From b182bd4443fe9ed7b12d6518d3f0136644d42b07 Mon Sep 17 00:00:00 2001 From: Tizen Infrastructure Date: Tue, 3 Jul 2018 01:12:25 +0000 Subject: [PATCH 001/672] Initial empty repository From 7501ff54a6c2ada7be3501956161e5e3b94fe289 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 11 Jul 2018 15:24:42 +0900 Subject: [PATCH 002/672] lottie-player : Initial draft for lottie-player library Change-Id: I8019e13863ef635fc011f0e7b82c692eaa01201d --- .gitignore | 5 + README.txt | 11 + example/demo.cpp | 41 + example/evasapp.cpp | 70 + example/evasapp.h | 46 + example/lottieview.cpp | 225 ++ example/lottieview.h | 66 + example/lottieviewtest.cpp | 123 + example/meson.build | 25 + example/pathtest.cpp | 110 + example/resource/acrobatics.json | 1 + example/resource/confetti.json | 1 + example/resource/crunches.json | 1 + example/resource/data.json | 1 + example/resource/emoji_wink.json | 1 + example/resource/glow_loading.json | 1 + example/resource/icon_animation.json | 1 + example/resource/mask.json | 1 + example/resource/material_wave_loading.json | 1 + ..._star_with_roundness_points_stroke_99.json | 1 + example/resource/rowing_machine.json | 1 + example/resource/running.json | 1 + example/resource/star_jumps.json | 1 + example/resource/walking.json | 1 + example/resource/yoga.json | 1 + inc/lottieplayer.h | 149 + inc/meson.build | 1 + meson.build | 36 + meson_options.txt | 14 + src/lottie/lottieitem.cpp | 1074 +++++++ src/lottie/lottieitem.h | 396 +++ src/lottie/lottieloader.cpp | 85 + src/lottie/lottieloader.h | 20 + src/lottie/lottiemodel.cpp | 274 ++ src/lottie/lottiemodel.h | 755 +++++ src/lottie/lottieparser.cpp | 1870 ++++++++++++ src/lottie/lottieparser.h | 16 + src/lottie/lottieplayer.cpp | 191 ++ src/lottie/meson.build | 12 + src/lottie/rapidjson/allocators.h | 271 ++ src/lottie/rapidjson/cursorstreamwrapper.h | 78 + src/lottie/rapidjson/document.h | 2672 +++++++++++++++++ src/lottie/rapidjson/encodedstream.h | 299 ++ src/lottie/rapidjson/encodings.h | 716 +++++ src/lottie/rapidjson/error/en.h | 74 + src/lottie/rapidjson/error/error.h | 161 + src/lottie/rapidjson/filereadstream.h | 99 + src/lottie/rapidjson/filewritestream.h | 104 + src/lottie/rapidjson/fwd.h | 151 + src/lottie/rapidjson/internal/biginteger.h | 290 ++ src/lottie/rapidjson/internal/diyfp.h | 258 ++ src/lottie/rapidjson/internal/dtoa.h | 245 ++ src/lottie/rapidjson/internal/ieee754.h | 78 + src/lottie/rapidjson/internal/itoa.h | 304 ++ src/lottie/rapidjson/internal/meta.h | 181 ++ src/lottie/rapidjson/internal/pow10.h | 55 + src/lottie/rapidjson/internal/regex.h | 734 +++++ src/lottie/rapidjson/internal/stack.h | 231 ++ src/lottie/rapidjson/internal/strfunc.h | 69 + src/lottie/rapidjson/internal/strtod.h | 269 ++ src/lottie/rapidjson/internal/swap.h | 46 + src/lottie/rapidjson/istreamwrapper.h | 115 + src/lottie/rapidjson/memorybuffer.h | 70 + src/lottie/rapidjson/memorystream.h | 71 + src/lottie/rapidjson/meson.build | 8 + src/lottie/rapidjson/msinttypes/inttypes.h | 316 ++ src/lottie/rapidjson/msinttypes/stdint.h | 300 ++ src/lottie/rapidjson/ostreamwrapper.h | 81 + src/lottie/rapidjson/pointer.h | 1358 +++++++++ src/lottie/rapidjson/prettywriter.h | 277 ++ src/lottie/rapidjson/rapidjson.h | 630 ++++ src/lottie/rapidjson/reader.h | 2221 ++++++++++++++ src/lottie/rapidjson/schema.h | 2017 +++++++++++++ src/lottie/rapidjson/stream.h | 223 ++ src/lottie/rapidjson/stringbuffer.h | 121 + src/lottie/rapidjson/writer.h | 711 +++++ src/meson.build | 12 + src/vector/freetype/meson.build | 10 + src/vector/freetype/v_ft_math.cpp | 528 ++++ src/vector/freetype/v_ft_math.h | 438 +++ src/vector/freetype/v_ft_raster.cpp | 1674 +++++++++++ src/vector/freetype/v_ft_raster.h | 607 ++++ src/vector/freetype/v_ft_stroker.cpp | 2292 ++++++++++++++ src/vector/freetype/v_ft_stroker.h | 325 ++ src/vector/freetype/v_ft_types.h | 160 + src/vector/meson.build | 29 + src/vector/vbezier.cpp | 116 + src/vector/vbezier.h | 110 + src/vector/vbitmap.cpp | 282 ++ src/vector/vbitmap.h | 47 + src/vector/vbrush.cpp | 77 + src/vector/vbrush.h | 82 + src/vector/vcompositionfunctions.cpp | 99 + src/vector/vdasher.cpp | 240 ++ src/vector/vdasher.h | 29 + src/vector/vdebug.cpp | 719 +++++ src/vector/vdebug.h | 143 + src/vector/vdrawhelper.cpp | 544 ++++ src/vector/vdrawhelper.h | 182 ++ src/vector/vdrawhelper_neon.cpp | 0 src/vector/vdrawhelper_sse2.cpp | 299 ++ src/vector/velapsedtimer.cpp | 29 + src/vector/velapsedtimer.h | 20 + src/vector/vglobal.h | 220 ++ src/vector/vinterpolator.cpp | 130 + src/vector/vinterpolator.h | 79 + src/vector/vmatrix.cpp | 835 ++++++ src/vector/vmatrix.h | 92 + src/vector/vpainter.cpp | 64 + src/vector/vpainter.h | 27 + src/vector/vpath.cpp | 735 +++++ src/vector/vpath.h | 80 + src/vector/vpathmesure.cpp | 6 + src/vector/vpathmesure.h | 18 + src/vector/vpoint.h | 147 + src/vector/vraster.cpp | 314 ++ src/vector/vraster.h | 33 + src/vector/vrect.cpp | 0 src/vector/vrect.h | 184 ++ src/vector/vregion.cpp | 2368 +++++++++++++++ src/vector/vregion.h | 73 + src/vector/vrle.cpp | 810 +++++ src/vector/vrle.h | 62 + test/meson.build | 20 + test/ssgtestsuite.cpp | 8 + test/testftraster.cpp | 30 + test/testsgregion.cpp | 120 + 127 files changed, 37082 insertions(+) create mode 100644 .gitignore create mode 100644 README.txt create mode 100644 example/demo.cpp create mode 100644 example/evasapp.cpp create mode 100644 example/evasapp.h create mode 100644 example/lottieview.cpp create mode 100644 example/lottieview.h create mode 100644 example/lottieviewtest.cpp create mode 100644 example/meson.build create mode 100644 example/pathtest.cpp create mode 100644 example/resource/acrobatics.json create mode 100644 example/resource/confetti.json create mode 100755 example/resource/crunches.json create mode 100755 example/resource/data.json create mode 100644 example/resource/emoji_wink.json create mode 100644 example/resource/glow_loading.json create mode 100755 example/resource/icon_animation.json create mode 100755 example/resource/mask.json create mode 100644 example/resource/material_wave_loading.json create mode 100755 example/resource/polystar_star_with_roundness_points_stroke_99.json create mode 100755 example/resource/rowing_machine.json create mode 100755 example/resource/running.json create mode 100755 example/resource/star_jumps.json create mode 100755 example/resource/walking.json create mode 100755 example/resource/yoga.json create mode 100644 inc/lottieplayer.h create mode 100644 inc/meson.build create mode 100644 meson.build create mode 100644 meson_options.txt create mode 100644 src/lottie/lottieitem.cpp create mode 100644 src/lottie/lottieitem.h create mode 100644 src/lottie/lottieloader.cpp create mode 100644 src/lottie/lottieloader.h create mode 100644 src/lottie/lottiemodel.cpp create mode 100644 src/lottie/lottiemodel.h create mode 100644 src/lottie/lottieparser.cpp create mode 100644 src/lottie/lottieparser.h create mode 100644 src/lottie/lottieplayer.cpp create mode 100644 src/lottie/meson.build create mode 100644 src/lottie/rapidjson/allocators.h create mode 100644 src/lottie/rapidjson/cursorstreamwrapper.h create mode 100644 src/lottie/rapidjson/document.h create mode 100644 src/lottie/rapidjson/encodedstream.h create mode 100644 src/lottie/rapidjson/encodings.h create mode 100644 src/lottie/rapidjson/error/en.h create mode 100644 src/lottie/rapidjson/error/error.h create mode 100644 src/lottie/rapidjson/filereadstream.h create mode 100644 src/lottie/rapidjson/filewritestream.h create mode 100644 src/lottie/rapidjson/fwd.h create mode 100644 src/lottie/rapidjson/internal/biginteger.h create mode 100644 src/lottie/rapidjson/internal/diyfp.h create mode 100644 src/lottie/rapidjson/internal/dtoa.h create mode 100644 src/lottie/rapidjson/internal/ieee754.h create mode 100644 src/lottie/rapidjson/internal/itoa.h create mode 100644 src/lottie/rapidjson/internal/meta.h create mode 100644 src/lottie/rapidjson/internal/pow10.h create mode 100644 src/lottie/rapidjson/internal/regex.h create mode 100644 src/lottie/rapidjson/internal/stack.h create mode 100644 src/lottie/rapidjson/internal/strfunc.h create mode 100644 src/lottie/rapidjson/internal/strtod.h create mode 100644 src/lottie/rapidjson/internal/swap.h create mode 100644 src/lottie/rapidjson/istreamwrapper.h create mode 100644 src/lottie/rapidjson/memorybuffer.h create mode 100644 src/lottie/rapidjson/memorystream.h create mode 100644 src/lottie/rapidjson/meson.build create mode 100644 src/lottie/rapidjson/msinttypes/inttypes.h create mode 100644 src/lottie/rapidjson/msinttypes/stdint.h create mode 100644 src/lottie/rapidjson/ostreamwrapper.h create mode 100644 src/lottie/rapidjson/pointer.h create mode 100644 src/lottie/rapidjson/prettywriter.h create mode 100644 src/lottie/rapidjson/rapidjson.h create mode 100644 src/lottie/rapidjson/reader.h create mode 100644 src/lottie/rapidjson/schema.h create mode 100644 src/lottie/rapidjson/stream.h create mode 100644 src/lottie/rapidjson/stringbuffer.h create mode 100644 src/lottie/rapidjson/writer.h create mode 100644 src/meson.build create mode 100644 src/vector/freetype/meson.build create mode 100644 src/vector/freetype/v_ft_math.cpp create mode 100644 src/vector/freetype/v_ft_math.h create mode 100644 src/vector/freetype/v_ft_raster.cpp create mode 100644 src/vector/freetype/v_ft_raster.h create mode 100644 src/vector/freetype/v_ft_stroker.cpp create mode 100644 src/vector/freetype/v_ft_stroker.h create mode 100644 src/vector/freetype/v_ft_types.h create mode 100644 src/vector/meson.build create mode 100644 src/vector/vbezier.cpp create mode 100644 src/vector/vbezier.h create mode 100644 src/vector/vbitmap.cpp create mode 100644 src/vector/vbitmap.h create mode 100644 src/vector/vbrush.cpp create mode 100644 src/vector/vbrush.h create mode 100644 src/vector/vcompositionfunctions.cpp create mode 100644 src/vector/vdasher.cpp create mode 100644 src/vector/vdasher.h create mode 100644 src/vector/vdebug.cpp create mode 100644 src/vector/vdebug.h create mode 100644 src/vector/vdrawhelper.cpp create mode 100644 src/vector/vdrawhelper.h create mode 100644 src/vector/vdrawhelper_neon.cpp create mode 100644 src/vector/vdrawhelper_sse2.cpp create mode 100644 src/vector/velapsedtimer.cpp create mode 100644 src/vector/velapsedtimer.h create mode 100644 src/vector/vglobal.h create mode 100644 src/vector/vinterpolator.cpp create mode 100644 src/vector/vinterpolator.h create mode 100644 src/vector/vmatrix.cpp create mode 100644 src/vector/vmatrix.h create mode 100644 src/vector/vpainter.cpp create mode 100644 src/vector/vpainter.h create mode 100644 src/vector/vpath.cpp create mode 100644 src/vector/vpath.h create mode 100644 src/vector/vpathmesure.cpp create mode 100644 src/vector/vpathmesure.h create mode 100644 src/vector/vpoint.h create mode 100644 src/vector/vraster.cpp create mode 100644 src/vector/vraster.h create mode 100644 src/vector/vrect.cpp create mode 100644 src/vector/vrect.h create mode 100644 src/vector/vregion.cpp create mode 100644 src/vector/vregion.h create mode 100644 src/vector/vrle.cpp create mode 100644 src/vector/vrle.h create mode 100644 test/meson.build create mode 100644 test/ssgtestsuite.cpp create mode 100644 test/testftraster.cpp create mode 100644 test/testsgregion.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..f13e7a5407 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +build +*.creator* +*.config +*.files +*.includes \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000000..c079df89ef --- /dev/null +++ b/README.txt @@ -0,0 +1,11 @@ +BUILD INSTRUCTION +================= +1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) +2. install ninja build tool (https://ninja-build.org/) +3. make a build directory in ssg/ flder +4. run meson build/ + +RUN INSTRUCTION +=============== +1. run ninja inside build/ folder +2. to run example invoke ./build/example/ssgdemo diff --git a/example/demo.cpp b/example/demo.cpp new file mode 100644 index 0000000000..fcf544b17f --- /dev/null +++ b/example/demo.cpp @@ -0,0 +1,41 @@ +#include "evasapp.h" +#include "lottieview.h" +#include +#include +using namespace std; + +static void +onExitCb(void *data) +{ + LottieView *view = (LottieView *)data; + delete view; +} + +int +main(void) +{ + EvasApp *app = new EvasApp(800, 800); + app->setup(); + + std::string filePath = DEMO_DIR; + filePath +="mask.json"; + + LottieView *view = new LottieView(app->evas()); + view->setFilePath(filePath.c_str()); + view->setPos(0, 0); + view->setSize(800, 800); + view->show(); + view->play(); + view->loop(true); + view->setRepeatMode(LottieView::RepeatMode::Reverse); + + app->addExitCb(onExitCb, view); + app->run(); + delete app; + return 0; +} + + + + + diff --git a/example/evasapp.cpp b/example/evasapp.cpp new file mode 100644 index 0000000000..4f4762e57c --- /dev/null +++ b/example/evasapp.cpp @@ -0,0 +1,70 @@ +#include "evasapp.h" + +static void +_on_resize(Ecore_Evas *ee) +{ + EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app"); + int w, h; + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + app->resize(w, h); + if (app->mResizeCb) + app->mResizeCb(app->mResizeData); +} + +static void +_on_delete(Ecore_Evas *ee) +{ + EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app"); + if (app->mExitCb) + app->mExitCb(app->mExitData); + + ecore_main_loop_quit(); + ecore_evas_free(ee); +} + +EvasApp::EvasApp(int w, int h) +{ + if (!ecore_evas_init()) + return; + mw = w; + mh = h; + //setenv("ECORE_EVAS_ENGINE", "opengl_x11", 1); + mEcoreEvas = ecore_evas_new(NULL, 0, 0, mw, mh, NULL); + if (!mEcoreEvas) return; +} + +void +EvasApp::setup() +{ + ecore_evas_data_set(mEcoreEvas, "app", this); + ecore_evas_callback_resize_set(mEcoreEvas, _on_resize); + ecore_evas_callback_delete_request_set(mEcoreEvas, _on_delete); + + ecore_evas_show(mEcoreEvas); + mEvas = ecore_evas_get(mEcoreEvas); + mBackground = evas_object_rectangle_add(mEvas); + evas_object_color_set(mBackground, 70, 70, 70, 255); + evas_object_show(mBackground); + + mVg = evas_object_vg_add(mEvas); + evas_object_show(mVg); + + mRoot = evas_vg_container_add(mVg); + evas_object_vg_root_node_set(mVg, mRoot); +} + +void +EvasApp::resize(int w, int h) +{ + evas_object_resize(mBackground, w, h); + evas_object_resize(mVg, w, h); + mw = w; + mh = h; +} + +void EvasApp::run() +{ + resize(mw, mh); + ecore_main_loop_begin(); + ecore_evas_shutdown(); +} diff --git a/example/evasapp.h b/example/evasapp.h new file mode 100644 index 0000000000..c7d18cfd40 --- /dev/null +++ b/example/evasapp.h @@ -0,0 +1,46 @@ +#ifndef EVASAPP_H +#define EVASAPP_H + +#ifndef EFL_BETA_API_SUPPORT +#define EFL_BETA_API_SUPPORT +#endif + +#ifndef EFL_EO_API_SUPPORT +#define EFL_EO_API_SUPPORT +#endif + +#include +#include +#include +#include +#include + +typedef void (*appCb)(void *userData); +class EvasApp +{ +public: + EvasApp(int w, int h); + void setup(); + void resize(int w, int h); + int width() const{ return mw;} + int height() const{ return mh;} + void run(); + Ecore_Evas * ee() const{return mEcoreEvas;} + Evas * evas() const {return mEvas;} + Efl_VG * root() const {return mRoot;} + void addExitCb(appCb exitcb, void *data) {mExitCb = exitcb; mExitData = data;} + void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;} +public: + int mw; + int mh; + Ecore_Evas *mEcoreEvas; + Evas *mEvas; + Efl_VG *mRoot; + Evas_Object *mVg; + Evas_Object *mBackground; + appCb mResizeCb; + void *mResizeData; + appCb mExitCb; + void *mExitData; +}; +#endif //EVASAPP_H diff --git a/example/lottieview.cpp b/example/lottieview.cpp new file mode 100644 index 0000000000..de145ef647 --- /dev/null +++ b/example/lottieview.cpp @@ -0,0 +1,225 @@ +#include"lottieview.h" +#include"lottieplayer.h" + +static Eina_Bool +animator(void *data , double pos) +{ + LottieView *view = static_cast(data); + view->seek(pos); + if (pos == 1.0) { + view->finished(); + return EINA_FALSE; + } + return EINA_TRUE; +} + +void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) +{ + Efl_VG *shape = evas_vg_shape_add(parent); + // update the path + const float *data = node->mPath.ptPtr; + for(int i=0; i mPath.elmCount; i++) { + switch (node->mPath.elmPtr[i]) { + case 0: //moveTo + { + evas_vg_shape_append_move_to(shape, data[0], data[1]); + data += 2; + break; + } + case 1: + { + evas_vg_shape_append_line_to(shape, data[0], data[1]); + data += 2; + break; + } + case 2: + { + evas_vg_shape_append_cubic_to(shape, data[0], data[1], data[2], data[3], data[4], data[5]); + data += 6; + break; + } + case 3: + { + evas_vg_shape_append_close(shape); + break; + } + default: + break; + } + } + + if (node->mStroke.enable) { + evas_vg_shape_stroke_width_set(shape, node->mStroke.width); + //evas_vg_shape_stroke_cap_set(shape, int(node->mStroke.cap)); + //evas_vg_shape_stroke_join_set(shape, int(node->mStroke.join)); + //evas_vg_shape_stroke_meter_limit_set(shape, node->mStroke.meterLimit); + } + // update paint info + if (node->mType == LOTNode::BrushSolid) { + int r = (node->mColor.r * node->mColor.a)/255; + int g = (node->mColor.g * node->mColor.a)/255; + int b = (node->mColor.b * node->mColor.a)/255; + int a = node->mColor.a; + if (node->mStroke.enable) { + evas_vg_shape_stroke_color_set(shape, r, g, b, a); + } else { + evas_vg_node_color_set(shape, r, g, b, a); + } + + } else if (node->mType == LOTNode::BrushGradient) { + //TODO fill the gradient info + } +} + +void LottieView::update(const std::vector &renderList) +{ + Efl_VG *root = evas_vg_container_add(mVg); + for(auto i : renderList) { + createVgNode(i, root); + } + evas_object_vg_root_node_set(mVg, root); +} + +LottieView::LottieView(Evas *evas, bool renderMode) +{ + mPalying = false; + mReverse = false; + mRepeatCount = 0; + mRepeatMode = LottieView::RepeatMode::Restart; + mLoop = false; + mSpeed = 1; + + mEvas = evas; + mPlayer = new LOTPlayer(); + mRenderMode = renderMode; + + if (mRenderMode) { + mImage = evas_object_image_filled_add(evas); + evas_object_image_colorspace_set(mImage, EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(mImage, EINA_TRUE); + } else { + mVg = evas_object_vg_add(evas); + } +} + +LottieView::~LottieView() +{ + ecore_animator_del(mAnimator); + delete mPlayer; +} + +void LottieView::show() +{ + if (mRenderMode) { + evas_object_show(mImage); + } else { + evas_object_show(mVg); + } + seek(0); +} + +void LottieView::hide() +{ + if (mRenderMode) { + evas_object_hide(mImage); + } else { + evas_object_hide(mVg); + } +} + +void LottieView::seek(float pos) +{ + if (mPalying && mReverse) + pos = 1.0 - pos; + + if (mRenderMode) { + LOTBuffer buf; + buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); + buf.bytesPerLine = evas_object_image_stride_get(mImage); + evas_object_image_size_get(mImage, &buf.width, &buf.height); + bool changed = mPlayer->renderSync(pos, buf); + evas_object_image_data_set(mImage, buf.buffer); + // if the buffer is updated notify the image object + if (changed) { + evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); + } + } else { + mPlayer->seek(pos); + const std::vector &renderList = mPlayer->renderList(); + update(renderList); + } +} + +void LottieView::setFilePath(const char *filePath) +{ + mPlayer->setFilePath(filePath); +} + +void LottieView::setSize(int w, int h) +{ + if (mRenderMode) { + evas_object_resize(mImage, w, h); + evas_object_image_size_set(mImage, w, h); + } else { + evas_object_resize(mVg, w, h); + } + mPlayer->setSize(w, h); +} +void LottieView::setPos(int x, int y) +{ + if (mRenderMode) { + evas_object_move(mImage, x, y); + } else { + evas_object_move(mVg, x, y); + } +} + +void LottieView::finished() +{ + restart(); +} + +void LottieView::loop(bool loop) +{ + mLoop = loop; +} + +void LottieView::setRepeatCount(int count) +{ + mRepeatCount = count; +} + +void LottieView::setRepeatMode(LottieView::RepeatMode mode) +{ + mRepeatMode = mode; +} + +void LottieView::play() +{ + mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this); + mReverse = false; + mCurCount = mRepeatCount; + mPalying = true; +} + +void LottieView::pause() +{ + +} + +void LottieView::stop() +{ + mPalying = false; +} + +void LottieView::restart() +{ + mCurCount--; + if (mLoop || mRepeatCount) { + if (mRepeatMode == LottieView::RepeatMode::Reverse) + mReverse = !mReverse; + else + mReverse = false; + mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this); + } +} diff --git a/example/lottieview.h b/example/lottieview.h new file mode 100644 index 0000000000..59ea019281 --- /dev/null +++ b/example/lottieview.h @@ -0,0 +1,66 @@ +#ifndef LOTTIEVIEW_H +#define LOTTIEVIEW_H + +#ifndef EFL_BETA_API_SUPPORT +#define EFL_BETA_API_SUPPORT +#endif + +#ifndef EFL_EO_API_SUPPORT +#define EFL_EO_API_SUPPORT +#endif + +#include +#include +#include +#include +#include +#include"lottieplayer.h" + +class LOTPlayer; +class LottieView +{ +public: + enum class RepeatMode { + Restart, + Reverse + }; + LottieView(Evas *evas, bool renderMode = true); + ~LottieView(); + void setSize(int w, int h); + void setPos(int x, int y); + void setFilePath(const char *filePath); + void show(); + void hide(); + void loop(bool loop); + void setSpeed(float speed) { mSpeed = speed;} + void setRepeatCount(int count); + void setRepeatMode(LottieView::RepeatMode mode); +public: + void seek(float pos); + void finished(); + void play(); + void pause(); + void stop(); +private: + void createVgNode(LOTNode *node, Efl_VG *parent); + void update(const std::vector &); + void restart(); +public: + int mw; + int mh; + Evas *mEvas; + Efl_VG *mRoot; + Evas_Object *mVg; + int mRepeatCount; + LottieView::RepeatMode mRepeatMode; + LOTPlayer *mPlayer; + Ecore_Animator *mAnimator; + bool mLoop; + int mCurCount; + bool mReverse; + bool mPalying; + Evas_Object *mImage; + float mSpeed; + bool mRenderMode; +}; +#endif //LOTTIEVIEW_H diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp new file mode 100644 index 0000000000..169da1e27b --- /dev/null +++ b/example/lottieviewtest.cpp @@ -0,0 +1,123 @@ +#include "evasapp.h" +#include "lottieview.h" +#include +#include +#include +using namespace std; + +/* + * To check the frame rate with rendermode off run + * ECORE_EVAS_FPS_DEBUG=1 ./lottieviewTest --disable-render + * + * To check the frame rate with render backend + * ECORE_EVAS_FPS_DEBUG=1 ./lottieviewTest + * + */ + +class LottieViewTest +{ +public: + LottieViewTest(EvasApp *app, bool renderMode) { + mApp = app; + mRenderMode = renderMode; + } + + bool isJsonFile(const char *filename) { + const char *dot = strrchr(filename, '.'); + if(!dot || dot == filename) return false; + return !strcmp(dot + 1, "json"); + } + + void buildResourceList() { + DIR *d; + struct dirent *dir; + d = opendir(DEMO_DIR); + if (d) { + while ((dir = readdir(d)) != NULL) { + if (isJsonFile(dir->d_name)) + mResource.push_back(dir->d_name); + } + closedir(d); + } + } + void displayResourceList() { + for(auto i : mResource) { + std::string filePath = DEMO_DIR; + filePath +=i; + } + } + + void show() { + if (mResource.empty()) return; + + int count = mResource.size(); + int colums = sqrt(count); + int rows = (count % colums) ? colums+1 : colums; + int offset = 3; + int vw = (mApp->width() - (2 * offset * colums))/colums; + int vh = (mApp->height() - (2 * offset * rows))/rows; + int posx = offset; + int posy = offset; + for(auto i : mResource) { + std::string filePath = DEMO_DIR; + filePath +=i; + + std::unique_ptr view(new LottieView(mApp->evas(), mRenderMode)); + view->setFilePath(filePath.c_str()); + view->setPos(posx, posy); + view->setSize(vw, vh); + view->show(); + view->play(); + view->loop(true); + //view->setRepeatMode(LottieView::RepeatMode::Reverse); + + posx += vw+offset; + if ((mApp->width() - posx) < vw) { + posx = offset; + posy = posy + vh + offset; + } + mViews.push_back(std::move(view)); + } + + } + +public: + EvasApp *mApp; + bool mRenderMode = false; + std::vector> mViews; + std::vector mResource; +}; + +static void +onExitCb(void *data) +{ + LottieViewTest *view = (LottieViewTest *)data; + delete view; +} + +int +main(int argc, char **argv) +{ + EvasApp *app = new EvasApp(800, 800); + app->setup(); + + bool renderMode = true; + if (argc > 1) { + if (!strcmp(argv[1],"--disable-render")) + renderMode = false; + } + LottieViewTest *view = new LottieViewTest(app, renderMode); + view->buildResourceList(); + view->show(); + + app->addExitCb(onExitCb, view); + + app->run(); + delete app; + return 0; +} + + + + + diff --git a/example/meson.build b/example/meson.build new file mode 100644 index 0000000000..6c49d93cfa --- /dev/null +++ b/example/meson.build @@ -0,0 +1,25 @@ + +common_source = files('evasapp.cpp') +common_source += files('lottieview.cpp') + +demo_sources = files('demo.cpp') +demo_sources += common_source + +demo_dep = [] +demo_dep+= dependency('elementary') + + +executable('demo', + demo_sources, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) + +lottieview_test_src = files('lottieviewtest.cpp') +lottieview_test_src += common_source + +executable('lottieviewTest', + lottieview_test_src, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) diff --git a/example/pathtest.cpp b/example/pathtest.cpp new file mode 100644 index 0000000000..011d38f0c9 --- /dev/null +++ b/example/pathtest.cpp @@ -0,0 +1,110 @@ +#include "evasapp.h" +#include"vpath.h" +#include +using namespace std; + +EvasApp *APP; + +static void +_on_resize(Ecore_Evas *ee) +{ + int w, h; + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + APP->resize(w, h); +} + +class PathTest +{ +public: + PathTest(EvasApp *app) { + mApp = app; + mShape = evas_vg_shape_add(mApp->root()); + } + void setColor(int r, int g, int b, int a) { + evas_vg_node_color_set(mShape, r, g, b, a); + } + + void setStrokeColor(int r, int g, int b, int a) { + evas_vg_shape_stroke_color_set(mShape, r, g, b, a); + } + + void setStrokeWidth(int w) { + evas_vg_shape_stroke_width_set(mShape, w); + } + + void setPath(const VPath &path) { + Efl_VG *shape = mShape; + evas_vg_shape_reset(shape); + const std::vector &elm = path.elements(); + const std::vector &pts = path.points(); + int i=0; + for (auto e : elm) { + switch(e) { + case VPath::Element::MoveTo: + { + VPointF p = pts[i++]; + evas_vg_shape_append_move_to(shape, p.x(), p.y()); + break; + } + case VPath::Element::LineTo: + { + VPointF p = pts[i++]; + evas_vg_shape_append_line_to(shape, p.x(), p.y()); + break; + } + case VPath::Element::CubicTo: + { + VPointF p = pts[i++]; + VPointF p1 = pts[i++]; + VPointF p2 = pts[i++]; + evas_vg_shape_append_cubic_to(shape, p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); + break; + } + case VPath::Element::Close: + { + evas_vg_shape_append_close(shape); + break; + } + } + } + } + +public: + EvasApp *mApp; + Efl_VG *mShape; +}; + +int +main(void) +{ + APP = new EvasApp(800, 800); + ecore_evas_callback_resize_set(APP->mEcoreEvas, _on_resize); + APP->setup(); + + VPath path; + path.addRoundRect(VRectF(100, 100, 200, 200), 20, 20, VPath::Direction::CCW); + path.addCircle(50, 50, 20, VPath::Direction::CCW); + + path.addOval(VRectF(300, 100, 100, 50), VPath::Direction::CCW); + + path.addPolystarStar(0.0, 150, 150, 15.0, + 106.0, 34.0, + 231.0, 88.0, VPath::Direction::CW); + + + PathTest test(APP); + test.setPath(path); + test.setColor(255, 0, 0, 255); + test.setStrokeColor(200, 200, 0, 200); + test.setStrokeWidth(5); + + + APP->run(); + delete APP; + return 0; +} + + + + + diff --git a/example/resource/acrobatics.json b/example/resource/acrobatics.json new file mode 100644 index 0000000000..7dce062fcd --- /dev/null +++ b/example/resource/acrobatics.json @@ -0,0 +1 @@ +{"v":"5.0.5","fr":29.9700012207031,"ip":0,"op":46.0000018736184,"w":288,"h":360,"nm":"jump","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"a7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[29],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[-23],"e":[-52]},{"t":30.0000012219251}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.585,"y":0.651},"o":{"x":0.232,"y":0.316},"n":"0p585_0p651_0p232_0p316","t":0,"s":[223.86,137.848,0],"e":[173.574,30.76,0],"to":[-1.73460388183594,-57.7228088378906,0],"ti":[29.553560256958,21.1779880523682,0]},{"i":{"x":0.649,"y":0.681},"o":{"x":0.307,"y":0.343},"n":"0p649_0p681_0p307_0p343","t":5,"s":[173.574,30.76,0],"e":[85.663,23.367,0],"to":[-27.3250160217285,-19.5810222625732,0],"ti":[26.9960441589355,-14.1411228179932,0]},{"i":{"x":0.671,"y":0.846},"o":{"x":0.331,"y":0.195},"n":"0p671_0p846_0p331_0p195","t":10,"s":[85.663,23.367,0],"e":[36.511,149.665,0],"to":[-19.3489608764648,10.1354112625122,0],"ti":[-6.15889406204224,-86.5106048583984,0]},{"i":{"x":0.696,"y":0.889},"o":{"x":0.354,"y":0.179},"n":"0p696_0p889_0p354_0p179","t":15,"s":[36.511,149.665,0],"e":[74.554,29.842,0],"to":[1.17162692546844,16.4571990966797,0],"ti":[-42.0285682678223,27.0350360870361,0]},{"i":{"x":0.652,"y":0.943},"o":{"x":0.268,"y":0.138},"n":"0p652_0p943_0p268_0p138","t":20,"s":[74.554,29.842,0],"e":[163.85,25.327,0],"to":[50.7120628356934,-30.1498985290527,0],"ti":[-6.47687864303589,-3.83117437362671,0]},{"i":{"x":0.855,"y":0.672},"o":{"x":0.451,"y":0.05},"n":"0p855_0p672_0p451_0p05","t":25,"s":[163.85,25.327,0],"e":[223.441,143.403,0],"to":[73.0731658935547,50.364128112793,0],"ti":[-1.62066376209259,-0.90557879209518,0]},{"i":{"x":0.585,"y":0.656},"o":{"x":0.262,"y":0.658},"n":"0p585_0p656_0p262_0p658","t":30,"s":[223.441,143.403,0],"e":[173.574,30.76,0],"to":[1.62066376209259,0.90557879209518,0],"ti":[29.553560256958,21.1779880523682,0]},{"i":{"x":0.649,"y":0.681},"o":{"x":0.307,"y":0.343},"n":"0p649_0p681_0p307_0p343","t":35,"s":[173.574,30.76,0],"e":[85.663,23.367,0],"to":[-27.3250160217285,-19.5810222625732,0],"ti":[26.9960441589355,-14.1411228179932,0]},{"i":{"x":0.671,"y":0.75},"o":{"x":0.331,"y":0.315},"n":"0p671_0p75_0p331_0p315","t":40,"s":[85.663,23.367,0],"e":[63.011,118.165,0],"to":[-19.3489608764648,10.1354112625122,0],"ti":[-21.1588935852051,-45.0106010437012,0]},{"t":46.0000018736184}],"ix":2},"a":{"a":0,"k":[49.985,49.973,0],"ix":1},"s":{"a":0,"k":[-50.014,50.014,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.5,-8.4],[8.4,1.6],[0.199,0.1],[2.599,-0.9],[0.201,0],[1.6,8.5],[-8.5,1.6],[-2.8,-1.2],[0,0],[0,0],[2.9,2.9],[0,0],[-4.2,-4.1],[-0.2,-2.1],[0,0],[-0.5,-0.3],[0.299,-0.5],[0,0],[-0.7,0.3],[-3.2,-0.6]],"o":[[-1.6,8.5],[-0.3,0],[-2.5,-0.9],[-0.201,0.1],[-8.5,1.6],[-1.6,-8.5],[3.2,-0.6],[1,0.5],[0,0],[-2,0],[-4.199,-4.2],[0,0],[2.3,2.3],[0,0],[0.3,-0.5],[0.5,0.3],[0,0],[0.801,-0.1],[2.8,-1.3],[8.5,1.5]],"v":[[25.65,1.6],[4.65,29.5],[3.951,29.3],[-3.749,29.3],[-4.45,29.5],[-25.55,1.6],[-13.05,-16.6],[-3.85,-15.5],[-0.749,-14.7],[0.45,-16.9],[-8.05,-20.3],[-11.35,-30.3],[-1.35,-27],[1.951,-19.7],[7.451,-29.9],[8.85,-30.3],[9.251,-28.9],[1.65,-14.7],[3.85,-15.4],[13.05,-16.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.380392163992,0.411764711142,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.366,50.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"a6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":29,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.67},"o":{"x":0.185,"y":0.366},"n":"0p833_0p67_0p185_0p366","t":0,"s":[186.985,40.473,0],"e":[216.985,116.473,0],"to":[1.01539611816406,-0.97280883789062,0],"ti":[6.98460388183594,-38.0271911621094,0]},{"i":{"x":0.833,"y":0.74},"o":{"x":0.185,"y":0.289},"n":"0p833_0p74_0p185_0p289","t":5,"s":[216.985,116.473,0],"e":[169.985,27.473,0],"to":[5.01539611816406,-38.4728088378906,0],"ti":[28.5490169525146,10.817400932312,0]},{"i":{"x":0.833,"y":0.716},"o":{"x":0.185,"y":0.315},"n":"0p833_0p716_0p185_0p315","t":10,"s":[169.985,27.473,0],"e":[76.485,28.973,0],"to":[-64,-24.25,0],"ti":[8.20706558227539,-7.81933689117432,0]},{"i":{"x":0.833,"y":0.732},"o":{"x":0.185,"y":0.298},"n":"0p833_0p732_0p185_0p298","t":15,"s":[76.485,28.973,0],"e":[42.485,121.973,0],"to":[-36.8030128479004,35.0643157958984,0],"ti":[-8.51539611816406,-3.02719116210938,0]},{"i":{"x":0.833,"y":0.756},"o":{"x":0.185,"y":0.271},"n":"0p833_0p756_0p185_0p271","t":20,"s":[42.485,121.973,0],"e":[85.485,24.473,0],"to":[-12.9846038818359,-63.4728088378906,0],"ti":[-12.5153961181641,8.47280883789062,0]},{"i":{"x":0.833,"y":0.717},"o":{"x":0.185,"y":0.314},"n":"0p833_0p717_0p185_0p314","t":25,"s":[85.485,24.473,0],"e":[178.485,31.973,0],"to":[40.0153961181641,-28.4728088378906,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.775},"o":{"x":0.167,"y":0.225},"n":"0p833_0p775_0p167_0p225","t":30,"s":[178.485,31.973,0],"e":[216.485,144.473,0],"to":[0,0,0],"ti":[16.4846038818359,-63.0271911621094,0]},{"i":{"x":0.833,"y":0.792},"o":{"x":0.185,"y":0.23},"n":"0p833_0p792_0p185_0p23","t":35,"s":[216.485,144.473,0],"e":[169.985,27.473,0],"to":[12.0153961181641,-51.9728088378906,0],"ti":[28.5490169525146,10.817400932312,0]},{"i":{"x":0.833,"y":0.669},"o":{"x":0.185,"y":0.368},"n":"0p833_0p669_0p185_0p368","t":40,"s":[169.985,27.473,0],"e":[73.485,29.473,0],"to":[-64,-24.25,0],"ti":[25.5490169525146,-10.682599067688,0]},{"t":46.0000018736184}],"ix":2},"a":{"a":0,"k":[49.985,49.973,0],"ix":1},"s":{"a":0,"k":[-50.014,50.014,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.5,-8.4],[8.4,1.6],[0.199,0.1],[2.599,-0.9],[0.201,0],[1.6,8.5],[-8.5,1.6],[-2.8,-1.2],[0,0],[0,0],[2.9,2.9],[0,0],[-4.2,-4.1],[-0.2,-2.1],[0,0],[-0.5,-0.3],[0.299,-0.5],[0,0],[-0.7,0.3],[-3.2,-0.6]],"o":[[-1.6,8.5],[-0.3,0],[-2.5,-0.9],[-0.201,0.1],[-8.5,1.6],[-1.6,-8.5],[3.2,-0.6],[1,0.5],[0,0],[-2,0],[-4.199,-4.2],[0,0],[2.3,2.3],[0,0],[0.3,-0.5],[0.5,0.3],[0,0],[0.801,-0.1],[2.8,-1.3],[8.5,1.5]],"v":[[25.65,1.6],[4.65,29.5],[3.951,29.3],[-3.749,29.3],[-4.45,29.5],[-25.55,1.6],[-13.05,-16.6],[-3.85,-15.5],[-0.749,-14.7],[0.45,-16.9],[-8.05,-20.3],[-11.35,-30.3],[-1.35,-27],[1.951,-19.7],[7.451,-29.9],[8.85,-30.3],[9.251,-28.9],[1.65,-14.7],[3.85,-15.4],[13.05,-16.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.380392163992,0.411764711142,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.366,50.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"a5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":29,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.585,"y":0.55},"o":{"x":0.185,"y":0.325},"n":"0p585_0p55_0p185_0p325","t":0,"s":[82.985,26.973,0],"e":[173.574,30.76,0],"to":[0.01539611816406,-3.97280883789062,0],"ti":[-43.4464416503906,-27.3220119476318,0]},{"i":{"x":0.585,"y":0.412},"o":{"x":0.303,"y":0.429},"n":"0p585_0p412_0p303_0p429","t":5,"s":[173.574,30.76,0],"e":[205.574,91.76,0],"to":[23.8329467773438,26.0342674255371,0],"ti":[6.07351684570312,9.26034545898438,0]},{"i":{"x":0.585,"y":0.449},"o":{"x":0.303,"y":0.402},"n":"0p585_0p449_0p303_0p402","t":10,"s":[205.574,91.76,0],"e":[167.074,25.76,0],"to":[-9.07351684570312,-39.7603454589844,0],"ti":[15.0735168457031,13.2603454589844,0]},{"i":{"x":0.585,"y":0.526},"o":{"x":0.303,"y":0.345},"n":"0p585_0p526_0p303_0p345","t":15,"s":[167.074,25.76,0],"e":[80.574,28.26,0],"to":[-48.5735168457031,-23.5103454589844,0],"ti":[8.82351684570312,-4.48965454101562,0]},{"i":{"x":0.585,"y":0.478},"o":{"x":0.303,"y":0.381},"n":"0p585_0p478_0p303_0p381","t":20,"s":[80.574,28.26,0],"e":[55.074,104.26,0],"to":[-26.8235168457031,30.9896545410156,0],"ti":[-2.42648315429688,-0.48965454101562,0]},{"i":{"x":0.585,"y":0.489},"o":{"x":0.303,"y":0.372},"n":"0p585_0p489_0p303_0p372","t":25,"s":[55.074,104.26,0],"e":[83.574,27.76,0],"to":[1.17648315429688,-59.2603454589844,0],"ti":[0,0,0]},{"i":{"x":0.585,"y":0.542},"o":{"x":0.167,"y":0.184},"n":"0p585_0p542_0p167_0p184","t":30,"s":[83.574,27.76,0],"e":[173.574,30.76,0],"to":[0,0,0],"ti":[-43.4464416503906,-27.3220119476318,0]},{"i":{"x":0.585,"y":0.624},"o":{"x":0.303,"y":0.274},"n":"0p585_0p624_0p303_0p274","t":35,"s":[173.574,30.76,0],"e":[217.074,133.26,0],"to":[23.8329467773438,26.0342674255371,0],"ti":[6.07351684570312,9.26034545898438,0]},{"i":{"x":0.585,"y":0.567},"o":{"x":0.303,"y":0.316},"n":"0p585_0p567_0p303_0p316","t":40,"s":[217.074,133.26,0],"e":[168.574,25.76,0],"to":[-17.0735168457031,-77.0103454589844,0],"ti":[6.07351684570312,9.26034545898438,0]},{"t":46.0000018736184}],"ix":2},"a":{"a":0,"k":[49.985,49.973,0],"ix":1},"s":{"a":0,"k":[-50.014,50.014,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.5,-8.4],[8.4,1.6],[0.199,0.1],[2.599,-0.9],[0.201,0],[1.6,8.5],[-8.5,1.6],[-2.8,-1.2],[0,0],[0,0],[2.9,2.9],[0,0],[-4.2,-4.1],[-0.2,-2.1],[0,0],[-0.5,-0.3],[0.299,-0.5],[0,0],[-0.7,0.3],[-3.2,-0.6]],"o":[[-1.6,8.5],[-0.3,0],[-2.5,-0.9],[-0.201,0.1],[-8.5,1.6],[-1.6,-8.5],[3.2,-0.6],[1,0.5],[0,0],[-2,0],[-4.199,-4.2],[0,0],[2.3,2.3],[0,0],[0.3,-0.5],[0.5,0.3],[0,0],[0.801,-0.1],[2.8,-1.3],[8.5,1.5]],"v":[[25.65,1.6],[4.65,29.5],[3.951,29.3],[-3.749,29.3],[-4.45,29.5],[-25.55,1.6],[-13.05,-16.6],[-3.85,-15.5],[-0.749,-14.7],[0.45,-16.9],[-8.05,-20.3],[-11.35,-30.3],[-1.35,-27],[1.951,-19.7],[7.451,-29.9],[8.85,-30.3],[9.251,-28.9],[1.65,-14.7],[3.85,-15.4],[13.05,-16.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.986887276173,0.380120933056,0.411817699671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.125,50.785],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"a1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":29,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.732},"o":{"x":0.185,"y":0.298},"n":"0p833_0p732_0p185_0p298","t":0,"s":[59.985,118.973,0],"e":[82.985,26.973,0],"to":[-19.4846038818359,-32.9728088378906,0],"ti":[-31.0153961181641,26.4728088378906,0]},{"i":{"x":0.833,"y":0.675},"o":{"x":0.185,"y":0.361},"n":"0p833_0p675_0p185_0p361","t":5,"s":[82.985,26.973,0],"e":[162.985,24.473,0],"to":[31.0153961181641,-26.4728088378906,0],"ti":[-21.0153961181641,-9.52719116210938,0]},{"i":{"x":0.833,"y":0.572},"o":{"x":0.185,"y":0.475},"n":"0p833_0p572_0p185_0p475","t":10,"s":[162.985,24.473,0],"e":[203.985,72.973,0],"to":[21.0153961181641,9.52719116210938,0],"ti":[-4.51539611816406,-16.5271911621094,0]},{"i":{"x":0.833,"y":0.556},"o":{"x":0.185,"y":0.493},"n":"0p833_0p556_0p185_0p493","t":15,"s":[203.985,72.973,0],"e":[165.485,24.973,0],"to":[-10.9846038818359,-31.4728088378906,0],"ti":[7.73460388183594,4.09780883789062,0]},{"i":{"x":0.833,"y":0.67},"o":{"x":0.185,"y":0.366},"n":"0p833_0p67_0p185_0p366","t":20,"s":[165.485,24.973,0],"e":[85.985,24.223,0],"to":[-51.1335983276367,-27.8870468139648,0],"ti":[2.48460388183594,-2.02719116210938,0]},{"i":{"x":0.833,"y":0.702},"o":{"x":0.185,"y":0.331},"n":"0p833_0p702_0p185_0p331","t":25,"s":[85.985,24.223,0],"e":[53.485,105.723,0],"to":[-50.724681854248,41.3863258361816,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.677},"o":{"x":0.167,"y":0.323},"n":"0p833_0p677_0p167_0p323","t":30,"s":[53.485,105.723,0],"e":[82.985,26.973,0],"to":[0,0,0],"ti":[-31.0153961181641,26.4728088378906,0]},{"i":{"x":0.833,"y":0.675},"o":{"x":0.185,"y":0.361},"n":"0p833_0p675_0p185_0p361","t":35,"s":[82.985,26.973,0],"e":[162.985,24.473,0],"to":[31.0153961181641,-26.4728088378906,0],"ti":[-21.0153961181641,-9.52719116210938,0]},{"i":{"x":0.833,"y":0.753},"o":{"x":0.185,"y":0.274},"n":"0p833_0p753_0p185_0p274","t":40,"s":[162.985,24.473,0],"e":[219.985,140.473,0],"to":[21.0153961181641,9.52719116210938,0],"ti":[-15.0153961181641,-99.0271911621094,0]},{"t":46.0000018736184}],"ix":2},"a":{"a":0,"k":[49.985,49.973,0],"ix":1},"s":{"a":0,"k":[-50.014,50.014,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.5,-8.4],[8.4,1.6],[0.199,0.1],[2.599,-0.9],[0.201,0],[1.6,8.5],[-8.5,1.6],[-2.8,-1.2],[0,0],[0,0],[2.9,2.9],[0,0],[-4.2,-4.1],[-0.2,-2.1],[0,0],[-0.5,-0.3],[0.299,-0.5],[0,0],[-0.7,0.3],[-3.2,-0.6]],"o":[[-1.6,8.5],[-0.3,0],[-2.5,-0.9],[-0.201,0.1],[-8.5,1.6],[-1.6,-8.5],[3.2,-0.6],[1,0.5],[0,0],[-2,0],[-4.199,-4.2],[0,0],[2.3,2.3],[0,0],[0.3,-0.5],[0.5,0.3],[0,0],[0.801,-0.1],[2.8,-1.3],[8.5,1.5]],"v":[[25.65,1.6],[4.65,29.5],[3.951,29.3],[-3.749,29.3],[-4.45,29.5],[-25.55,1.6],[-13.05,-16.6],[-3.85,-15.5],[-0.749,-14.7],[0.45,-16.9],[-8.05,-20.3],[-11.35,-30.3],[-1.35,-27],[1.951,-19.7],[7.451,-29.9],[8.85,-30.3],[9.251,-28.9],[1.65,-14.7],[3.85,-15.4],[13.05,-16.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.380392163992,0.411764711142,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.366,50.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"teeth Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.312,41.66,0],"ix":2},"a":{"a":0,"k":[3.718,3.618,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.646,-2.841],[2.087,-2.018],[-0.571,2.841],[-2.087,2.392]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.1,4.146],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.338,-2.982],[1.673,-2.18],[-0.039,2.982],[-1.673,2.673]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.923,3.232],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"right eye Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[42.538,16.724,0],"e":[47.764,16.011,0],"to":[0.87093943357468,-0.11872462183237,0],"ti":[-0.05034303665161,-1.83084356784821,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[47.764,16.011,0],"e":[41.775,15.029,0],"to":[0.01295710168779,0.4712156355381,0],"ti":[3.24095487594604,-0.21771761775017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[41.775,15.029,0],"e":[35.94,19.224,0],"to":[-2.2777636051178,0.15301331877708,0],"ti":[0.64945775270462,-2.75669002532959,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19,"s":[35.94,19.224,0],"e":[37.155,29.03,0],"to":[-1.57354974746704,6.67909383773804,0],"ti":[0.77238988876343,-1.01815032958984,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[37.155,29.03,0],"e":[38.689,17.956,0],"to":[-0.66211730241776,0.87279099225998,0],"ti":[-4.08277225494385,3.6608738899231,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30.5,"s":[38.689,17.956,0],"e":[46.673,19.389,0],"to":[4.08277225494385,-3.6608738899231,0],"ti":[0,0,0]},{"t":42.0000017106951}],"ix":2},"a":{"a":0,"k":[2.909,2.909,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[110,110,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[100,100,100],"e":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":22,"s":[110,110,100],"e":[100,100,100]},{"t":42.0000017106951}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.86,-0.994],[0.994,-0.859],[0.86,0.994],[-0.994,0.86]],"o":[[0.86,0.994],[-0.993,0.86],[-0.86,-0.993],[0.993,-0.859]],"v":[[1.799,-1.557],[1.556,1.798],[-1.799,1.556],[-1.556,-1.799]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349000010771,0.349000010771,0.349000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.909,2.909],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"left eye Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[20.352,12.353,0],"e":[23.754,15.218,0],"to":[0.75799149274826,-0.13729524612427,0],"ti":[1.20316421985626,-1.69811820983887,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[23.754,15.218,0],"e":[14.162,14.634,0],"to":[-0.43755486607552,0.61755484342575,0],"ti":[5.72465705871582,-5.02380609512329,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18.75,"s":[14.162,14.634,0],"e":[14.48,23.107,0],"to":[-5.72465705871582,5.02380609512329,0],"ti":[1.21317493915558,0.42704656720161,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[14.48,23.107,0],"e":[14.053,13.997,0],"to":[-1.21317493915558,-0.42704656720161,0],"ti":[-4.91244649887085,5.34288120269775,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":29.75,"s":[14.053,13.997,0],"e":[23.538,15.395,0],"to":[4.91244649887085,-5.34288120269775,0],"ti":[-1.43252968788147,0.25947457551956,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[23.538,15.395,0],"e":[20.161,13.089,0],"to":[1.894491314888,-0.34314984083176,0],"ti":[-1.51578795909882,0.27455517649651,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[2.909,2.909,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[110,110,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[100,100,100],"e":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":22,"s":[110,110,100],"e":[100,100,100]},{"t":42.0000017106951}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.86,-0.994],[0.994,-0.859],[0.86,0.993],[-0.994,0.86]],"o":[[0.86,0.994],[-0.993,0.86],[-0.86,-0.993],[0.993,-0.859]],"v":[[1.799,-1.557],[1.556,1.798],[-1.799,1.556],[-1.556,-1.799]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349000010771,0.349000010771,0.349000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.909,2.909],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"right blush Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.908,34.526,0],"ix":2},"a":{"a":0,"k":[4.844,4.952,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.811,2.618],[-2.549,-0.789],[0.811,-2.618],[2.549,0.79]],"o":[[0.811,-2.618],[2.548,0.79],[-0.811,2.619],[-2.548,-0.789]],"v":[[-4.615,-1.43],[1.469,-4.742],[4.615,1.428],[-1.469,4.739]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.430999995213,0.430999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.844,4.952],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"left blush Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[37.356,40.818,0],"ix":2},"a":{"a":0,"k":[5.879,5.991,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.756,-1.649],[1.716,2.869],[-2.756,1.649],[-1.716,-2.868]],"o":[[-2.756,1.649],[-1.716,-2.868],[2.756,-1.649],[1.716,2.868]],"v":[[3.107,5.193],[-4.99,2.986],[-3.107,-5.192],[4.99,-2.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.430999995213,0.430999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.879,5.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"glass leg Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-42],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[-42],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[58.822,31.197,0],"e":[64.21,21.554,0],"to":[0.89794141054153,-1.60704386234283,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[64.21,21.554,0],"e":[58.822,31.197,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[58.822,31.197,0],"e":[64.21,21.554,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[64.21,21.554,0],"e":[58.822,31.197,0],"to":[0,0,0],"ti":[0.89794141054153,-1.60704386234283,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[10.014,11.241,0],"ix":1},"s":{"a":0,"k":[104.675,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[4.892,8.892],[7.945,5.839],[-4.892,-8.892]],"c":true}],"e":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[1.191,4.186],[4.147,0.904],[-4.892,-8.892]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[1.191,4.186],[4.147,0.904],[-4.892,-8.892]],"c":true}],"e":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[4.892,8.892],[7.945,5.839],[-4.892,-8.892]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[4.892,8.892],[7.945,5.839],[-4.892,-8.892]],"c":true}],"e":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[1.191,4.186],[4.147,0.904],[-4.892,-8.892]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[1.191,4.186],[4.147,0.904],[-4.892,-8.892]],"c":true}],"e":[{"i":[[-1.819,-2.087],[-4.279,-4.91],[1.819,2.088],[4.279,4.91]],"o":[[4.278,4.91],[1.828,2.099],[-4.28,-4.91],[-1.829,-2.099]],"v":[[-7.945,-5.839],[4.892,8.892],[7.945,5.839],[-4.892,-8.892]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.313999998803,0.365000017952,0.976000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[10.014,11.241],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"glass mid","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.189,19.107,0],"ix":2},"a":{"a":0,"k":[12.089,10.362,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.454,-3.454]],"o":[[0,0],[0,0]],"v":[[-3.454,0],[3.454,1.727]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.313999998803,0.365000017952,0.976000019148,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.454,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[12.089,10.362],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"right glass Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[9],"e":[0]},{"t":22.0000008960784}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[42.247,23.795,0],"e":[42.247,19.795,0],"to":[0,-0.66666668653488,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[42.247,19.795,0],"e":[42.247,23.795,0],"to":[0,0,0],"ti":[0,-0.66666668653488,0]},{"t":22.0000008960784}],"ix":2},"a":{"a":0,"k":[18.398,18.804,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.726,-1.893],[3.751,3.273],[-3.663,4.242],[-3.679,-3.355],[-0.074,-2.34]],"o":[[-3.452,3.786],[-3.725,-3.252],[3.349,-3.877],[1.839,1.677],[0.074,2.339]],"v":[[7.221,6.114],[-5.691,6.896],[-6.101,-6.033],[6.811,-6.814],[9.689,-0.512]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.313999998803,0.365000017952,0.976000019148,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.454,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[18.398,18.804],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"right ear Outlines","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-14],"e":[-14]},{"t":42.0000017106951}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[68.438,22.11,0],"e":[59.029,9.437,0],"to":[-1.56817352771759,-2.11210107803345,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[59.029,9.437,0],"e":[68.438,22.11,0],"to":[0,0,0],"ti":[-0.69228959083557,-0.1520429700613,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[68.438,22.11,0],"e":[63.183,10.349,0],"to":[0.69228959083557,0.1520429700613,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[63.183,10.349,0],"e":[68.438,22.11,0],"to":[0,0,0],"ti":[-0.87588393688202,-1.96005809307098,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[7.277,8.167,0],"ix":1},"s":{"a":0,"k":[87.794,95.636,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.205,"y":1},"o":{"x":1,"y":0},"n":"0p205_1_1_0","t":0,"s":[{"i":[[0.373,-0.494],[-4.647,-2.786],[-0.182,3.144],[3.477,0]],"o":[[-2.483,3.287],[1.628,0.976],[0.235,-4.094],[-1.392,0]],"v":[[-4.544,-7.153],[2.088,4.966],[8.16,-3.175],[-1.665,-7.917]],"c":true}],"e":[{"i":[[0.373,-0.494],[-4.647,-2.786],[-0.182,3.144],[3.477,0]],"o":[[-2.483,3.287],[1.628,0.976],[0.235,-4.094],[-1.392,0]],"v":[[-4.544,-7.153],[2.088,4.966],[8.16,-3.175],[-1.665,-7.917]],"c":true}]},{"i":{"x":1,"y":0.998},"o":{"x":1,"y":0},"n":"1_0p998_1_0","t":18,"s":[{"i":[[0.373,-0.494],[-4.647,-2.786],[-0.182,3.144],[3.477,0]],"o":[[-2.483,3.287],[1.628,0.976],[0.235,-4.094],[-1.392,0]],"v":[[-4.544,-7.153],[2.088,4.966],[8.16,-3.175],[-1.665,-7.917]],"c":true}],"e":[{"i":[[0.373,-0.494],[-4.647,-2.786],[-0.182,3.144],[3.477,0]],"o":[[-2.483,3.287],[1.628,0.976],[0.235,-4.094],[-1.392,0]],"v":[[-4.544,-7.153],[2.088,4.966],[8.16,-3.175],[-1.665,-7.917]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.052,"y":1},"n":"0_1_0p052_1","t":23,"s":[{"i":[[0.373,-0.494],[-4.647,-2.786],[-0.182,3.144],[3.477,0]],"o":[[-2.483,3.287],[1.628,0.976],[0.235,-4.094],[-1.392,0]],"v":[[-4.544,-7.153],[2.088,4.966],[8.16,-3.175],[-1.665,-7.917]],"c":true}],"e":[{"i":[[0.373,-0.494],[-4.647,-2.786],[-0.182,3.144],[3.477,0]],"o":[[-2.483,3.287],[1.628,0.976],[0.235,-4.094],[-1.392,0]],"v":[[-4.544,-7.153],[2.088,4.966],[8.16,-3.175],[-1.665,-7.917]],"c":true}]},{"t":34.0000013848484}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0.115,0.286],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[99.454,101.055],"ix":3},"r":{"a":0,"k":-1.33,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.525490224361,0.537254929543,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.541,7.827],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[104.62,100.21],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"left glass Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-24]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-24],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[-3],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[113.337,79.663,0],"e":[86.337,67.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[86.337,67.663,0],"e":[113.337,79.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[113.337,79.663,0],"e":[105.337,60.663,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[105.337,60.663,0],"e":[113.337,79.663,0],"to":[0,0,0],"ti":[0,0,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[18.693,18.548,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[4.149,-2.624],[2.546,4.026],[-4.149,2.623],[-2.546,-4.025]],"o":[[-4.149,2.624],[-2.546,-4.025],[4.149,-2.624],[2.546,4.026]],"v":[[4.611,7.289],[-7.512,4.751],[-4.609,-7.29],[7.512,-4.752]],"c":true}],"e":[{"i":[[4.149,-2.624],[2.546,4.026],[-4.149,2.623],[-2.546,-4.025]],"o":[[-4.149,2.624],[-2.546,-4.025],[4.149,-2.624],[2.546,4.026]],"v":[[4.611,7.289],[-7.512,4.751],[-4.609,-7.29],[7.512,-4.752]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.313999998803,0.365000017952,0.976000019148,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.454,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[18.693,18.548],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"right leg Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-21],"e":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[2],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[137.234,263.001,0],"e":[149.234,229.001,0],"to":[2,-5.66666650772095,0],"ti":[-1.5,-0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[149.234,229.001,0],"e":[146.234,266.001,0],"to":[1.5,0.5,0],"ti":[3.5,-0.16666667163372,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[146.234,266.001,0],"e":[128.234,230.001,0],"to":[-3.5,0.16666667163372,0],"ti":[1.5,0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[128.234,230.001,0],"e":[137.234,263.001,0],"to":[-1.5,-0.5,0],"ti":[-1.5,-5.5,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[6.404,11.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[1.203,-6.24],[-7.402,0.838],[1.536,2.127],[0,0]],"o":[[-1.039,5.389],[4.747,-0.538],[0,0],[0,0]],"v":[[-10.659,2.429],[-9.691,18.566],[16.208,-23.499],[-4.812,-19.381]],"c":true}],"e":[{"i":[[3.453,-0.562],[-9.391,2.685],[1.536,2.127],[0,0]],"o":[[-5.722,0.931],[9.444,-2.7],[0,0],[0,0]],"v":[[-8.909,-9.07],[-7.939,-2.692],[7.715,-15.478],[-4.811,-19.381]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[3.453,-0.562],[-9.391,2.685],[1.536,2.127],[0,0]],"o":[[-5.722,0.931],[9.444,-2.7],[0,0],[0,0]],"v":[[-8.909,-9.07],[-7.939,-2.692],[7.715,-15.478],[-4.811,-19.381]],"c":true}],"e":[{"i":[[3.453,-0.562],[-9.391,2.685],[1.536,2.127],[0,0]],"o":[[-5.722,0.931],[9.444,-2.7],[0,0],[0,0]],"v":[[-8.909,-9.07],[-7.939,-2.692],[7.715,-15.478],[-4.811,-19.381]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[3.453,-0.562],[-9.391,2.685],[1.536,2.127],[0,0]],"o":[[-5.722,0.931],[9.444,-2.7],[0,0],[0,0]],"v":[[-8.909,-9.07],[-7.939,-2.692],[7.715,-15.478],[-4.811,-19.381]],"c":true}],"e":[{"i":[[3.453,-0.562],[-9.391,2.685],[1.536,2.127],[0,0]],"o":[[-5.722,0.931],[9.444,-2.7],[0,0],[0,0]],"v":[[-8.909,-9.07],[-7.939,-2.692],[7.715,-15.478],[-4.811,-19.381]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[3.453,-0.562],[-9.391,2.685],[1.536,2.127],[0,0]],"o":[[-5.722,0.931],[9.444,-2.7],[0,0],[0,0]],"v":[[-8.909,-9.07],[-7.939,-2.692],[7.715,-15.478],[-4.811,-19.381]],"c":true}],"e":[{"i":[[1.203,-6.24],[-7.402,0.838],[1.536,2.127],[0,0]],"o":[[-1.039,5.389],[4.747,-0.538],[0,0],[0,0]],"v":[[-10.659,2.43],[-11.187,28.112],[16.208,-23.499],[-4.811,-19.381]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,99.949],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470589638,0.57647061348,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.625,19.807],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.231,99.569],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"left leg Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-7]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-7],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[5],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[114.346,258.893,0],"e":[119.596,226.893,0],"to":[0.875,-5.33333349227905,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[119.596,226.893,0],"e":[119.846,266.393,0],"to":[0,0,0],"ti":[0.46127620339394,-2.81158828735352,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[119.846,266.393,0],"e":[97.596,219.893,0],"to":[-0.875,5.33333349227905,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[97.596,219.893,0],"e":[114.346,258.893,0],"to":[0,0,0],"ti":[-2.79166674613953,-6.5,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[16.021,16.585,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-12.369,-1.388],[2.77,3.145],[0,1.393],[0,0],[0,0]],"o":[[10.544,1.183],[-1.665,-1.89],[0,-7.65],[0,0],[0,0]],"v":[[4.143,8.543],[10.207,3.82],[6.493,-1.492],[0.929,-14.48],[-15.771,-16.335]],"c":true}],"e":[{"i":[[-11.149,1.063],[4.196,6.676],[0,0],[0,0],[0,0]],"o":[[4.05,-0.386],[-2.99,-4.757],[0,0],[0,0],[0,0]],"v":[[9.806,8.474],[5.06,-1.478],[2.993,-11.242],[0.928,-14.48],[-16.343,-15.672]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[-11.149,1.063],[4.196,6.676],[0,0],[0,0],[0,0]],"o":[[4.05,-0.386],[-2.99,-4.757],[0,0],[0,0],[0,0]],"v":[[9.806,8.474],[5.06,-1.478],[2.993,-11.242],[0.928,-14.48],[-16.343,-15.672]],"c":true}],"e":[{"i":[[-9.87,-7.218],[0.816,5.06],[0,1.393],[0,0],[0,0]],"o":[[5.454,3.988],[-0.463,-2.868],[0,-7.65],[0,0],[0,0]],"v":[[8.992,22.67],[9.912,7.963],[6.01,-5.865],[0.929,-14.48],[-19.64,-21.193]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[-9.87,-7.218],[0.816,5.06],[0,1.393],[0,0],[0,0]],"o":[[5.454,3.988],[-0.463,-2.868],[0,-7.65],[0,0],[0,0]],"v":[[8.992,22.67],[9.912,7.963],[6.01,-5.865],[0.929,-14.48],[-19.64,-21.193]],"c":true}],"e":[{"i":[[-11.149,1.063],[4.196,6.676],[0,0],[0,0],[0,0]],"o":[[4.05,-0.386],[-2.99,-4.757],[0,0],[0,0],[0,0]],"v":[[9.806,8.474],[5.06,-1.478],[2.993,-11.242],[0.928,-14.48],[-16.343,-15.672]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[-11.149,1.063],[4.196,6.676],[0,0],[0,0],[0,0]],"o":[[4.05,-0.386],[-2.99,-4.757],[0,0],[0,0],[0,0]],"v":[[9.806,8.474],[5.06,-1.478],[2.993,-11.242],[0.928,-14.48],[-16.343,-15.672]],"c":true}],"e":[{"i":[[-12.369,-1.388],[2.77,3.145],[0,1.393],[0,0],[0,0]],"o":[[10.544,1.183],[-1.665,-1.89],[0,-7.65],[0,0],[0,0]],"v":[[4.143,8.543],[10.207,3.82],[6.493,-1.492],[0.929,-14.48],[-15.771,-16.335]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470589638,0.57647061348,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.083,16.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[103.391,102.914],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[14]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[14],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[131.075,163.508,0],"e":[125.075,144.508,0],"to":[-1,-3.16666674613953,0],"ti":[0.16666667163372,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[125.075,144.508,0],"e":[130.075,163.508,0],"to":[-0.16666667163372,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[130.075,163.508,0],"e":[125.075,144.508,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[125.075,144.508,0],"e":[130.075,163.508,0],"to":[0,0,0],"ti":[-0.83333331346512,-3.16666674613953,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[57.909,101.248,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[3.119,14.05],[1.443,14.3],[-2.17,13.017],[24.121,3.711],[1.855,-5.566],[0,0],[3.711,-9.276],[-0.497,-4.769],[0.927,-0.928],[1.074,-2.294],[1.392,-5.65],[-12.598,-18.435],[-23.003,15.653]],"o":[[-3.406,-15.344],[-0.176,-1.741],[1.856,-11.133],[-24.12,-3.711],[0,0],[0,0],[-0.436,1.09],[0.861,8.25],[-0.637,0.638],[-2.503,5.341],[-5.042,20.471],[16.307,23.863],[20.023,-13.625]],"v":[[114.214,133.19],[100.314,82.432],[100.948,46.636],[74.972,3.961],[34.153,24.371],[32.297,29.937],[21.165,41.069],[19.24,50.728],[25.804,69.828],[11.164,95.141],[5.292,111.681],[15.526,172.377],[93.31,188.365]],"c":true}],"e":[{"i":[[2.064,8.136],[5.519,9.808],[2.437,12.97],[31.861,-4.221],[0.18,-13.631],[0,0],[1.918,-5.829],[-4.252,-6.457],[0.927,-0.928],[6.669,-10.901],[0.041,-8.441],[-15.193,-18.637],[-23.788,14.432]],"o":[[-3.865,-15.235],[-0.858,-1.525],[-4.115,-21.896],[-12.162,1.611],[0,0],[0,0],[-0.367,1.115],[6.593,10.012],[-0.637,0.638],[-4.793,7.835],[-0.091,18.721],[14.406,17.672],[31.523,-19.125]],"v":[[116.714,116.69],[100.314,82.932],[88.948,43.136],[42.472,-1.539],[16.153,25.371],[16.797,38.187],[11.665,44.569],[11.74,60.728],[23.804,72.328],[12.164,86.641],[4.292,113.681],[19.026,162.377],[92.31,178.365]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[2.064,8.136],[5.519,9.808],[2.437,12.97],[31.861,-4.221],[0.18,-13.631],[0,0],[1.918,-5.829],[-4.252,-6.457],[0.927,-0.928],[6.669,-10.901],[0.041,-8.441],[-15.193,-18.637],[-23.788,14.432]],"o":[[-3.865,-15.235],[-0.858,-1.525],[-4.115,-21.896],[-12.162,1.611],[0,0],[0,0],[-0.367,1.115],[6.593,10.012],[-0.637,0.638],[-4.793,7.835],[-0.091,18.721],[14.406,17.672],[31.523,-19.125]],"v":[[116.714,116.69],[100.314,82.932],[88.948,43.136],[42.472,-1.539],[16.153,25.371],[16.797,38.187],[11.665,44.569],[11.74,60.728],[23.804,72.328],[12.164,86.641],[4.292,113.681],[19.026,162.377],[92.31,178.365]],"c":true}],"e":[{"i":[[3.119,14.05],[1.443,14.3],[-2.17,13.017],[24.121,3.711],[1.855,-5.566],[0,0],[3.711,-9.276],[-0.497,-4.769],[0.927,-0.928],[1.074,-2.294],[1.392,-5.65],[-12.598,-18.435],[-23.003,15.653]],"o":[[-3.406,-15.344],[-0.176,-1.741],[1.856,-11.133],[-24.12,-3.711],[0,0],[0,0],[-0.436,1.09],[0.861,8.25],[-0.637,0.638],[-2.503,5.341],[-5.042,20.471],[16.307,23.863],[20.023,-13.625]],"v":[[114.214,133.19],[100.314,82.432],[100.948,46.636],[74.972,3.961],[34.153,24.371],[32.297,29.937],[21.165,41.069],[19.24,50.728],[25.804,69.828],[11.164,95.141],[5.292,111.681],[15.526,172.377],[93.31,188.365]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[3.119,14.05],[1.443,14.3],[-2.17,13.017],[24.121,3.711],[1.855,-5.566],[0,0],[3.711,-9.276],[-0.497,-4.769],[0.927,-0.928],[1.074,-2.294],[1.392,-5.65],[-12.598,-18.435],[-23.003,15.653]],"o":[[-3.406,-15.344],[-0.176,-1.741],[1.856,-11.133],[-24.12,-3.711],[0,0],[0,0],[-0.436,1.09],[0.861,8.25],[-0.637,0.638],[-2.503,5.341],[-5.042,20.471],[16.307,23.863],[20.023,-13.625]],"v":[[114.214,133.19],[100.314,82.432],[100.948,46.636],[74.972,3.961],[34.153,24.371],[32.297,29.937],[21.165,41.069],[19.24,50.728],[25.804,69.828],[11.164,95.141],[5.292,111.681],[15.526,172.377],[93.31,188.365]],"c":true}],"e":[{"i":[[2.064,8.136],[5.519,9.808],[2.437,12.97],[31.861,-4.221],[0.18,-13.631],[0,0],[1.918,-5.829],[-4.252,-6.457],[0.927,-0.928],[6.669,-10.901],[0.041,-8.441],[-15.193,-18.637],[-23.788,14.432]],"o":[[-3.865,-15.235],[-0.858,-1.525],[-4.115,-21.896],[-12.162,1.611],[0,0],[0,0],[-0.367,1.115],[6.593,10.012],[-0.637,0.638],[-4.793,7.835],[-0.091,18.721],[14.406,17.672],[31.523,-19.125]],"v":[[116.714,116.69],[100.314,82.932],[88.948,43.136],[42.472,-1.539],[16.153,25.371],[16.797,38.187],[11.665,44.569],[11.74,60.728],[23.804,72.328],[12.164,86.641],[4.292,113.681],[19.026,162.377],[92.31,178.365]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[2.064,8.136],[5.519,9.808],[2.437,12.97],[31.861,-4.221],[0.18,-13.631],[0,0],[1.918,-5.829],[-4.252,-6.457],[0.927,-0.928],[6.669,-10.901],[0.041,-8.441],[-15.193,-18.637],[-23.788,14.432]],"o":[[-3.865,-15.235],[-0.858,-1.525],[-4.115,-21.896],[-12.162,1.611],[0,0],[0,0],[-0.367,1.115],[6.593,10.012],[-0.637,0.638],[-4.793,7.835],[-0.091,18.721],[14.406,17.672],[31.523,-19.125]],"v":[[116.714,116.69],[100.314,82.932],[88.948,43.136],[42.472,-1.539],[16.153,25.371],[16.797,38.187],[11.665,44.569],[11.74,60.728],[23.804,72.328],[12.164,86.641],[4.292,113.681],[19.026,162.377],[92.31,178.365]],"c":true}],"e":[{"i":[[3.119,14.05],[1.443,14.3],[-2.17,13.017],[24.121,3.711],[1.855,-5.566],[0,0],[3.711,-9.276],[-0.497,-4.769],[0.927,-0.928],[1.074,-2.294],[1.392,-5.65],[-12.598,-18.435],[-23.003,15.653]],"o":[[-3.406,-15.344],[-0.176,-1.741],[1.856,-11.133],[-24.12,-3.711],[0,0],[0,0],[-0.436,1.09],[0.861,8.25],[-0.637,0.638],[-2.503,5.341],[-5.042,20.471],[16.307,23.863],[20.023,-13.625]],"v":[[114.214,133.19],[100.314,82.432],[100.948,46.636],[74.972,3.961],[34.153,24.371],[32.297,29.937],[21.165,41.069],[19.24,50.728],[25.804,69.828],[11.164,95.141],[5.292,111.681],[15.526,172.377],[93.31,188.365]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.57599995931,0.57599995931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"left ear","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[47.905,119.544,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[76.687,99.836,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[13,-4.5],[0,0],[0,0]],"o":[[-10.459,3.62],[0,0],[0,0]],"v":[[-8,-120.5],[-19.5,-109.5],[1.932,-112.016]],"c":true}],"e":[{"i":[[10.44,-3.65],[0,0],[0,0]],"o":[[-10.448,3.653],[0,0],[0,0]],"v":[[-26.889,-117.04],[-18.018,-107.449],[-7.084,-114.234]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[10.44,-3.65],[0,0],[0,0]],"o":[[-10.448,3.653],[0,0],[0,0]],"v":[[-26.889,-117.04],[-18.018,-107.449],[-7.084,-114.234]],"c":true}],"e":[{"i":[[14.183,-1.941],[0,0],[0,0]],"o":[[-18.722,2.562],[0,0],[0,0]],"v":[[-3.16,-120.237],[-19.5,-109.5],[1.932,-112.016]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[14.183,-1.941],[0,0],[0,0]],"o":[[-18.722,2.562],[0,0],[0,0]],"v":[[-3.16,-120.237],[-19.5,-109.5],[1.932,-112.016]],"c":true}],"e":[{"i":[[10.932,1.606],[0,0],[0,0]],"o":[[-21.367,-3.138],[0,0],[0,0]],"v":[[3.658,-121.26],[-24.796,-110.572],[-6.371,-112.546]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[10.932,1.606],[0,0],[0,0]],"o":[[-21.367,-3.138],[0,0],[0,0]],"v":[[3.658,-121.26],[-24.796,-110.572],[-6.371,-112.546]],"c":true}],"e":[{"i":[[13,-4.5],[0,0],[0,0]],"o":[[-10.459,3.62],[0,0],[0,0]],"v":[[-8,-120.5],[-19.5,-109.5],[1.932,-112.016]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941179276,0.509803950787,0.501960813999,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[101.015,100.81],"ix":3},"r":{"a":0,"k":0.022,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"right arm Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[171.186,127.399,0],"ix":2},"a":{"a":0,"k":[52.548,63.288,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-11.104,-11.125],[-10.566,6.314],[-2.469,1.867],[-0.826,0.524],[0.43,1.436],[0.92,0.748],[2.738,-0.091],[2.379,-0.189],[7.807,0.614],[4.254,0.971]],"o":[[10.295,-6.33],[3.554,-2.124],[0.935,-0.707],[4.367,-2.771],[-0.501,-1.673],[-1.395,-1.134],[-1.711,0.057],[-4.64,0.37],[-18.768,-1.478],[8.543,11.558]],"v":[[-19.199,20.792],[15.781,0.985],[24.956,-5.034],[33.911,-2.903],[32.779,-11.406],[28.355,-15.942],[22.268,-17.235],[16.161,-16.8],[-2.301,-16.674],[-32.458,-20.792]],"c":true}],"e":[{"i":[[-11.104,-11.125],[-15.5,5.99],[-2.532,1.977],[-0.818,0.548],[1.315,0.658],[2.733,-1.47],[2.307,-0.855],[2.425,-0.21],[7.873,0.585],[4.207,1.23]],"o":[[10.722,-6.116],[4.08,-1.577],[0.941,-0.73],[4.189,-2.716],[-6.288,-3.145],[-1.576,0.848],[-1.622,0.601],[-4.686,0.403],[-18.771,-1.407],[7.528,11.882]],"v":[[-20.519,21.393],[8.649,4.112],[26.044,-4.509],[33.858,-10.09],[38.489,-23.076],[26.709,-19.924],[22.363,-17.256],[13.134,-18.87],[-8.198,-20.59],[-32.653,-20.553]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":1,"s":[{"i":[[-11.104,-11.125],[-15.5,5.99],[-2.532,1.977],[-0.818,0.548],[1.315,0.658],[2.733,-1.47],[2.307,-0.855],[2.425,-0.21],[7.873,0.585],[4.207,1.23]],"o":[[10.722,-6.116],[4.08,-1.577],[0.941,-0.73],[4.189,-2.716],[-6.288,-3.145],[-1.576,0.848],[-1.622,0.601],[-4.686,0.403],[-18.771,-1.407],[7.528,11.882]],"v":[[-20.519,21.393],[8.649,4.112],[26.044,-4.509],[33.858,-10.09],[38.489,-23.076],[26.709,-19.924],[22.363,-17.256],[13.134,-18.87],[-8.198,-20.59],[-32.653,-20.553]],"c":true}],"e":[{"i":[[-11.104,-11.125],[-14.505,10.067],[-3.542,3.728],[-1.091,0.379],[0.288,0.961],[0.755,0.802],[2.104,0.089],[3.158,-0.545],[8.937,0.129],[3.463,5.376]],"o":[[17.56,-2.697],[6.68,-4.636],[1.042,-1.097],[2.469,-0.858],[-0.436,-1.457],[-1.146,-1.217],[-2.026,-0.086],[-5.416,0.935],[-18.824,-0.272],[-8.717,17.058]],"v":[[-41.654,31.01],[10.463,7.876],[26.189,-5.06],[28.786,-8.112],[33.299,-14.684],[31.518,-23.387],[24.713,-25.943],[16.161,-16.8],[-8.385,-13.15],[-35.767,-16.742]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[-11.104,-11.125],[-14.505,10.067],[-3.542,3.728],[-1.091,0.379],[0.288,0.961],[0.755,0.802],[2.104,0.089],[3.158,-0.545],[8.937,0.129],[3.463,5.376]],"o":[[17.56,-2.697],[6.68,-4.636],[1.042,-1.097],[2.469,-0.858],[-0.436,-1.457],[-1.146,-1.217],[-2.026,-0.086],[-5.416,0.935],[-18.824,-0.272],[-8.717,17.058]],"v":[[-41.654,31.01],[10.463,7.876],[26.189,-5.06],[28.786,-8.112],[33.299,-14.684],[31.518,-23.387],[24.713,-25.943],[16.161,-16.8],[-8.385,-13.15],[-35.767,-16.742]],"c":true}],"e":[{"i":[[-11.104,-11.125],[-9.387,5.292],[-3.92,2.822],[-0.773,0.752],[-0.73,0.992],[5.019,-0.422],[2.101,0.07],[3.195,-0.254],[7.601,1.883],[4.254,0.971]],"o":[[9.446,-0.926],[6.596,-3.719],[1.154,-0.831],[1.526,-1.486],[1.973,-2.682],[-1.59,0.134],[-2.024,-0.067],[-4.64,0.37],[-17.269,-4.278],[8.543,11.558]],"v":[[-19.199,20.792],[9.216,3.798],[25.656,-6.016],[28.563,-8.391],[35.362,-14.602],[32.833,-21.042],[23.922,-17.241],[16.161,-16.8],[-4.885,-17.657],[-32.458,-20.792]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[-11.104,-11.125],[-9.387,5.292],[-3.92,2.822],[-0.773,0.752],[-0.73,0.992],[5.019,-0.422],[2.101,0.07],[3.195,-0.254],[7.601,1.883],[4.254,0.971]],"o":[[9.446,-0.926],[6.596,-3.719],[1.154,-0.831],[1.526,-1.486],[1.973,-2.682],[-1.59,0.134],[-2.024,-0.067],[-4.64,0.37],[-17.269,-4.278],[8.543,11.558]],"v":[[-19.199,20.792],[9.216,3.798],[25.656,-6.016],[28.563,-8.391],[35.362,-14.602],[32.833,-21.042],[23.922,-17.241],[16.161,-16.8],[-4.885,-17.657],[-32.458,-20.792]],"c":true}],"e":[{"i":[[-11.104,-11.125],[-10.566,6.314],[-2.638,2.383],[-0.503,0.637],[-0.393,0.923],[2.901,0.041],[2.651,-0.472],[3.195,-0.254],[7.807,0.614],[4.254,0.971]],"o":[[10.295,-6.33],[4.866,-2.908],[0.776,-0.701],[0.993,-1.259],[1.852,-4.349],[-1.596,-0.023],[-1.993,0.355],[-4.64,0.37],[-18.768,-1.478],[8.543,11.558]],"v":[[-19.199,20.792],[15.781,0.985],[27.397,-7.033],[29.325,-9.043],[32.427,-12.909],[31.801,-24.024],[23.922,-17.241],[16.161,-16.8],[-2.301,-16.674],[-32.458,-20.792]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[-11.104,-11.125],[-10.566,6.314],[-2.638,2.383],[-0.503,0.637],[-0.393,0.923],[2.901,0.041],[2.651,-0.472],[3.195,-0.254],[7.807,0.614],[4.254,0.971]],"o":[[10.295,-6.33],[4.866,-2.908],[0.776,-0.701],[0.993,-1.259],[1.852,-4.349],[-1.596,-0.023],[-1.993,0.355],[-4.64,0.37],[-18.768,-1.478],[8.543,11.558]],"v":[[-19.199,20.792],[15.781,0.985],[27.397,-7.033],[29.325,-9.043],[32.427,-12.909],[31.801,-24.024],[23.922,-17.241],[16.161,-16.8],[-2.301,-16.674],[-32.458,-20.792]],"c":true}],"e":[{"i":[[-11.104,-11.125],[-10.566,6.314],[-2.638,2.383],[-0.503,0.637],[0.288,0.961],[0.747,0.74],[2.101,0.07],[3.195,-0.254],[7.807,0.614],[4.254,0.971]],"o":[[10.295,-6.33],[4.866,-2.908],[0.776,-0.701],[0.993,-1.259],[-0.436,-1.457],[-1.134,-1.123],[-2.024,-0.067],[-4.64,0.37],[-18.768,-1.478],[8.543,11.558]],"v":[[-19.199,20.792],[15.781,0.985],[27.397,-7.033],[29.325,-9.043],[30.454,-12.39],[28.7,-15.633],[23.922,-17.241],[16.161,-16.8],[-2.301,-16.674],[-32.458,-20.792]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,0],"e":[-7.516,-68.234],"to":[-1.25260412693024,-11.3723955154419],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[-7.516,-68.234],"e":[0,0],"to":[0,0],"ti":[0.44322040677071,-8.47819042205811]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[0,0],"e":[-10.175,-17.365],"to":[-0.44322040677071,8.47819042205811],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[-10.175,-17.365],"e":[0,0],"to":[0,0],"ti":[-1.69582462310791,-2.89420580863953]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[101.323,101.673],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-34],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[25.257]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[25.257],"e":[0]},{"t":47.0000019143492}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470589638,0.57647061348,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.24,107.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.342,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Tail Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-33]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-33],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[-17]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[-17],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[212.335,167.723,0],"e":[190.335,118.723,0],"to":[-3.66666674613953,-8.16666698455811,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[190.335,118.723,0],"e":[212.335,167.723,0],"to":[0,0,0],"ti":[-0.83333331346512,-1.83333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[212.335,167.723,0],"e":[195.335,129.723,0],"to":[0.83333331346512,1.83333337306976,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[195.335,129.723,0],"e":[212.335,167.723,0],"to":[0,0,0],"ti":[-2.83333325386047,-6.33333349227905,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[54.728,57.385,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.626,-43.075],[8.28,-11.357],[-20.938,9.59],[-4.438,25.785],[17.722,4.423],[2.676,0]],"o":[[-6.694,18.454],[12.237,-1.587],[23.8,-10.901],[3.197,-18.576],[-2.934,-0.733],[-23.09,0.001]],"v":[[-30.358,12.605],[-54.478,57.135],[-2.526,42.293],[51.281,-13.37],[30.872,-56.045],[22.465,-57.136]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941179276,0.509803950787,0.501960813999,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.728,57.386],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"left hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-62]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[-62],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[2],"e":[0]},{"t":47.0000019143492}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[73.59,148.469,0],"e":[66.59,159.469,0],"to":[-1.16666662693024,1.83333337306976,0],"ti":[0.5,0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[66.59,159.469,0],"e":[70.59,143.469,0],"to":[-0.5,-0.83333331346512,0],"ti":[-2.5,7.16666650772095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[70.59,143.469,0],"e":[81.59,116.469,0],"to":[2.5,-7.16666650772095,0],"ti":[-0.5,-0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[81.59,116.469,0],"e":[73.59,148.469,0],"to":[0.5,0.83333331346512,0],"ti":[1.33333337306976,-5.33333349227905,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[26.314,29.276,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[2.354,-5.536],[-1.08,-3.642],[-22.462,-9.92],[-0.008,2.143],[8.241,2.434],[0.346,0.758],[2.55,0.62]],"o":[[-1.514,3.559],[2.627,8.841],[-1.75,-5.549],[-4.541,0.998],[-7.681,-2.268],[-0.844,-1.846],[-4.134,0.346]],"v":[[-24.551,-20.684],[-24.479,-9.865],[9.958,29.026],[26.064,-6.89],[3.748,-10.381],[-10.835,-16.004],[-14.424,-29.026]],"c":true}],"e":[{"i":[[-2.873,-10.082],[-1.08,-3.642],[-27.836,-10.69],[-0.008,2.143],[7.525,2.066],[0.88,0.302],[2.55,0.62]],"o":[[1.06,3.72],[2.627,8.841],[-1.75,-5.549],[-4.045,0.889],[-8.797,-2.415],[-5.212,-1.789],[1.105,-8.394]],"v":[[-30.277,-15.063],[-24.157,-9.482],[9.958,29.026],[38.112,-0.636],[3.547,-8.438],[-10.835,-16.004],[-22.437,-22.629]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[{"i":[[-2.873,-10.082],[-1.08,-3.642],[-27.836,-10.69],[-0.008,2.143],[7.525,2.066],[0.88,0.302],[2.55,0.62]],"o":[[1.06,3.72],[2.627,8.841],[-1.75,-5.549],[-4.045,0.889],[-8.797,-2.415],[-5.212,-1.789],[1.105,-8.394]],"v":[[-30.277,-15.063],[-24.157,-9.482],[9.958,29.026],[38.112,-0.636],[3.547,-8.438],[-10.835,-16.004],[-22.437,-22.629]],"c":true}],"e":[{"i":[[2.354,-5.536],[-1.08,-3.642],[-10.4,-18.741],[-0.008,2.143],[7.525,2.066],[0.386,0.847],[2.55,0.62]],"o":[[-1.514,3.559],[2.627,8.841],[-1.75,-5.549],[-4.045,0.889],[-8.797,-2.415],[-0.844,-1.846],[-4.134,0.346]],"v":[[-24.551,-20.684],[-24.479,-9.865],[9.958,29.026],[33.529,-4.995],[8.487,-12.851],[-10.835,-16.004],[-14.424,-29.026]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[2.354,-5.536],[-1.08,-3.642],[-10.4,-18.741],[-0.008,2.143],[7.525,2.066],[0.386,0.847],[2.55,0.62]],"o":[[-1.514,3.559],[2.627,8.841],[-1.75,-5.549],[-4.045,0.889],[-8.797,-2.415],[-0.844,-1.846],[-4.134,0.346]],"v":[[-24.551,-20.684],[-24.479,-9.865],[9.958,29.026],[33.529,-4.995],[8.487,-12.851],[-10.835,-16.004],[-14.424,-29.026]],"c":true}],"e":[{"i":[[-2.873,-10.082],[-1.08,-3.642],[-27.836,-10.69],[-0.008,2.143],[7.525,2.066],[0.88,0.302],[2.55,0.62]],"o":[[1.06,3.72],[2.627,8.841],[-1.75,-5.549],[-4.045,0.889],[-8.797,-2.415],[-5.212,-1.789],[1.105,-8.394]],"v":[[-30.277,-15.063],[-24.157,-9.482],[9.958,29.026],[38.112,-0.636],[3.547,-8.438],[-10.835,-16.004],[-22.437,-22.629]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[{"i":[[-2.873,-10.082],[-1.08,-3.642],[-27.836,-10.69],[-0.008,2.143],[7.525,2.066],[0.88,0.302],[2.55,0.62]],"o":[[1.06,3.72],[2.627,8.841],[-1.75,-5.549],[-4.045,0.889],[-8.797,-2.415],[-5.212,-1.789],[1.105,-8.394]],"v":[[-30.277,-15.063],[-24.157,-9.482],[9.958,29.026],[38.112,-0.636],[3.547,-8.438],[-10.835,-16.004],[-22.437,-22.629]],"c":true}],"e":[{"i":[[2.354,-5.536],[-1.08,-3.642],[-22.462,-9.92],[-0.008,2.143],[8.241,2.434],[0.346,0.758],[2.55,0.62]],"o":[[-1.514,3.559],[2.627,8.841],[-1.75,-5.549],[-4.541,0.998],[-7.681,-2.268],[-0.844,-1.846],[-4.134,0.346]],"v":[[-24.551,-20.684],[-24.479,-9.865],[9.958,29.026],[26.064,-6.89],[3.748,-10.381],[-10.835,-16.004],[-14.424,-29.026]],"c":true}]},{"t":47.0000019143492}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0.152,0.512],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.951700389385,0.511714220047,0.503170788288,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[26.602,29.879],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47.0000019143492,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[145,183,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[109.014,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[64.705,22.852],"e":[30,10.595]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[30,10.595],"e":[64.705,22.852]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":22,"s":[64.705,22.852],"e":[30,10.595]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":42,"s":[30,10.595],"e":[64.705,22.852]},{"t":46.0000018736184}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.532000601292,0.344732820988,0.344732820988,1],"e":[0.361688107252,0.33187431097,0.33187431097,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[0.361688107252,0.33187431097,0.33187431097,1],"e":[0.532000601292,0.344732820988,0.344732820988,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0.532000601292,0.344732820988,0.344732820988,1],"e":[0.361688107252,0.33187431097,0.33187431097,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[0.361688107252,0.33187431097,0.33187431097,1],"e":[0.532000601292,0.344732820988,0.344732820988,1]},{"t":46.0000018736184}],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[40],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[20],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[40],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[20],"e":[40]},{"t":46.0000018736184}],"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-13.212,107.812],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[92.827,156.063],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/confetti.json b/example/resource/confetti.json new file mode 100644 index 0000000000..495035cb42 --- /dev/null +++ b/example/resource/confetti.json @@ -0,0 +1 @@ +{"v":"4.12.0","fr":29.9700012207031,"ip":0,"op":59.0000024031193,"w":800,"h":800,"nm":"confettis2","ddd":0,"assets":[{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"p20","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":4,"s":[100],"e":[0]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":4,"s":[400,400,0],"e":[71,152,0],"to":[1.83333337306976,-220.66667175293,0],"ti":[85.1666641235352,-23.3333339691162,0]},{"t":43.0000017514259}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.901960790157,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4.00000016292334,"op":364.000014826024,"st":4.00000016292334,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"p19","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":3,"s":[100],"e":[0]},{"t":42.0000017106951}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":3,"s":[400,400,0],"e":[579,746,0],"to":[101.833335876465,91.3333358764648,0],"ti":[27.1666660308838,-153.33332824707,0]},{"t":42.0000017106951}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3.00000012219251,"op":363.000014785293,"st":3.00000012219251,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"p18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":2,"s":[100],"e":[0]},{"t":41.0000016699642}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":2,"s":[400,400,0],"e":[503,238,0],"to":[-84.1666641235352,-74.6666641235352,0],"ti":[-88.8333358764648,-45.3333320617676,0]},{"t":41.0000016699642}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.074509806931,0.737254917622,0.172549024224,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2.00000008146167,"op":362.000014744562,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"p17","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":1,"s":[100],"e":[0]},{"t":40.0000016292334}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":1,"s":[400,400,0],"e":[91,556,0],"to":[-82.1666641235352,-112.666664123535,0],"ti":[73.1666641235352,-199.33332824707,0]},{"t":40.0000016292334}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1.00000004073083,"op":361.000014703831,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"p16","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":0,"s":[100],"e":[0]},{"t":39.0000015885026}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":0,"s":[400,400,0],"e":[511,308,0],"to":[77.8333358764648,91.3333358764648,0],"ti":[51.1666679382324,60.6666679382324,0]},{"t":39.0000015885026}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.270588248968,0.529411792755,0.952941179276,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"p15","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":1,"s":[100],"e":[0]},{"t":40.0000016292334}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":1,"s":[400,400,0],"e":[155,280,0],"to":[-30.1666660308838,-122.666664123535,0],"ti":[95.1666641235352,-53.3333320617676,0]},{"t":40.0000016292334}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.901960790157,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1.00000004073083,"op":361.000014703831,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"p14","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":2,"s":[100],"e":[0]},{"t":41.0000016699642}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":2,"s":[400,400,0],"e":[681,388.872,0],"to":[143.83332824707,49.3333320617676,0],"ti":[-58.8333320617676,48.6666679382324,0]},{"t":41.0000016699642}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2.00000008146167,"op":362.000014744562,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"p13","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":3,"s":[100],"e":[0]},{"t":42.0000017106951}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":3,"s":[400,400,0],"e":[257,284,0],"to":[-24.1666660308838,-72.6666641235352,0],"ti":[75.1666641235352,-5.33333349227905,0]},{"t":42.0000017106951}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.074509806931,0.737254917622,0.172549024224,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3.00000012219251,"op":363.000014785293,"st":3.00000012219251,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"p12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":4,"s":[100],"e":[0]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":4,"s":[400,400,0],"e":[301,474,0],"to":[-14.1666669845581,31.3333339691162,0],"ti":[65.1666641235352,-13.3333330154419,0]},{"t":43.0000017514259}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4.00000016292334,"op":364.000014826024,"st":4.00000016292334,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"p11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":0,"s":[100],"e":[0]},{"t":39.0000015885026}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":0,"s":[400,400,0],"e":[499,570,0],"to":[-8.16666698455811,63.3333320617676,0],"ti":[-62.8333320617676,-29.3333339691162,0]},{"t":39.0000015885026}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.270588248968,0.529411792755,0.952941179276,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"p10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":1,"s":[100],"e":[0]},{"t":40.0000016292334}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":1,"s":[400,400,0],"e":[557,68,0],"to":[81.8333358764648,-104.666664123535,0],"ti":[-58.8333320617676,104.666664123535,0]},{"t":40.0000016292334}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.901960790157,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1.00000004073083,"op":361.000014703831,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"p9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":2,"s":[100],"e":[0]},{"t":41.0000016699642}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":2,"s":[400,400,0],"e":[715,138,0],"to":[151.83332824707,-46.6666679382324,0],"ti":[-26.8333339691162,72.6666641235352,0]},{"t":41.0000016699642}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2.00000008146167,"op":362.000014744562,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"p8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":3,"s":[100],"e":[0]},{"t":42.0000017106951}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":3,"s":[400,400,0],"e":[679,664,0],"to":[107.833335876465,89.3333358764648,0],"ti":[-92.8333358764648,-103.333335876465,0]},{"t":42.0000017106951}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.074509806931,0.737254917622,0.172549024224,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3.00000012219251,"op":363.000014785293,"st":3.00000012219251,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"p7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":4,"s":[100],"e":[0]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":4,"s":[400,400,0],"e":[97,686,0],"to":[-36.1666679382324,53.3333320617676,0],"ti":[75.1666641235352,-39.3333320617676,0]},{"t":43.0000017514259}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4.00000016292334,"op":364.000014826024,"st":4.00000016292334,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"p6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":5,"s":[100],"e":[0]},{"t":44.0000017921567}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":5,"s":[400,400,0],"e":[65,340,0],"to":[-148.16667175293,-132.66667175293,0],"ti":[61.1666679382324,-65.3333358764648,0]},{"t":44.0000017921567}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.270588248968,0.529411792755,0.952941179276,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5.00000020365417,"op":365.000014866755,"st":5.00000020365417,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"p5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":6,"s":[100],"e":[0]},{"t":45.0000018328876}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.004,"y":0.691},"o":{"x":0.014,"y":0},"n":"0p004_0p691_0p014_0","t":6,"s":[400,400,0],"e":[400,23.613,0],"to":[-55.3803939819336,-168.204071044922,0],"ti":[27.0301876068115,124.269813537598,0]},{"t":45.0000018328876}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.901960790157,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6.00000024438501,"op":366.000014907486,"st":6.00000024438501,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"p4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":7,"s":[100],"e":[0]},{"t":46.0000018736184}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":7,"s":[400,400,0],"e":[303,660,0],"to":[109.833335876465,69.3333358764648,0],"ti":[97.1666641235352,0.66666668653488,0]},{"t":46.0000018736184}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7.00000028511585,"op":367.000014948216,"st":7.00000028511585,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"p3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":8,"s":[100],"e":[0]},{"t":47.0000019143492}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":8,"s":[400,400,0],"e":[663,498,0],"to":[41.8333320617676,109.333335876465,0],"ti":[-71.8333358764648,39.6666679382324,0]},{"t":47.0000019143492}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.076272718608,0.735462605953,0.171031266451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8.00000032584668,"op":368.000014988947,"st":8.00000032584668,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"p2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":9,"s":[100],"e":[0]},{"t":48.0000019550801}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":9,"s":[400,400,0],"e":[187,88,0],"to":[-0.16666667163372,-158.66667175293,0],"ti":[89.1666641235352,6.66666650772095,0]},{"t":48.0000019550801}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.271778345108,0.528400123119,0.952267169952,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9.00000036657752,"op":369.000015029678,"st":9.00000036657752,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"p1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[1],"y":[1]},"o":{"x":[0.01],"y":[0]},"n":["1_1_0p01_0"],"t":0,"s":[100],"e":[0]},{"t":39.0000015885026}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.01,"y":0},"n":"0_1_0p01_0","t":0,"s":[400,400,0],"e":[621,234,0],"to":[-0.16666667163372,-158.66667175293,0],"ti":[-92.8333358764648,-103.333335876465,0]},{"t":39.0000015885026}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.855,0],[0,-7.855],[-7.855,0],[0,7.855]],"o":[[-7.855,0],[0,7.855],[7.855,0],[0,-7.855]],"v":[[0,-14.223],[-14.223,0],[0,14.223],[14.223,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.903676450253,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80,80],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":42,"ix":10},"p":{"a":0,"k":[396,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[91.5,91.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":9.00000036657752,"op":369.000015029678,"st":9.00000036657752,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":267,"ix":10},"p":{"a":0,"k":[416,420,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[64.5,64.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":7.00000028511585,"op":367.000014948216,"st":7.00000028511585,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":358,"ix":10},"p":{"a":0,"k":[436,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[64.5,64.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":5.00000020365417,"op":365.000014866755,"st":5.00000020365417,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":177,"ix":10},"p":{"a":0,"k":[416,380,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[64.5,64.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":3.00000012219251,"op":363.000014785293,"st":3.00000012219251,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":132,"ix":10},"p":{"a":0,"k":[416,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[91.5,91.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":1.00000004073083,"op":361.000014703831,"st":1.00000004073083,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[396,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[91.5,91.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":8.00000032584668,"op":368.000014988947,"st":8.00000032584668,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[416,420,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[64.5,64.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":6.00000024438501,"op":366.000014907486,"st":6.00000024438501,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":226,"ix":10},"p":{"a":0,"k":[436,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[64.5,64.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":4.00000016292334,"op":364.000014826024,"st":4.00000016292334,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[416,380,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[64.5,64.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":2.00000008146167,"op":362.000014744562,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"confettis1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[416,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[91.5,91.5,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":0,"op":360.000014663101,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/crunches.json b/example/resource/crunches.json new file mode 100755 index 0000000000..73c01216ce --- /dev/null +++ b/example/resource/crunches.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":0,"op":145,"w":200,"h":200,"nm":"crunches","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.539,100.996,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.473,-1.118],[-1.989,-1.65],[-1.284,0.567],[0.251,1.628]],"o":[[-1.342,-1.164],[-1.927,1.461],[1.08,0.896],[1.73,-0.764],[0,0]],"v":[[-11.176,-7.404],[-16.007,-7.559],[-16.101,-1.52],[-12.186,-0.974],[-9.898,-5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.438,6.953],"ix":2},"a":{"a":0,"k":[3.438,6.953],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":21,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":69,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":117,"s":[25],"e":[0]},{"t":144}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.409,0.451],[0.604,-0.063],[0,0],[0.251,1.628],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.215,-1.029],[-3.595,0],[0,0],[-1.66,1.26]],"o":[[0,0],[0,0],[0,0],[0.121,-0.596],[-0.409,-0.449],[0,0],[-1.342,-1.164],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.983,1.252],[2.743,2.324],[0,0],[2.084,0],[0,0]],"v":[[1.707,2.891],[-2.509,2.815],[-5.914,0.3],[-3.283,-6.308],[-3.714,-8.037],[-5.326,-8.653],[-11.176,-7.404],[-9.898,-5.095],[-6.652,-5.636],[-6.762,-5.477],[-6.747,-5.513],[-9.383,-1.929],[-11.629,1.03],[-11.216,5.116],[-1.402,8.716],[-1.002,8.716],[4.769,6.774]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.453,6.953],"ix":2},"a":{"a":0,"k":[3.453,6.953],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":21,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":69,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":117,"s":[25],"e":[0]},{"t":144}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body top","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.73,0.716],[0,0],[1.121,-0.761],[0,0],[0,0],[0,0],[-1.66,1.26],[0,0],[0,0],[-0.883,0.883]],"o":[[0,0],[-0.961,-0.956],[0,0],[0,0],[0,0],[2.084,0],[0,0],[0,0],[0.341,0.247],[0.679,-0.678]],"v":[[17.34,5.004],[11.346,-1.059],[7.762,-1.394],[1.707,2.891],[-2.509,2.815],[0.06,6.434],[4.769,6.774],[9.442,2.983],[14.991,7.558],[17.412,7.557]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body bottom","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/data.json b/example/resource/data.json new file mode 100755 index 0000000000..c3531cea2b --- /dev/null +++ b/example/resource/data.json @@ -0,0 +1 @@ +{"v":"5.1.13","fr":60,"ip":0,"op":60,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[43]},{"t":50}],"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[146,146],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.923041880131,0.933333337307,0.058562088758,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[2],"e":[14]},{"t":50}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.937254905701,0.033079583198,0.118178516626,1],"e":[0.043737020344,0.085415646434,0.929411768913,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[0.043737020344,0.085415646434,0.929411768913,1],"e":[0.129419133067,0.92549020052,0.068958088756,1]},{"t":55}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/emoji_wink.json b/example/resource/emoji_wink.json new file mode 100644 index 0000000000..29b39a5369 --- /dev/null +++ b/example/resource/emoji_wink.json @@ -0,0 +1 @@ +{"v":"4.5.7","fr":30,"ip":0,"op":60,"w":100,"h":100,"ddd":0,"assets":[{"id":"comp_38","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"round_normal","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[-252,-412,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-17.673,0],[0,-17.673],[17.673,0],[0,17.673]],"o":[[17.673,0],[0,17.673],[-17.673,0],[0,-17.673]],"v":[[-252,-444],[-220,-412],[-252,-380],[-284,-412]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.88,0.59,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":300,"st":0,"bm":0,"sr":1}]}],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"eyes_normal","parent":2,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[50,45.5,0]},"a":{"a":0,"k":[-252,-416.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.516,0.831,0.667],"y":[0.516,1,0.667]},"o":{"x":[0.75,0.705,0.333],"y":[0.75,0,0.333]},"n":["0p516_0p516_0p75_0p75","0p831_1_0p705_0","0p667_0p667_0p333_0p333"],"t":40,"s":[100,100,100],"e":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.667,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0.333,0,0.333]},"n":["0p667_0p667_0p333_0p333","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":45,"s":[100,0,100],"e":[100,110,100]},{"i":{"x":[0.298,0.276,0.667],"y":[0.298,1,0.667]},"o":{"x":[0.038,0.105,0.333],"y":[0.038,0,0.333]},"n":["0p298_0p298_0p038_0p038","0p276_1_0p105_0","0p667_0p667_0p333_0p333"],"t":50,"s":[100,110,100],"e":[100,98,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.667,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0.333,0,0.333]},"n":["0p667_0p667_0p333_0p333","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":55,"s":[100,98,100],"e":[100,100,100]},{"t":60}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.313,"y":1},"o":{"x":0.467,"y":0},"n":"0p313_1_0p467_0","t":6,"s":[{"i":[[-1.933,0],[0,-1.933],[1.933,0],[0,1.933]],"o":[[1.933,0],[0,1.933],[-1.933,0],[0,-1.933]],"v":[[-237.5,-420],[-234,-416.5],[-237.5,-413],[-241,-416.5]],"c":true}],"e":[{"i":[[-1.933,0],[-0.312,-1.313],[1.933,0],[0,1.062]],"o":[[1.933,0],[0.174,0.732],[-1.933,0],[0,-1.25]],"v":[[-237.437,-418],[-231.25,-415.875],[-237.5,-416.938],[-243.188,-415.937]],"c":true}]},{"i":{"x":0.395,"y":1},"o":{"x":0.716,"y":0},"n":"0p395_1_0p716_0","t":16,"s":[{"i":[[-1.933,0],[-0.312,-1.313],[1.933,0],[0,1.062]],"o":[[1.933,0],[0.174,0.732],[-1.933,0],[0,-1.25]],"v":[[-237.437,-418],[-231.25,-415.875],[-237.5,-416.938],[-243.188,-415.937]],"c":true}],"e":[{"i":[[-1.933,0],[0,-1.933],[1.933,0],[0,1.933]],"o":[[1.933,0],[0,1.933],[-1.933,0],[0,-1.933]],"v":[[-237.5,-420],[-234,-416.5],[-237.5,-413],[-241,-416.5]],"c":true}]},{"t":29}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.933,0],[0,-1.933],[1.933,0],[0,1.933]],"o":[[1.933,0],[0,1.933],[-1.933,0],[0,-1.933]],"v":[[-266.5,-420],[-263,-416.5],[-266.5,-413],[-270,-416.5]],"c":true}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.33,0.33,0.28,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"mn":"ADBE Vector Group"}],"ip":0,"op":61,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"mouth_smile","parent":2,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.75],"y":[0]},"n":["0p25_1_0p75_0"],"t":4,"s":[0],"e":[-15]},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.75],"y":[0]},"n":["0p25_1_0p75_0"],"t":15,"s":[-15],"e":[0]},{"t":30}]},"p":{"a":0,"k":[50.862,57.489,0]},"a":{"a":0,"k":[-251.138,-404.511,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.292,"y":1},"o":{"x":0.506,"y":0},"n":"0p292_1_0p506_0","t":0,"s":[{"i":[[6.254,0],[2.91,1.715],[-0.616,0.558],[-0.707,-0.436],[-2.276,0],[-3.615,1.995],[-0.52,-0.71],[0.737,-0.384]],"o":[[-6.249,0],[-0.716,-0.422],[0.615,-0.558],[3.273,2.017],[2.662,0],[0.728,-0.402],[0.324,0.602],[-3.252,1.696]],"v":[[-252.006,-391.01],[-263.629,-394.434],[-263.522,-396.373],[-261.398,-396.454],[-252.006,-394.02],[-242.635,-396.433],[-240.261,-396.227],[-240.405,-394.414]],"c":true}],"e":[{"i":[[6.233,0],[4.195,4.639],[-0.616,0.558],[-0.558,-0.615],[-5.401,0],[-3.206,6.717],[-0.615,-0.557],[0.338,-0.759]],"o":[[-6.249,0],[-0.557,-0.616],[0.615,-0.558],[3.626,4.01],[4.636,0],[0.358,-0.75],[0.616,0.557],[-2.811,6.323]],"v":[[-252.044,-390.197],[-266.129,-396.746],[-266.022,-398.873],[-263.898,-398.767],[-252.076,-392.959],[-239.687,-401.031],[-237.564,-401.138],[-237.457,-399.012]],"c":true}]},{"i":{"x":0.564,"y":1},"o":{"x":0.571,"y":0},"n":"0p564_1_0p571_0","t":15,"s":[{"i":[[6.233,0],[4.195,4.639],[-0.616,0.558],[-0.558,-0.615],[-5.401,0],[-3.206,6.717],[-0.615,-0.557],[0.338,-0.759]],"o":[[-6.249,0],[-0.557,-0.616],[0.615,-0.558],[3.626,4.01],[4.636,0],[0.358,-0.75],[0.616,0.557],[-2.811,6.323]],"v":[[-252.044,-390.197],[-266.129,-396.746],[-266.022,-398.873],[-263.898,-398.767],[-252.076,-392.959],[-239.687,-401.031],[-237.564,-401.138],[-237.457,-399.012]],"c":true}],"e":[{"i":[[6.254,0],[2.91,1.715],[-0.616,0.558],[-0.707,-0.436],[-2.276,0],[-3.615,1.995],[-0.52,-0.71],[0.737,-0.384]],"o":[[-6.249,0],[-0.716,-0.422],[0.615,-0.558],[3.273,2.017],[2.662,0],[0.728,-0.402],[0.324,0.602],[-3.252,1.696]],"v":[[-252.006,-391.01],[-263.629,-394.434],[-263.522,-396.373],[-261.398,-396.454],[-252.006,-394.02],[-242.635,-396.433],[-240.261,-396.227],[-240.405,-394.414]],"c":true}]},{"i":{"x":0.681,"y":0.833},"o":{"x":0.546,"y":0},"n":"0p681_0p833_0p546_0","t":30,"s":[{"i":[[6.254,0],[2.91,1.715],[-0.616,0.558],[-0.707,-0.436],[-2.276,0],[-3.615,1.995],[-0.52,-0.71],[0.737,-0.384]],"o":[[-6.249,0],[-0.716,-0.422],[0.615,-0.558],[3.273,2.017],[2.662,0],[0.728,-0.402],[0.324,0.602],[-3.252,1.696]],"v":[[-252.006,-391.01],[-263.629,-394.434],[-263.522,-396.373],[-261.398,-396.454],[-252.006,-394.02],[-242.635,-396.433],[-240.261,-396.227],[-240.405,-394.414]],"c":true}],"e":[{"i":[[6.254,0],[2.91,1.715],[-0.616,0.558],[-0.734,-0.389],[-2.276,0],[-3.487,2.248],[-0.52,-0.71],[0.673,-0.488]],"o":[[-6.249,0],[-0.716,-0.422],[0.615,-0.558],[3.089,1.638],[2.662,0],[0.699,-0.451],[0.324,0.602],[-2.905,2.105]],"v":[[-252.006,-391.01],[-264.507,-394.555],[-264.401,-396.494],[-262.276,-396.576],[-252.006,-394.02],[-242.076,-396.998],[-239.702,-396.793],[-239.845,-394.98]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.497,"y":0.261},"n":"0p667_1_0p497_0p261","t":40,"s":[{"i":[[6.254,0],[2.91,1.715],[-0.616,0.558],[-0.734,-0.389],[-2.276,0],[-3.487,2.248],[-0.52,-0.71],[0.673,-0.488]],"o":[[-6.249,0],[-0.716,-0.422],[0.615,-0.558],[3.089,1.638],[2.662,0],[0.699,-0.451],[0.324,0.602],[-2.905,2.105]],"v":[[-252.006,-391.01],[-264.507,-394.555],[-264.401,-396.494],[-262.276,-396.576],[-252.006,-394.02],[-242.076,-396.998],[-239.702,-396.793],[-239.845,-394.98]],"c":true}],"e":[{"i":[[6.254,0],[2.91,1.715],[-0.616,0.558],[-0.707,-0.436],[-2.276,0],[-3.615,1.995],[-0.52,-0.71],[0.737,-0.384]],"o":[[-6.249,0],[-0.716,-0.422],[0.615,-0.558],[3.273,2.017],[2.662,0],[0.728,-0.402],[0.324,0.602],[-3.252,1.696]],"v":[[-252.006,-391.01],[-263.629,-394.434],[-263.522,-396.373],[-261.398,-396.454],[-252.006,-394.02],[-242.635,-396.433],[-240.261,-396.227],[-240.405,-394.414]],"c":true}]},{"t":60}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.33,0.33,0.28,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":61,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":0,"nm":"base_normal","refId":"comp_38","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.273],"y":[1]},"o":{"x":[0.464],"y":[0]},"n":["0p273_1_0p464_0"],"t":4,"s":[0],"e":[13]},{"i":{"x":[0.532],"y":[1]},"o":{"x":[0.578],"y":[0]},"n":["0p532_1_0p578_0"],"t":19,"s":[13],"e":[0]},{"t":40}]},"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[50,50,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":100,"h":100,"ip":0,"op":61,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/glow_loading.json b/example/resource/glow_loading.json new file mode 100644 index 0000000000..3cbcc056bd --- /dev/null +++ b/example/resource/glow_loading.json @@ -0,0 +1 @@ +{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":69.0000028104276,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Glow ball","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":69.0000028104276}]},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":0,"k":[132,132,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1635217,0.8509804,0.8105415,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 8","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":315},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":56,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":59,"s":[145,145,100],"e":[132,132,100]},{"t":63.0000025660426}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":69.0000028104276}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 7","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":270},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":48,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":51,"s":[145,145,100],"e":[132,132,100]},{"t":55.0000022401959}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.6745098,0.8431373,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[0.1647059,0.6745098,0.8431373,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":58,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":69.0000028104276}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 6","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":225},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":39,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":42,"s":[145,145,100],"e":[132,132,100]},{"t":46.0000018736184}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":43,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":48.0000019550801}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":180},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":31,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":34,"s":[145,145,100],"e":[132,132,100]},{"t":38.0000015477717}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":26,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":42.0000017106951}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":135},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":23,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":26,"s":[145,145,100],"e":[132,132,100]},{"t":30.0000012219251}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":38.0000015477717}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":90},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[145,145,100],"e":[132,132,100]},{"t":21.0000008553475}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":28.0000011404634}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":45},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":7,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":10,"s":[145,145,100],"e":[132,132,100]},{"t":14.0000005702317}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":22.0000008960784}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[127.984,127.969,0]},"a":{"a":0,"k":[-0.182,32.385,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[132,132,100],"e":[145,145,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":3,"s":[145,145,100],"e":[132,132,100]},{"t":7.00000028511585}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.125,14.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.1647059,0.6313726,0.8509804,1],"e":[0.1647059,0.8509804,0.8117647,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[0.1647059,0.8509804,0.8117647,1],"e":[0.1647059,0.6313726,0.8509804,1]},{"t":16.0000006516934}]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-0.063,1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/icon_animation.json b/example/resource/icon_animation.json new file mode 100755 index 0000000000..c574f7491b --- /dev/null +++ b/example/resource/icon_animation.json @@ -0,0 +1 @@ +{"v":"5.1.13","fr":33.8690032958984,"ip":0,"op":90.000932593746,"w":276,"h":580,"nm":"IconAnimation","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,102,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.438,-16.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.66,4.158],[0.55,-0.255],[0.162,-0.111],[0,0],[0.052,-0.433],[0,0],[-0.72,-0.085],[-0.053,0],[-0.079,0.669],[0,0],[0,0]],"o":[[-0.122,0.001],[-0.175,0.062],[0,0],[-0.358,0.248],[0,0],[-0.083,0.72],[0.053,0.006],[0.656,0],[0,0],[0,0],[0,0]],"v":[[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-6.499,-11.32],[-7.142,-10.25],[-7.54,-4.643],[-6.387,-3.183],[-6.23,-3.174],[-4.926,-4.334],[-4.207,-9.214],[-2.379,-10.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.219,-10.875],"ix":2},"a":{"a":0,"k":[1.219,-15.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.964,"s":[-40],"e":[-71]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76.205,"s":[-71],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86.366,"s":[-40],"e":[0]},{"t":101.607009887695}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.091,-0.063],[0,0],[-0.282,0],[-0.276,0.395],[0.644,0.449],[0,0],[0,0],[0.035,0.064]],"o":[[0.074,0.082],[0,0],[0.247,0.175],[0.448,0],[0.447,-0.644],[0,0],[0,0],[-0.291,-1.581],[-4.465,2.376]],"v":[[4.208,-6.719],[4.455,-6.499],[8.738,-3.549],[9.55,-3.292],[10.717,-3.899],[10.366,-5.878],[6.496,-8.672],[4.938,-13.658],[1.653,-16.626]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.313,-10.375],"ix":2},"a":{"a":0,"k":[1.313,-15.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.964,"s":[40],"e":[78]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76.205,"s":[78],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86.366,"s":[40],"e":[0]},{"t":101.607009887695}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.804,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60.964,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.125,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76.205,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":86.366,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96.527,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"t":101.607009887695}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.063,2.75],"ix":2},"a":{"a":0,"k":[-0.063,-2.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.964,"s":[-42],"e":[-57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71.125,"s":[-57],"e":[-59]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76.205,"s":[-59],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86.366,"s":[-25],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96.527,"s":[4],"e":[0]},{"t":101.607009887695}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.804,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60.964,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.125,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76.205,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":86.366,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96.527,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"t":101.607009887695}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.094,3.281],"ix":2},"a":{"a":0,"k":[1.094,-1.719],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.964,"s":[34],"e":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71.125,"s":[64],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76.205,"s":[60],"e":[18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86.366,"s":[18],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96.527,"s":[4],"e":[0]},{"t":101.607009887695}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.013,0.152],[0,0],[-0.091,-0.063],[1.678,0.136],[0.55,-0.255],[0.162,-0.111],[0,0],[0,0],[-0.022,-0.203],[-1.843,0.062]],"o":[[0.034,-0.145],[0,0],[0.074,0.082],[0,0],[-0.65,-0.052],[-0.175,0.062],[0,0],[0,0],[-0.018,0.211],[0,0],[1.843,-0.062]],"v":[[3.59,-2.105],[3.664,-2.552],[4.208,-6.719],[4.455,-6.499],[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-2.379,-10.24],[-2.626,-3.062],[-2.616,-2.439],[0.782,2.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":50.8035049438477,"op":389.493537902832,"st":50.8035049438477,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,102,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.438,-16.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.66,4.158],[0.55,-0.255],[0.162,-0.111],[0,0],[0.052,-0.433],[0,0],[-0.72,-0.085],[-0.053,0],[-0.079,0.669],[0,0],[0,0]],"o":[[-0.122,0.001],[-0.175,0.062],[0,0],[-0.358,0.248],[0,0],[-0.083,0.72],[0.053,0.006],[0.656,0],[0,0],[0,0],[0,0]],"v":[[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-6.499,-11.32],[-7.142,-10.25],[-7.54,-4.643],[-6.387,-3.183],[-6.23,-3.174],[-4.926,-4.334],[-4.207,-9.214],[-2.379,-10.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.219,-10.875],"ix":2},"a":{"a":0,"k":[1.219,-15.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10.161,"s":[-40],"e":[-71]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25.402,"s":[-71],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35.562,"s":[-40],"e":[0]},{"t":50.8035049438477}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.091,-0.063],[0,0],[-0.282,0],[-0.276,0.395],[0.644,0.449],[0,0],[0,0],[0.035,0.064]],"o":[[0.074,0.082],[0,0],[0.247,0.175],[0.448,0],[0.447,-0.644],[0,0],[0,0],[-0.291,-1.581],[-4.465,2.376]],"v":[[4.208,-6.719],[4.455,-6.499],[8.738,-3.549],[9.55,-3.292],[10.717,-3.899],[10.366,-5.878],[6.496,-8.672],[4.938,-13.658],[1.653,-16.626]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.313,-10.375],"ix":2},"a":{"a":0,"k":[1.313,-15.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10.161,"s":[40],"e":[78]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25.402,"s":[78],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35.562,"s":[40],"e":[0]},{"t":50.8035049438477}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.161,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.321,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25.402,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.562,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45.723,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"t":50.8035049438477}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.063,2.75],"ix":2},"a":{"a":0,"k":[-0.063,-2.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10.161,"s":[-42],"e":[-57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.321,"s":[-57],"e":[-59]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25.402,"s":[-59],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35.562,"s":[-25],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45.723,"s":[4],"e":[0]},{"t":50.8035049438477}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.161,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.321,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25.402,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.562,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45.723,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"t":50.8035049438477}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.094,3.281],"ix":2},"a":{"a":0,"k":[1.094,-1.719],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10.161,"s":[34],"e":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.321,"s":[64],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25.402,"s":[60],"e":[18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35.562,"s":[18],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45.723,"s":[4],"e":[0]},{"t":50.8035049438477}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.013,0.152],[0,0],[-0.091,-0.063],[1.678,0.136],[0.55,-0.255],[0.162,-0.111],[0,0],[0,0],[-0.022,-0.203],[-1.843,0.062]],"o":[[0.034,-0.145],[0,0],[0.074,0.082],[0,0],[-0.65,-0.052],[-0.175,0.062],[0,0],[0,0],[-0.018,0.211],[0,0],[1.843,-0.062]],"v":[[3.59,-2.105],[3.664,-2.552],[4.208,-6.719],[4.455,-6.499],[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-2.379,-10.24],[-2.626,-3.062],[-2.616,-2.439],[0.782,2.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":50.8035049438477,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.657,107.486,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.625,-20.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.017,0.019],[0.04,0.027],[0,0],[0,0],[0,0],[-0.672,0],[-0.124,0.03],[0.205,0.745],[0,0],[0.348,0.264],[0,0]],"o":[[-0.013,0.013],[0,0],[0,0],[0,0],[0.173,0.629],[0.123,0],[0.807,-0.189],[0,0],[-0.11,-0.401],[0,0],[0,0]],"v":[[2.561,-4.414],[0.991,-2.508],[2.518,0.539],[9.146,5.668],[11.642,14.735],[13.1,15.782],[13.472,15.738],[14.561,14.047],[13.08,4.085],[12.375,3.061],[5.551,-3.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,-2.188],"ix":2},"a":{"a":0,"k":[3.063,-2.188],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81.286,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":94.833,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108.381,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115.155,"s":[0],"e":[94]},{"t":121.928411865234}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.039,-0.055],[0,0],[0,0],[0.064,-0.838],[-0.814,-0.068],[0,0],[-0.055,0],[-0.387,0.536],[0,0],[0.941,1.069]],"o":[[-0.043,0.051],[0,0],[0,0],[-0.815,-0.069],[-0.066,0.839],[0,0],[0.057,0.004],[0.69,0],[0,0],[0,0],[-1.011,-1.15]],"v":[[-0.697,-4.047],[-0.822,-3.891],[-5.511,3.443],[-13.571,3.263],[-15.162,4.658],[-13.808,6.299],[-4.627,7.337],[-4.461,7.344],[-2.736,6.49],[2.518,0.539],[3.114,-3.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-3.313],"ix":2},"a":{"a":0,"k":[2,-3.313],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81.286,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":94.833,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108.381,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115.155,"s":[0],"e":[-92]},{"t":121.928411865234}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.576,0.03],[-0.027,0.003],[-0.261,0.549],[0,0],[0.723,0.342],[0.341,-0.722],[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.218,-1.676],[0,0]],"o":[[0.348,0.465],[0.027,-0.002],[0.604,-0.061],[0,0],[0.343,-0.722],[-0.722,-0.341],[0,0],[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.956,-0.079],[-0.218,1.676],[0,0]],"v":[[8.772,-5.613],[10.252,-4.92],[10.334,-4.927],[11.728,-5.911],[14.885,-10.833],[14.198,-12.759],[12.272,-12.071],[10.205,-9.296],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[2.522,-12.203],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.5,-14.094],"ix":2},"a":{"a":0,"k":[3.5,-14.094],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[0],"e":[102]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81.286,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":94.833,"s":[0],"e":[102]},{"t":108.380810546875}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,1.598],[0,0],[0,0],[0.003,0],[0.309,-0.694],[0,0],[-0.727,-0.324],[-0.142,-0.016],[-0.263,0.59],[0,0],[0,0]],"o":[[0.571,-1.598],[0,0],[-0.002,0],[-0.752,-0.087],[0,0],[-0.324,0.727],[0.138,0.061],[0.61,0.071],[0,0],[0,0],[0,0]],"v":[[4.577,-12.524],[3.928,-15.382],[-2.871,-15.695],[-2.877,-15.695],[-4.66,-14.677],[-6.655,-9.525],[-5.924,-7.621],[-5.502,-7.506],[-4.02,-8.352],[-2.009,-12.1],[0.749,-11.524]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.656,-13.281],"ix":2},"a":{"a":0,"k":[4.656,-13.281],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[0],"e":[-146]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81.286,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":94.833,"s":[0],"e":[-146]},{"t":108.380810546875}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.237,0.013],[0.018,0.003],[0,0],[1.075,-1.386],[0,0],[0,0],[0.039,-0.055],[0,0],[0,0],[0.348,0.264],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.238,-0.059],[-0.016,-0.002],[0,0],[0,0],[-1.075,1.386],[0,0],[-0.043,0.051],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.798,-10.046],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[4.795,-15.336],[4.746,-15.345],[3.928,-15.382],[1.879,-14.538],[0.749,-11.524],[-0.697,-4.047],[-0.822,-3.891],[-0.403,-0.141],[2.518,0.539],[5.47,-0.404],[5.551,-3.128],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":54.1904052734375,"op":108.380810546875,"st":54.1904052734375,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.657,107.486,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.625,-20.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.017,0.019],[0.04,0.027],[0,0],[0,0],[0,0],[-0.672,0],[-0.124,0.03],[0.205,0.745],[0,0],[0.348,0.264],[0,0]],"o":[[-0.013,0.013],[0,0],[0,0],[0,0],[0.173,0.629],[0.123,0],[0.807,-0.189],[0,0],[-0.11,-0.401],[0,0],[0,0]],"v":[[2.561,-4.414],[0.991,-2.508],[2.518,0.539],[9.146,5.668],[11.642,14.735],[13.1,15.782],[13.472,15.738],[14.561,14.047],[13.08,4.085],[12.375,3.061],[5.551,-3.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,-2.188],"ix":2},"a":{"a":0,"k":[3.063,-2.188],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.548,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27.095,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40.643,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.964,"s":[0],"e":[94]},{"t":67.7380065917969}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.039,-0.055],[0,0],[0,0],[0.064,-0.838],[-0.814,-0.068],[0,0],[-0.055,0],[-0.387,0.536],[0,0],[0.941,1.069]],"o":[[-0.043,0.051],[0,0],[0,0],[-0.815,-0.069],[-0.066,0.839],[0,0],[0.057,0.004],[0.69,0],[0,0],[0,0],[-1.011,-1.15]],"v":[[-0.697,-4.047],[-0.822,-3.891],[-5.511,3.443],[-13.571,3.263],[-15.162,4.658],[-13.808,6.299],[-4.627,7.337],[-4.461,7.344],[-2.736,6.49],[2.518,0.539],[3.114,-3.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-3.313],"ix":2},"a":{"a":0,"k":[2,-3.313],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.548,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27.095,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40.643,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.964,"s":[0],"e":[-92]},{"t":67.7380065917969}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.576,0.03],[-0.027,0.003],[-0.261,0.549],[0,0],[0.723,0.342],[0.341,-0.722],[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.218,-1.676],[0,0]],"o":[[0.348,0.465],[0.027,-0.002],[0.604,-0.061],[0,0],[0.343,-0.722],[-0.722,-0.341],[0,0],[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.956,-0.079],[-0.218,1.676],[0,0]],"v":[[8.772,-5.613],[10.252,-4.92],[10.334,-4.927],[11.728,-5.911],[14.885,-10.833],[14.198,-12.759],[12.272,-12.071],[10.205,-9.296],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[2.522,-12.203],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.5,-14.094],"ix":2},"a":{"a":0,"k":[3.5,-14.094],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.548,"s":[0],"e":[102]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27.095,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40.643,"s":[0],"e":[102]},{"t":54.1904052734375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,1.598],[0,0],[0,0],[0.003,0],[0.309,-0.694],[0,0],[-0.727,-0.324],[-0.142,-0.016],[-0.263,0.59],[0,0],[0,0]],"o":[[0.571,-1.598],[0,0],[-0.002,0],[-0.752,-0.087],[0,0],[-0.324,0.727],[0.138,0.061],[0.61,0.071],[0,0],[0,0],[0,0]],"v":[[4.577,-12.524],[3.928,-15.382],[-2.871,-15.695],[-2.877,-15.695],[-4.66,-14.677],[-6.655,-9.525],[-5.924,-7.621],[-5.502,-7.506],[-4.02,-8.352],[-2.009,-12.1],[0.749,-11.524]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.656,-13.281],"ix":2},"a":{"a":0,"k":[4.656,-13.281],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.548,"s":[0],"e":[-146]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27.095,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40.643,"s":[0],"e":[-146]},{"t":54.1904052734375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.237,0.013],[0.018,0.003],[0,0],[1.075,-1.386],[0,0],[0,0],[0.039,-0.055],[0,0],[0,0],[0.348,0.264],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.238,-0.059],[-0.016,-0.002],[0,0],[0,0],[-1.075,1.386],[0,0],[-0.043,0.051],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.798,-10.046],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[4.795,-15.336],[4.746,-15.345],[3.928,-15.382],[1.879,-14.538],[0.749,-11.524],[-0.697,-4.047],[-0.822,-3.891],[-0.403,-0.141],[2.518,0.539],[5.47,-0.404],[5.551,-3.128],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":54.1904052734375,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-14.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.738,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.673,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"t":101.607009887695}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.188,-6.875],"ix":2},"a":{"a":0,"k":[-2.188,-9.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[-90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84.673,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88.059,"s":[0],"e":[-90]},{"t":101.607009887695}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.738,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.673,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"t":101.607009887695}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-6.969],"ix":2},"a":{"a":0,"k":[2,-9.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84.673,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88.059,"s":[0],"e":[90]},{"t":101.607009887695}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.286,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88.059,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}]},{"t":101.607009887695}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[-30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84.673,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88.059,"s":[0],"e":[-30]},{"t":101.607009887695}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.286,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88.059,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}]},{"t":101.607009887695}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84.673,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88.059,"s":[0],"e":[30]},{"t":101.607009887695}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 2,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.551,0.153],[0,0],[0,0],[-3.568,0.081],[0,0],[0,0]],"o":[[-0.548,0.165],[0,0],[0,0],[0,0],[3.568,-0.081],[0,0],[0.001,-0.048]],"v":[[1.526,-11.742],[-1.779,-11.724],[-3.864,-8.282],[-3.606,0.078],[-0.006,4.393],[3.587,0.078],[4.117,-8.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":67.7380065917969,"op":101.607009887695,"st":67.7380065917969,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-14.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33.869,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.804,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"t":67.7380065917969}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.188,-6.875],"ix":2},"a":{"a":0,"k":[-2.188,-9.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33.869,"s":[-90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[0],"e":[-90]},{"t":67.7380065917969}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33.869,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.804,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"t":67.7380065917969}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-6.969],"ix":2},"a":{"a":0,"k":[2,-9.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33.869,"s":[90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[0],"e":[90]},{"t":67.7380065917969}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47.417,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.19,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}]},{"t":67.7380065917969}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33.869,"s":[-30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[0],"e":[-30]},{"t":67.7380065917969}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47.417,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.19,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}]},{"t":67.7380065917969}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33.869,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.804,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[0],"e":[30]},{"t":67.7380065917969}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 2,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.551,0.153],[0,0],[0,0],[-3.568,0.081],[0,0],[0,0]],"o":[[-0.548,0.165],[0,0],[0,0],[0,0],[3.568,-0.081],[0,0],[0.001,-0.048]],"v":[[1.526,-11.742],[-1.779,-11.724],[-3.864,-8.282],[-3.606,0.078],[-0.006,4.393],[3.587,0.078],[4.117,-8.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":33.8690032958984,"op":67.7380065917969,"st":33.8690032958984,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-14.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.935,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"t":33.8690032958984}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.188,-6.875],"ix":2},"a":{"a":0,"k":[-2.188,-9.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.935,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.321,"s":[0],"e":[-90]},{"t":33.8690032958984}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.935,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"t":33.8690032958984}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-6.969],"ix":2},"a":{"a":0,"k":[2,-9.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.935,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.321,"s":[0],"e":[90]},{"t":33.8690032958984}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13.548,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.321,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}]},{"t":33.8690032958984}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.935,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.321,"s":[0],"e":[-30]},{"t":33.8690032958984}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13.548,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.321,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}]},{"t":33.8690032958984}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.935,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.321,"s":[0],"e":[30]},{"t":33.8690032958984}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 2,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1, val2, val2, val3;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.551,0.153],[0,0],[0,0],[-3.568,0.081],[0,0],[0,0]],"o":[[-0.548,0.165],[0,0],[0,0],[0,0],[3.568,-0.081],[0,0],[0.001,-0.048]],"v":[[1.526,-11.742],[-1.779,-11.724],[-3.864,-8.282],[-3.606,0.078],[-0.006,4.393],[3.587,0.078],[4.117,-8.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":33.8690032958984,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.25,104.125,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.74,0.359],[0.357,1.738],[1.738,-0.356],[-0.354,-1.737]],"o":[[1.733,-0.354],[-0.355,-1.737],[-1.738,0.354],[0.357,1.737]],"v":[[0.647,3.143],[3.144,-0.646],[-0.645,-3.146],[-3.147,0.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-11.25,4.844],"ix":2},"a":{"a":0,"k":[6.5,17.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.935,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42.336,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":59.271,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84.673,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96.527,"s":[30],"e":[0]},{"t":111.767710876465}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.145,-0.018],[0.306,-0.102],[-0.519,-1.549],[-0.175,-1.679],[-3.71,1.418],[0,0],[-0.004,0.004],[0,0],[0.369,1.397]],"o":[[-0.14,-0.014],[-0.313,0],[-1.549,0.52],[0.694,2.07],[0.146,0.847],[0,0],[0.003,-0.002],[0,0],[-0.506,-1.975],[0,0]],"v":[[-14.642,-8.556],[-15.072,-8.547],[-16.006,-8.398],[-17.872,-4.654],[-15.683,2.599],[-11.015,5.502],[-11.014,5.502],[-11.004,5.496],[-10.372,0.328],[-11.79,-5.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-11.266,4.844],"ix":2},"a":{"a":0,"k":[-11.266,4.844],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.935,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42.336,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":59.271,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84.673,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96.527,"s":[30],"e":[0]},{"t":111.767710876465}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}],"e":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.935,"s":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}],"e":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.336,"s":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}],"e":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":59.271,"s":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}],"e":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.673,"s":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}],"e":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96.527,"s":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}],"e":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}]},{"t":111.767710876465}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0.113,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.71,1.418],[0,0],[-0.004,0.004],[0,0],[0,0],[-0.291,0.617],[0.617,0.289],[0,0],[0.512,-0.252],[0,0]],"o":[[0,0],[0.003,-0.002],[0,0],[0,0],[0.616,0.29],[0.29,-0.617],[0,0],[-0.515,-0.242],[0,0],[-0.506,-1.975]],"v":[[-11.015,5.502],[-11.014,5.502],[-11.004,5.496],[-3.568,1.344],[3.58,4.77],[5.222,4.178],[4.63,2.535],[-2.965,-2.291],[-4.588,-2.274],[-10.372,0.328]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.914],[2.615,0.41],[0.044,0.006],[0,0],[0,-2.097],[-0.673,-0.908],[0,0],[0,-0.611],[-0.612,0],[0,0],[-0.006,0],[-0.006,0],[0,0],[-0.015,0.009]],"o":[[0,-2.729],[-0.03,-0.013],[0,0],[-1.733,0.917],[0,1.218],[0,0],[-0.612,0],[0,0.613],[0,0],[0,0],[0,0],[0,0],[0.059,0],[2.874,-0.162]],"v":[[19.065,3.104],[14.448,-2.291],[14.337,-2.32],[11.048,-1.729],[8.133,3.104],[9.208,6.351],[-17.956,6.351],[-19.065,7.459],[-17.956,8.568],[13.58,8.568],[13.599,8.569],[13.618,8.568],[13.808,8.568],[13.91,8.554]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.034,0],[0,2.034],[-2.034,0],[0,-2.034]],"o":[[-2.034,0],[0,-2.034],[2.034,0],[0,2.034]],"v":[[13.599,6.787],[9.916,3.104],[13.599,-0.58],[17.282,3.104]],"c":true},"ix":2},"nm":"circle","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"macine","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":338.690032958984,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.539,100.996,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.473,-1.118],[-1.989,-1.65],[-1.284,0.567],[0.251,1.628]],"o":[[-1.342,-1.164],[-1.927,1.461],[1.08,0.896],[1.73,-0.764],[0,0]],"v":[[-11.176,-7.404],[-16.007,-7.559],[-16.101,-1.52],[-12.186,-0.974],[-9.898,-5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.438,6.953],"ix":2},"a":{"a":0,"k":[3.438,6.953],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.854,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27.095,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38.949,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66.045,"s":[25],"e":[0]},{"t":81.2856079101562}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.409,0.451],[0.604,-0.063],[0,0],[0.251,1.628],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.215,-1.029],[-3.595,0],[0,0],[-1.66,1.26]],"o":[[0,0],[0,0],[0,0],[0.121,-0.596],[-0.409,-0.449],[0,0],[-1.342,-1.164],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.983,1.252],[2.743,2.324],[0,0],[2.084,0],[0,0]],"v":[[1.707,2.891],[-2.509,2.815],[-5.914,0.3],[-3.283,-6.308],[-3.714,-8.037],[-5.326,-8.653],[-11.176,-7.404],[-9.898,-5.095],[-6.652,-5.636],[-6.762,-5.477],[-6.747,-5.513],[-9.383,-1.929],[-11.629,1.03],[-11.216,5.116],[-1.402,8.716],[-1.002,8.716],[4.769,6.774]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.453,6.953],"ix":2},"a":{"a":0,"k":[3.453,6.953],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.854,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27.095,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38.949,"s":[25],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.19,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66.045,"s":[25],"e":[0]},{"t":81.2856079101562}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body top","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.73,0.716],[0,0],[1.121,-0.761],[0,0],[0,0],[0,0],[-1.66,1.26],[0,0],[0,0],[-0.883,0.883]],"o":[[0,0],[-0.961,-0.956],[0,0],[0,0],[0,0],[2.084,0],[0,0],[0,0],[0.341,0.247],[0.679,-0.678]],"v":[[17.34,5.004],[11.346,-1.059],[7.762,-1.394],[1.707,2.891],[-2.509,2.815],[0.06,6.434],[4.769,6.774],[9.442,2.983],[14.991,7.558],[17.412,7.557]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body bottom","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":338.690032958984,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.027,-1.297],[-1.295,2.036],[2.03,1.294],[1.295,-2.031]],"o":[[2.029,1.293],[1.292,-2.024],[-2.029,-1.297],[-1.298,2.028]],"v":[[-2.531,15.115],[3.49,13.779],[2.159,7.764],[-3.859,9.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,-3.063],"e":[0,-5.063],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25.402,"s":[0,-5.063],"e":[0,-3.063],"to":[0,0],"ti":[0,0]},{"t":67.7380065917969}],"ix":2},"a":{"a":0,"k":[-0.188,20.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.738,"s":[0],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":101.607,"s":[35],"e":[-35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":169.345,"s":[-35],"e":[0]},{"t":203.214019775391}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[8.091,-0.689],[5.568,-8.097],[5.265,-8.719],[0.277,-11.541],[0.275,-11.541],[-4.753,-8.612],[-4.978,-8.113],[-7.582,-0.54],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}],"e":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[9.091,-0.876],[7.725,-9.097],[7.421,-9.719],[0.09,-13.604],[0.088,-13.604],[-7.472,-9.706],[-7.696,-9.207],[-8.988,-0.759],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25.402,"s":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[9.091,-0.876],[7.725,-9.097],[7.421,-9.719],[0.09,-13.604],[0.088,-13.604],[-7.472,-9.706],[-7.696,-9.207],[-8.988,-0.759],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}],"e":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[8.091,-0.689],[5.568,-8.097],[5.265,-8.719],[0.277,-11.541],[0.275,-11.541],[-4.753,-8.612],[-4.978,-8.113],[-7.582,-0.54],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}]},{"t":67.7380065917969}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":338.690032958984,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"walking","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80,113,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":338.690032958984,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"running","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[182.5,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":338.690032958984,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"star jumps","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[84.5,213,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":338.690032958984,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"rawing machine","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[191.5,222.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":338.690032958984,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"crunches","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193,313.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":338.690032958984,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"yoga","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81.5,314.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":338.690032958984,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/mask.json b/example/resource/mask.json new file mode 100755 index 0000000000..29437b7216 --- /dev/null +++ b/example/resource/mask.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":0,"op":30,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"Red Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[27.614,0],[0,-27.614],[-27.614,0],[0,27.614]],"o":[[-27.614,0],[0,27.614],[27.614,0],[0,-27.614]],"v":[[100,50],[50,100],[100,150],[150,100]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[50,50],[50,150],[150,150],[150,50]],"c":true}]},{"t":29}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"sw":200,"sh":200,"sc":"#ea0c11","ip":0,"op":30,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/material_wave_loading.json b/example/resource/material_wave_loading.json new file mode 100644 index 0000000000..cafcccf1eb --- /dev/null +++ b/example/resource/material_wave_loading.json @@ -0,0 +1 @@ +{"v":"4.6.8","fr":29.9700012207031,"ip":0,"op":40.0000016292334,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[208.6,127.969,0],"e":[208.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[208.6,88,0],"e":[208.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":40.0000016292334}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9843137,0.5490196,0,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[168.6,128,0],"e":[168.6,88,0],"to":[0,-6.66666650772095,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[168.6,88,0],"e":[168.6,128,0],"to":[0,0,0],"ti":[0,-6.66666650772095,0]},{"t":35.0000014255792}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.9921569,0.8470588,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[128.594,127.969,0],"e":[128.594,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[128.594,88,0],"e":[128.594,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":30.0000012219251}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2627451,0.627451,0.2784314,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[88.6,127.969,0],"e":[88.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[88.6,88,0],"e":[88.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":25.0000010182709}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.1176471,0.5333334,0.8980392,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[48.6,127.969,0],"e":[48.6,88,0],"to":[0,-6.66145849227905,0],"ti":[0,-0.00520833348855,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[48.6,88,0],"e":[48.6,128,0],"to":[0,0.00520833348855,0],"ti":[0,-6.66666650772095,0]},{"t":20.0000008146167}]},"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[33.75,34.5]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.8980392,0.2235294,0.2078431,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-70.125,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/polystar_star_with_roundness_points_stroke_99.json b/example/resource/polystar_star_with_roundness_points_stroke_99.json new file mode 100755 index 0000000000..24a82d455f --- /dev/null +++ b/example/resource/polystar_star_with_roundness_points_stroke_99.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[152,152,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"sr","sy":1,"d":2,"pt":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[5],"e":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[11],"e":[99]},{"t":100.000004073084}],"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[64]},{"t":90.0000036657751}],"ix":5},"ir":{"a":0,"k":75,"ix":6},"is":{"a":0,"k":79,"ix":8},"or":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[142]},{"t":90.0000036657751}],"ix":7},"os":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[79],"e":[247]},{"t":90.0000036657751}],"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/rowing_machine.json b/example/resource/rowing_machine.json new file mode 100755 index 0000000000..f6a814cdf2 --- /dev/null +++ b/example/resource/rowing_machine.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":0,"op":151,"w":200,"h":200,"nm":"rawing machine","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.25,104.125,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.74,0.359],[0.357,1.738],[1.738,-0.356],[-0.354,-1.737]],"o":[[1.733,-0.354],[-0.355,-1.737],[-1.738,0.354],[0.357,1.737]],"v":[[0.647,3.143],[3.144,-0.646],[-0.645,-3.146],[-3.147,0.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-11.25,4.844],"ix":2},"a":{"a":0,"k":[6.5,17.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[30],"e":[0]},{"t":198}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.145,-0.018],[0.306,-0.102],[-0.519,-1.549],[-0.175,-1.679],[-3.71,1.418],[0,0],[-0.004,0.004],[0,0],[0.369,1.397]],"o":[[-0.14,-0.014],[-0.313,0],[-1.549,0.52],[0.694,2.07],[0.146,0.847],[0,0],[0.003,-0.002],[0,0],[-0.506,-1.975],[0,0]],"v":[[-14.642,-8.556],[-15.072,-8.547],[-16.006,-8.398],[-17.872,-4.654],[-15.683,2.599],[-11.015,5.502],[-11.014,5.502],[-11.004,5.496],[-10.372,0.328],[-11.79,-5.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-11.266,4.844],"ix":2},"a":{"a":0,"k":[-11.266,4.844],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[30],"e":[0]},{"t":198}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}],"e":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}],"e":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}],"e":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}],"e":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":150,"s":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}],"e":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":171,"s":[{"i":[[2.142,0.411],[0.036,0.006],[0,0],[0.343,0.042],[0,0],[0.303,1.398],[0,0],[-0.165,0.143],[0,0]],"o":[[-0.025,-0.013],[0,0],[-0.108,-0.38],[0,0],[-0.114,-0.014],[0,0],[0.218,0.026],[0,0],[-1.419,0.916]],"v":[[14.921,-2.292],[14.831,-2.321],[0.384,-6.112],[-0.347,-6.825],[-8.903,-8.567],[-6.565,-5.262],[-0.52,-4.715],[0.067,-4.908],[12.138,-1.732]],"c":true}],"e":[{"i":[[2.615,0.41],[0.044,0.006],[0,0],[0.419,0.042],[0,0],[0.369,1.397],[0,0],[-0.201,0.143],[0,0]],"o":[[-0.03,-0.013],[0,0],[-0.132,-0.38],[0,0],[-0.14,-0.014],[0,0],[0.266,0.026],[0,0],[-1.733,0.917]],"v":[[14.448,-2.291],[14.337,-2.32],[-3.302,-6.104],[-4.195,-6.817],[-14.642,-8.556],[-11.79,-5.252],[-4.408,-4.707],[-3.691,-4.9],[11.048,-1.729]],"c":true}]},{"t":198}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0.113,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.71,1.418],[0,0],[-0.004,0.004],[0,0],[0,0],[-0.291,0.617],[0.617,0.289],[0,0],[0.512,-0.252],[0,0]],"o":[[0,0],[0.003,-0.002],[0,0],[0,0],[0.616,0.29],[0.29,-0.617],[0,0],[-0.515,-0.242],[0,0],[-0.506,-1.975]],"v":[[-11.015,5.502],[-11.014,5.502],[-11.004,5.496],[-3.568,1.344],[3.58,4.77],[5.222,4.178],[4.63,2.535],[-2.965,-2.291],[-4.588,-2.274],[-10.372,0.328]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.914],[2.615,0.41],[0.044,0.006],[0,0],[0,-2.097],[-0.673,-0.908],[0,0],[0,-0.611],[-0.612,0],[0,0],[-0.006,0],[-0.006,0],[0,0],[-0.015,0.009]],"o":[[0,-2.729],[-0.03,-0.013],[0,0],[-1.733,0.917],[0,1.218],[0,0],[-0.612,0],[0,0.613],[0,0],[0,0],[0,0],[0,0],[0.059,0],[2.874,-0.162]],"v":[[19.065,3.104],[14.448,-2.291],[14.337,-2.32],[11.048,-1.729],[8.133,3.104],[9.208,6.351],[-17.956,6.351],[-19.065,7.459],[-17.956,8.568],[13.58,8.568],[13.599,8.569],[13.618,8.568],[13.808,8.568],[13.91,8.554]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.034,0],[0,2.034],[-2.034,0],[0,-2.034]],"o":[[-2.034,0],[0,-2.034],[2.034,0],[0,2.034]],"v":[[13.599,6.787],[9.916,3.104],[13.599,-0.58],[17.282,3.104]],"c":true},"ix":2},"nm":"circle","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"macine","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/running.json b/example/resource/running.json new file mode 100755 index 0000000000..3f7219a525 --- /dev/null +++ b/example/resource/running.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":0,"op":96,"w":200,"h":200,"nm":"running","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.657,107.486,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.625,-20.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.017,0.019],[0.04,0.027],[0,0],[0,0],[0,0],[-0.672,0],[-0.124,0.03],[0.205,0.745],[0,0],[0.348,0.264],[0,0]],"o":[[-0.013,0.013],[0,0],[0,0],[0,0],[0.173,0.629],[0.123,0],[0.807,-0.189],[0,0],[-0.11,-0.401],[0,0],[0,0]],"v":[[2.561,-4.414],[0.991,-2.508],[2.518,0.539],[9.146,5.668],[11.642,14.735],[13.1,15.782],[13.472,15.738],[14.561,14.047],[13.08,4.085],[12.375,3.061],[5.551,-3.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,-2.188],"ix":2},"a":{"a":0,"k":[3.063,-2.188],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":192,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":204,"s":[0],"e":[94]},{"t":216}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.039,-0.055],[0,0],[0,0],[0.064,-0.838],[-0.814,-0.068],[0,0],[-0.055,0],[-0.387,0.536],[0,0],[0.941,1.069]],"o":[[-0.043,0.051],[0,0],[0,0],[-0.815,-0.069],[-0.066,0.839],[0,0],[0.057,0.004],[0.69,0],[0,0],[0,0],[-1.011,-1.15]],"v":[[-0.697,-4.047],[-0.822,-3.891],[-5.511,3.443],[-13.571,3.263],[-15.162,4.658],[-13.808,6.299],[-4.627,7.337],[-4.461,7.344],[-2.736,6.49],[2.518,0.539],[3.114,-3.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-3.313],"ix":2},"a":{"a":0,"k":[2,-3.313],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":192,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":204,"s":[0],"e":[-92]},{"t":216}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.576,0.03],[-0.027,0.003],[-0.261,0.549],[0,0],[0.723,0.342],[0.341,-0.722],[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.218,-1.676],[0,0]],"o":[[0.348,0.465],[0.027,-0.002],[0.604,-0.061],[0,0],[0.343,-0.722],[-0.722,-0.341],[0,0],[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.956,-0.079],[-0.218,1.676],[0,0]],"v":[[8.772,-5.613],[10.252,-4.92],[10.334,-4.927],[11.728,-5.911],[14.885,-10.833],[14.198,-12.759],[12.272,-12.071],[10.205,-9.296],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[2.522,-12.203],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.5,-14.094],"ix":2},"a":{"a":0,"k":[3.5,-14.094],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[102]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[102]},{"t":192}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,1.598],[0,0],[0,0],[0.003,0],[0.309,-0.694],[0,0],[-0.727,-0.324],[-0.142,-0.016],[-0.263,0.59],[0,0],[0,0]],"o":[[0.571,-1.598],[0,0],[-0.002,0],[-0.752,-0.087],[0,0],[-0.324,0.727],[0.138,0.061],[0.61,0.071],[0,0],[0,0],[0,0]],"v":[[4.577,-12.524],[3.928,-15.382],[-2.871,-15.695],[-2.877,-15.695],[-4.66,-14.677],[-6.655,-9.525],[-5.924,-7.621],[-5.502,-7.506],[-4.02,-8.352],[-2.009,-12.1],[0.749,-11.524]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.656,-13.281],"ix":2},"a":{"a":0,"k":[4.656,-13.281],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[-146]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[-146]},{"t":192}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.237,0.013],[0.018,0.003],[0,0],[1.075,-1.386],[0,0],[0,0],[0.039,-0.055],[0,0],[0,0],[0.348,0.264],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.238,-0.059],[-0.016,-0.002],[0,0],[0,0],[-1.075,1.386],[0,0],[-0.043,0.051],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.798,-10.046],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[4.795,-15.336],[4.746,-15.345],[3.928,-15.382],[1.879,-14.538],[0.749,-11.524],[-0.697,-4.047],[-0.822,-3.891],[-0.403,-0.141],[2.518,0.539],[5.47,-0.404],[5.551,-3.128],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":96,"op":192,"st":96,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.657,107.486,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.625,-20.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.017,0.019],[0.04,0.027],[0,0],[0,0],[0,0],[-0.672,0],[-0.124,0.03],[0.205,0.745],[0,0],[0.348,0.264],[0,0]],"o":[[-0.013,0.013],[0,0],[0,0],[0,0],[0.173,0.629],[0.123,0],[0.807,-0.189],[0,0],[-0.11,-0.401],[0,0],[0,0]],"v":[[2.561,-4.414],[0.991,-2.508],[2.518,0.539],[9.146,5.668],[11.642,14.735],[13.1,15.782],[13.472,15.738],[14.561,14.047],[13.08,4.085],[12.375,3.061],[5.551,-3.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,-2.188],"ix":2},"a":{"a":0,"k":[3.063,-2.188],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[0],"e":[94]},{"t":120}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.039,-0.055],[0,0],[0,0],[0.064,-0.838],[-0.814,-0.068],[0,0],[-0.055,0],[-0.387,0.536],[0,0],[0.941,1.069]],"o":[[-0.043,0.051],[0,0],[0,0],[-0.815,-0.069],[-0.066,0.839],[0,0],[0.057,0.004],[0.69,0],[0,0],[0,0],[-1.011,-1.15]],"v":[[-0.697,-4.047],[-0.822,-3.891],[-5.511,3.443],[-13.571,3.263],[-15.162,4.658],[-13.808,6.299],[-4.627,7.337],[-4.461,7.344],[-2.736,6.49],[2.518,0.539],[3.114,-3.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-3.313],"ix":2},"a":{"a":0,"k":[2,-3.313],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[0],"e":[-92]},{"t":120}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.576,0.03],[-0.027,0.003],[-0.261,0.549],[0,0],[0.723,0.342],[0.341,-0.722],[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.218,-1.676],[0,0]],"o":[[0.348,0.465],[0.027,-0.002],[0.604,-0.061],[0,0],[0.343,-0.722],[-0.722,-0.341],[0,0],[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.956,-0.079],[-0.218,1.676],[0,0]],"v":[[8.772,-5.613],[10.252,-4.92],[10.334,-4.927],[11.728,-5.911],[14.885,-10.833],[14.198,-12.759],[12.272,-12.071],[10.205,-9.296],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[2.522,-12.203],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.5,-14.094],"ix":2},"a":{"a":0,"k":[3.5,-14.094],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[102]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[102]},{"t":96}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,1.598],[0,0],[0,0],[0.003,0],[0.309,-0.694],[0,0],[-0.727,-0.324],[-0.142,-0.016],[-0.263,0.59],[0,0],[0,0]],"o":[[0.571,-1.598],[0,0],[-0.002,0],[-0.752,-0.087],[0,0],[-0.324,0.727],[0.138,0.061],[0.61,0.071],[0,0],[0,0],[0,0]],"v":[[4.577,-12.524],[3.928,-15.382],[-2.871,-15.695],[-2.877,-15.695],[-4.66,-14.677],[-6.655,-9.525],[-5.924,-7.621],[-5.502,-7.506],[-4.02,-8.352],[-2.009,-12.1],[0.749,-11.524]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.656,-13.281],"ix":2},"a":{"a":0,"k":[4.656,-13.281],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[-146]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[-146]},{"t":96}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.237,0.013],[0.018,0.003],[0,0],[1.075,-1.386],[0,0],[0,0],[0.039,-0.055],[0,0],[0,0],[0.348,0.264],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.238,-0.059],[-0.016,-0.002],[0,0],[0,0],[-1.075,1.386],[0,0],[-0.043,0.051],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.798,-10.046],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[4.795,-15.336],[4.746,-15.345],[3.928,-15.382],[1.879,-14.538],[0.749,-11.524],[-0.697,-4.047],[-0.822,-3.891],[-0.403,-0.141],[2.518,0.539],[5.47,-0.404],[5.551,-3.128],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/star_jumps.json b/example/resource/star_jumps.json new file mode 100755 index 0000000000..82f7c56d74 --- /dev/null +++ b/example/resource/star_jumps.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":1,"op":62,"w":200,"h":200,"nm":"star jumps","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-14.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":120,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":150,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.188,-6.875],"ix":2},"a":{"a":0,"k":[-2.188,-9.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[-90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":156,"s":[0],"e":[-90]},{"t":180}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":120,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":150,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-6.969],"ix":2},"a":{"a":0,"k":[2,-9.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":156,"s":[0],"e":[90]},{"t":180}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":144,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":156,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[-30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":156,"s":[0],"e":[-30]},{"t":180}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":144,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":156,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":156,"s":[0],"e":[30]},{"t":180}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 2,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.551,0.153],[0,0],[0,0],[-3.568,0.081],[0,0],[0,0]],"o":[[-0.548,0.165],[0,0],[0,0],[0,0],[3.568,-0.081],[0,0],[0.001,-0.048]],"v":[[1.526,-11.742],[-1.779,-11.724],[-3.864,-8.282],[-3.606,0.078],[-0.006,4.393],[3.587,0.078],[4.117,-8.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":180,"st":120,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-14.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.188,-6.875],"ix":2},"a":{"a":0,"k":[-2.188,-9.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[-90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[0],"e":[-90]},{"t":120}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-6.969],"ix":2},"a":{"a":0,"k":[2,-9.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[0],"e":[90]},{"t":120}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[-30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[0],"e":[-30]},{"t":120}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[0],"e":[30]},{"t":120}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 2,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.551,0.153],[0,0],[0,0],[-3.568,0.081],[0,0],[0,0]],"o":[[-0.548,0.165],[0,0],[0,0],[0,0],[3.568,-0.081],[0,0],[0.001,-0.048]],"v":[[1.526,-11.742],[-1.779,-11.724],[-3.864,-8.282],[-3.606,0.078],[-0.006,4.393],[3.587,0.078],[4.117,-8.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":120,"st":60,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-14.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-11.599,-16.915],[-13.29,-16.358],[-12.733,-14.666],[-8.351,-10.775],[-3.864,-8.282]],"c":true}],"e":[{"i":[[0.717,2.38],[0,0],[0,0],[0.313,-0.621],[-0.53,-0.458],[0,0],[-0.011,0.063]],"o":[[0,0],[0,0],[-0.545,-0.365],[-0.314,0.621],[0,0],[0,0],[2.396,0.532]],"v":[[-0.717,-11.599],[-7.06,-13.364],[-13.286,-13.415],[-14.978,-12.858],[-14.421,-11.166],[-8.351,-10.775],[-3.864,-8.282]],"c":true}]},{"t":60}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.188,-6.875],"ix":2},"a":{"a":0,"k":[-2.188,-9.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[0],"e":[-90]},{"t":60}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[12.733,-14.666],[13.29,-16.358],[11.599,-16.915],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}],"e":[{"i":[[0,0],[0,0],[0.314,0.621],[0.573,-0.371],[0,0],[-0.026,0.054],[-2.461,0.5]],"o":[[0,0],[0.607,-0.463],[-0.313,-0.621],[0,0],[0,0],[-1.183,2.773],[0.008,0]],"v":[[8.035,-10.775],[13.921,-11.416],[14.478,-13.108],[12.786,-13.665],[6.745,-13.364],[0.964,-11.617],[4.117,-8.282]],"c":true}]},{"t":60}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-6.969],"ix":2},"a":{"a":0,"k":[2,-9.969],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[90],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[0],"e":[90]},{"t":60}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.297,6.224],[-12.443,12.673],[-12.148,14.513],[-11.974,14.621],[-10.309,14.219],[-6.026,7.497],[-0.006,4.393]],"c":true}],"e":[{"i":[[3.419,-0.047],[0,0],[0,0],[-0.589,-0.426],[-0.061,-0.031],[-0.387,0.532],[0,0],[0.006,-0.049]],"o":[[0.013,-0.047],[0,0],[-0.427,0.589],[0.056,0.041],[0.568,0.29],[0,0],[0,0],[0.975,-3.393]],"v":[[-3.606,0.078],[-9.234,8.474],[-12.881,15.048],[-12.586,16.888],[-12.411,16.996],[-10.746,16.594],[-5.964,9.747],[-0.006,4.393]],"c":true}]},{"t":60}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[0],"e":[-30]},{"t":60}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[6.345,7.764],[10.36,14.219],[12.024,14.621],[12.199,14.513],[12.494,12.673],[9.415,6.441],[3.587,0.078]],"c":true}],"e":[{"i":[[-1.494,-2.799],[0,0],[0,0],[-0.568,0.29],[-0.056,0.041],[0.427,0.589],[0,0],[0.007,0.016]],"o":[[-0.025,-0.018],[0,0],[0.385,0.532],[0.061,-0.031],[0.589,-0.426],[0,0],[0,0],[-3.118,-0.234]],"v":[[-0.006,4.393],[5.97,9.514],[10.735,16.594],[12.399,16.996],[12.574,16.888],[12.869,15.048],[9.04,8.191],[3.587,0.078]],"c":true}]},{"t":60}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[30],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[0],"e":[30]},{"t":60}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 2,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, sX, eX, sY, eY, sZ, eZ, val1;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key(sum(n, 1));\n } catch (e) {\n return null;\n }\n var dim = 1;\n try {\n key(1)[1];\n dim = 2;\n key(1)[2];\n dim = 3;\n } catch (e) {\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n t = sub(time, key1.time);\n d = sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity) {\n newProgress = expression.executeProgress(div(t, d));\n return thisProperty.valueAtTime(sum(key1.time, mul(d, newProgress)));\n }\n sX = key1[0];\n eX = sub(key2[0], key1[0]);\n if (dim >= 2) {\n sY = key1[1];\n eY = sub(key2[1], key1[1]);\n if (dim >= 3) {\n sZ = key1[2];\n eZ = sub(key2[2], key1[2]);\n }\n }\n if (time < key1.time || time > key2.time) {\n return value;\n } else {\n val1 = expression.execute(t, sX, eX, d);\n switch (dim) {\n case 1:\n return val1;\n case 2:\n val2 = expression.execute(t, sY, eY, d);\n return [\n val1,\n val2\n ];\n case 3:\n val2 = expression.execute(t, sY, eY, d);\n val3 = expression.execute(t, sZ, eZ, d);\n return [\n val1,\n val2,\n val3\n ];\n default:\n return null;\n }\n }\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return mul(sum(mul(sum(mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return mul(sum(mul(sum(mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return sum(mul(sum(mul(mul(3, this.ax), t), mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = sub(t2, div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = sum(mul(sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return sum(b, mul(e, sampleCurveY.call(this, solveCurveX.call(this, div(t, d), div(1, mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = mul(3, p1x);\n this.bx = sub(mul(3, sub(p2x, p1x)), this.cx);\n this.ax = sub(sub(1, this.cx), this.bx);\n this.cy = mul(3, p1y);\n this.by = sub(mul(3, sub(p2y, p1y)), this.cy);\n this.ay = sub(sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum($bm_neg(mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n return sum(sum(mul(mul(a, Math.pow(2, mul(-10, t))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return sum(b, c);\n if (!p)\n p = mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = div(p, 4);\n } else\n s = mul(div(p, mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return sum(mul(-0.5, mul(mul(a, Math.pow(2, mul(10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p)))), b);\n return sum(sum(mul(mul(mul(a, Math.pow(2, mul(-10, t -= 1))), Math.sin(div(mul(sub(mul(t, d), s), mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return sum(sub(c, executeBounceOut(sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return sum(mul(c, mul(mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return sum(mul(c, sum(mul(mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < d / 2)\n return sum(mul(executeBounceIn(mul(t, 2), 0, c, d), 0.5), b);\n return sum(sum(mul(executeBounceOut(sub(mul(t, 2), d), 0, c, d), 0.5), mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return sub(1, executeBounceOut(sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return mul(mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return sum(mul(mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return sum(mul(mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return mul(executeBounceIn(mul(oldProgress, 2)), 0.5);\n return sum(mul(executeBounceOut(sub(mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.551,0.153],[0,0],[0,0],[-3.568,0.081],[0,0],[0,0]],"o":[[-0.548,0.165],[0,0],[0,0],[0,0],[3.568,-0.081],[0,0],[0.001,-0.048]],"v":[[1.526,-11.742],[-1.779,-11.724],[-3.864,-8.282],[-3.606,0.078],[-0.006,4.393],[3.587,0.078],[4.117,-8.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/walking.json b/example/resource/walking.json new file mode 100755 index 0000000000..99e5d61d4a --- /dev/null +++ b/example/resource/walking.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":0,"op":90,"w":200,"h":200,"nm":"walking","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,102,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.438,-16.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.66,4.158],[0.55,-0.255],[0.162,-0.111],[0,0],[0.052,-0.433],[0,0],[-0.72,-0.085],[-0.053,0],[-0.079,0.669],[0,0],[0,0]],"o":[[-0.122,0.001],[-0.175,0.062],[0,0],[-0.358,0.248],[0,0],[-0.083,0.72],[0.053,0.006],[0.656,0],[0,0],[0,0],[0,0]],"v":[[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-6.499,-11.32],[-7.142,-10.25],[-7.54,-4.643],[-6.387,-3.183],[-6.23,-3.174],[-4.926,-4.334],[-4.207,-9.214],[-2.379,-10.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.219,-10.875],"ix":2},"a":{"a":0,"k":[1.219,-15.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[-40],"e":[-71]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[-71],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[-40],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.091,-0.063],[0,0],[-0.282,0],[-0.276,0.395],[0.644,0.449],[0,0],[0,0],[0.035,0.064]],"o":[[0.074,0.082],[0,0],[0.247,0.175],[0.448,0],[0.447,-0.644],[0,0],[0,0],[-0.291,-1.581],[-4.465,2.376]],"v":[[4.208,-6.719],[4.455,-6.499],[8.738,-3.549],[9.55,-3.292],[10.717,-3.899],[10.366,-5.878],[6.496,-8.672],[4.938,-13.658],[1.653,-16.626]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.313,-10.375],"ix":2},"a":{"a":0,"k":[1.313,-15.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[40],"e":[78]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[78],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[40],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":126,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":135,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":153,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":171,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.063,2.75],"ix":2},"a":{"a":0,"k":[-0.063,-2.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[-42],"e":[-57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":126,"s":[-57],"e":[-59]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[-59],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[-25],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[4],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":126,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":135,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":153,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":171,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.094,3.281],"ix":2},"a":{"a":0,"k":[1.094,-1.719],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[34],"e":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":126,"s":[64],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[60],"e":[18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[18],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[4],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.013,0.152],[0,0],[-0.091,-0.063],[1.678,0.136],[0.55,-0.255],[0.162,-0.111],[0,0],[0,0],[-0.022,-0.203],[-1.843,0.062]],"o":[[0.034,-0.145],[0,0],[0.074,0.082],[0,0],[-0.65,-0.052],[-0.175,0.062],[0,0],[0,0],[-0.018,0.211],[0,0],[1.843,-0.062]],"v":[[3.59,-2.105],[3.664,-2.552],[4.208,-6.719],[4.455,-6.499],[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-2.379,-10.24],[-2.626,-3.062],[-2.616,-2.439],[0.782,2.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":690,"st":90,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,102,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.438,-16.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.66,4.158],[0.55,-0.255],[0.162,-0.111],[0,0],[0.052,-0.433],[0,0],[-0.72,-0.085],[-0.053,0],[-0.079,0.669],[0,0],[0,0]],"o":[[-0.122,0.001],[-0.175,0.062],[0,0],[-0.358,0.248],[0,0],[-0.083,0.72],[0.053,0.006],[0.656,0],[0,0],[0,0],[0,0]],"v":[[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-6.499,-11.32],[-7.142,-10.25],[-7.54,-4.643],[-6.387,-3.183],[-6.23,-3.174],[-4.926,-4.334],[-4.207,-9.214],[-2.379,-10.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.219,-10.875],"ix":2},"a":{"a":0,"k":[1.219,-15.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[-40],"e":[-71]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[-71],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[-40],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.091,-0.063],[0,0],[-0.282,0],[-0.276,0.395],[0.644,0.449],[0,0],[0,0],[0.035,0.064]],"o":[[0.074,0.082],[0,0],[0.247,0.175],[0.448,0],[0.447,-0.644],[0,0],[0,0],[-0.291,-1.581],[-4.465,2.376]],"v":[[4.208,-6.719],[4.455,-6.499],[8.738,-3.549],[9.55,-3.292],[10.717,-3.899],[10.366,-5.878],[6.496,-8.672],[4.938,-13.658],[1.653,-16.626]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.313,-10.375],"ix":2},"a":{"a":0,"k":[1.313,-15.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[40],"e":[78]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[78],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[40],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"t":90}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.063,2.75],"ix":2},"a":{"a":0,"k":[-0.063,-2.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[-42],"e":[-57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[-57],"e":[-59]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[-59],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[-25],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[4],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"t":90}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.094,3.281],"ix":2},"a":{"a":0,"k":[1.094,-1.719],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[34],"e":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[64],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[60],"e":[18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[18],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[4],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.013,0.152],[0,0],[-0.091,-0.063],[1.678,0.136],[0.55,-0.255],[0.162,-0.111],[0,0],[0,0],[-0.022,-0.203],[-1.843,0.062]],"o":[[0.034,-0.145],[0,0],[0.074,0.082],[0,0],[-0.65,-0.052],[-0.175,0.062],[0,0],[0,0],[-0.018,0.211],[0,0],[1.843,-0.062]],"v":[[3.59,-2.105],[3.664,-2.552],[4.208,-6.719],[4.455,-6.499],[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-2.379,-10.24],[-2.626,-3.062],[-2.616,-2.439],[0.782,2.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/yoga.json b/example/resource/yoga.json new file mode 100755 index 0000000000..9003783dc2 --- /dev/null +++ b/example/resource/yoga.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":60,"ip":0,"op":361,"w":200,"h":200,"nm":"yoga","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.027,-1.297],[-1.295,2.036],[2.03,1.294],[1.295,-2.031]],"o":[[2.029,1.293],[1.292,-2.024],[-2.029,-1.297],[-1.298,2.028]],"v":[[-2.531,15.115],[3.49,13.779],[2.159,7.764],[-3.859,9.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,-3.063],"e":[0,-5.063],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[0,-5.063],"e":[0,-3.063],"to":[0,0],"ti":[0,0]},{"t":120}],"ix":2},"a":{"a":0,"k":[-0.188,20.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[35],"e":[-35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":300,"s":[-35],"e":[0]},{"t":360}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[8.091,-0.689],[5.568,-8.097],[5.265,-8.719],[0.277,-11.541],[0.275,-11.541],[-4.753,-8.612],[-4.978,-8.113],[-7.582,-0.54],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}],"e":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[9.091,-0.876],[7.725,-9.097],[7.421,-9.719],[0.09,-13.604],[0.088,-13.604],[-7.472,-9.706],[-7.696,-9.207],[-8.988,-0.759],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[9.091,-0.876],[7.725,-9.097],[7.421,-9.719],[0.09,-13.604],[0.088,-13.604],[-7.472,-9.706],[-7.696,-9.207],[-8.988,-0.759],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}],"e":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[8.091,-0.689],[5.568,-8.097],[5.265,-8.719],[0.277,-11.541],[0.275,-11.541],[-4.753,-8.612],[-4.978,-8.113],[-7.582,-0.54],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h new file mode 100644 index 0000000000..dfda1520a7 --- /dev/null +++ b/inc/lottieplayer.h @@ -0,0 +1,149 @@ +#ifndef LOTPLAYER_H +#define LOTPLAYER_H + +#include +#include + +#ifdef _WIN32 +# ifdef LOT_BUILD +# ifdef DLL_EXPORT +# define LOT_EXPORT __declspec(dllexport) +# else +# define LOT_EXPORT +# endif +# else +# define LOT_EXPORT __declspec(dllimport) +# endif +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define LOT_EXPORT __attribute__ ((visibility("default"))) +# else +# define LOT_EXPORT +# endif +# else +# define LOT_EXPORT +# endif +#endif + +class LOTPlayerPrivate; +class LOTNode; + +struct LOT_EXPORT LOTBuffer +{ + uint32_t *buffer; + int width; + int height; + int bytesPerLine; + bool clear; +}; + +class LOT_EXPORT LOTPlayer +{ +public: + ~LOTPlayer(); + LOTPlayer(); + + LOTPlayer(const char *filePath); + + bool setFilePath(const char *filePath); + + void setSize(int width, int height); + void size(int &width, int &height) const; + + int frameRate() const; + + void setFrameRate(int frameRate); + + float playTime() const; + + void seek(float pos); + + const std::vector& renderList() const; + + std::future render(float pos, const LOTBuffer &buffer); + bool renderSync(float pos, const LOTBuffer &buffer); + +public: + LOTPlayerPrivate *d; +}; + +#define ChangeFlagNone 0x0000 +#define ChangeFlagPath 0x0001 +#define ChangeFlagPaint 0x0010 +#define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) + +class LOT_EXPORT LOTNode +{ +public: + struct PathData { + const float *ptPtr; + int ptCount; + const char *elmPtr; + int elmCount; + }; + struct Color { + unsigned short r, g, b, a; + }; + + enum BrushType { + BrushSolid, + BrushGradient + }; + enum FillRule { + EvenOdd, + Winding + }; + + enum JoinStyle { + MiterJoin, + BevelJoin, + RoundJoin + }; + + enum CapStyle { + FlatCap, + SquareCap, + RoundCap + }; + + struct Stroke { + bool enable; + int width; + CapStyle cap; + JoinStyle join; + int meterLimit; + float *dashArray; + int dashArraySize; + }; + + struct Gradient { + enum Type { + Linear = 1, + Radial = 2 + }; + Gradient::Type type; + struct { + float x, y; + } start, end; + struct { + float x, y; + } center, focal; + float cradius; + float fradius; + }; + + ~LOTNode(); + LOTNode(); + +public: + int mFlag; + LOTNode::BrushType mType; + FillRule mFillRule; + PathData mPath; + Color mColor; + Stroke mStroke; + Gradient mGradient; +}; + +#endif // LOTPLAYER_H diff --git a/inc/meson.build b/inc/meson.build new file mode 100644 index 0000000000..0b4bb41f4e --- /dev/null +++ b/inc/meson.build @@ -0,0 +1 @@ +install_headers(['lottieplayer.h']) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000000..ba33397744 --- /dev/null +++ b/meson.build @@ -0,0 +1,36 @@ +project('lottie-player library', + 'cpp', + license : 'Apache') + +lottie_player_lib_version = '0.0.1' + +add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_source_dir()), language : 'cpp') + +compiler_flags = ['-Wall','-std=c++11', '-fvisibility=hidden'] + +if (build_machine.system() == 'linux') + compiler_flags += ['-pthread'] + add_global_link_arguments('-pthread', language: 'cpp') +endif + +add_global_arguments(compiler_flags, language: 'cpp') + +inc = include_directories('inc') + +subdir('inc') +subdir('src') + +subdir('example') + +if get_option('test') == true + subdir('test') +endif + +pkg_mod = import('pkgconfig') + +pkg_mod.generate( libraries : lottie_player_lib, + version : lottie_player_lib_version, + name : 'liblottie-player', + filebase : 'lottie-player', + description : 'A Library for rendering lottie files.' + ) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000000..d8e58902a5 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,14 @@ +option('test', + type: 'boolean', + value: false, + description: 'enable unit test') + +option('example', + type: 'boolean', + value: true, + description: 'enable example') + +option('text', + type: 'boolean', + value: false, + description: 'enable text module') diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp new file mode 100644 index 0000000000..6b4b2a7bef --- /dev/null +++ b/src/lottie/lottieitem.cpp @@ -0,0 +1,1074 @@ +#include "lottieitem.h" +#include"vbitmap.h" +#include"vpainter.h" +#include"vraster.h" +#include"vdasher.h" +#include + + +VDrawable::VDrawable():mFlag(DirtyState::All), + mType(Type::Fill), + mFillRule(FillRule::Winding) +{ + mStroke.dashArraySize = 0; + mStroke.cap = CapStyle::Round; + mStroke.join= JoinStyle::Round; + mStroke.meterLimit = 10; + mStroke.enable = false; +} + +void VDrawable::preprocess() +{ + if (mFlag & (DirtyState::Path)) { + if (mStroke.enable) { + VPath newPath = mPath; + if (mStroke.dashArraySize) { + VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); + newPath = dasher.dashed(mPath); + } + FTOutline *outline = VRaster::toFTOutline(newPath); + mRle = VRaster::instance().generateStrokeInfo(outline, mStroke.cap, mStroke.join, + mStroke.width, mStroke.meterLimit); + VRaster::deleteFTOutline(outline); + } else { + FTOutline *outline = VRaster::toFTOutline(mPath); + mRle = VRaster::instance().generateFillInfo(outline, mFillRule); + VRaster::deleteFTOutline(outline); + } + mFlag &= ~DirtyFlag(DirtyState::Path); + } +} + +void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) +{ + mStroke.enable = true; + mStroke.cap = cap; + mStroke.join = join; + mStroke.meterLimit = meterLimit; + mStroke.width = strokeWidth; + mFlag |= DirtyState::Path; +} +void VDrawable::setDashInfo(float *array, int size) +{ + mStroke.dashArray = array; + mStroke.dashArraySize = size; + mFlag |= DirtyState::Path; +} + +void VDrawable::sync() +{ + mCNode.mFlag = ChangeFlagNone; + if (mFlag & DirtyState::None) return; + + if (mFlag & DirtyState::Path) { + const std::vector &elm = mPath.elements(); + const std::vector &pts = mPath.points(); + const float *ptPtr = reinterpret_cast(pts.data()); + const char *elmPtr = reinterpret_cast(elm.data()); + mCNode.mPath.elmPtr = elmPtr; + mCNode.mPath.elmCount = elm.size(); + mCNode.mPath.ptPtr = ptPtr; + mCNode.mPath.ptCount = 2 * pts.size(); + mCNode.mFlag |= ChangeFlagPath; + } + + if (mStroke.enable) { + mCNode.mStroke.width = mStroke.width; + mCNode.mStroke.meterLimit = mStroke.meterLimit; + mCNode.mStroke.enable = 1; + + switch (mFillRule) { + case FillRule::EvenOdd: + mCNode.mFillRule = LOTNode::EvenOdd; + break; + default: + mCNode.mFillRule = LOTNode::Winding; + break; + } + + switch (mStroke.cap) { + case CapStyle::Flat: + mCNode.mStroke.cap = LOTNode::FlatCap; + break; + case CapStyle::Square: + mCNode.mStroke.cap = LOTNode::SquareCap; + break; + case CapStyle::Round: + mCNode.mStroke.cap = LOTNode::RoundCap; + break; + default: + mCNode.mStroke.cap = LOTNode::FlatCap; + break; + } + + switch (mStroke.join) { + case JoinStyle::Miter: + mCNode.mStroke.join = LOTNode::MiterJoin; + break; + case JoinStyle::Bevel: + mCNode.mStroke.join = LOTNode::BevelJoin; + break; + case JoinStyle::Round: + mCNode.mStroke.join = LOTNode::RoundJoin; + break; + default: + mCNode.mStroke.join = LOTNode::MiterJoin; + break; + } + + mCNode.mStroke.dashArray = mStroke.dashArray; + mCNode.mStroke.dashArraySize = mStroke.dashArraySize; + + } else { + mCNode.mStroke.enable = 0; + } + + switch (mBrush.type()) { + case VBrush::Type::Solid: + mCNode.mType = LOTNode::BrushSolid; + mCNode.mColor.r = mBrush.mColor.r; + mCNode.mColor.g = mBrush.mColor.g; + mCNode.mColor.b = mBrush.mColor.b; + mCNode.mColor.a = mBrush.mColor.a; + break; + case VBrush::Type::LinearGradient: + mCNode.mType = LOTNode::BrushGradient; + mCNode.mGradient.type = LOTNode::Gradient::Linear; + mCNode.mGradient.start.x = mBrush.mGradient->linear.x1; + mCNode.mGradient.start.y = mBrush.mGradient->linear.y1; + mCNode.mGradient.end.x = mBrush.mGradient->linear.x2; + mCNode.mGradient.end.y = mBrush.mGradient->linear.y2; + break; + case VBrush::Type::RadialGradient: + mCNode.mType = LOTNode::BrushGradient; + mCNode.mGradient.type = LOTNode::Gradient::Radial; + mCNode.mGradient.center.x = mBrush.mGradient->radial.cx; + mCNode.mGradient.center.y = mBrush.mGradient->radial.cy; + mCNode.mGradient.focal.x = mBrush.mGradient->radial.fx; + mCNode.mGradient.focal.y = mBrush.mGradient->radial.fy; + mCNode.mGradient.cradius = mBrush.mGradient->radial.cradius; + mCNode.mGradient.fradius = mBrush.mGradient->radial.fradius; + break; + default: + break; + } +} + +/* Lottie Layer Rules + * 1. time stretch is pre calculated and applied to all the properties of the lottilayer model and all its children + * 2. The frame property could be reversed using,time-reverse layer property in AE. which means (start frame > endFrame) + * 3. + */ + +LOTCompItem::LOTCompItem(LOTModel *model):mRootModel(model), mUpdateViewBox(false),mCurFrameNo(-1) +{ + // 1. build layer item list + mCompData = model->mRoot.get(); + for(auto i : mCompData->mChildren) { + LOTLayerData *layerData = dynamic_cast(i.get()); + if (layerData) { + LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerData); + if (layerItem) { + mLayers.push_back(layerItem); + mLayerMap[layerItem->id()] = layerItem; + } + } + } + + //2. update parent layer + for(auto i : mLayers) { + int id = i->parentId(); + if (id >=0) { + auto search = mLayerMap.find(id); + if (search != mLayerMap.end()) { + LOTLayerItem *parentLayer = search->second; + i->setParentLayer(parentLayer); + } + } + } + //3. update static property of each layer + for(auto i : mLayers) { + i->updateStaticProperty(); + } + + mViewSize = mCompData->size(); +} + +LOTCompItem::~LOTCompItem() +{ + for(auto i : mLayers) { + delete i; + } +} + +LOTLayerItem * +LOTCompItem::createLayerItem(LOTLayerData *layerData) +{ + switch(layerData->mLayerType) { + case LayerType::Precomp: { + return new LOTCompLayerItem(layerData); + break; + } + case LayerType::Solid: { + return new LOTSolidLayerItem(layerData); + break; + } + case LayerType::Shape: { + return new LOTShapeLayerItem(layerData); + break; + } + case LayerType::Null: { + return new LOTNullLayerItem(layerData); + break; + } + default: + return nullptr; + break; + } +} + +void LOTCompItem::resize(const VSize &size) +{ + if (mViewSize == size) return; + mViewSize = size; + mUpdateViewBox = true; +} + +VSize LOTCompItem::size() const +{ + return mViewSize; +} + +bool LOTCompItem::update(int frameNo) +{ + VMatrix m; + float sx, sy; + + // check if cached frame is same as requested frame. + if (!mUpdateViewBox && (mCurFrameNo == frameNo)) return false; + + sx = mViewSize.width() / float(mCompData->size().width()); + sy = mViewSize.height() / float(mCompData->size().height()); + float scale = fmin(sx, sy); + m.scale(scale, scale); + + // update the layer from back to front + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->update(frameNo, m, 1.0); + } + buildRenderList(); + mCurFrameNo = frameNo; + mUpdateViewBox = false; + return true; +} + +void LOTCompItem::buildRenderList() +{ + mRenderList.clear(); + std::vector list; + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->renderList(list); + } + + for(auto i : list) { + i->sync(); + mRenderList.push_back(&i->mCNode); + } +} + +const std::vector& LOTCompItem::renderList() const +{ + return mRenderList; +} + +bool LOTCompItem::render(const LOTBuffer &buffer) +{ + VBitmap bitmap((uchar *)buffer.buffer, buffer.width, buffer.height, + buffer.bytesPerLine, VBitmap::Format::ARGB32_Premultiplied, nullptr, nullptr); + + VPainter painter(&bitmap); + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->render(&painter); + } + +// for(auto i : mRenderList) { +// if (i->mType == LOTNode::TypeFill) { +// if (i->mFlag & ChangeFlagPath) { +// FTOutline *outline = VRaster::toFTOutline(i->mFinalPath); +// i->mRleInfo = VRaster::instance().generateFillInfo(outline); +// VRaster::deleteFTOutline(outline); +// i->mFlag = ChangeFlagNone; +// } +// VBrush brush(i->mColor.r, i->mColor.g, i->mColor.b, i->mColor.a); +// painter.setBrush(brush); +// if (!i->mMaskRle.isEmpty()) { +// VRle rle = i->mRleInfo + i->mMaskRle; +// painter.drawRle(VPoint(), rle); +// } else { +// painter.drawRle(VPoint(), i->mRleInfo); +// } +// } else if(i->mType == LOTNode::TypeStroke) { +// if (i->mFlag & ChangeFlagPath) { +// VPath final = i->mFinalPath; +// if (i->mStroke.dashArraySize) { +// VDasher dasher(i->mStroke.dashArray, i->mStroke.dashArraySize); +// final = dasher.dashed(i->mFinalPath); +// } +// FTOutline *outline = VRaster::toFTOutline(final); +// i->mRleInfo = VRaster::instance().generateStrokeInfo(outline, CapStyle::Round, JoinStyle::Round, i->mStroke.width); +// VRaster::deleteFTOutline(outline); +// i->mFlag = ChangeFlagNone; +// } +// VBrush brush(i->mColor.r, i->mColor.g, i->mColor.b, i->mColor.a); +// painter.setBrush(brush); +// painter.drawRle(VPoint(), i->mRleInfo); +// } else if (i->mType == LOTNode::Type::TypeGFill) { +// if (i->mFlag & ChangeFlagPath) { +// FTOutline *outline = VRaster::toFTOutline(i->mFinalPath); +// i->mRleInfo = VRaster::instance().generateFillInfo(outline); +// VRaster::deleteFTOutline(outline); +// i->mFlag = ChangeFlagNone; +// } +// painter.setBrush(i->mBrush); +// painter.drawRle(VPoint(), i->mRleInfo); + +// } +// } + return true; +} + +void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha, const DirtyFlag &flag) +{ + if (mData->mShape.isStatic()) { + if (mLocalPath.isEmpty()) { + mLocalPath = mData->mShape.value(frameNo).toPath(); + } + } else { + mLocalPath = mData->mShape.value(frameNo).toPath(); + } + float opacity = mData->opacity(frameNo); + opacity = opacity * parentAlpha; + + VPath path = mLocalPath; + path.transform(parentMatrix); + + FTOutline *outline = VRaster::toFTOutline(path); + mRle = VRaster::instance().generateFillInfo(outline); + VRaster::deleteFTOutline(outline); + + mRle = mRle * (opacity * 255); + + if (mData->mInv) { + mRle = ~mRle; + } +} + +void LOTLayerItem::render(VPainter *painter) +{ + std::vector list; + renderList(list); + VRle mask = maskRle(); + for(auto i : list) { + i->preprocess(); + painter->setBrush(i->mBrush); + if (!mask.isEmpty()) { + VRle rle = i->mRle + mask; + painter->drawRle(VPoint(), rle); + } else { + painter->drawRle(VPoint(), i->mRle); + } + } +} + +VRle LOTLayerItem::maskRle() +{ + VRle rle; + for (auto &i : mMasks) { + switch (i->maskMode()) { + case LOTMaskData::Mode::Add: { + rle = rle + i->mRle; + break; + } + case LOTMaskData::Mode::Substarct: { + rle = rle - i->mRle; + break; + } + case LOTMaskData::Mode::Intersect: { + rle = rle & i->mRle; + break; + } + default: + break; + } + } + return rle; +} + +LOTLayerItem::LOTLayerItem(LOTLayerData *layerData):mLayerData(layerData), + mParentLayer(nullptr), + mFrameNo(-1), + mDirtyFlag(DirtyFlagBit::All) +{ + if (mLayerData->mHasMask) { + for (auto i : mLayerData->mMasks) { + mMasks.push_back(std::unique_ptr(new LOTMaskItem(i.get()))); + } + } +} + +void LOTLayerItem::updateStaticProperty() +{ + if (mParentLayer) + mParentLayer->updateStaticProperty(); + + mStatic = mParentLayer ? (mLayerData->isStatic() & mParentLayer->isStatic()) : mLayerData->isStatic(); +} + +void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha) +{ + mFrameNo = frameNo; + // 1. check if the layer is part of the current frame + if (!visible()) return; + + // 2. calculate the parent matrix and alpha + VMatrix m = matrix(frameNo) * parentMatrix; + float alpha = parentAlpha * opacity(frameNo); + + //6. update the mask + if (hasMask()) { + for (auto &i : mMasks) + i->update(frameNo, m, alpha, mDirtyFlag); + } + + // 3. update the dirty flag based on the change + if (flag() & DirtyFlagBit::All) { + mCombinedMatrix = m; + mCombinedAlpha = alpha; + } else { + if (!mCombinedMatrix.fuzzyCompare(m)) { + mDirtyFlag |= DirtyFlagBit::Matrix; + mCombinedMatrix = m; + } + if (!vCompare(mCombinedAlpha, alpha)) { + mDirtyFlag |= DirtyFlagBit::Alpha; + mCombinedAlpha = alpha; + } + } + + // 4. if no parent property change and layer is static then nothing to do. + //@TODO fix this regression +// if ((flag() & DirtyFlagBit::None) && isStatic()) +// return; + + //5. update the content of the layer + updateContent(); + + //6. reset the dirty flag + mDirtyFlag = DirtyFlagBit::None; +} + +float +LOTLayerItem::opacity(int frameNo) const +{ + return mLayerData->mTransform->opacity(frameNo); +} + +VMatrix +LOTLayerItem::matrix(int frameNo) const +{ + if (mParentLayer) + return mLayerData->mTransform->matrix(frameNo) * mParentLayer->matrix(frameNo); + else + return mLayerData->mTransform->matrix(frameNo); +} + +bool LOTLayerItem::visible() const +{ + if (frameNo() >= mLayerData->inFrame() && frameNo() < mLayerData->outFrame()) + return true; + else + return false; +} + + + +LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel):LOTLayerItem(layerModel) +{ + for(auto i : mLayerData->mChildren) { + LOTLayerData *layerModel = dynamic_cast(i.get()); + if (layerModel) { + LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel); + if (layerItem) { + mLayers.push_back(layerItem); + mLayerMap[layerItem->id()] = layerItem; + } + } + } + + //2. update parent layer + for(auto i : mLayers) { + int id = i->parentId(); + if (id >=0) { + auto search = mLayerMap.find(id); + if (search != mLayerMap.end()) { + LOTLayerItem *parentLayer = search->second; + i->setParentLayer(parentLayer); + } + } + } + for(auto i : mLayers) { + i->updateStaticProperty(); + } +} + +LOTCompLayerItem::~LOTCompLayerItem() +{ + for(auto i : mLayers) { + delete i; + } +} + +void LOTCompLayerItem::updateContent() +{ + // update the layer from back to front + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->update(frameNo(), combinedMatrix(), combinedAlpha()); + } +} + +void LOTCompLayerItem::renderList(std::vector &list) +{ + if (!visible()) return; + + // update the layer from back to front + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->renderList(list); + } +} + +LOTSolidLayerItem::LOTSolidLayerItem(LOTLayerData *layerData):LOTLayerItem(layerData) +{ + +} + +void LOTSolidLayerItem::updateContent() +{ + if (!mRenderNode) { + mRenderNode = std::unique_ptr(new VDrawable()); + mRenderNode->mType = VDrawable::Type::Fill; + mRenderNode->mFlag |= VDrawable::DirtyState::All; + } + + if (flag() & DirtyFlagBit::Matrix) { + VPath path; + path.addRect(VRectF(0, 0, mLayerData->solidWidth(), mLayerData->solidHeight())); + path.transform(combinedMatrix()); + mRenderNode->mFlag |= VDrawable::DirtyState::Path; + mRenderNode->mPath = path; + } + if (flag() & DirtyFlagBit::Alpha) { + LottieColor color = mLayerData->solidColor(); + VBrush brush(color.toColor(combinedAlpha())); + mRenderNode->setBrush(brush); + mRenderNode->mFlag |= VDrawable::DirtyState::Brush; + } +} + +void LOTSolidLayerItem::renderList(std::vector &list) +{ + if (!visible()) return; + + list.push_back(mRenderNode.get()); +} + +LOTNullLayerItem::LOTNullLayerItem(LOTLayerData *layerData):LOTLayerItem(layerData) +{ + +} +void LOTNullLayerItem::updateContent() +{ + +} + + +LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData):LOTLayerItem(layerData) +{ + mRoot = new LOTContentGroupItem(nullptr); + mRoot->addChildren(layerData); + mRoot->processPaintOperation(); +} + +LOTShapeLayerItem::~LOTShapeLayerItem() +{ + delete mRoot; +} + +LOTContentItem * LOTShapeLayerItem::createContentItem(LOTData *contentData) +{ + switch(contentData->type()) { + case LOTData::Type::ShapeGroup: { + return new LOTContentGroupItem(static_cast(contentData)); + break; + } + case LOTData::Type::Rect: { + return new LOTRectItem(static_cast(contentData)); + break; + } + case LOTData::Type::Ellipse: { + return new LOTEllipseItem(static_cast(contentData)); + break; + } + case LOTData::Type::Shape: { + return new LOTShapeItem(static_cast(contentData)); + break; + } + case LOTData::Type::Polystar: { + return new LOTPolystarItem(static_cast(contentData)); + break; + } + case LOTData::Type::Fill: { + return new LOTFillItem(static_cast(contentData)); + break; + } + case LOTData::Type::GFill: { + return new LOTGFillItem(static_cast(contentData)); + break; + } + case LOTData::Type::Stroke: { + return new LOTStrokeItem(static_cast(contentData)); + break; + } + case LOTData::Type::GStroke: { + return new LOTGStrokeItem(static_cast(contentData)); + break; + } + case LOTData::Type::Repeater: { + return new LOTRepeaterItem(static_cast(contentData)); + break; + } + default: + return nullptr; + break; + } +} + +void LOTShapeLayerItem::updateContent() +{ + mRoot->update(frameNo(), combinedMatrix(), combinedAlpha(), flag()); +} + +void LOTShapeLayerItem::renderList(std::vector &list) +{ + if (!visible()) return; + mRoot->renderList(list); +} + +VPath::Direction LOTContentItem::direction(bool isCW) +{ + if (isCW) + return VPath::Direction::CW; + else + return VPath::Direction::CCW; +} + + +LOTContentGroupItem::LOTContentGroupItem(LOTShapeGroupData *data):mData(data) +{ + addChildren(mData); +} + +void LOTContentGroupItem::addChildren(LOTGroupData *data) +{ + if (!data) return; + + for(auto i : data->mChildren) { + LOTData *data = i.get(); + LOTContentItem *content = LOTShapeLayerItem::createContentItem(data); + if (content) + mContents.push_back(content); + } +} + +LOTContentGroupItem::~LOTContentGroupItem() +{ + for(auto i : mContents) { + delete i; + } +} + + +void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ + VMatrix m = parentMatrix; + float alpha = parentAlpha; + DirtyFlag newFlag = flag; + + if (mData) { + // update the matrix and the flag + if ((flag & DirtyFlagBit::Matrix) || !mData->mTransform->staticMatrix() ) { + newFlag |= DirtyFlagBit::Matrix; + } + m = mData->mTransform->matrix(frameNo) * parentMatrix; + alpha *= mData->mTransform->opacity(frameNo); + + if (!floatCmp(alpha, parentAlpha)) { + newFlag |= DirtyFlagBit::Alpha; + } + } + + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + (*i)->update(frameNo, m, alpha, newFlag); + } +} + +void LOTContentGroupItem::renderList(std::vector &list) +{ + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + (*i)->renderList(list); + } +} + +void LOTContentGroupItem::processPaintOperation() +{ + std::vector list; + paintOperationHelper(list); +} + +void LOTContentGroupItem::paintOperationHelper(std::vector &list) +{ + int curOpCount = list.size(); + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto child = *i; + if (auto pathNode = dynamic_cast(child)) { + // the node is a path data node add the paint operation list to it. + pathNode->addPaintOperation(list, curOpCount); + } else if (auto paintNode = dynamic_cast(child)) { + // add it to the paint operation list + list.push_back(paintNode); + } else if (auto groupNode = dynamic_cast(child)) { + // update the groups node with current list + groupNode->paintOperationHelper(list); + } + } + list.erase(list.begin() + curOpCount, list.end()); +} + +void LOTPathDataItem::addPaintOperation(std::vector &list, int externalCount) +{ + for(auto paintItem : list) { + bool sameGroup = (externalCount-- > 0) ? false : true; + mNodeList.push_back(std::unique_ptr(new VDrawable())); + mRenderList.push_back(LOTRenderNode(this, paintItem, mNodeList.back().get(), sameGroup)); + } +} + + +void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ + mPathChanged = false; + mCombinedAlpha = parentAlpha; + + // 1. update the local path if needed + if (!(mInit && mStaticPath)) { + mLocalPath = getPath(frameNo); + mInit = true; + mPathChanged = true; + } + + // 2. apply path operation if needed + // TODO + + // 3. compute the final path with parentMatrix + if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { + mFinalPath = mLocalPath; + mFinalPath.transform(parentMatrix); + mPathChanged = true; + } + + // 2. update the rendernode list + for (const auto &i : mRenderList) { + i.drawable->mFlag = VDrawable::DirtyState::None; + i.paintNodeRef->updateRenderNode(i.pathNodeRef, i.drawable, i.sameGroup); + if (mPathChanged) { + i.drawable->mPath = mFinalPath; + i.drawable->mFlag |= VDrawable::DirtyState::Path; + } + } +} + +void LOTPathDataItem::renderList(std::vector &list) +{ + for (const auto &i : mRenderList) { + list.push_back(i.drawable); + } +} + +VPath LOTPathDataItem::path() const +{ + return mFinalPath; +} + + +LOTRectItem::LOTRectItem(LOTRectData *data):LOTPathDataItem(data->isStatic()),mData(data) +{ +} + +VPath LOTRectItem::getPath(int frameNo) +{ + VPointF pos = mData->mPos.value(frameNo); + VPointF size = mData->mSize.value(frameNo); + float radius = mData->mRound.value(frameNo); + VRectF r(pos.x() - size.x()/2, pos.y() - size.y()/2, size.x(), size.y()); + + VPath path; + path.addRoundRect(r, radius, radius, direction(mData->isDirectionCW())); + + return path; +} + +LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data):LOTPathDataItem(data->isStatic()),mData(data) +{ + +} + +VPath LOTEllipseItem::getPath(int frameNo) +{ + VPointF pos = mData->mPos.value(frameNo); + VPointF size = mData->mSize.value(frameNo); + VRectF r(pos.x() - size.x()/2, pos.y() - size.y()/2, size.x(), size.y()); + + VPath path; + path.addOval(r, direction(mData->isDirectionCW())); + + return path; +} + +LOTShapeItem::LOTShapeItem(LOTShapeData *data):LOTPathDataItem(data->isStatic()),mData(data) +{ + +} + +VPath LOTShapeItem::getPath(int frameNo) +{ + LottieShapeData shapeData = mData->mShape.value(frameNo); + + if (shapeData.mPoints.empty()) + return VPath(); + + VPath path; + + int size = shapeData.mPoints.size(); + const VPointF *points = shapeData.mPoints.data(); + path.moveTo(points[0]); + for (int i = 1 ; i < size; i+=3) { + path.cubicTo(points[i], points[i+1], points[i+2]); + } + if (shapeData.mClosed) + path.close(); + + return path; +} + + +LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data):LOTPathDataItem(data->isStatic()),mData(data) +{ + +} + +VPath LOTPolystarItem::getPath(int frameNo) +{ + VPointF pos = mData->mPos.value(frameNo); + float points = mData->mPointCount.value(frameNo); + float innerRadius = mData->mInnerRadius.value(frameNo); + float outerRadius = mData->mOuterRadius.value(frameNo); + float innerRoundness = mData->mInnerRoundness.value(frameNo); + float outerRoundness = mData->mOuterRoundness.value(frameNo); + float rotation = mData->mRotation.value(frameNo); + + VPath path; + VMatrix m; + + if (mData->mType == LOTPolystarData::PolyType::Star) { + path.addPolystarStar(0.0, 0.0, 0.0, points, + innerRadius, outerRadius, + innerRoundness, outerRoundness, + direction(mData->isDirectionCW())); + } else { + path.addPolystarPolygon(0.0, 0.0, 0.0, points, + outerRadius, outerRoundness, + direction(mData->isDirectionCW())); + } + + m.translate(pos.x(), pos.y()).rotate(rotation); + m.rotate(rotation); + path.transform(m); + + return path; +} + + + +/* + * PaintData Node handling + * + */ + +void LOTPaintDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ + mContentChanged = false; + mParentAlpha = parentAlpha; + mParentMatrix = parentMatrix; + mFlag = flag; + mFrameNo = frameNo; + // 1. update the local content if needed + // if (!(mInit && mStaticContent)) { + mInit = true; + updateContent(frameNo); + mContentChanged = true; + // } +} + + +LOTFillItem::LOTFillItem(LOTFillData *data):LOTPaintDataItem(data->isStatic()),mData(data) +{ +} + +void LOTFillItem::updateContent(int frameNo) +{ + LottieColor c = mData->mColor.value(frameNo); + float opacity = mData->opacity(frameNo); + mColor = c.toColor(opacity); + mFillRule = mData->fillRule(); +} + +void LOTFillItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +{ + VColor color = mColor; + if (sameParent) + color.setAlpha(color.a * pathNode->combinedAlpha()); + else + color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); + VBrush brush(color); + drawable->setBrush(brush); + drawable->setFillRule(mFillRule); +} + + +LOTGFillItem::LOTGFillItem(LOTGFillData *data):LOTPaintDataItem(data->isStatic()),mData(data) +{ +} + +void LOTGFillItem::updateContent(int frameNo) +{ + mData->update(mGradient, frameNo); + mGradient->mMatrix = mParentMatrix; + mFillRule = mData->fillRule(); +} + +void LOTGFillItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +{ + drawable->setBrush(VBrush(mGradient.get())); + drawable->setFillRule(mFillRule); +} + +LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data):LOTPaintDataItem(data->isStatic()),mData(data) +{ + mDashArraySize = 0; +} + +void LOTStrokeItem::updateContent(int frameNo) +{ + LottieColor c = mData->mColor.value(frameNo); + float opacity = mData->opacity(frameNo); + mColor = c.toColor(opacity); + mCap = mData->capStyle(); + mJoin = mData->joinStyle(); + mMiterLimit = mData->meterLimit(); + mWidth = mData->width(frameNo); + if (mData->hasDashInfo()) { + mDashArraySize = mData->getDashInfo(frameNo, mDashArray); + } +} + +static float getScale(const VMatrix &matrix) +{ + constexpr float SQRT_2 = 1.41421; + VPointF p1(0,0); + VPointF p2(SQRT_2,SQRT_2); + p1 = matrix.map(p1); + p2 = matrix.map(p2); + VPointF final = p2 - p1; + + return std::sqrt( final.x() * final.x() + final.y() * final.y()); +} + +void LOTStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +{ + VColor color = mColor; + if (sameParent) + color.setAlpha(color.a * pathNode->combinedAlpha()); + else + color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); + + VBrush brush(color); + drawable->setBrush(brush); + + drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * getScale(mParentMatrix)); + if (mDashArraySize) { + drawable->setDashInfo(mDashArray, mDashArraySize); + } +} + +LOTGStrokeItem::LOTGStrokeItem(LOTGStrokeData *data):LOTPaintDataItem(data->isStatic()),mData(data) +{ + mDashArraySize = 0; +} + +void LOTGStrokeItem::updateContent(int frameNo) +{ + mData->update(mGradient, frameNo); + mGradient->mMatrix = mParentMatrix; + mCap = mData->capStyle(); + mJoin = mData->joinStyle(); + mMiterLimit = mData->meterLimit(); + mWidth = mData->width(frameNo); + if (mData->hasDashInfo()) { + mDashArraySize = mData->getDashInfo(frameNo, mDashArray); + } +} + +void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +{ + drawable->setBrush(VBrush(mGradient.get())); + drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * getScale(mParentMatrix)); + if (mDashArraySize) { + drawable->setDashInfo(mDashArray, mDashArraySize); + } +} + +LOTTrimItem::LOTTrimItem(LOTTrimData *data):mData(data) +{ + +} + +LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data):mData(data) +{ + +} + +void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ + +} + +void LOTRepeaterItem::renderList(std::vector &list) +{ + +} + diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h new file mode 100644 index 0000000000..829ac07caa --- /dev/null +++ b/src/lottie/lottieitem.h @@ -0,0 +1,396 @@ +#ifndef LOTTIEITEM_H +#define LOTTIEITEM_H + +#include +#include +#include + +#include"vmatrix.h" +#include"vpath.h" +#include"vpoint.h" +#include"lottieplayer.h" +#include"vbrush.h" +#include"vpainter.h" + +enum class DirtyFlagBit +{ + None = 0x0001, + Matrix = 0x0010, + Alpha = 0x0100, + All = (Matrix | Alpha) +}; + +class LOTLayerItem; +class LOTMaskItem; +class VDrawable; + +class LOTCompItem +{ +public: + LOTCompItem(LOTModel *model); + ~LOTCompItem(); + static LOTLayerItem * createLayerItem(LOTLayerData *layerData); + bool update(int frameNo); + void resize(const VSize &size); + VSize size() const; + const std::vector& renderList()const; + void buildRenderList(); + bool render(const LOTBuffer &buffer); +private: + VMatrix mScaleMatrix; + VSize mViewSize; + LOTModel *mRootModel; + LOTCompositionData *mCompData; + std::vector mLayers; + std::unordered_map mLayerMap; + bool mUpdateViewBox; + int mCurFrameNo; + std::vector mRenderList; +}; + +typedef vFlag DirtyFlag; +class LOTLayerItem +{ +public: + LOTLayerItem(LOTLayerData *layerData); + virtual ~LOTLayerItem(){} + int id() const {return mLayerData->id();} + int parentId() const {return mLayerData->parentId();} + void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;} + virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha); + VMatrix matrix(int frameNo) const; + virtual void renderList(std::vector &list){} + void updateStaticProperty(); + void render(VPainter *painter); +protected: + virtual void updateContent() = 0; + inline VMatrix combinedMatrix() const {return mCombinedMatrix;} + inline int frameNo() const {return mFrameNo;} + inline float combinedAlpha() const {return mCombinedAlpha;} + inline bool isStatic() const {return mStatic;} + float opacity(int frameNo) const; + bool visible() const; + inline DirtyFlag flag() const {return mDirtyFlag;} + VRle maskRle(); + bool hasMask() const {return !mMasks.empty();} +protected: + std::vector> mMasks; + LOTLayerData *mLayerData; + LOTLayerItem *mParentLayer; + VMatrix mCombinedMatrix; + float mCombinedAlpha; + int mFrameNo; + DirtyFlag mDirtyFlag; + bool mVisible; + bool mStatic; +}; + +class LOTCompLayerItem: public LOTLayerItem +{ +public: + ~LOTCompLayerItem(); + LOTCompLayerItem(LOTLayerData *layerData); + void renderList(std::vector &list)final; +protected: + void updateContent() final; +private: + std::vector mLayers; + std::unordered_map mLayerMap; + int mLastFrame; +}; + +class LOTSolidLayerItem: public LOTLayerItem +{ +public: + LOTSolidLayerItem(LOTLayerData *layerData); +protected: + void updateContent() final; + void renderList(std::vector &list) final; +private: + std::unique_ptr mRenderNode; +}; + +class LOTContentItem; +class LOTContentGroupItem; +class LOTShapeLayerItem: public LOTLayerItem +{ +public: + ~LOTShapeLayerItem(); + LOTShapeLayerItem(LOTLayerData *layerData); + static LOTContentItem * createContentItem(LOTData *contentData); + void renderList(std::vector &list)final; +protected: + void updateContent() final; + LOTContentGroupItem *mRoot; +}; + +class LOTNullLayerItem: public LOTLayerItem +{ +public: + LOTNullLayerItem(LOTLayerData *layerData); +protected: + void updateContent() final; +}; + +class LOTMaskItem +{ +public: + LOTMaskItem(LOTMaskData *data): mData(data), mCombinedAlpha(0){} + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); + LOTMaskData::Mode maskMode() const { return mData->mMode;} +public: + LOTMaskData *mData; + float mCombinedAlpha; + VMatrix mCombinedMatrix; + VPath mLocalPath; + VRle mRle; +}; + +class VDrawable +{ +public: + enum class DirtyState { + None = 0x00000000, + Path = 0x00000001, + Stroke = 0x00000010, + Brush = 0x00000100, + All = (None | Path | Stroke | Brush) + }; + enum class Type { + Fill, + Stroke, + }; + typedef vFlag DirtyFlag; + VDrawable(); + void sync(); + void setPath(const VPath &path); + void setFillRule(FillRule rule){mFillRule = rule;} + void setBrush(const VBrush &brush){mBrush = brush;} + void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); + void setDashInfo(float *array, int size); + void preprocess(); +public: + DirtyFlag mFlag; + VDrawable::Type mType; + VBrush mBrush; + VPath mPath; + FillRule mFillRule; + VRle mRle; + struct { + bool enable; + float width; + CapStyle cap; + JoinStyle join; + float meterLimit; + float *dashArray; + int dashArraySize; + }mStroke; + LOTNode mCNode; +}; + +class LOTNode; +class LOTPathDataItem; +class LOTPaintDataItem; +struct LOTRenderNode +{ + LOTRenderNode(LOTPathDataItem *path, LOTPaintDataItem *paint, VDrawable *render, bool sameG) + :pathNodeRef(path), paintNodeRef(paint), drawable(render), sameGroup(sameG){} + LOTPathDataItem *pathNodeRef; + LOTPaintDataItem *paintNodeRef; + VDrawable *drawable; + bool sameGroup; +}; + +class LOTContentItem +{ +public: + LOTContentItem(){} + virtual ~LOTContentItem(){} + virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0; + virtual void renderList(std::vector &list){} + VPath::Direction direction(bool isCW); +}; + +class LOTContentGroupItem: public LOTContentItem +{ +public: + ~LOTContentGroupItem(); + LOTContentGroupItem(LOTShapeGroupData *data); + void addChildren(LOTGroupData *data); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + void processPaintOperation(); + void renderList(std::vector &list) final; +private: + void paintOperationHelper(std::vector &list); + LOTShapeGroupData *mData; + std::vector mContents; +}; + +class LOTPathDataItem : public LOTContentItem +{ +public: + LOTPathDataItem(bool staticPath):mInit(false), mStaticPath(staticPath){} + void addPaintOperation(std::vector &list, int externalCount); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + VPath path() const; + inline float combinedAlpha() const{ return mCombinedAlpha;} + void renderList(std::vector &list) final; +private: + std::vector mRenderList; + std::vector> mNodeList; + bool mInit; + bool mStaticPath; + VPath mLocalPath; + VPath mFinalPath; + bool mPathChanged; + float mCombinedAlpha; +protected: + virtual VPath getPath(int frameNo) = 0; +}; + +class LOTRectItem: public LOTPathDataItem +{ +public: + LOTRectItem(LOTRectData *data); +protected: + VPath getPath(int frameNo) final; + LOTRectData *mData; +}; + +class LOTEllipseItem: public LOTPathDataItem +{ +public: + LOTEllipseItem(LOTEllipseData *data); +private: + VPath getPath(int frameNo) final; + LOTEllipseData *mData; +}; + +class LOTShapeItem: public LOTPathDataItem +{ +public: + LOTShapeItem(LOTShapeData *data); +private: + VPath getPath(int frameNo) final; + LOTShapeData *mData; +}; + +class LOTPolystarItem: public LOTPathDataItem +{ +public: + LOTPolystarItem(LOTPolystarData *data); +private: + VPath getPath(int frameNo) final; + LOTPolystarData *mData; +}; + + + +class LOTPaintDataItem : public LOTContentItem +{ +public: + LOTPaintDataItem(bool staticContent):mInit(false), mStaticContent(staticContent){} + virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); + virtual void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) = 0; +protected: + virtual void updateContent(int frameNo) = 0; + inline float parentAlpha() const {return mParentAlpha;} + inline bool contentChanged() const{return mContentChanged;} +public: + float mParentAlpha; + VMatrix mParentMatrix; + DirtyFlag mFlag; + int mFrameNo; + bool mInit; + bool mStaticContent; + bool mContentChanged; +}; + +class LOTFillItem : public LOTPaintDataItem +{ +public: + LOTFillItem(LOTFillData *data); +protected: + void updateContent(int frameNo) final; + void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; +private: + LOTFillData *mData; + VColor mColor; + FillRule mFillRule; +}; + +class LOTGFillItem : public LOTPaintDataItem +{ +public: + LOTGFillItem(LOTGFillData *data); +protected: + void updateContent(int frameNo) final; + void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; +private: + LOTGFillData *mData; + std::unique_ptr mGradient; + FillRule mFillRule; +}; + +class LOTStrokeItem : public LOTPaintDataItem +{ +public: + LOTStrokeItem(LOTStrokeData *data); +protected: + void updateContent(int frameNo) final; + void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; +private: + LOTStrokeData *mData; + CapStyle mCap; + JoinStyle mJoin; + float mMiterLimit; + VColor mColor; + float mWidth; + float mDashArray[6]; + int mDashArraySize; +}; + +class LOTGStrokeItem : public LOTPaintDataItem +{ +public: + LOTGStrokeItem(LOTGStrokeData *data); +protected: + void updateContent(int frameNo) final; + void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; +private: + LOTGStrokeData *mData; + std::unique_ptr mGradient; + CapStyle mCap; + JoinStyle mJoin; + float mMiterLimit; + VColor mColor; + float mWidth; + float mDashArray[6]; + int mDashArraySize; +}; + + +// Trim Item + +class LOTTrimItem : public LOTContentItem +{ +public: + LOTTrimItem(LOTTrimData *data); +private: + LOTTrimData *mData; +}; + +class LOTRepeaterItem : public LOTContentItem +{ +public: + LOTRepeaterItem(LOTRepeaterData *data); + virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + virtual void renderList(std::vector &list) final; +private: + LOTRepeaterData *mData; +}; + + +#endif // LOTTIEITEM_H + + diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp new file mode 100644 index 0000000000..e91849039c --- /dev/null +++ b/src/lottie/lottieloader.cpp @@ -0,0 +1,85 @@ +#include "lottieloader.h" +#include "lottieparser.h" + +#include +#include + +class LottieFileCache +{ +public: + ~LottieFileCache(); + static LottieFileCache &get() { + static LottieFileCache CACHE; + + return CACHE; + } + std::shared_ptr find(std::string &key); + void add(std::string &key, std::shared_ptr value); +private: + LottieFileCache(){} + + std::unordered_map> mHash; + +}; + +LottieFileCache::~LottieFileCache() +{ + +} +std::shared_ptr +LottieFileCache::find(std::string &key) +{ + auto search = mHash.find(key); + if (search != mHash.end()) { + return search->second; + } else { + return nullptr; + } +} + +void +LottieFileCache::add(std::string &key, std::shared_ptr value) +{ + mHash[key] = value; +} + +LottieLoader::LottieLoader() +{ + +} + +bool LottieLoader::load(std::string &path) +{ + if (path.empty()) return false; + + LottieFileCache &fileCache = LottieFileCache::get(); + + mModel = fileCache.find(path); + if (mModel) + return true; + + std::ifstream f; + f.open(path); + + if (!f.is_open()) { + printf("failed to open \n"); + return false; + } else { + std::stringstream buf; + buf << f.rdbuf(); + + LottieParser parser(const_cast(buf.str().data())); + mModel = parser.model(); + fileCache.add(path, mModel); + + f.close(); + } + + return true; +} + +std::shared_ptr LottieLoader::model() +{ + return mModel; +} + diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h new file mode 100644 index 0000000000..0c4367b480 --- /dev/null +++ b/src/lottie/lottieloader.h @@ -0,0 +1,20 @@ +#ifndef LOTTIELOADER_H +#define LOTTIELOADER_H + +#include +#include + +class LOTModel; +class LottieLoader +{ +public: + LottieLoader(); + bool load(std::string &filePath); + std::shared_ptr model(); +private: + std::shared_ptr mModel; +}; + +#endif // LOTTIELOADER_H + + diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp new file mode 100644 index 0000000000..e843008c39 --- /dev/null +++ b/src/lottie/lottiemodel.cpp @@ -0,0 +1,274 @@ +#include "lottiemodel.h" +#include +#include + + + +class LottieRepeaterProcesser : public LOTDataVisitor +{ +public: + LottieRepeaterProcesser():mRepeaterFound(false){} + void visit(LOTCompositionData *obj) {} + void visit(LOTLayerData *obj) {} + void visit(LOTTransformData *) {} + void visit(LOTShapeGroupData *obj) {} + void visit(LOTShapeData *) {} + void visit(LOTRectData *) {} + void visit(LOTEllipseData *) {} + void visit(LOTTrimData *) {} + void visit(LOTRepeaterData *) { mRepeaterFound = true;} + void visit(LOTFillData *) {} + void visit(LOTStrokeData *) {} + void visit(LOTPolystarData *) {} + void visitChildren(LOTGroupData *obj) { + for(auto child :obj->mChildren) { + child.get()->accept(this); + if (mRepeaterFound) { + LOTRepeaterData *repeater = static_cast(child.get()); + std::shared_ptr sharedShapeGroup= std::make_shared(); + LOTShapeGroupData *shapeGroup = sharedShapeGroup.get(); + repeater->mChildren.push_back(sharedShapeGroup); + // copy all the child of the object till repeater and + // move that in to a group and then add that group to + // the repeater object. + for(auto cpChild :obj->mChildren) { + if (cpChild == child) + break; + // there shouldn't be any trim object left in the child list + if (cpChild.get()->type() == LOTData::Type::Trim) { + assert(0); + } + shapeGroup->mChildren.push_back(cpChild); + } + mRepeaterFound = false; + } + } + } +public: + bool mRepeaterFound; +}; + +class LottiePathOperationProcesser : public LOTDataVisitor +{ +public: + LottiePathOperationProcesser():mPathOperator(false), mPathNode(false){} + void visit(LOTCompositionData *obj) {} + void visit(LOTLayerData *obj) {} + void visit(LOTTransformData *) {} + void visit(LOTShapeGroupData *obj) {} + void visit(LOTShapeData *) {mPathNode = true;} + void visit(LOTRectData *) {mPathNode = true;} + void visit(LOTEllipseData *) { mPathNode = true;} + void visit(LOTTrimData *) { mPathOperator = true;} + void visit(LOTRepeaterData *) {} + void visit(LOTFillData *) {} + void visit(LOTStrokeData *) {} + void visit(LOTPolystarData *) { mPathNode = true;} + void visitChildren(LOTGroupData *obj) { + int curOpCount = mPathOperationList.size(); + mPathOperator = false; + mPathNode = false; + for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); ++i) { + auto child = *i; + child.get()->accept(this); + if (mPathOperator) { + mPathOperationList.push_back(child); + //obj->mChildren.erase(std::next(i).base()); + } + if (mPathNode) { + updatePathObject(static_cast(child.get())); + } + mPathOperator = false; + mPathNode = false; + } + mPathOperationList.erase(mPathOperationList.begin() + curOpCount, mPathOperationList.end()); + } + + void updatePathObject(LOTPath *drawable) { + for (auto i = mPathOperationList.rbegin(); i != mPathOperationList.rend(); ++i) { + drawable->mPathOperations.push_back(*i); + } + } +public: + bool mPathOperator; + bool mPathNode; + std::vector> mPathOperationList; +}; + +class LottiePaintOperationProcesser : public LOTDataVisitor +{ +public: + LottiePaintOperationProcesser():mPaintOperator(false), mPathNode(false){} + void visit(LOTCompositionData *obj) {} + void visit(LOTLayerData *obj) {} + void visit(LOTTransformData *) {} + void visit(LOTShapeGroupData *obj) {} + void visit(LOTShapeData *) {mPathNode = true;} + void visit(LOTRectData *) {mPathNode = true;} + void visit(LOTEllipseData *) { mPathNode = true;} + void visit(LOTTrimData *) {} + void visit(LOTRepeaterData *) {} + void visit(LOTFillData *) { mPaintOperator = true;} + void visit(LOTStrokeData *) { mPaintOperator = true;} + void visit(LOTPolystarData *) { mPathNode = true;} + void visitChildren(LOTGroupData *obj) { + int curOpCount = mPaintOperationList.size(); + mPaintOperator = false; + mPathNode = false; + for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); ++i) { + auto child = *i; + child.get()->accept(this); + if (mPaintOperator) { + mPaintOperationList.push_back(child); + //obj->mChildren.erase(std::next(i).base()); + } + if (mPathNode) { + // put it in the list + updatePathObject(static_cast(child.get())); + } + mPaintOperator = false; + mPathNode = false; + } + mPaintOperationList.erase(mPaintOperationList.begin() + curOpCount, mPaintOperationList.end()); + } + + void updatePathObject(LOTPath *drawable) { + for (auto i = mPaintOperationList.begin(); i != mPaintOperationList.end(); ++i) { + drawable->mPaintOperations.push_back(*i); + } + } +public: + bool mPaintOperator; + bool mPathNode; + std::vector> mPaintOperationList; +}; + +void LOTCompositionData::processRepeaterObjects() +{ + LottieRepeaterProcesser visitor; + accept(&visitor); +} + +void LOTCompositionData::processPathOperatorObjects() +{ + LottiePathOperationProcesser visitor; + accept(&visitor); +} + +void LOTCompositionData::processPaintOperatorObjects() +{ + LottiePaintOperationProcesser visitor; + accept(&visitor); +} + + +VMatrix LOTTransformData::matrix(int frameNo) const +{ + if (mStaticMatrix) + return mCachedMatrix; + else + return computeMatrix(frameNo); +} + +float LOTTransformData::opacity(int frameNo) const +{ + return mOpacity.value(frameNo)/100.f; +} + +void LOTTransformData::cacheMatrix() +{ + mCachedMatrix = computeMatrix(0); +} + +VMatrix LOTTransformData::computeMatrix(int frameNo) const +{ + VMatrix m; + m.translate(mPosition.value(frameNo)). + rotate(mRotation.value(frameNo)). + scale(mScale.value(frameNo)/100.f). + translate(-mAnchor.value(frameNo)); + return m; +} + +int LOTStrokeData::getDashInfo(int frameNo, float *array) const +{ + if (!mDash.mDashCount) return 0; + // odd case + if (mDash.mDashCount % 2) { + for (int i = 0; i < mDash.mDashCount; i++) { + array[i] = mDash.mDashArray[i].value(frameNo); + } + return mDash.mDashCount; + } else { // even case when last gap info is not provided. + int i; + for (i = 0; i < mDash.mDashCount-1 ; i++) { + array[i] = mDash.mDashArray[i].value(frameNo); + } + array[i] = array[i-1]; + array[i+1] = mDash.mDashArray[i].value(frameNo); + return mDash.mDashCount+1; + } +} + +int LOTGStrokeData::getDashInfo(int frameNo, float *array) const +{ + if (!mDash.mDashCount) return 0; + // odd case + if (mDash.mDashCount % 2) { + for (int i = 0; i < mDash.mDashCount; i++) { + array[i] = mDash.mDashArray[i].value(frameNo); + } + return mDash.mDashCount; + } else { // even case when last gap info is not provided. + int i; + for (i = 0; i < mDash.mDashCount-1 ; i++) { + array[i] = mDash.mDashArray[i].value(frameNo); + } + array[i] = array[i-1]; + array[i+1] = mDash.mDashArray[i].value(frameNo); + return mDash.mDashCount+1; + } +} + +void LOTGradient::update(std::unique_ptr &grad, int frameNo) +{ + bool init = false; + if (!grad) { + if (mGradientType == 1) + grad = std::unique_ptr(new VLinearGradient(0,0,0,0)); + else + grad = std::unique_ptr(new VRadialGradient(0,0,0,0,0,0)); + grad->mSpread = VGradient::Spread::Pad; + init = true; + } + + if (!mGradient.isStatic() || init) { + LottieGradient gradData = mGradient.value(frameNo); + int size = gradData.mGradient.size(); + float *ptr = gradData.mGradient.data(); + grad->mStops.clear(); + for (int i = 0; i < size ; i += 4) { + float stop = ptr[i]; + LottieColor color = LottieColor(ptr[i+1], ptr[i+2], ptr[i+3]); + grad->mStops.push_back(std::make_pair(stop, color.toColor())); + } + } + + if (mGradientType == 1) { //linear gradient + VPointF start = mStartPoint.value(frameNo); + VPointF end = mEndPoint.value(frameNo); + grad->linear.x1 = start.x(); + grad->linear.y1 = start.y(); + grad->linear.x2 = end.x(); + grad->linear.y2 = end.y(); + } else { // radial gradient + VPointF start = mStartPoint.value(frameNo); + VPointF end = mEndPoint.value(frameNo); + grad->radial.cx = start.x(); + grad->radial.cy = start.y(); + grad->radial.fx = end.x(); + grad->radial.fy = end.y(); + } +} + + diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h new file mode 100644 index 0000000000..7ae6b81e8b --- /dev/null +++ b/src/lottie/lottiemodel.h @@ -0,0 +1,755 @@ +#ifndef LOTModel_H +#define LOTModel_H + +#include +#include +#include +#include"vpoint.h" +#include"vrect.h" +#include"vinterpolator.h" +#include"vmatrix.h" +#include"vbezier.h" +#include"vbrush.h" +#include"vpath.h" + + +class LOTCompositionData; +class LOTLayerData; +class LOTTransformData; +class LOTShapeGroupData; +class LOTShapeData; +class LOTRectData; +class LOTEllipseData; +class LOTTrimData; +class LOTRepeaterData; +class LOTFillData; +class LOTStrokeData; +class LOTGroupData; +class LOTGFillData; +class LOTGStrokeData; +class LottieShapeData; +class LOTPolystarData; +class LOTMaskData; + +class LOTDataVisitor +{ +public: + virtual ~LOTDataVisitor() {} + virtual void visit(LOTCompositionData *) = 0; + virtual void visit(LOTLayerData *) = 0; + virtual void visit(LOTTransformData *) = 0; + virtual void visit(LOTShapeGroupData *) = 0; + virtual void visit(LOTShapeData *) = 0; + virtual void visit(LOTRectData *) = 0; + virtual void visit(LOTEllipseData *) = 0; + virtual void visit(LOTPolystarData *) {}; + virtual void visit(LOTTrimData *) = 0; + virtual void visit(LOTRepeaterData *) = 0; + virtual void visit(LOTFillData *) = 0; + virtual void visit(LOTStrokeData *) = 0; + virtual void visit(LOTGFillData *){}; + virtual void visit(LOTGStrokeData *){}; + virtual void visitChildren(LOTGroupData *) = 0; +}; + +enum class MatteType +{ + None = 0, + Alpha = 1, + AlphaInv, + Luma, + LumaInv +}; + +enum class LayerType { + Precomp = 0, + Solid = 1, + Image = 2, + Null = 3, + Shape = 4, + Text = 5 +}; + +class LottieColor +{ +public: + LottieColor():r(1),g(1), b(1){} + LottieColor(float red, float green , float blue):r(red), g(green),b(blue){} + VColor toColor(float a=1){ return VColor((255 * r), (255 * g), (255 * b), (255 * a));} + friend inline LottieColor operator+(const LottieColor &c1, const LottieColor &c2); + friend inline LottieColor operator-(const LottieColor &c1, const LottieColor &c2); +public: + float r; + float g; + float b; +}; + +inline LottieColor operator-(const LottieColor &c1, const LottieColor &c2) +{ + return LottieColor(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b); +} +inline LottieColor operator+(const LottieColor &c1, const LottieColor &c2) +{ + return LottieColor(c1.r + c2.r, c1.g + c2.g, c1.b + c2.b); +} + +inline const LottieColor operator*(const LottieColor &c, float m) +{ return LottieColor(c.r*m, c.g*m, c.b*m); } + +inline const LottieColor operator*(float m, const LottieColor &c) +{ return LottieColor(c.r*m, c.g*m, c.b*m); } + +class LottieShapeData +{ +public: + VPath toPath() const{ + if (mPoints.empty()) return VPath(); + + VPath path; + int size = mPoints.size(); + const VPointF *points = mPoints.data(); + path.moveTo(points[0]); + for (int i = 1 ; i < size; i+=3) { + path.cubicTo(points[i], points[i+1], points[i+2]); + } + if (mClosed) + path.close(); + + return path; + } +public: + std::vector mPoints; + bool mClosed = false; /* "c" */ +}; + + +template +class LOTKeyFrame +{ +public: + LOTKeyFrame():mStartValue(), + mEndValue(), + mStartFrame(0), + mEndFrame(0), + mInterpolator(nullptr), + mInTangent(), + mOutTangent(), + mPathKeyFrame(false){} + + T value(int frameNo) const { + float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); + return mStartValue + progress * (mEndValue - mStartValue); + } + +public: + T mStartValue; + T mEndValue; + int mStartFrame; + int mEndFrame; + std::shared_ptr mInterpolator; + + /* this is for interpolating position along a path + * Need to move to other place because its only applicable + * for positional property. + */ + VPointF mInTangent; + VPointF mOutTangent; + bool mPathKeyFrame; +}; + +template<> +class LOTKeyFrame +{ +public: + LOTKeyFrame():mStartValue(), + mEndValue(), + mStartFrame(0), + mEndFrame(0), + mInterpolator(nullptr), + mInTangent(), + mOutTangent(), + mPathKeyFrame(false){} + + VPointF value(int frameNo) const { + float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); + if (mPathKeyFrame & 1) { + return VBezier::fromPoints(mStartValue, mStartValue + mOutTangent, mEndValue + mInTangent, mEndValue).pointAt(progress); + } else { + return mStartValue + progress * (mEndValue - mStartValue); + } + } + +public: + VPointF mStartValue; + VPointF mEndValue; + int mStartFrame; + int mEndFrame; + std::shared_ptr mInterpolator; + + /* this is for interpolating position along a path + * Need to move to other place because its only applicable + * for positional property. + */ + VPointF mInTangent; + VPointF mOutTangent; + bool mPathKeyFrame; +}; + +template<> +class LOTKeyFrame +{ +public: + LOTKeyFrame():mStartValue(), + mEndValue(), + mStartFrame(0), + mEndFrame(0), + mInterpolator(nullptr), + mInTangent(), + mOutTangent(), + mPathKeyFrame(false){} + + LottieShapeData value(int frameNo) const { + float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); + + if (mStartValue.mPoints.size() != mEndValue.mPoints.size()) + return LottieShapeData(); + + LottieShapeData result; + for (unsigned int i = 0 ; i < mStartValue.mPoints.size(); i++) { + result.mPoints.push_back(mStartValue.mPoints[i] + progress * (mEndValue.mPoints[i] - mStartValue.mPoints[i])); + } + return result; + } + +public: + LottieShapeData mStartValue; + LottieShapeData mEndValue; + int mStartFrame; + int mEndFrame; + std::shared_ptr mInterpolator; + + /* this is for interpolating position along a path + * Need to move to other place because its only applicable + * for positional property. + */ + VPointF mInTangent; + VPointF mOutTangent; + bool mPathKeyFrame; +}; + +template +class LOTAnimInfo +{ +public: + bool hasKeyFrame(int frameNo) { + if (frameNo >= mStartFrame && frameNo <= mEndFrame) + return true; + else + return false; + } + T value(int frameNo) const { + if (mStartFrame >= frameNo) + return mKeyFrames.front().mStartValue; + if(mEndFrame <= frameNo) + return mKeyFrames.back().mEndValue; + + for(auto keyFrame : mKeyFrames) { + if (frameNo >= keyFrame.mStartFrame && frameNo <= keyFrame.mEndFrame) + return keyFrame.value(frameNo); + } + return T(); + } +public: + std::vector> mKeyFrames; + int mStartFrame; + int mEndFrame; +}; + +template +class LOTAnimatable +{ +public: + LOTAnimatable():mValue(),mAnimInfo(nullptr){} + LOTAnimatable(const T &value): mValue(value){} + bool isStatic() const {if (mAnimInfo) return false; else return true;} + T value(int frameNo) const{ + if (isStatic()) + return mValue; + else + return mAnimInfo->value(frameNo); + } +public: + T mValue; + int mPropertyIndex; /* "ix" */ + std::shared_ptr> mAnimInfo; +}; + +enum class LottieBlendMode +{ + Normal = 0, + Multiply = 1, + Screen = 2, + OverLay = 3 +}; + +class LOTDataVisitor; +class LOTData +{ +public: + enum class Type { + Composition = 1, + Layer, + ShapeGroup, + Transform, + Fill, + Stroke, + GFill, + GStroke, + Rect, + Ellipse, + Shape, + Polystar, + Trim, + Repeater + }; + inline LOTData::Type type() const {return mType;} + virtual void accept(LOTDataVisitor *){} + virtual ~LOTData(){} + LOTData(LOTData::Type type): mStatic(true), mType(type){} + bool isStatic() const{return mStatic;} + void setStatic(bool value) {mStatic = value;} + virtual bool hasChildren() {return false;} +public: + bool mStatic; + LOTData::Type mType; +}; + +class LOTGroupData: public LOTData +{ +public: + LOTGroupData(LOTData::Type type):LOTData(type){} + virtual bool hasChildren() {return true;} +public: + std::vector> mChildren; + std::shared_ptr mTransform; +}; + +class LOTShapeGroupData : public LOTGroupData +{ +public: + void accept(LOTDataVisitor *visitor) override + {visitor->visit(this); visitor->visitChildren(this);} + + LOTShapeGroupData():LOTGroupData(LOTData::Type::ShapeGroup){} +}; + +class LOTLayerData; +class LOTAsset +{ +public: + LOTAsset(){} + int mAssetType; //lottie asset type (precomp/char/image) + std::string mRefId; // ref id + std::vector> mLayers; +}; + +class LOTCompositionData : public LOTGroupData +{ +public: + void processPathOperatorObjects(); + void processPaintOperatorObjects(); + void processRepeaterObjects(); + void accept(LOTDataVisitor *visitor) override + {visitor->visit(this); visitor->visitChildren(this);} + LOTCompositionData():LOTGroupData(LOTData::Type::Composition){} + inline long frameDuration()const{return mEndFrame - mStartFrame -1;} + inline long frameRate()const{return mFrameRate;} + inline long startFrame() const {return mStartFrame;} + inline long endFrame() const {return mEndFrame;} + inline VSize size() const { return mSize;} + +public: + std::string mVersion; + VSize mSize; + bool mAnimation = false; + long mStartFrame = 0; + long mEndFrame = 0; + float mFrameRate; + LottieBlendMode mBlendMode; + std::unordered_map> mInterpolatorCache; + std::unordered_map> mAssets; +}; + +class LOTLayerData : public LOTGroupData +{ +public: + void accept(LOTDataVisitor *visitor) override + {visitor->visit(this); visitor->visitChildren(this);} + LOTLayerData():LOTGroupData(LOTData::Type::Layer), + mMatteType(MatteType::None), + mParentId(-1), + mId(-1), + mHasPathOperator(false), mHasMask(false){} + inline bool hasPathOperator() const noexcept {return mHasPathOperator;} + inline int id() const noexcept{ return mId;} + inline int parentId() const noexcept{ return mParentId;} + inline int inFrame() const noexcept{return mInFrame;} + inline int outFrame() const noexcept{return mOutFrame;} + inline int startFrame() const noexcept{return mOutFrame;} + inline int solidWidth() const noexcept{return mSolidLayer.mWidth;} + inline int solidHeight() const noexcept{return mSolidLayer.mHeight;} + inline LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} +public: + MatteType mMatteType; + VRect mBound; + LayerType mLayerType; //lottie layer type (solid/shape/precomp) + int mParentId; // Lottie the id of the parent in the composition + int mId; // Lottie the group id used for parenting. + long mInFrame = 0; + long mOutFrame = 0; + long mStartFrame = 0; + LottieBlendMode mBlendMode; + float mTimeStreatch; + std::string mPreCompRefId; + LOTAnimatable mTimeRemap; /* "tm" */ + struct SolidLayer { + int mWidth; + int mHeight; + LottieColor mColor; + }; + SolidLayer mSolidLayer; + bool mHasPathOperator; + bool mHasMask; + std::vector> mMasks; +}; + +class LOTTransformData : public LOTData +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTTransformData():LOTData(LOTData::Type::Transform), + mRotation(0), + mScale(VPointF(100, 100)), + mPosition(VPointF(0, 0)), + mAnchor(VPointF(0, 0)), + mOpacity(100), + mSkew(0), + mSkewAxis(0), + mStaticMatrix(true){} + VMatrix matrix(int frameNo) const; + float opacity(int frameNo) const; + void cacheMatrix(); + inline bool staticMatrix() const {return mStaticMatrix;} +private: + VMatrix computeMatrix(int frameNo) const; +public: + LOTAnimatable mRotation; /* "r" */ + LOTAnimatable mScale; /* "s" */ + LOTAnimatable mPosition; /* "p" */ + LOTAnimatable mAnchor; /* "a" */ + LOTAnimatable mOpacity; /* "o" */ + LOTAnimatable mSkew; /* "sk" */ + LOTAnimatable mSkewAxis; /* "sa" */ + bool mStaticMatrix; + VMatrix mCachedMatrix; +}; + +class LOTFillData : public LOTData +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTFillData():LOTData(LOTData::Type::Fill), mFillRule(FillRule::Winding){} + inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + inline FillRule fillRule() const {return mFillRule;} +public: + FillRule mFillRule; /* "r" */ + LOTAnimatable mColor; /* "c" */ + LOTAnimatable mOpacity; /* "o" */ + bool mEnabled = true; /* "fillEnabled" */ +}; + +struct LOTDashProperty +{ + LOTDashProperty():mDashCount(0), mStatic(true){} + LOTAnimatable mDashArray[5]; /* "d" "g" "o"*/ + int mDashCount; + bool mStatic; +}; + +class LOTStrokeData : public LOTData +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTStrokeData():LOTData(LOTData::Type::Stroke){} + inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + inline float width(int frameNo) const {return mWidth.value(frameNo);} + inline CapStyle capStyle() const {return mCapStyle;} + inline JoinStyle joinStyle() const {return mJoinStyle;} + inline float meterLimit() const{return mMeterLimit;} + inline bool hasDashInfo() const { return !(mDash.mDashCount == 0);} + int getDashInfo(int frameNo, float *array) const; +public: + LOTAnimatable mColor; /* "c" */ + LOTAnimatable mOpacity; /* "o" */ + LOTAnimatable mWidth; /* "w" */ + CapStyle mCapStyle; /* "lc" */ + JoinStyle mJoinStyle; /* "lj" */ + float mMeterLimit; /* "ml" */ + LOTDashProperty mDash; + bool mEnabled = true; /* "fillEnabled" */ +}; + +class LottieGradient +{ +public: + friend inline LottieGradient operator+(const LottieGradient &g1, const LottieGradient &g2); + friend inline LottieGradient operator-(const LottieGradient &g1, const LottieGradient &g2); + friend inline LottieGradient operator*(float m, const LottieGradient &g); +public: + std::vector mGradient; +}; + +inline LottieGradient operator+(const LottieGradient &g1, const LottieGradient &g2) +{ + if (g1.mGradient.size() != g2.mGradient.size()) + return g1; + + LottieGradient newG; + newG.mGradient = g1.mGradient; + + auto g2It = g2.mGradient.begin(); + for(auto &i : newG.mGradient) { + i = i + *g2It; + g2It++; + } + + return newG; +} + +inline LottieGradient operator-(const LottieGradient &g1, const LottieGradient &g2) +{ + if (g1.mGradient.size() != g2.mGradient.size()) + return g1; + LottieGradient newG; + newG.mGradient = g1.mGradient; + + auto g2It = g2.mGradient.begin(); + for(auto &i : newG.mGradient) { + i = i - *g2It; + g2It++; + } + + return newG; +} + +inline LottieGradient operator*(float m, const LottieGradient &g) +{ + LottieGradient newG; + newG.mGradient = g.mGradient; + + for(auto &i : newG.mGradient) { + i = i * m; + } + return newG; +} + + + +class LOTGradient : public LOTData +{ +public: + LOTGradient(LOTData::Type type):LOTData(type){} + inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + void update(std::unique_ptr &grad, int frameNo); +public: + int mGradientType; /* "t" Linear=1 , Radial = 2*/ + LOTAnimatable mStartPoint; /* "s" */ + LOTAnimatable mEndPoint; /* "e" */ + LOTAnimatable mHighlightLength; /* "h" */ + LOTAnimatable mHighlightAngle; /* "a" */ + LOTAnimatable mOpacity; /* "o" */ + LOTAnimatable mGradient; /* "g" */ + bool mEnabled = true; /* "fillEnabled" */ +}; + +class LOTGFillData : public LOTGradient +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTGFillData():LOTGradient(LOTData::Type::GFill), mFillRule(FillRule::Winding){} + inline FillRule fillRule() const {return mFillRule;} +public: + FillRule mFillRule; /* "r" */ +}; + +class LOTGStrokeData : public LOTGradient +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTGStrokeData():LOTGradient(LOTData::Type::GStroke){} + inline float width(int frameNo) const {return mWidth.value(frameNo);} + inline CapStyle capStyle() const {return mCapStyle;} + inline JoinStyle joinStyle() const {return mJoinStyle;} + inline float meterLimit() const{return mMeterLimit;} + inline bool hasDashInfo() const { return !(mDash.mDashCount == 0);} + int getDashInfo(int frameNo, float *array) const; +public: + LOTAnimatable mWidth; /* "w" */ + CapStyle mCapStyle; /* "lc" */ + JoinStyle mJoinStyle; /* "lj" */ + float mMeterLimit; /* "ml" */ + LOTDashProperty mDash; +}; + +class LOTPath : public LOTData +{ +public: + LOTPath(LOTData::Type type):LOTData(type), mDirection(3){} + bool isDirectionCW() const { return ((mDirection == 3) ? false : true );} +public: + int mDirection; + std::vector> mPathOperations; + std::vector> mPaintOperations; +}; + +class LOTShapeData : public LOTPath +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + void process(); + LOTShapeData():LOTPath(LOTData::Type::Shape){} +public: + LOTAnimatable mShape; +}; + +class LOTMaskData +{ +public: + enum class Mode { + None, + Add, + Substarct, + Intersect + }; + LOTMaskData():mInv(false), mIsStatic(true){} + inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + inline bool isStatic() const {return mIsStatic;} +public: + LOTAnimatable mShape; + LOTAnimatable mOpacity; + bool mInv; + bool mIsStatic; + LOTMaskData::Mode mMode; +}; + +class LOTRectData : public LOTPath +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTRectData():LOTPath(LOTData::Type::Rect), + mPos(VPointF(0,0)), + mSize(VPointF(0,0)), + mRound(0){} +public: + LOTAnimatable mPos; + LOTAnimatable mSize; + LOTAnimatable mRound; +}; + +class LOTEllipseData : public LOTPath +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTEllipseData():LOTPath(LOTData::Type::Ellipse), + mPos(VPointF(0,0)), + mSize(VPointF(0,0)){} +public: + LOTAnimatable mPos; + LOTAnimatable mSize; +}; + +class LOTPolystarData : public LOTPath +{ +public: + enum class PolyType { + Star = 1, + Polygon = 2 + }; + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + LOTPolystarData():LOTPath(LOTData::Type::Polystar), + mType(PolyType::Polygon), + mPos(VPointF(0,0)), + mPointCount(0), + mInnerRadius(0), + mOuterRadius(0), + mInnerRoundness(0), + mOuterRoundness(0), + mRotation(0){} +public: + LOTPolystarData::PolyType mType; + LOTAnimatable mPos; + LOTAnimatable mPointCount; + LOTAnimatable mInnerRadius; + LOTAnimatable mOuterRadius; + LOTAnimatable mInnerRoundness; + LOTAnimatable mOuterRoundness; + LOTAnimatable mRotation; +}; + +class LOTTrimData : public LOTData +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} + enum class TrimType { + Simultaneously, + Individually + }; + LOTTrimData():LOTData(LOTData::Type::Trim), + mStart(0), + mEnd(0), + mOffset(0), + mTrimType(TrimType::Simultaneously){} +public: + LOTAnimatable mStart; + LOTAnimatable mEnd; + LOTAnimatable mOffset; + LOTTrimData::TrimType mTrimType; +}; + +class LOTRepeaterData : public LOTGroupData +{ +public: + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this); visitor->visitChildren(this);} + LOTRepeaterData():LOTGroupData(LOTData::Type::Repeater), + mCopies(0), + mOffset(0){} +public: + LOTAnimatable mCopies; + LOTAnimatable mOffset; +}; + +class LOTModel +{ +public: + bool isStatic() const{return mRoot->isStatic();} + int frameDuration() {return mRoot->frameDuration();} + int frameRate() {return mRoot->frameRate();} + int startFrame() {return mRoot->startFrame();} +public: + std::shared_ptr mRoot; +}; + +#endif // LOTModel_H diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp new file mode 100644 index 0000000000..68b9314683 --- /dev/null +++ b/src/lottie/lottieparser.cpp @@ -0,0 +1,1870 @@ + +#include "lottieparser.h" + +#define DEBUG_PARSER + +// This parser implements JSON token-by-token parsing with an API that is +// more direct; we don't have to create handler object and +// callbacks. Instead, we retrieve values from the JSON stream by calling +// GetInt(), GetDouble(), GetString() and GetBool(), traverse into structures +// by calling EnterObject() and EnterArray(), and skip over unwanted data by +// calling SkipValue(). As we know the lottie file structure this way will be the efficient way +// of parsing the file. +// +// If you aren't sure of what's next in the JSON data, you can use PeekType() and +// PeekValue() to look ahead to the next object before reading it. +// +// If you call the wrong retrieval method--e.g. GetInt when the next JSON token is +// not an int, EnterObject or EnterArray when there isn't actually an object or array +// to read--the stream parsing will end immediately and no more data will be delivered. +// +// After calling EnterObject, you retrieve keys via NextObjectKey() and values via +// the normal getters. When NextObjectKey() returns null, you have exited the +// object, or you can call SkipObject() to skip to the end of the object +// immediately. If you fetch the entire object (i.e. NextObjectKey() returned null), +// you should not call SkipObject(). +// +// After calling EnterArray(), you must alternate between calling NextArrayValue() +// to see if the array has more data, and then retrieving values via the normal +// getters. You can call SkipArray() to skip to the end of the array immediately. +// If you fetch the entire array (i.e. NextArrayValue() returned null), +// you should not call SkipArray(). +// +// This parser uses in-situ strings, so the JSON buffer will be altered during the +// parse. + + +#include "rapidjson/document.h" +#include +#include "lottiemodel.h" +#include"velapsedtimer.h" + + +RAPIDJSON_DIAG_PUSH +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#endif + +using namespace rapidjson; + +class LookaheadParserHandler { +public: + bool Null() { st_ = kHasNull; v_.SetNull(); return true; } + bool Bool(bool b) { st_ = kHasBool; v_.SetBool(b); return true; } + bool Int(int i) { st_ = kHasNumber; v_.SetInt(i); return true; } + bool Uint(unsigned u) { st_ = kHasNumber; v_.SetUint(u); return true; } + bool Int64(int64_t i) { st_ = kHasNumber; v_.SetInt64(i); return true; } + bool Uint64(uint64_t u) { st_ = kHasNumber; v_.SetUint64(u); return true; } + bool Double(double d) { st_ = kHasNumber; v_.SetDouble(d); return true; } + bool RawNumber(const char*, SizeType, bool) { return false; } + bool String(const char* str, SizeType length, bool) { st_ = kHasString; v_.SetString(str, length); return true; } + bool StartObject() { st_ = kEnteringObject; return true; } + bool Key(const char* str, SizeType length, bool) { st_ = kHasKey; v_.SetString(str, length); return true; } + bool EndObject(SizeType) { st_ = kExitingObject; return true; } + bool StartArray() { st_ = kEnteringArray; return true; } + bool EndArray(SizeType) { st_ = kExitingArray; return true; } + +protected: + LookaheadParserHandler(char* str); + void ParseNext(); + +protected: + enum LookaheadParsingState { + kInit, + kError, + kHasNull, + kHasBool, + kHasNumber, + kHasString, + kHasKey, + kEnteringObject, + kExitingObject, + kEnteringArray, + kExitingArray + }; + + Value v_; + LookaheadParsingState st_; + Reader r_; + InsituStringStream ss_; + + static const int parseFlags = kParseDefaultFlags | kParseInsituFlag; +}; + + +class LottieParserImpl : protected LookaheadParserHandler { +public: + LottieParserImpl(char* str) : LookaheadParserHandler(str) {} + +public: + bool EnterObject(); + bool EnterArray(); + const char* NextObjectKey(); + bool NextArrayValue(); + int GetInt(); + double GetDouble(); + const char* GetString(); + bool GetBool(); + void GetNull(); + + void SkipObject(); + void SkipArray(); + void SkipValue(); + Value* PeekValue(); + int PeekType(); // returns a rapidjson::Type, or -1 for no value (at end of object/array) + + bool IsValid() { return st_ != kError; } + + void Skip(const char *key); + VRect getRect(); + LottieBlendMode getBlendMode(); + CapStyle getLineCap(); + JoinStyle getLineJoin(); + FillRule getFillRule(); + LOTTrimData::TrimType getTrimType(); + MatteType getMatteType(); + LayerType getLayerType(); + + std::shared_ptr composition() const {return mComposition;} + void parseComposition(); + void parseAssets(LOTCompositionData *comp); + std::shared_ptr parseAsset(); + void parseLayers(LOTCompositionData *comp); + std::shared_ptr parseLayer(); + void parseMaskProperty(LOTLayerData *layer); + void parseShapesAttr(LOTLayerData *layer); + void parseObject(LOTGroupData *parent); + std::shared_ptr parseMaskObject(); + std::shared_ptr parseObjectTypeAttr(); + std::shared_ptr parseGroupObject(); + std::shared_ptr parseRectObject(); + std::shared_ptr parseEllipseObject(); + std::shared_ptr parseShapeObject(); + std::shared_ptr parsePolystarObject(); + + std::shared_ptr parseTransformObject(); + std::shared_ptr parseFillObject(); + std::shared_ptr parseGFillObject(); + std::shared_ptr parseStrokeObject(); + std::shared_ptr parseGStrokeObject(); + std::shared_ptr parseTrimObject(); + std::shared_ptr parseReapeaterObject(); + + + void parseGradientProperty(LOTGradient *gradient, const char *key); + + VPointF parseInperpolatorPoint(); + void parseArrayValue(VPointF &pt); + void parseArrayValue(LottieColor &pt); + void parseArrayValue(float &val); + void parseArrayValue(int &val); + void parseArrayValue(LottieGradient &gradient); + void getValue(VPointF &val); + void getValue(float &val); + void getValue(LottieColor &val); + void getValue(int &val); + void getValue(LottieShapeData &shape); + void getValue(LottieGradient &gradient); + template + void parseKeyFrame(LOTAnimInfo &obj); + template + void parseProperty(LOTAnimatable &obj); + + void parseShapeKeyFrame(LOTAnimInfo &obj); + void parseShapeProperty(LOTAnimatable &obj); + void parseArrayValue(std::vector &v); + void parseDashProperty(LOTDashProperty &dash); + + LottieColor toColor(const char *str); + + void resolveLayerRefs(); +protected: + std::shared_ptr mComposition; + LOTCompositionData *compRef; + LOTLayerData *curLayerRef; + std::vector> mLayersToUpdate; + void SkipOut(int depth); +}; + +LookaheadParserHandler::LookaheadParserHandler(char* str) : v_(), st_(kInit), r_(), ss_(str) { + r_.IterativeParseInit(); + ParseNext(); +} + +void LookaheadParserHandler::ParseNext() { + if (r_.HasParseError()) { + st_ = kError; + return; + } + + if (!r_.IterativeParseNext(ss_, *this)) { + vCritical<<"Lottie file parsing error"; + RAPIDJSON_ASSERT(0); + } +} + + +bool LottieParserImpl::EnterObject() { + if (st_ != kEnteringObject) { + st_ = kError; + RAPIDJSON_ASSERT(false); + return false; + } + + ParseNext(); + return true; +} + +bool LottieParserImpl::EnterArray() { + if (st_ != kEnteringArray) { + st_ = kError; + RAPIDJSON_ASSERT(false); + return false; + } + + ParseNext(); + return true; +} + +const char* LottieParserImpl::NextObjectKey() { + if (st_ == kHasKey) { + const char* result = v_.GetString(); + ParseNext(); + return result; + } + + /* SPECIAL CASE + * The parser works with a prdefined rule that it will be only + * while (NextObjectKey()) for each object but in case of our nested group + * object we can call multiple time NextObjectKey() while exiting the object + * so ignore those and don't put parser in the error state. + * */ + if (st_ == kExitingArray || st_ == kEnteringObject ) { +// #ifdef DEBUG_PARSER +// vDebug<<"Object: Exiting nested loop"; +// #endif + return 0; + } + + if (st_ != kExitingObject) { + RAPIDJSON_ASSERT(false); + st_ = kError; + return 0; + } + + ParseNext(); + return 0; +} + +bool LottieParserImpl::NextArrayValue() { + if (st_ == kExitingArray) { + ParseNext(); + return false; + } + + /* SPECIAL CASE + * same as NextObjectKey() + */ + if (st_ == kExitingObject) { +// #ifdef DEBUG_PARSER +// vDebug<<"Array: Exiting nested loop"; +// #endif + return 0; + } + + + if (st_ == kError || st_ == kHasKey) { + RAPIDJSON_ASSERT(false); + st_ = kError; + return false; + } + + return true; +} + +int LottieParserImpl::GetInt() { + if (st_ != kHasNumber || !v_.IsInt()) { + st_ = kError; + RAPIDJSON_ASSERT(false); + return 0; + } + + int result = v_.GetInt(); + ParseNext(); + return result; +} + +double LottieParserImpl::GetDouble() { + if (st_ != kHasNumber) { + st_ = kError; + RAPIDJSON_ASSERT(false); + return 0.; + } + + double result = v_.GetDouble(); + ParseNext(); + return result; +} + +bool LottieParserImpl::GetBool() { + if (st_ != kHasBool) { + st_ = kError; + RAPIDJSON_ASSERT(false); + return false; + } + + bool result = v_.GetBool(); + ParseNext(); + return result; +} + +void LottieParserImpl::GetNull() { + if (st_ != kHasNull) { + st_ = kError; + return; + } + + ParseNext(); +} + +const char* LottieParserImpl::GetString() { + if (st_ != kHasString) { + st_ = kError; + RAPIDJSON_ASSERT(false); + return 0; + } + + const char* result = v_.GetString(); + ParseNext(); + return result; +} + +void LottieParserImpl::SkipOut(int depth) { + do { + if (st_ == kEnteringArray || st_ == kEnteringObject) { + ++depth; + } + else if (st_ == kExitingArray || st_ == kExitingObject) { + --depth; + } + else if (st_ == kError) { + RAPIDJSON_ASSERT(false); + return; + } + + ParseNext(); + } + while (depth > 0); +} + +void LottieParserImpl::SkipValue() { + SkipOut(0); +} + +void LottieParserImpl::SkipArray() { + SkipOut(1); +} + +void LottieParserImpl::SkipObject() { + SkipOut(1); +} + +Value* LottieParserImpl::PeekValue() { + if (st_ >= kHasNull && st_ <= kHasKey) { + return &v_; + } + + return 0; +} + +int LottieParserImpl::PeekType() { + if (st_ >= kHasNull && st_ <= kHasKey) { + return v_.GetType(); + } + + if (st_ == kEnteringArray) { + return kArrayType; + } + + if (st_ == kEnteringObject) { + return kObjectType; + } + + return -1; +} + +void LottieParserImpl::Skip(const char *key) +{ + if (PeekType() == kArrayType) { + EnterArray(); + SkipArray(); + } else if (PeekType() == kObjectType) { + EnterObject(); + SkipObject(); + } else { + SkipValue(); + } +} + +LottieBlendMode +LottieParserImpl::getBlendMode() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + LottieBlendMode mode = LottieBlendMode::Normal; + + switch (GetInt()) { + case 1: + mode = LottieBlendMode::Multiply; + break; + case 2: + mode = LottieBlendMode::Screen; + break; + case 3: + mode = LottieBlendMode::OverLay; + break; + default: + break; + } + return mode; +} +VRect LottieParserImpl::getRect() +{ + VRect r; + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "l")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + r.setLeft(GetInt()); + } else if (0 == strcmp(key, "r")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + r.setRight(GetInt()); + } else if (0 == strcmp(key, "t")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + r.setTop(GetInt()); + } else if (0 == strcmp(key, "b")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + r.setBottom(GetInt()); + } else { + RAPIDJSON_ASSERT(false); + } + } + return r; +} + +void LottieParserImpl::resolveLayerRefs() +{ + for(auto i : mLayersToUpdate) { + LOTLayerData *layer = i.get(); + auto search = compRef->mAssets.find(layer->mPreCompRefId); + if (search != compRef->mAssets.end()) { + layer->mChildren = search->second.get()->mLayers; + } + } +} + + +void +LottieParserImpl::parseComposition() +{ + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + std::shared_ptr sharedComposition = std::make_shared(); + LOTCompositionData *comp = sharedComposition.get(); + compRef = comp; + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "v")) { + RAPIDJSON_ASSERT(PeekType() == kStringType); + comp->mVersion = std::string(GetString()); + } else if (0 == strcmp(key, "w")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + comp->mSize.setWidth(GetInt()); + } else if (0 == strcmp(key, "h")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + comp->mSize.setHeight(GetInt()); + } else if (0 == strcmp(key, "ip")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + comp->mStartFrame = GetDouble(); + } else if (0 == strcmp(key, "op")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + comp->mEndFrame = GetDouble(); + } else if (0 == strcmp(key, "fr")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + comp->mFrameRate = GetDouble(); + } else if (0 == strcmp(key, "assets")) { + parseAssets(comp); + } else if (0 == strcmp(key, "layers")) { + parseLayers(comp); + } else { +#ifdef DEBUG_PARSER + vWarning<<"Composition Attribute Skipped : "<mChildren) { + staticFlag &= child.get()->isStatic(); + } + comp->setStatic(staticFlag); + + mComposition = sharedComposition; +} + +void LottieParserImpl::parseAssets(LOTCompositionData *composition) +{ + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + std::shared_ptr asset = parseAsset(); + composition->mAssets[asset->mRefId] = asset; + } + // update the precomp layers with the actual layer object + +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/layers/shape.json + * + */ +std::shared_ptr +LottieParserImpl::parseAsset() +{ + RAPIDJSON_ASSERT(PeekType() == kObjectType); + std::shared_ptr sharedAsset = std::make_shared(); + LOTAsset *asset = sharedAsset.get(); + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "ty")) { /* Type of layer: Shape. Value 4.*/ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + asset->mAssetType = GetInt(); + } else if (0 == strcmp(key, "id")) { /* reference id*/ + RAPIDJSON_ASSERT(PeekType() == kStringType); + asset->mRefId = std::string(GetString()); + }else if (0 == strcmp(key, "layers")) { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + std::shared_ptr layer = parseLayer(); + asset->mLayers.push_back(layer); + } + } else { + #ifdef DEBUG_PARSER + vWarning<<"Asset Attribute Skipped : "< layer = parseLayer(); + composition->mChildren.push_back(layer); + } +} + +LottieColor +LottieParserImpl::toColor(const char *str) +{ + LottieColor color; + + RAPIDJSON_ASSERT(strlen(str) == 7); + RAPIDJSON_ASSERT(str[0] == '#'); + + char tmp[3] = { '\0', '\0', '\0' }; + tmp[0] = str[1]; tmp[1] = str[2]; + color.r = std::strtol(tmp, NULL, 16)/ 255.0; + + tmp[0] = str[3]; tmp[1] = str[4]; + color.g = std::strtol(tmp, NULL, 16)/ 255.0; + + tmp[0] = str[5]; tmp[1] = str[6]; + color.b = std::strtol(tmp, NULL, 16)/ 255.0; + + return color; +} + +MatteType +LottieParserImpl::getMatteType() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + switch (GetInt()) { + case 1: + return MatteType::Alpha; + break; + case 2: + return MatteType::AlphaInv; + break; + case 3: + return MatteType::Luma; + break; + case 4: + return MatteType::LumaInv; + break; + default: + return MatteType::None; + break; + } +} + +LayerType LottieParserImpl::getLayerType() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + switch (GetInt()) { + case 0: + return LayerType::Precomp; + break; + case 1: + return LayerType::Solid; + break; + case 2: + return LayerType::Image; + break; + case 3: + return LayerType::Null; + break; + case 4: + return LayerType::Shape; + break; + case 5: + return LayerType::Text; + break; + default: + return LayerType::Null; + break; + } +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/layers/shape.json + * + */ +std::shared_ptr +LottieParserImpl::parseLayer() +{ + RAPIDJSON_ASSERT(PeekType() == kObjectType); + std::shared_ptr sharedLayer = std::make_shared(); + LOTLayerData *layer = sharedLayer.get(); + curLayerRef = layer; + bool hasLayerRef = false; + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "ty")) { /* Type of layer*/ + layer->mLayerType = getLayerType(); + } else if (0 == strcmp(key, "ind")) { /*Layer index in AE. Used for parenting and expressions.*/ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + layer->mId = GetInt(); + } else if (0 == strcmp(key, "parent")) { /*Layer Parent. Uses "ind" of parent.*/ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + layer->mParentId = GetInt(); + } else if (0 == strcmp(key, "refId")) { /*preComp Layer reference id*/ + RAPIDJSON_ASSERT(PeekType() == kStringType); + layer->mPreCompRefId = std::string(GetString()); + mLayersToUpdate.push_back(sharedLayer); + hasLayerRef = true; + }else if (0 == strcmp(key, "sr")) { // "Layer Time Stretching" + RAPIDJSON_ASSERT(PeekType() == kNumberType); + layer->mTimeStreatch = GetDouble(); + } else if (0 == strcmp(key, "tm")) { // time remapping + parseProperty(layer->mTimeRemap); + }else if (0 == strcmp(key, "ip")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + layer->mInFrame = std::round(GetDouble()); + } else if (0 == strcmp(key, "op")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + layer->mOutFrame = std::round(GetDouble()); + } else if (0 == strcmp(key, "st")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + layer->mStartFrame = GetDouble(); + } else if (0 == strcmp(key, "bounds")) { + layer->mBound = getRect(); + } else if (0 == strcmp(key, "bm")) { + layer->mBlendMode = getBlendMode(); + } else if (0 == strcmp(key, "ks")) { + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + layer->mTransform = parseTransformObject(); + } else if (0 == strcmp(key, "shapes")) { + parseShapesAttr(layer); + } else if (0 == strcmp(key, "sw")) { + layer->mSolidLayer.mWidth = GetInt(); + } else if (0 == strcmp(key, "sh")) { + layer->mSolidLayer.mHeight = GetInt(); + } else if (0 == strcmp(key, "sc")) { + layer->mSolidLayer.mColor = toColor(GetString()); + } else if (0 == strcmp(key, "tt")) { + layer->mMatteType = getMatteType(); + } else if (0 == strcmp(key, "tt")) { + layer->mMatteType = getMatteType(); + } else if (0 == strcmp(key, "hasMask")) { + layer->mHasMask = GetBool(); + } else if (0 == strcmp(key, "masksProperties")) { + parseMaskProperty(layer); + }else { + #ifdef DEBUG_PARSER + vWarning<<"Layer Attribute Skipped : "<mChildren) { + staticFlag &= child.get()->isStatic(); + } + + for (auto mask : layer->mMasks) { + staticFlag &= mask->isStatic(); + } + + layer->setStatic(staticFlag && + layer->mTransform->isStatic() && + !hasLayerRef); + + return sharedLayer; +} + +void LottieParserImpl::parseMaskProperty(LOTLayerData *layer) +{ + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + layer->mMasks.push_back(parseMaskObject()); + } +} + +std::shared_ptr +LottieParserImpl::parseMaskObject() +{ + std::shared_ptr sharedMask = std::make_shared(); + LOTMaskData *obj = sharedMask.get(); + + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "inv")) { + obj->mInv = GetBool(); + } else if (0 == strcmp(key, "mode")) { + const char *str = GetString(); + switch (str[0]) { + case 'n': + obj->mMode = LOTMaskData::Mode::None; + break; + case 'a': + obj->mMode = LOTMaskData::Mode::Add; + break; + case 's': + obj->mMode = LOTMaskData::Mode::Substarct; + break; + case 'i': + obj->mMode = LOTMaskData::Mode::Intersect; + break; + default: + obj->mMode = LOTMaskData::Mode::None; + break; + } + } else if (0 == strcmp(key, "pt")) { + parseShapeProperty(obj->mShape); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOpacity); + } else { + Skip(key); + } + } + obj->mIsStatic = obj->mShape.isStatic() && obj->mOpacity.isStatic(); + return sharedMask; +} + + + +void LottieParserImpl::parseShapesAttr(LOTLayerData *layer) +{ + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + parseObject(layer); + } +} + +std::shared_ptr +LottieParserImpl::parseObjectTypeAttr() +{ + RAPIDJSON_ASSERT(PeekType() == kStringType); + const char *type = GetString(); + if (0 == strcmp(type, "gr")) { + return parseGroupObject(); + } else if (0 == strcmp(type, "rc")) { + return parseRectObject(); + } else if (0 == strcmp(type, "el")) { + return parseEllipseObject(); + } else if (0 == strcmp(type, "tr")) { + return parseTransformObject(); + } else if (0 == strcmp(type, "fl")) { + return parseFillObject(); + } else if (0 == strcmp(type, "st")) { + return parseStrokeObject(); + } else if (0 == strcmp(type, "gf")) { + return parseGFillObject(); + } else if (0 == strcmp(type, "gs")) { + return parseGStrokeObject(); + } else if (0 == strcmp(type, "sh")) { + return parseShapeObject(); + } else if (0 == strcmp(type, "sr")) { + return parsePolystarObject(); + } else if (0 == strcmp(type, "tm")) { + return parseTrimObject(); + } else if (0 == strcmp(type, "rp")) { + return parseReapeaterObject(); + } else { +#ifdef DEBUG_PARSER + vDebug<<"The Object Type not yet handled = "<< type; +#endif + return nullptr; + } +} + +void +LottieParserImpl::parseObject(LOTGroupData *parent) +{ + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "ty")) { + auto child = parseObjectTypeAttr(); + if (child) { + if (child) + parent->mChildren.push_back(child); + } + } else { + Skip(key); + } + } +} + +std::shared_ptr +LottieParserImpl::parseGroupObject() +{ + std::shared_ptr sharedGroup = std::make_shared(); + + LOTShapeGroupData *group = sharedGroup.get(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "it")) { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + RAPIDJSON_ASSERT(PeekType() == kObjectType); + parseObject(group); + } + group->mTransform = std::dynamic_pointer_cast(group->mChildren.back()); + group->mChildren.pop_back(); + } else { + Skip(key); + } + } + bool staticFlag = true; + for (auto child : group->mChildren) { + staticFlag &= child.get()->isStatic(); + } + + group->setStatic(staticFlag && + group->mTransform->isStatic()); + + return sharedGroup; +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/rect.json + */ +std::shared_ptr +LottieParserImpl::parseRectObject() +{ + std::shared_ptr sharedRect = std::make_shared(); + LOTRectData *obj = sharedRect.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "p")) { + parseProperty(obj->mPos); + } else if (0 == strcmp(key, "s")) { + parseProperty(obj->mSize); + } else if (0 == strcmp(key, "r")) { + parseProperty(obj->mRound); + } else if (0 == strcmp(key, "d")) { + obj->mDirection = GetInt(); + } else { + Skip(key); + } + } + obj->setStatic(obj->mPos.isStatic() && + obj->mSize.isStatic() && + obj->mRound.isStatic()); + return sharedRect; +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/ellipse.json + */ +std::shared_ptr +LottieParserImpl::parseEllipseObject() +{ + std::shared_ptr sharedEllipse = std::make_shared(); + LOTEllipseData *obj = sharedEllipse.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "p")) { + parseProperty(obj->mPos); + } else if (0 == strcmp(key, "s")) { + parseProperty(obj->mSize); + } else if (0 == strcmp(key, "d")) { + obj->mDirection = GetInt(); + } else { + Skip(key); + } + } + obj->setStatic(obj->mPos.isStatic() && + obj->mSize.isStatic()); + return sharedEllipse; +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/shape.json + */ +std::shared_ptr +LottieParserImpl::parseShapeObject() +{ + std::shared_ptr sharedShape = std::make_shared(); + LOTShapeData *obj = sharedShape.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "ks")) { + parseShapeProperty(obj->mShape); + } else if (0 == strcmp(key, "d")) { + obj->mDirection = GetInt(); + } else { +#ifdef DEBUG_PARSER + vDebug<<"Shape property ignored :"<setStatic(obj->mShape.isStatic()); + + return sharedShape; +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/star.json + */ +std::shared_ptr +LottieParserImpl::parsePolystarObject() +{ + std::shared_ptr sharedPolystar = std::make_shared(); + LOTPolystarData *obj = sharedPolystar.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "p")) { + parseProperty(obj->mPos); + } else if (0 == strcmp(key, "pt")) { + parseProperty(obj->mPointCount); + } else if (0 == strcmp(key, "ir")) { + parseProperty(obj->mInnerRadius); + } else if (0 == strcmp(key, "is")) { + parseProperty(obj->mInnerRoundness); + } else if (0 == strcmp(key, "or")) { + parseProperty(obj->mOuterRadius); + } else if (0 == strcmp(key, "os")) { + parseProperty(obj->mOuterRoundness); + } else if (0 == strcmp(key, "r")) { + parseProperty(obj->mRotation); + } else if (0 == strcmp(key, "sy")) { + int starType = GetInt(); + if (starType == 1) + obj->mType = LOTPolystarData::PolyType::Star; + if (starType == 2) + obj->mType = LOTPolystarData::PolyType::Polygon; + } else if (0 == strcmp(key, "d")) { + obj->mDirection = GetInt(); + } else { +#ifdef DEBUG_PARSER + vDebug<<"Polystar property ignored :"<setStatic(obj->mPos.isStatic() && + obj->mPointCount.isStatic() && + obj->mInnerRadius.isStatic() && + obj->mInnerRoundness.isStatic() && + obj->mOuterRadius.isStatic() && + obj->mOuterRoundness.isStatic() && + obj->mRotation.isStatic()); + + return sharedPolystar; +} + +LOTTrimData::TrimType +LottieParserImpl::getTrimType() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + switch (GetInt()) { + case 1: + return LOTTrimData::TrimType::Simultaneously; + break; + case 2: + return LOTTrimData::TrimType::Individually; + break; + default: + RAPIDJSON_ASSERT(0); + break; + } +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/trim.json + */ +std::shared_ptr +LottieParserImpl::parseTrimObject() +{ + std::shared_ptr sharedTrim = std::make_shared(); + LOTTrimData *obj = sharedTrim.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "s")) { + parseProperty(obj->mStart); + } else if (0 == strcmp(key, "e")) { + parseProperty(obj->mEnd); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOffset); + } else if (0 == strcmp(key, "m")) { + obj->mTrimType = getTrimType(); + } else { +#ifdef DEBUG_PARSER + vDebug<<"Trim property ignored :"<setStatic(obj->mStart.isStatic() && + obj->mEnd.isStatic() && + obj->mOffset.isStatic()); + curLayerRef->mHasPathOperator = true; + return sharedTrim; +} + +std::shared_ptr +LottieParserImpl::parseReapeaterObject() +{ + std::shared_ptr sharedRepeater = std::make_shared(); + LOTRepeaterData *obj = sharedRepeater.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "c")) { + parseProperty(obj->mCopies); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOffset); + } else if (0 == strcmp(key, "tr")) { + obj->mTransform = parseTransformObject(); + } else { +#ifdef DEBUG_PARSER + vDebug<<"Repeater property ignored :"<setStatic(obj->mCopies.isStatic() && + obj->mOffset.isStatic() && + obj->mTransform->isStatic()); + + return sharedRepeater; +} + + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/transform.json + */ +std::shared_ptr +LottieParserImpl::parseTransformObject() +{ + std::shared_ptr sharedTransform = std::make_shared(); + LOTTransformData *obj = sharedTransform.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "a")) { + parseProperty(obj->mAnchor); + } else if (0 == strcmp(key, "p")) { + parseProperty(obj->mPosition); + } else if (0 == strcmp(key, "r")) { + parseProperty(obj->mRotation); + } else if (0 == strcmp(key, "s")) { + parseProperty(obj->mScale); + } else if (0 == strcmp(key, "sk")) { + parseProperty(obj->mSkew); + } else if (0 == strcmp(key, "sa")) { + parseProperty(obj->mSkewAxis); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOpacity); + } else { + Skip(key); + } + } + obj->mStaticMatrix = obj->mAnchor.isStatic() && + obj->mPosition.isStatic() && + obj->mRotation.isStatic() && + obj->mScale.isStatic() && + obj->mSkew.isStatic() && + obj->mSkewAxis.isStatic(); + obj->setStatic(obj->mStaticMatrix && obj->mOpacity.isStatic() ); + + if (obj->mStaticMatrix) + obj->cacheMatrix(); + + return sharedTransform; +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/fill.json + */ +std::shared_ptr +LottieParserImpl::parseFillObject() +{ + std::shared_ptr sharedFill = std::make_shared(); + LOTFillData *obj = sharedFill.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "c")) { + parseProperty(obj->mColor); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOpacity); + } else if (0 == strcmp(key, "fillEnabled")) { + obj->mEnabled = GetBool(); + } else if (0 == strcmp(key, "r")) { + obj->mFillRule = getFillRule(); + } else { +#ifdef DEBUG_PARSER + vWarning<<"Fill property skipped = "<setStatic(obj->mColor.isStatic() && + obj->mOpacity.isStatic()); + + return sharedFill; +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/helpers/lineCap.json + */ +CapStyle LottieParserImpl::getLineCap() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + switch (GetInt()) { + case 1: + return CapStyle::Flat; + break; + case 2: + return CapStyle::Round; + break; + default: + return CapStyle::Square; + break; + } +} + +FillRule LottieParserImpl::getFillRule() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + switch (GetInt()) { + case 1: + return FillRule::Winding; + break; + case 2: + return FillRule::EvenOdd; + break; + default: + return FillRule::Winding; + break; + } +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/helpers/lineJoin.json + */ +JoinStyle LottieParserImpl::getLineJoin() +{ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + switch (GetInt()) { + case 1: + return JoinStyle::Miter; + break; + case 2: + return JoinStyle::Round; + break; + default: + return JoinStyle::Bevel; + break; + } +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/stroke.json + */ +std::shared_ptr +LottieParserImpl::parseStrokeObject() +{ + std::shared_ptr sharedStroke = std::make_shared(); + LOTStrokeData *obj = sharedStroke.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "c")) { + parseProperty(obj->mColor); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOpacity); + } else if (0 == strcmp(key, "w")) { + parseProperty(obj->mWidth); + } else if (0 == strcmp(key, "fillEnabled")) { + obj->mEnabled = GetBool(); + } else if (0 == strcmp(key, "lc")) { + obj->mCapStyle = getLineCap(); + } else if (0 == strcmp(key, "lj")) { + obj->mJoinStyle = getLineJoin(); + } else if (0 == strcmp(key, "ml")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + obj->mMeterLimit = GetDouble(); + } else if (0 == strcmp(key, "d")) { + parseDashProperty(obj->mDash); + } else { +#ifdef DEBUG_PARSER + vWarning<<"Stroke property skipped = "<setStatic(obj->mColor.isStatic() && + obj->mOpacity.isStatic() && + obj->mWidth.isStatic() && + obj->mDash.mStatic); + return sharedStroke; +} + +void +LottieParserImpl::parseGradientProperty(LOTGradient *obj, const char *key) +{ + if (0 == strcmp(key, "t")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + obj->mGradientType = GetInt(); + } else if (0 == strcmp(key, "o")) { + parseProperty(obj->mOpacity); + } else if (0 == strcmp(key, "s")) { + parseProperty(obj->mStartPoint); + } else if (0 == strcmp(key, "e")) { + parseProperty(obj->mEndPoint); + } else if (0 == strcmp(key, "h")) { + parseProperty(obj->mHighlightLength); + } else if (0 == strcmp(key, "a")) { + parseProperty(obj->mHighlightAngle); + } else if (0 == strcmp(key, "g")) { + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "k")) { + parseProperty(obj->mGradient); + } else { + Skip(nullptr); + } + } + } else { +#ifdef DEBUG_PARSER + vWarning<<"Gradient property skipped = "< +LottieParserImpl::parseGFillObject() +{ + std::shared_ptr sharedGFill = std::make_shared(); + LOTGFillData *obj = sharedGFill.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "r")) { + obj->mFillRule = getFillRule(); + } else { + parseGradientProperty(obj, key); + } + } + + return sharedGFill; +} + +void LottieParserImpl::parseDashProperty(LOTDashProperty &dash) +{ + dash.mDashCount = 0; + dash.mStatic = true; + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "v")) { + parseProperty(dash.mDashArray[dash.mDashCount++]); + } else { + Skip(key); + } + } + } + + // update the staic proprty + for (int i = 0 ; i < dash.mDashCount ; i++) { + if (!dash.mDashArray[i].isStatic()) { + dash.mStatic = false; + break; + } + } +} + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/gstroke.json + */ +std::shared_ptr +LottieParserImpl::parseGStrokeObject() +{ + std::shared_ptr sharedGStroke = std::make_shared(); + LOTGStrokeData *obj = sharedGStroke.get(); + + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "w")) { + parseProperty(obj->mWidth); + } else if (0 == strcmp(key, "lc")) { + obj->mCapStyle = getLineCap(); + } else if (0 == strcmp(key, "lj")) { + obj->mJoinStyle = getLineJoin(); + } else if (0 == strcmp(key, "ml")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + obj->mMeterLimit = GetDouble(); + } else if (0 == strcmp(key, "d")) { + parseDashProperty(obj->mDash); + } else { + parseGradientProperty(obj, key); + } + } + + obj->setStatic(obj->mWidth.isStatic() && + obj->mDash.mStatic); + return sharedGStroke; +} + +void LottieParserImpl::parseArrayValue(LottieColor &color) +{ + float val[4]; + int i=0; + while (NextArrayValue()) { + val[i++] = GetDouble(); + } + + color.r = val[0]; + color.g = val[1]; + color.b = val[2]; +} + +void LottieParserImpl::parseArrayValue(VPointF &pt) +{ + float val[4]; + int i=0; + while (NextArrayValue()) { + val[i++] = GetDouble(); + } + pt.setX(val[0]); + pt.setY(val[1]); +} + +void LottieParserImpl::parseArrayValue(float &val) +{ + RAPIDJSON_ASSERT(0); + val = GetDouble(); +} + +void LottieParserImpl::parseArrayValue(int &val) +{ + RAPIDJSON_ASSERT(0); + val = GetInt(); +} + +void LottieParserImpl::parseArrayValue(std::vector &v) +{ + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + VPointF pt; + parseArrayValue(pt); + v.push_back(pt); + } +} + +void LottieParserImpl::getValue(VPointF &pt) +{ + float val[4]; + int i=0; + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + val[i++] = GetDouble(); + } + pt.setX(val[0]); + pt.setY(val[1]); +} + +void LottieParserImpl::getValue(float &val) +{ + if (PeekType() == kArrayType) { + EnterArray(); + while (NextArrayValue()) { + val = GetDouble(); + } + } else if (PeekType() == kNumberType) { + val = GetDouble(); + } else { + RAPIDJSON_ASSERT(0); + } +} + +void LottieParserImpl::getValue(LottieColor &color) +{ + float val[4]; + int i=0; + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + val[i++] = GetDouble(); + } + color.r = val[0]; + color.g = val[1]; + color.b = val[2]; +} + +void LottieParserImpl::parseArrayValue(LottieGradient &grad) +{ + while (NextArrayValue()) { + grad.mGradient.push_back(GetDouble()); + } +} + +void LottieParserImpl::getValue(LottieGradient &grad) +{ + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + grad.mGradient.push_back(GetDouble()); + } +} + +void LottieParserImpl::getValue(int &val) +{ + if (PeekType() == kArrayType) { + EnterArray(); + while (NextArrayValue()) { + val = GetInt(); + } + } else if (PeekType() == kNumberType) { + val = GetInt(); + } else { + RAPIDJSON_ASSERT(0); + } +} + +void LottieParserImpl::getValue(LottieShapeData &obj) +{ + std::vector inPoint; /* "i" */ + std::vector outPoint; /* "o" */ + std::vector vertices; /* "v" */ + std::vector points; + bool closed=false; + + /* + * The shape object could be wrapped by a array + * if its part of the keyframe object + */ + bool arrayWrapper = (PeekType() == kArrayType); + if (arrayWrapper) + EnterArray(); + + RAPIDJSON_ASSERT(PeekType() == kObjectType); + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "i")) { + parseArrayValue(inPoint); + } else if (0 == strcmp(key, "o")) { + parseArrayValue(outPoint); + } else if (0 == strcmp(key, "v")) { + parseArrayValue(vertices); + } else if (0 == strcmp(key, "c")) { + closed = GetBool(); + }else { + RAPIDJSON_ASSERT(0); + Skip(nullptr); + } + } + // exit properly from the array + if (arrayWrapper) + NextArrayValue(); + + +/* + * Convert the AE shape format to + * list of bazier curves + * The final structure will be Move +size*Cubic + Cubic (if the path is closed one) + */ + if (inPoint.size() != outPoint.size() || + inPoint.size() != vertices.size()) { + vCritical<<"The Shape data are corrupted"; + points = std::vector(); + } else { + int size = vertices.size(); + points.reserve(3*size + 4); + points.push_back(vertices[0]); + for (int i =1; i +void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) +{ + EnterObject(); + LOTKeyFrame keyframe; + VPointF inTangent; + VPointF outTangent; + const char *interpolatorKey = nullptr; + bool hold = false; + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "i")) { + inTangent = parseInperpolatorPoint(); + } else if (0 == strcmp(key, "o")) { + outTangent = parseInperpolatorPoint(); + } else if (0 == strcmp(key, "n")) { + if (PeekType() == kStringType) { + interpolatorKey = GetString(); + } else { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + RAPIDJSON_ASSERT(PeekType() == kStringType); + interpolatorKey = GetString(); + } + } + continue; + } else if (0 == strcmp(key, "t")) { + keyframe.mStartFrame = GetDouble(); + } else if (0 == strcmp(key, "s")) { + getValue(keyframe.mStartValue); + continue; + } else if (0 == strcmp(key, "e")) { + getValue(keyframe.mEndValue); + continue; + } else if (0 == strcmp(key, "ti")) { + keyframe.mPathKeyFrame = true; + getValue(keyframe.mInTangent); + continue; + } else if (0 == strcmp(key, "to")) { + keyframe.mPathKeyFrame = true; + getValue(keyframe.mOutTangent); + continue; + } else if (0 == strcmp(key, "h")) { + hold = GetInt(); + continue; + } else { +#ifdef DEBUG_PARSER + vDebug<<"key frame property skipped = "<mInterpolatorCache.find(interpolatorKey); + if (search != compRef->mInterpolatorCache.end()) { + keyframe.mInterpolator = search->second; + } else { + keyframe.mInterpolator = std::make_shared(VInterpolator(inTangent, outTangent)); + compRef->mInterpolatorCache[interpolatorKey] = keyframe.mInterpolator; + } + } else { + /* this is the last key frame. update the first and last frame of this property */ + obj.mStartFrame = obj.mKeyFrames.front().mStartFrame; + obj.mEndFrame = keyframe.mStartFrame; + return; + } + obj.mKeyFrames.push_back(keyframe); +} + + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/properties/shapeKeyframed.json + */ + +/* + * https://github.com/airbnb/lottie-web/blob/master/docs/json/properties/shape.json + */ +void +LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) +{ + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "k")) { + if (PeekType() == kArrayType) { + EnterArray(); + while (NextArrayValue()) { + RAPIDJSON_ASSERT(PeekType() == kObjectType); + if (!obj.mAnimInfo) + obj.mAnimInfo = std::make_shared>(); + parseKeyFrame(*obj.mAnimInfo.get()); + } + } else { + getValue(obj.mValue); + } + } else { +#ifdef DEBUG_PARSER + vDebug<<"shape property ignored = "< +void LottieParserImpl::parseProperty(LOTAnimatable &obj) +{ + EnterObject(); + while (const char* key = NextObjectKey()) { + if (0 == strcmp(key, "k")) { + if (PeekType() == kNumberType) { + /*single value property with no animation*/ + getValue(obj.mValue); + } else { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + /* property with keyframe info*/ + if (PeekType() == kObjectType) { + if (!obj.mAnimInfo) + obj.mAnimInfo = std::make_shared>(); + parseKeyFrame(*obj.mAnimInfo.get()); + } else { + /* Read before modifying. + * as there is no way of knowing if the + * value of the array is either array of numbers + * or array of object without entering the array + * thats why this hack is there + */ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + /*multi value property with no animation*/ + parseArrayValue(obj.mValue); + /*break here as we already reached end of array*/ + break; + } + } + } + } else if (0 == strcmp(key, "ix")){ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + obj.mPropertyIndex = GetInt(); + } else { + Skip(key); + } + } +} + +class LOTDataInspector : public LOTDataVisitor +{ +public: + void visit(LOTCompositionData *obj) { + vDebug<<"[COMP_START:: static:"<isStatic()<<" v:"<mVersion<<" [{ stFm endFm fmRate } { "<mStartFrame<<" "<mEndFrame<<" }]\n"; + } + void visit(LOTLayerData *obj) { + vDebug<<"[LAYER_START:: type:"<mLayerType)<<" id:"<mId<<" Pid:"<mParentId + <<" static:"<isStatic()<<"[{ stFm endFm stTm tmStrch } { " + <mInFrame<<" "<mOutFrame<<" "<mStartFrame<<" "<mTimeStreatch <<" }]"; + } + void visit(LOTTransformData *t) { + vDebug<<"[TRANSFORM: static: "<isStatic()<<" ]"; + } + void visit(LOTShapeGroupData *o) { + vDebug<<"[GROUP_START:: static:"<isStatic()<<"]"; + } + void visit(LOTShapeData *s) { + vDebug<<"[SHAPE: static:"<isStatic()<<"]"; + } + void visit(LOTRectData *r) { + vDebug<<"[RECT: static:"<isStatic()<<"]"; + } + void visit(LOTEllipseData *e) { + vDebug<<"[ELLIPSE: static:"<isStatic()<<"]"; + } + void visit(LOTTrimData *t) { + vDebug<<"[TRIM: static: "<isStatic()<<" ]"; + } + void visit(LOTRepeaterData *r) { + vDebug<<"[REPEATER: static:"<isStatic()<<"]"; + } + void visit(LOTFillData *f) { + vDebug<<"[FILL: static:"<isStatic()<<"]"; + } + void visit(LOTGFillData *f) { + vDebug<<"[GFILL: static:"<isStatic()<<" ty:"<mGradientType<<" s:"<mStartPoint.value(0)<<" e:"<mEndPoint.value(0)<<"]"; + } + void visit(LOTGStrokeData *f) { + vDebug<<"[GSTROKE: static:"<isStatic()<<"]"; + } + void visit(LOTStrokeData *s) { + vDebug<<"[STROKE: static:"<isStatic()<<"]"; + } + void visitChildren(LOTGroupData *obj) { + for(auto child :obj->mChildren) + child.get()->accept(this); + switch (obj->type()) { + case LOTData::Type::Layer: + { + LOTLayerData *layer = static_cast(obj); + vDebug<<"[LAYER_END:: type:"<mLayerType).c_str()<<" id:"<mId<<"\n"; + break; + } + case LOTData::Type::ShapeGroup: + vDebug<<"[GROUP_END]"; + break; + case LOTData::Type::Composition: + vDebug<<"[COMP End ]\n"; + break; + case LOTData::Type::Repeater: + vDebug<<"[REPEATER End ]"; + break; + default: + break; + } + } + std::string layerType(LayerType type) { + switch (type) { + case LayerType::Precomp: + return "Precomp"; + break; + case LayerType::Null: + return "Null"; + break; + case LayerType::Shape: + return "Shape"; + break; + case LayerType::Solid: + return "Solid"; + break; + case LayerType::Image: + return "Image"; + break; + case LayerType::Text: + return "Text"; + break; + default: + return "Unknow"; + break; + } + } +}; + +LottieParser::~LottieParser() +{ + delete d; +} + +LottieParser::LottieParser(char* str): d(new LottieParserImpl(str)) +{ + d->parseComposition(); +} + +std::shared_ptr LottieParser::model() +{ + std::shared_ptr model= std::make_shared(); + model->mRoot = d->composition(); + model->mRoot->processPathOperatorObjects(); + model->mRoot->processRepeaterObjects(); + +#ifdef DEBUG_PARSER + LOTDataInspector inspector; + model->mRoot->accept(&inspector); +#endif + + return model; +} + +RAPIDJSON_DIAG_POP diff --git a/src/lottie/lottieparser.h b/src/lottie/lottieparser.h new file mode 100644 index 0000000000..bde8f39332 --- /dev/null +++ b/src/lottie/lottieparser.h @@ -0,0 +1,16 @@ +#ifndef LOTTIEPARSER_H +#define LOTTIEPARSER_H + +#include "lottiemodel.h" + +class LottieParserImpl; +class LottieParser { +public: + ~LottieParser(); + LottieParser(char* str); + std::shared_ptr model(); +private: + LottieParserImpl *d; +}; + +#endif // LOTTIEPARSER_H diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp new file mode 100644 index 0000000000..2356b9547a --- /dev/null +++ b/src/lottie/lottieplayer.cpp @@ -0,0 +1,191 @@ +#include + +#include "lottiemodel.h" +#include "lottieloader.h" +#include "lottieitem.h" + +#include + + +class LOTPlayerPrivate +{ +public: + LOTPlayerPrivate(); + bool setFilePath(std::string path); + void setSize(const VSize &sz); + void size(int &w, int &h) const; + void setFrameRate(int frameRate); + int frameRate() const; + float playTime() const; + bool seek(float pos); + const std::vector& renderList()const; + bool render(float pos, const LOTBuffer &buffer); +public: + std::string mFilePath; + std::shared_ptr mModel; + std::unique_ptr mCompItem; + VSize mSize; + int mFrameRate; +}; + +void LOTPlayerPrivate::setSize(const VSize &sz) +{ + mCompItem->resize(sz); +} + +void LOTPlayerPrivate::size(int &w, int &h) const +{ + VSize size = mCompItem->size(); + w = size.width(); + h = size.height(); +} + + +const std::vector& LOTPlayerPrivate::renderList() const +{ + return mCompItem->renderList(); +} +int LOTPlayerPrivate::frameRate() const +{ + if (mFrameRate) + return mFrameRate; + else + return mModel->frameRate(); +} + +void LOTPlayerPrivate::setFrameRate(int frameRate) +{ + mFrameRate = frameRate; +} + +float LOTPlayerPrivate::playTime() const +{ + if (mModel->isStatic()) return 0; + + float fr = frameRate(); + float fd = mModel->frameDuration(); + return fd/fr; +} + +bool LOTPlayerPrivate::seek(float pos) +{ + if (!mModel || !mCompItem) return false; + + if (pos > 1.0) pos = 1.0; + if (pos < 0) pos = 0; + if (mModel->isStatic()) pos = 0; + int frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); + return mCompItem->update(frameNumber); +} + +bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) +{ + if (seek(pos)) { + if (mCompItem->render(buffer)) + return true; + else + return false; + } else { + return false; + } +} + + +LOTPlayerPrivate::LOTPlayerPrivate():mFrameRate(0) +{ + +} + +bool +LOTPlayerPrivate::setFilePath(std::string path) +{ + LottieLoader loader; + if (loader.load(path)) { + mModel = loader.model(); + mCompItem = std::unique_ptr(new LOTCompItem(mModel.get())); + return true; + } + return false; +} + + +LOTPlayer::LOTPlayer():d(new LOTPlayerPrivate()) +{ + +} + +LOTPlayer::~LOTPlayer() +{ + delete d; +} + +LOTPlayer::LOTPlayer(const char *filePath):d(new LOTPlayerPrivate()) +{ + d->setFilePath(filePath); +} + +/** + * \breif Brief abput the Api. + * Description about the setFilePath Api + * @param path add the details + */ + +bool LOTPlayer::setFilePath(const char *filePath) +{ + return d->setFilePath(filePath); +} + +void LOTPlayer::setSize(int width, int height) +{ + d->setSize(VSize(width, height)); +} + +void LOTPlayer::size(int &width, int &height) const +{ + d->size(width, height); +} + +float LOTPlayer::playTime() const +{ + return d->playTime(); +} + +int LOTPlayer::frameRate() const +{ + return d->frameRate(); +} + +void LOTPlayer::setFrameRate(int frameRate) +{ + d->setFrameRate(frameRate); +} + +void LOTPlayer::seek(float pos) +{ + d->seek(pos); +} + +const std::vector& LOTPlayer::renderList()const +{ + return d->renderList(); +} + +std::future LOTPlayer::render(float pos, const LOTBuffer &buffer) +{ + return std::async(std::launch::async, &LOTPlayerPrivate::render, d, pos, buffer); +} + +bool LOTPlayer::renderSync(float pos, const LOTBuffer &buffer) +{ + return d->render(pos, buffer); +} + +LOTNode::~LOTNode() +{ +} + +LOTNode::LOTNode() +{ +} + + diff --git a/src/lottie/meson.build b/src/lottie/meson.build new file mode 100644 index 0000000000..ba61f0725b --- /dev/null +++ b/src/lottie/meson.build @@ -0,0 +1,12 @@ + +source_file = files('lottieparser.cpp') +source_file += files('lottieloader.cpp') +source_file += files('lottiemodel.cpp') +source_file += files('lottieplayer.cpp') +source_file += files('lottieitem.cpp') + + +lottie_dep = declare_dependency( + include_directories : include_directories('.'), + sources : source_file + ) diff --git a/src/lottie/rapidjson/allocators.h b/src/lottie/rapidjson/allocators.h new file mode 100644 index 0000000000..655f4a3854 --- /dev/null +++ b/src/lottie/rapidjson/allocators.h @@ -0,0 +1,271 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + std::free(originalPtr); + return NULL; + } + return std::realloc(originalPtr, newSize); + } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)(); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/src/lottie/rapidjson/cursorstreamwrapper.h b/src/lottie/rapidjson/cursorstreamwrapper.h new file mode 100644 index 0000000000..52c11a7c01 --- /dev/null +++ b/src/lottie/rapidjson/cursorstreamwrapper.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_ +#define RAPIDJSON_CURSORSTREAMWRAPPER_H_ + +#include "stream.h" + +#if defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + + +//! Cursor stream wrapper for counting line and column number if error exists. +/*! + \tparam InputStream Any stream that implements Stream Concept +*/ +template > +class CursorStreamWrapper : public GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + + CursorStreamWrapper(InputStream& is): + GenericStreamWrapper(is), line_(1), col_(0) {} + + // counting line and column number + Ch Take() { + Ch ch = this->is_.Take(); + if(ch == '\n') { + line_ ++; + col_ = 0; + } else { + col_ ++; + } + return ch; + } + + //! Get the error line number, if error exists. + size_t GetLine() const { return line_; } + //! Get the error column number, if error exists. + size_t GetColumn() const { return col_; } + +private: + size_t line_; //!< Current Line + size_t col_; //!< Current Column +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +#if defined(__GNUC__) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_ diff --git a/src/lottie/rapidjson/document.h b/src/lottie/rapidjson/document.h new file mode 100644 index 0000000000..aeca757d56 --- /dev/null +++ b/src/lottie/rapidjson/document.h @@ -0,0 +1,2672 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include + +RAPIDJSON_DIAG_PUSH +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 6 +RAPIDJSON_DIAG_OFF(terminate) // ignore throwing RAPIDJSON_ASSERT in RAPIDJSON_NOEXCEPT functions +#endif +#endif // __GNUC__ + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::iterator, std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +struct GenericMember { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator + : public std::iterator >::Type> { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef std::iterator BaseType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + //! Pointer to (const) GenericMember + typedef typename BaseType::pointer Pointer; + //! Reference to (const) GenericMember + typedef typename BaseType::reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef typename BaseType::difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; } + bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; } + bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; } + bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; } + bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; } + bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; } + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +struct GenericMemberIterator; + +//! non-const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(NotNullStrLen(str)) {} + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + SizeType NotNullStrLen(const CharType* str) { + RAPIDJSON_ASSERT(str != 0); + return internal::StrLen(str); + } + + /// Empty string - used when passing in a NULL pointer + static const Ch emptyString[]; + + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; + //! Copy assignment operator not permitted - immutable type + GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; +}; + +template +const CharType GenericStringRef::emptyString[] = { CharType() }; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[7] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_ASSERT(type >= kNullType && type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + \see CopyFrom() + */ + template + GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + switch (rhs.GetType()) { + case kObjectType: { + SizeType count = rhs.data_.o.size; + Member* lm = reinterpret_cast(allocator.Malloc(count * sizeof(Member))); + const typename GenericValue::Member* rm = rhs.GetMembersPointer(); + for (SizeType i = 0; i < count; i++) { + new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); + new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); + } + data_.f.flags = kObjectFlag; + data_.o.size = data_.o.capacity = count; + SetMembersPointer(lm); + } + break; + case kArrayType: { + SizeType count = rhs.data_.a.size; + GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); + const GenericValue* re = rhs.GetElementsPointer(); + for (SizeType i = 0; i < count; i++) + new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); + data_.f.flags = kArrayFlag; + data_.a.size = data_.a.capacity = count; + SetElementsPointer(le); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } + else + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } + } + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for float value. + explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + RAPIDJSON_ASSERT(this != &rhs); + this->~GenericValue(); + RawAssign(rhs); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator, copyConstStrings); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Linear time complexity (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast((std::numeric_limits::max)())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast((std::numeric_limits::min)())) + && (d < static_cast((std::numeric_limits::max)())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-(std::numeric_limits::max)()) + || a > static_cast((std::numeric_limits::max)())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Get the capacity of object. + SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + + template + float optFloat(T* name, float fallback = 0.0) { + GenericValue n(StringRef(name)); + return optFloat(n, fallback); + } + + template + double optDouble(T* name, double fallback = 0.0) { + GenericValue n(StringRef(name)); + return optDouble(n, fallback); + } + + template + int optInt(T* name, int fallback=0) { + GenericValue n(StringRef(name)); + return optInt(n, fallback); + } + + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + + template + float optFloat(const GenericValue& name, float fallback) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value.GetFloat(); + return fallback; + } + + template + double optDouble(const GenericValue& name, double fallback) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value.GetDouble(); + return fallback; + } + + template + int optInt(const GenericValue& name, int fallback) { + MemberIterator member = FindMember(name); + if (member != MemberEnd() && member->value.IsInt()) + return member->value.GetInt(); + return fallback; + } + + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Request the object to have enough capacity to store members. + /*! \param newCapacity The capacity that the object at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsObject()); + if (newCapacity > data_.o.capacity) { + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), data_.o.capacity * sizeof(Member), newCapacity * sizeof(Member)))); + data_.o.capacity = newCapacity; + } + return *this; + } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) + MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator); + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(&*pos, &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(pos, last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string reference + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(e, values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(m, members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +typedef GenericValue > JsonObj; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template , typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + // Allow Swap with ValueType. + // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. + using ValueType::Swap; + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; +typedef GenericDocument > JsonDoc; + + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + SizeType MemberCapacity() const { return value_.MemberCapacity(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/src/lottie/rapidjson/encodedstream.h b/src/lottie/rapidjson/encodedstream.h new file mode 100644 index 0000000000..223601c059 --- /dev/null +++ b/src/lottie/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/src/lottie/rapidjson/encodings.h b/src/lottie/rapidjson/encodings.h new file mode 100644 index 0000000000..7903e76a55 --- /dev/null +++ b/src/lottie/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFFu >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define COPY() os.Put(c = is.Take()) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + Ch c; + COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put(static_cast((v & 0x3FF) | 0xDC00)); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + static RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/src/lottie/rapidjson/error/en.h b/src/lottie/rapidjson/error/en.h new file mode 100644 index 0000000000..2db838bff2 --- /dev/null +++ b/src/lottie/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/src/lottie/rapidjson/error/error.h b/src/lottie/rapidjson/error/error.h new file mode 100644 index 0000000000..9311d2f03b --- /dev/null +++ b/src/lottie/rapidjson/error/error.h @@ -0,0 +1,161 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { + //!! Unspecified boolean type + typedef bool (ParseResult::*BooleanType)() const; +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). + operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + bool operator!=(const ParseResult& that) const { return !(*this == that); } + bool operator!=(ParseErrorCode code) const { return !(*this == code); } + friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/src/lottie/rapidjson/filereadstream.h b/src/lottie/rapidjson/filereadstream.h new file mode 100644 index 0000000000..f1bfb7d0b9 --- /dev/null +++ b/src/lottie/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/src/lottie/rapidjson/filewritestream.h b/src/lottie/rapidjson/filewritestream.h new file mode 100644 index 0000000000..3811f8b8d8 --- /dev/null +++ b/src/lottie/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/src/lottie/rapidjson/fwd.h b/src/lottie/rapidjson/fwd.h new file mode 100644 index 0000000000..e8104e841b --- /dev/null +++ b/src/lottie/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +struct GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/src/lottie/rapidjson/internal/biginteger.h b/src/lottie/rapidjson/internal/biginteger.h new file mode 100644 index 0000000000..9d3e88c998 --- /dev/null +++ b/src/lottie/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(&digits_[count_ - 1 + offset], &digits_[count_ - 1], count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/src/lottie/rapidjson/internal/diyfp.h b/src/lottie/rapidjson/internal/diyfp.h new file mode 100644 index 0000000000..29abf8046e --- /dev/null +++ b/src/lottie/rapidjson/internal/diyfp.h @@ -0,0 +1,258 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) +#include +#pragma intrinsic(_BitScanReverse64) +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + unsigned index = (static_cast(exp) + 348u) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); + } + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/src/lottie/rapidjson/internal/dtoa.h b/src/lottie/rapidjson/internal/dtoa.h new file mode 100644 index 0000000000..bf2e9b2e59 --- /dev/null +++ b/src/lottie/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline int CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -kappa; + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[index] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/src/lottie/rapidjson/internal/ieee754.h b/src/lottie/rapidjson/internal/ieee754.h new file mode 100644 index 0000000000..c2684ba2a3 --- /dev/null +++ b/src/lottie/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static int EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return order + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/src/lottie/rapidjson/internal/itoa.h b/src/lottie/rapidjson/internal/itoa.h new file mode 100644 index 0000000000..01a4e7e72d --- /dev/null +++ b/src/lottie/rapidjson/internal/itoa.h @@ -0,0 +1,304 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + if (value >= kTen8) + *buffer++ = cDigitsLut[d4 + 1]; + + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/src/lottie/rapidjson/internal/meta.h b/src/lottie/rapidjson/internal/meta.h new file mode 100644 index 0000000000..5a9aaa4286 --- /dev/null +++ b/src/lottie/rapidjson/internal/meta.h @@ -0,0 +1,181 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif +#if defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/src/lottie/rapidjson/internal/pow10.h b/src/lottie/rapidjson/internal/pow10.h new file mode 100644 index 0000000000..02f475d705 --- /dev/null +++ b/src/lottie/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/src/lottie/rapidjson/internal/regex.h b/src/lottie/rapidjson/internal/regex.h new file mode 100644 index 0000000000..e1a2faae5f --- /dev/null +++ b/src/lottie/rapidjson/internal/regex.h @@ -0,0 +1,734 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 7 +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// DecodedStream + +template +class DecodedStream { +public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + +private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +template +class GenericRegexSearch; + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef Encoding EncodingType; + typedef typename Encoding::Ch Ch; + template friend class GenericRegexSearch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + states_(allocator, 256), ranges_(allocator, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream, Encoding> ds(ss); + Parse(ds); + } + + ~GenericRegex() {} + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Allocator allocator; + Stack operandStack(&allocator, 256); // Frag + Stack operatorStack(&allocator, 256); // Operator + Stack atomCountStack(&allocator, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + default: + RAPIDJSON_ASSERT(op == kOneOrMore); + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + bool anchorBegin_; + bool anchorEnd_; +}; + +template +class GenericRegexSearch { +public: + typedef typename RegexType::EncodingType Encoding; + typedef typename Encoding::Ch Ch; + + GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : + regex_(regex), allocator_(allocator), ownAllocator_(0), + state0_(allocator, 0), state1_(allocator, 0), stateSet_() + { + RAPIDJSON_ASSERT(regex_.IsValid()); + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); + state0_.template Reserve(regex_.stateCount_); + state1_.template Reserve(regex_.stateCount_); + } + + ~GenericRegexSearch() { + Allocator::Free(stateSet_); + RAPIDJSON_DELETE(ownAllocator_); + } + + template + bool Match(InputStream& is) { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) { + return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); + } + + bool Search(const Ch* s) { + GenericStringStream is(s); + return Search(is); + } + +private: + typedef typename RegexType::State State; + typedef typename RegexType::Range Range; + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, regex_.root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = regex_.GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == RegexType::kAnyCharacterClass || + (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, regex_.root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (regex_.stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = regex_.GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { + stateSet_[index >> 5] |= (1u << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = regex_.GetRange(rangeIndex); + if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + const RegexType& regex_; + Allocator* allocator_; + Allocator* ownAllocator_; + Stack state0_; + Stack state1_; + uint32_t* stateSet_; +}; + +typedef GenericRegex > Regex; +typedef GenericRegexSearch RegexSearch; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/src/lottie/rapidjson/internal/stack.h b/src/lottie/rapidjson/internal/stack.h new file mode 100644 index 0000000000..5c5398c35c --- /dev/null +++ b/src/lottie/rapidjson/internal/stack.h @@ -0,0 +1,231 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(stackTop_ + sizeof(T) * count > stackEnd_)) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_); + RAPIDJSON_ASSERT(stackTop_ + sizeof(T) * count <= stackEnd_); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/src/lottie/rapidjson/internal/strfunc.h b/src/lottie/rapidjson/internal/strfunc.h new file mode 100644 index 0000000000..226439a767 --- /dev/null +++ b/src/lottie/rapidjson/internal/strfunc.h @@ -0,0 +1,69 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + RAPIDJSON_ASSERT(s != 0); + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +template <> +inline SizeType StrLen(const char* s) { + return SizeType(std::strlen(s)); +} + +template <> +inline SizeType StrLen(const wchar_t* s) { + return SizeType(std::wcslen(s)); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + RAPIDJSON_ASSERT(s != 0); + RAPIDJSON_ASSERT(outCount != 0); + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/src/lottie/rapidjson/internal/strtod.h b/src/lottie/rapidjson/internal/strtod.h new file mode 100644 index 0000000000..adf49e3496 --- /dev/null +++ b/src/lottie/rapidjson/internal/strtod.h @@ -0,0 +1,269 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosition, int exp, double* result) { + uint64_t significand = 0; + size_t i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < length; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < length && decimals[i] >= '5') // Rounding + significand++; + + size_t remaining = length - i; + const int kUlpShift = 3; + const int kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + const int dExp = static_cast(decimalPosition) - static_cast(i) + exp; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp - 1; + RAPIDJSON_ASSERT(adjustment >= 0 && adjustment < 7); + v = v * kPow10[adjustment]; + if (length + static_cast(adjustment)> 19u) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + int precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + int scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + kUlp; + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, size_t length, size_t decimalPosition, int exp) { + const BigInteger dInt(decimals, length); + const int dExp = static_cast(decimalPosition) - static_cast(length) + exp; + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result; + if (StrtodFast(d, p, &result)) + return result; + + // Trim leading zeros + while (*decimals == '0' && length > 1) { + length--; + decimals++; + decimalPosition--; + } + + // Trim trailing zeros + while (decimals[length - 1] == '0' && length > 1) { + length--; + decimalPosition--; + exp++; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 780; + if (static_cast(length) > kMaxDecimalDigit) { + int delta = (static_cast(length) - kMaxDecimalDigit); + exp += delta; + decimalPosition -= static_cast(delta); + length = kMaxDecimalDigit; + } + + // If too small, underflow to zero + if (int(length) + exp < -324) + return 0.0; + + if (StrtodDiyFp(decimals, length, decimalPosition, exp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, length, decimalPosition, exp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/src/lottie/rapidjson/internal/swap.h b/src/lottie/rapidjson/internal/swap.h new file mode 100644 index 0000000000..666e49f97b --- /dev/null +++ b/src/lottie/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/src/lottie/rapidjson/istreamwrapper.h b/src/lottie/rapidjson/istreamwrapper.h new file mode 100644 index 0000000000..8639c8c3c8 --- /dev/null +++ b/src/lottie/rapidjson/istreamwrapper.h @@ -0,0 +1,115 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicIStreamWrapper(StreamType& stream) : stream_(stream), count_(), peekBuffer_() {} + + Ch Peek() const { + typename StreamType::int_type c = stream_.peek(); + return RAPIDJSON_LIKELY(c != StreamType::traits_type::eof()) ? static_cast(c) : static_cast('\0'); + } + + Ch Take() { + typename StreamType::int_type c = stream_.get(); + if (RAPIDJSON_LIKELY(c != StreamType::traits_type::eof())) { + count_++; + return static_cast(c); + } + else + return '\0'; + } + + // tellg() may return -1 when failed. So we count by ourself. + size_t Tell() const { return count_; } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + RAPIDJSON_ASSERT(sizeof(Ch) == 1); // Only usable for byte stream. + int i; + bool hasError = false; + for (i = 0; i < 4; ++i) { + typename StreamType::int_type c = stream_.get(); + if (c == StreamType::traits_type::eof()) { + hasError = true; + stream_.clear(); + break; + } + peekBuffer_[i] = static_cast(c); + } + for (--i; i >= 0; --i) + stream_.putback(peekBuffer_[i]); + return !hasError ? peekBuffer_ : 0; + } + +private: + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + StreamType& stream_; + size_t count_; //!< Number of characters read. Note: + mutable Ch peekBuffer_[4]; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/src/lottie/rapidjson/memorybuffer.h b/src/lottie/rapidjson/memorybuffer.h new file mode 100644 index 0000000000..39bee1dec1 --- /dev/null +++ b/src/lottie/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/src/lottie/rapidjson/memorystream.h b/src/lottie/rapidjson/memorystream.h new file mode 100644 index 0000000000..1d71d8a4f0 --- /dev/null +++ b/src/lottie/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/src/lottie/rapidjson/meson.build b/src/lottie/rapidjson/meson.build new file mode 100644 index 0000000000..2809babd2e --- /dev/null +++ b/src/lottie/rapidjson/meson.build @@ -0,0 +1,8 @@ +ssg_sources_lottie_rapidjson = [] + +ssg_lottie_rapidjson_file = ['jsontest.cpp' + ] + +foreach file: ssg_lottie_rapidjson_file + ssg_sources_lottie_rapidjson += join_paths('rapidjson', file) +endforeach diff --git a/src/lottie/rapidjson/msinttypes/inttypes.h b/src/lottie/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000000..18111286bf --- /dev/null +++ b/src/lottie/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/src/lottie/rapidjson/msinttypes/stdint.h b/src/lottie/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000000..3d4477b9a0 --- /dev/null +++ b/src/lottie/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/src/lottie/rapidjson/ostreamwrapper.h b/src/lottie/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000000..6f4667c08a --- /dev/null +++ b/src/lottie/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/src/lottie/rapidjson/pointer.h b/src/lottie/rapidjson/pointer.h new file mode 100644 index 0000000000..0f377efecc --- /dev/null +++ b/src/lottie/rapidjson/pointer.h @@ -0,0 +1,1358 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, internal::StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = static_cast(buffer[i]); + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(static_cast(hexDigits[u >> 4])); + os_.Put(static_cast(hexDigits[u & 15])); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/src/lottie/rapidjson/prettywriter.h b/src/lottie/rapidjson/prettywriter.h new file mode 100644 index 0000000000..98dfb30604 --- /dev/null +++ b/src/lottie/rapidjson/prettywriter.h @@ -0,0 +1,277 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of ouptut os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + PrettyWriter(PrettyWriter&& rhs) : + Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} +#endif + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::WriteNull(); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::WriteBool(b); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::WriteInt(i); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::WriteUint(u); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::WriteInt64(i64); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::WriteUint64(u64); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::WriteDouble(d); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kNumberType); + return Base::WriteString(str, length); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kStringType); + return Base::WriteString(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndObject(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndArray(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + PrettyPrefix(type); + return Base::WriteRawValue(json, length); + } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/src/lottie/rapidjson/rapidjson.h b/src/lottie/rapidjson/rapidjson.h new file mode 100644 index 0000000000..256b0d52e9 --- /dev/null +++ b/src/lottie/rapidjson/rapidjson.h @@ -0,0 +1,630 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overriden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x + +// token concatenation +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. Currently the default uses 4 bytes + alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#if RAPIDJSON_64BIT == 1 +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#else +#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2/Neon optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel + or ARM compatible processors. + + To enable these optimizations, three different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + // Enable ARM Neon optimization. + #define RAPIDJSON_NEON + \endcode + + \c RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Prefer C++11 static_assert, if available +#ifndef RAPIDJSON_STATIC_ASSERT +#if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) +#define RAPIDJSON_STATIC_ASSERT(x) \ + static_assert(x, RAPIDJSON_STRINGIFY(x)) +#endif // C++11 +#endif // RAPIDJSON_STATIC_ASSERT + +// Adopt C++03 implementation from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif // RAPIDJSON_STATIC_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features +//enable c++11 feature +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) +// (defined(_MSC_VER) && _MSC_VER >= ????) // not yet supported +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +//!@endcond + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(TypeName) new TypeName +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/src/lottie/rapidjson/reader.h b/src/lottie/rapidjson/reader.h new file mode 100644 index 0000000000..120c31115f --- /dev/null +++ b/src/lottie/rapidjson/reader.h @@ -0,0 +1,2221 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_NEON) + +//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz =__builtin_clzll(high);; + return p + 8 + (lz >> 3); + } + } else { + int lz = __builtin_clzll(low);; + return p + (lz >> 3); + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (; p <= end - 16; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz = __builtin_clzll(high); + return p + 8 + (lz >> 3); + } + } else { + int lz = __builtin_clzll(low); + return p + (lz >> 3); + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_NEON + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Initialize JSON text token-by-token parsing + /*! + */ + void IterativeParseInit() { + parseResult_.Clear(); + state_ = IterativeParsingStartState; + } + + //! Parse one token from JSON text + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + bool IterativeParseNext(InputStream& is, Handler& handler) { + while (RAPIDJSON_LIKELY(is.Peek() != '\0')) { + SkipWhitespaceAndComments(is); + + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state_, t); + IterativeParsingState d = Transit(state_, t, n, is, handler); + + // If we've finished or hit an error... + if (RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { + // Report errors. + if (d == IterativeParsingErrorState) { + HandleError(state_, is); + return false; + } + + // Transition to the finish state. + RAPIDJSON_ASSERT(d == IterativeParsingFinishState); + state_ = d; + + // If StopWhenDone is not set... + if (!(parseFlags & kParseStopWhenDoneFlag)) { + // ... and extra non-whitespace data is found... + SkipWhitespaceAndComments(is); + if (is.Peek() != '\0') { + // ... this is considered an error. + HandleError(state_, is); + return false; + } + } + + // Success! We are done! + return true; + } + + // Transition to the new state. + state_ = d; + + // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. + if (!IsIterativeParsingDelimiterState(n)) + return true; + } + + // We reached the end of file. + stack_.Clear(); + + if (state_ != IterativeParsingFinishState) { + HandleError(state_, is); + return false; + } + + return true; + } + + //! Check if token-by-token parsing JSON text is complete + /*! \return Whether the JSON has been fully decoded. + */ + RAPIDJSON_FORCEINLINE bool IterativeParseComplete() { + return IsIterativeParsingCompleteState(state_); + } + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n') {} + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the inital '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#elif defined(RAPIDJSON_NEON) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high);; + length = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low);; + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + vst1q_u8(reinterpret_cast(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16, q += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low); + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + for (const char* pend = p + length; p != pend; ) { + *q++ = *p++; + } + break; + } + vst1q_u8(reinterpret_cast(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz = __builtin_clzll(high); + p += 8 + (lz >> 3); + break; + } + } else { + int lz = __builtin_clzll(low); + p += lz >> 3; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif // RAPIDJSON_NEON + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + if (Consume(s, 'N')) { + if (Consume(s, 'a') && Consume(s, 'N')) { + d = std::numeric_limits::quiet_NaN(); + useNanOrInf = true; + } + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { + if (Consume(s, 'n') && Consume(s, 'f')) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + useNanOrInf = true; + + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + } + + if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(d >= 1.7976931348623157e307)) // DBL_MAX / 10.0 + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (exp >= 214748364) { // Issue #313: prevent overflow exponent + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingFinishState = 0, // sink states at top + IterativeParsingErrorState, // sink states at top + IterativeParsingStartState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingMemberValueState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState, + + // Delimiter states (at bottom) + IterativeParsingElementDelimiterState, + IterativeParsingMemberDelimiterState, + IterativeParsingKeyValueDelimiterState, + + cIterativeParsingStateCount + }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) { + return s >= IterativeParsingElementDelimiterState; + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) { + return s <= IterativeParsingErrorState; + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; + IterativeParsingState state_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/src/lottie/rapidjson/schema.h b/src/lottie/rapidjson/schema.h new file mode 100644 index 0000000000..2713fb2603 --- /dev/null +++ b/src/lottie/rapidjson/schema.h @@ -0,0 +1,2017 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// 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-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && !defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, const SchemaType* s) : + factory(f), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + typeless_(schemaDocument->GetTypeless()), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + notValidatorIndex_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false) + { + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256 + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = typeless_; + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + } + + ~Schema() { + AllocatorType::Free(enum_); + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + AllocatorType::Free(pattern_); + } +#endif + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = typeless_; + else + RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + else + context.valueSchema = typeless_; + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (!patternValid && !otherValid) // kPatternValidatorWithAdditionalProperty) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + else + oneValid = true; + } + if (!oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + if (count > maxLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + context.valueSchema = typeless_; + } + } + + SizeType index; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = typeless_; + return true; + } + + if (context.patternPropertiesSchemaCount == 0) // patternProperties are not additional properties + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required) + if (!context.propertyExist[index]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + + if (memberCount < minProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + + if (memberCount > maxProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + + if (hasDependencies_) { + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) + if (context.propertyExist[sourceIndex]) { + if (properties_[sourceIndex].dependencies) { + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (properties_[sourceIndex].dependencies[targetIndex] && !context.propertyExist[targetIndex]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + else if (properties_[sourceIndex].dependenciesSchema) + if (!context.validators[properties_[sourceIndex].dependenciesValidatorIndex]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + + if (elementCount > maxItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + + return true; + } + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + GenericRegexSearch rs(*pattern); + return rs.Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) + try { + return new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsUint64()) { + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsUint64()) { } + /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + return true; + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + const SchemaType* typeless_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = static_cast(buffer[i]); + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + typeless_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); + new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), 0); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + else if (refEntry->schema) + *refEntry->schema = typeless_; + + refEntry->~SchemaRefEntry(); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + typeless_(rhs.typeless_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.typeless_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + if (typeless_) { + typeless_->~SchemaType(); + Allocator::Free(typeless_); + } + + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = typeless_; + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + const SchemaType* GetTypeless() const { return typeless_; } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + SchemaType* typeless_; + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(&outputHandler), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : schemaDocument_->GetPointer(&CurrentSchema()); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + return documentStack_.Empty() ? PointerType() : PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && (!outputHandler_ || outputHandler_->method arg2) + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext() ), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = !outputHandler_ || outputHandler_->StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = !outputHandler_ || outputHandler_->StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator)(); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + RAPIDJSON_ASSERT(CurrentContext().valueSchema); + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) + RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + OutputHandler* outputHandler_; + bool valid_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/src/lottie/rapidjson/stream.h b/src/lottie/rapidjson/stream.h new file mode 100644 index 0000000000..7f2643e481 --- /dev/null +++ b/src/lottie/rapidjson/stream.h @@ -0,0 +1,223 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// GenericStreamWrapper + +//! A Stream Wrapper +/*! \tThis string stream is a wrapper for any stream by just forwarding any + \treceived message to the origin stream. + \note implements Stream concept +*/ + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +template > +class GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + GenericStreamWrapper(InputStream& is): is_(is) {} + + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() { return is_.Tell(); } + Ch* PutBegin() { return is_.PutBegin(); } + void Put(Ch ch) { is_.Put(ch); } + void Flush() { is_.Flush(); } + size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } + + // wrapper for MemoryStream + const Ch* Peek4() const { return is_.Peek4(); } + + // wrapper for AutoUTFInputStream + UTFType GetType() const { return is_.GetType(); } + bool HasBOM() const { return is_.HasBOM(); } + +protected: + InputStream& is_; +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/src/lottie/rapidjson/stringbuffer.h b/src/lottie/rapidjson/stringbuffer.h new file mode 100644 index 0000000000..4e38b82c3d --- /dev/null +++ b/src/lottie/rapidjson/stringbuffer.h @@ -0,0 +1,121 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + //! Get the size of string in bytes in the string buffer. + size_t GetSize() const { return stack_.GetSize(); } + + //! Get the length of string in Ch in the string buffer. + size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/src/lottie/rapidjson/writer.h b/src/lottie/rapidjson/writer.h new file mode 100644 index 0000000000..e610ebb602 --- /dev/null +++ b/src/lottie/rapidjson/writer.h @@ -0,0 +1,711 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Writer(Writer&& rhs) : + os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { + rhs.os_ = 0; + } +#endif + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) + { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + Prefix(type); + return EndValue(WriteRawValue(json, length)); + } + + //! Flush the output stream. + /*! + Allows the user to flush the output stream immediately. + */ + void Flush() { + os_->Flush(); + } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + for (size_t i = 0; i < length; i++) { + RAPIDJSON_ASSERT(json[i] != '\0'); + PutUnsafe(*os_, json[i]); + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#elif defined(RAPIDJSON_NEON) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (; p != endAligned; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType len = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high); + len = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low); + len = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // RAPIDJSON_NEON + +RAPIDJSON_NAMESPACE_END + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000000..6f6bb37857 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,12 @@ +subdir('vector') +subdir('lottie') + +library_deps = [vector_dep] +library_deps += lottie_dep + +lottie_player_lib = shared_library( 'lottie-player', + include_directories : inc, + version : lottie_player_lib_version, + dependencies : library_deps, + install : true + ) diff --git a/src/vector/freetype/meson.build b/src/vector/freetype/meson.build new file mode 100644 index 0000000000..8bbff5c329 --- /dev/null +++ b/src/vector/freetype/meson.build @@ -0,0 +1,10 @@ + +source_file = files('v_ft_math.cpp') +source_file += files('v_ft_raster.cpp') +source_file += files('v_ft_stroker.cpp') + + +freetype_dep = declare_dependency( + include_directories : include_directories('.'), + sources : source_file + ) \ No newline at end of file diff --git a/src/vector/freetype/v_ft_math.cpp b/src/vector/freetype/v_ft_math.cpp new file mode 100644 index 0000000000..e1c8ad46e2 --- /dev/null +++ b/src/vector/freetype/v_ft_math.cpp @@ -0,0 +1,528 @@ +/***************************************************************************/ +/* */ +/* fttrigon.c */ +/* */ +/* FreeType trigonometric functions (body). */ +/* */ +/* Copyright 2001-2005, 2012-2013 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include +#include "v_ft_math.h" + + +#define SW_FT_MSB( x ) ( 31 - __builtin_clz( x ) ) + +#define SW_FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) +#define SW_FT_PAD_ROUND( x, n ) SW_FT_PAD_FLOOR( (x) + ((n)/2), n ) +#define SW_FT_PAD_CEIL( x, n ) SW_FT_PAD_FLOOR( (x) + ((n)-1), n ) + + +#define SW_FT_BEGIN_STMNT do { +#define SW_FT_END_STMNT } while ( 0 ) +/* transfer sign leaving a positive number */ +#define SW_FT_MOVE_SIGN( x, s ) \ +SW_FT_BEGIN_STMNT \ + if ( x < 0 ) \ + { \ + x = -x; \ + s = -s; \ + } \ +SW_FT_END_STMNT + + + + +SW_FT_Long +SW_FT_MulFix( SW_FT_Long a, + SW_FT_Long b ) +{ + SW_FT_Int s = 1; + SW_FT_Long c; + + + SW_FT_MOVE_SIGN( a, s ); + SW_FT_MOVE_SIGN( b, s ); + + c = (SW_FT_Long)( ( (SW_FT_Int64)a * b + 0x8000L ) >> 16 ); + + return ( s > 0 ) ? c : -c; +} + +SW_FT_Long +SW_FT_MulDiv( SW_FT_Long a, + SW_FT_Long b, + SW_FT_Long c ) +{ + SW_FT_Int s = 1; + SW_FT_Long d; + + + SW_FT_MOVE_SIGN( a, s ); + SW_FT_MOVE_SIGN( b, s ); + SW_FT_MOVE_SIGN( c, s ); + + d = (SW_FT_Long)( c > 0 ? ( (SW_FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; +} + +SW_FT_Long +SW_FT_DivFix( SW_FT_Long a, + SW_FT_Long b ) +{ + SW_FT_Int s = 1; + SW_FT_Long q; + + + SW_FT_MOVE_SIGN( a, s ); + SW_FT_MOVE_SIGN( b, s ); + + q = (SW_FT_Long)( b > 0 ? ( ( (SW_FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b + : 0x7FFFFFFFL ); + + return ( s < 0 ? -q : q ); +} + + +/*************************************************************************/ +/* */ +/* This is a fixed-point CORDIC implementation of trigonometric */ +/* functions as well as transformations between Cartesian and polar */ +/* coordinates. The angles are represented as 16.16 fixed-point values */ +/* in degrees, i.e., the angular resolution is 2^-16 degrees. Note that */ +/* only vectors longer than 2^16*180/pi (or at least 22 bits) on a */ +/* discrete Cartesian grid can have the same or better angular */ +/* resolution. Therefore, to maintain this precision, some functions */ +/* require an interim upscaling of the vectors, whereas others operate */ +/* with 24-bit long vectors directly. */ +/* */ +/*************************************************************************/ + + /* the Cordic shrink factor 0.858785336480436 * 2^32 */ +#define SW_FT_TRIG_SCALE 0xDBD95B16UL + + /* the highest bit in overflow-safe vector components, */ + /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ +#define SW_FT_TRIG_SAFE_MSB 29 + + /* this table was generated for SW_FT_PI = 180L << 16, i.e. degrees */ +#define SW_FT_TRIG_MAX_ITERS 23 + + static const SW_FT_Fixed + ft_trig_arctan_table[] = + { + 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, + 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, + 57L, 29L, 14L, 7L, 4L, 2L, 1L + }; + + /* multiply a given value by the CORDIC shrink factor */ + static SW_FT_Fixed + ft_trig_downscale( SW_FT_Fixed val ) + { + SW_FT_Fixed s; + SW_FT_Int64 v; + + + s = val; + val = SW_FT_ABS( val ); + + v = ( val * (SW_FT_Int64)SW_FT_TRIG_SCALE ) + 0x100000000UL; + val = (SW_FT_Fixed)( v >> 32 ); + + return ( s >= 0 ) ? val : -val; + } + + + + /* undefined and never called for zero vector */ + static SW_FT_Int + ft_trig_prenorm( SW_FT_Vector* vec ) + { + SW_FT_Pos x, y; + SW_FT_Int shift; + + + x = vec->x; + y = vec->y; + + shift = SW_FT_MSB( SW_FT_ABS( x ) | SW_FT_ABS( y ) ); + + if ( shift <= SW_FT_TRIG_SAFE_MSB ) + { + shift = SW_FT_TRIG_SAFE_MSB - shift; + vec->x = (SW_FT_Pos)( (SW_FT_ULong)x << shift ); + vec->y = (SW_FT_Pos)( (SW_FT_ULong)y << shift ); + } + else + { + shift -= SW_FT_TRIG_SAFE_MSB; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + + return shift; + } + + + static void + ft_trig_pseudo_rotate( SW_FT_Vector* vec, + SW_FT_Angle theta ) + { + SW_FT_Int i; + SW_FT_Fixed x, y, xtemp, b; + const SW_FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Rotate inside [-PI/4,PI/4] sector */ + while ( theta < -SW_FT_ANGLE_PI4 ) + { + xtemp = y; + y = -x; + x = xtemp; + theta += SW_FT_ANGLE_PI2; + } + + while ( theta > SW_FT_ANGLE_PI4 ) + { + xtemp = -y; + y = x; + x = xtemp; + theta -= SW_FT_ANGLE_PI2; + } + + arctanptr = ft_trig_arctan_table; + + /* Pseudorotations, with right shifts */ + for ( i = 1, b = 1; i < SW_FT_TRIG_MAX_ITERS; b <<= 1, i++ ) + { + if ( theta < 0 ) + { + xtemp = x + ( ( y + b ) >> i ); + y = y - ( ( x + b ) >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( ( y + b ) >> i ); + y = y + ( ( x + b ) >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } + + vec->x = x; + vec->y = y; + } + + + static void + ft_trig_pseudo_polarize( SW_FT_Vector* vec ) + { + SW_FT_Angle theta; + SW_FT_Int i; + SW_FT_Fixed x, y, xtemp, b; + const SW_FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into [-PI/4,PI/4] sector */ + if ( y > x ) + { + if ( y > -x ) + { + theta = SW_FT_ANGLE_PI2; + xtemp = y; + y = -x; + x = xtemp; + } + else + { + theta = y > 0 ? SW_FT_ANGLE_PI : -SW_FT_ANGLE_PI; + x = -x; + y = -y; + } + } + else + { + if ( y < -x ) + { + theta = -SW_FT_ANGLE_PI2; + xtemp = -y; + y = x; + x = xtemp; + } + else + { + theta = 0; + } + } + + arctanptr = ft_trig_arctan_table; + + /* Pseudorotations, with right shifts */ + for ( i = 1, b = 1; i < SW_FT_TRIG_MAX_ITERS; b <<= 1, i++ ) + { + if ( y > 0 ) + { + xtemp = x + ( ( y + b ) >> i ); + y = y - ( ( x + b ) >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( ( y + b ) >> i ); + y = y + ( ( x + b ) >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } + + /* round theta */ + if ( theta >= 0 ) + theta = SW_FT_PAD_ROUND( theta, 32 ); + else + theta = -SW_FT_PAD_ROUND( -theta, 32 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + SW_FT_Fixed + SW_FT_Cos( SW_FT_Angle angle ) + { + SW_FT_Vector v; + + + v.x = SW_FT_TRIG_SCALE >> 8; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return ( v.x + 0x80L ) >> 8; + } + + + /* documentation is in fttrigon.h */ + + SW_FT_Fixed + SW_FT_Sin( SW_FT_Angle angle ) + { + return SW_FT_Cos( SW_FT_ANGLE_PI2 - angle ); + } + + + /* documentation is in fttrigon.h */ + + SW_FT_Fixed + SW_FT_Tan( SW_FT_Angle angle ) + { + SW_FT_Vector v; + + + v.x = SW_FT_TRIG_SCALE >> 8; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return SW_FT_DivFix( v.y, v.x ); + } + + + /* documentation is in fttrigon.h */ + + SW_FT_Angle + SW_FT_Atan2( SW_FT_Fixed dx, + SW_FT_Fixed dy ) + { + SW_FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + void + SW_FT_Vector_Unit( SW_FT_Vector* vec, + SW_FT_Angle angle ) + { + vec->x = SW_FT_TRIG_SCALE >> 8; + vec->y = 0; + ft_trig_pseudo_rotate( vec, angle ); + vec->x = ( vec->x + 0x80L ) >> 8; + vec->y = ( vec->y + 0x80L ) >> 8; + } + + + /* these macros return 0 for positive numbers, + and -1 for negative ones */ +#define SW_FT_SIGN_LONG( x ) ( (x) >> ( SW_FT_SIZEOF_LONG * 8 - 1 ) ) +#define SW_FT_SIGN_INT( x ) ( (x) >> ( SW_FT_SIZEOF_INT * 8 - 1 ) ) +#define SW_FT_SIGN_INT32( x ) ( (x) >> 31 ) +#define SW_FT_SIGN_INT16( x ) ( (x) >> 15 ) + + + /* documentation is in fttrigon.h */ + + void + SW_FT_Vector_Rotate( SW_FT_Vector* vec, + SW_FT_Angle angle ) + { + SW_FT_Int shift; + SW_FT_Vector v; + + + v.x = vec->x; + v.y = vec->y; + + if ( angle && ( v.x != 0 || v.y != 0 ) ) + { + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_rotate( &v, angle ); + v.x = ft_trig_downscale( v.x ); + v.y = ft_trig_downscale( v.y ); + + if ( shift > 0 ) + { + SW_FT_Int32 half = (SW_FT_Int32)1L << ( shift - 1 ); + + + vec->x = ( v.x + half + SW_FT_SIGN_LONG( v.x ) ) >> shift; + vec->y = ( v.y + half + SW_FT_SIGN_LONG( v.y ) ) >> shift; + } + else + { + shift = -shift; + vec->x = (SW_FT_Pos)( (SW_FT_ULong)v.x << shift ); + vec->y = (SW_FT_Pos)( (SW_FT_ULong)v.y << shift ); + } + } + } + + + /* documentation is in fttrigon.h */ + + SW_FT_Fixed + SW_FT_Vector_Length( SW_FT_Vector* vec ) + { + SW_FT_Int shift; + SW_FT_Vector v; + + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return SW_FT_ABS( v.y ); + } + else if ( v.y == 0 ) + { + return SW_FT_ABS( v.x ); + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; + + return (SW_FT_Fixed)( (SW_FT_UInt32)v.x << -shift ); + } + + + /* documentation is in fttrigon.h */ + + void + SW_FT_Vector_Polarize( SW_FT_Vector* vec, + SW_FT_Fixed *length, + SW_FT_Angle *angle ) + { + SW_FT_Int shift; + SW_FT_Vector v; + + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = ( shift >= 0 ) ? ( v.x >> shift ) + : (SW_FT_Fixed)( (SW_FT_UInt32)v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + void + SW_FT_Vector_From_Polar( SW_FT_Vector* vec, + SW_FT_Fixed length, + SW_FT_Angle angle ) + { + vec->x = length; + vec->y = 0; + + SW_FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + SW_FT_Angle + SW_FT_Angle_Diff( SW_FT_Angle angle1, + SW_FT_Angle angle2 ) + { + SW_FT_Angle delta = angle2 - angle1; + + + delta %= SW_FT_ANGLE_2PI; + if ( delta < 0 ) + delta += SW_FT_ANGLE_2PI; + + if ( delta > SW_FT_ANGLE_PI ) + delta -= SW_FT_ANGLE_2PI; + + return delta; + } + + +/* END */ + diff --git a/src/vector/freetype/v_ft_math.h b/src/vector/freetype/v_ft_math.h new file mode 100644 index 0000000000..b4611d8d44 --- /dev/null +++ b/src/vector/freetype/v_ft_math.h @@ -0,0 +1,438 @@ +#ifndef V_FT_MATH_H +#define V_FT_MATH_H + +/***************************************************************************/ +/* */ +/* fttrigon.h */ +/* */ +/* FreeType trigonometric functions (specification). */ +/* */ +/* Copyright 2001, 2003, 2005, 2007, 2013 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include "v_ft_types.h" + + +/*************************************************************************/ +/* */ +/* The min and max functions missing in C. As usual, be careful not to */ +/* write things like SW_FT_MIN( a++, b++ ) to avoid side effects. */ +/* */ +#define SW_FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define SW_FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define SW_FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + +/* + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' + * algorithm. We use alpha = 1, beta = 3/8, giving us results with a + * largest error less than 7% compared to the exact value. + */ +#define SW_FT_HYPOT( x, y ) \ + ( x = SW_FT_ABS( x ), \ + y = SW_FT_ABS( y ), \ + x > y ? x + ( 3 * y >> 3 ) \ + : y + ( 3 * x >> 3 ) ) + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_MulFix */ +/* */ +/* */ +/* A very simple function used to perform the computation */ +/* `(a*b)/0x10000' with maximum accuracy. Most of the time this is */ +/* used to multiply a given value by a 16.16 fixed-point factor. */ +/* */ +/* */ +/* a :: The first multiplier. */ +/* b :: The second multiplier. Use a 16.16 factor here whenever */ +/* possible (see note below). */ +/* */ +/* */ +/* The result of `(a*b)/0x10000'. */ +/* */ +/* */ +/* This function has been optimized for the case where the absolute */ +/* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ +/* As this happens mainly when scaling from notional units to */ +/* fractional pixels in FreeType, it resulted in noticeable speed */ +/* improvements between versions 2.x and 1.x. */ +/* */ +/* As a conclusion, always try to place a 16.16 factor as the */ +/* _second_ argument of this function; this can make a great */ +/* difference. */ +/* */ +SW_FT_Long +SW_FT_MulFix( SW_FT_Long a, + SW_FT_Long b ); + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_MulDiv */ +/* */ +/* */ +/* A very simple function used to perform the computation `(a*b)/c' */ +/* with maximum accuracy (it uses a 64-bit intermediate integer */ +/* whenever necessary). */ +/* */ +/* This function isn't necessarily as fast as some processor specific */ +/* operations, but is at least completely portable. */ +/* */ +/* */ +/* a :: The first multiplier. */ +/* b :: The second multiplier. */ +/* c :: The divisor. */ +/* */ +/* */ +/* The result of `(a*b)/c'. This function never traps when trying to */ +/* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ +/* on the signs of `a' and `b'. */ +/* */ +SW_FT_Long +SW_FT_MulDiv( SW_FT_Long a, + SW_FT_Long b, + SW_FT_Long c ); + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_DivFix */ +/* */ +/* */ +/* A very simple function used to perform the computation */ +/* `(a*0x10000)/b' with maximum accuracy. Most of the time, this is */ +/* used to divide a given value by a 16.16 fixed-point factor. */ +/* */ +/* */ +/* a :: The numerator. */ +/* b :: The denominator. Use a 16.16 factor here. */ +/* */ +/* */ +/* The result of `(a*0x10000)/b'. */ +/* */ +SW_FT_Long +SW_FT_DivFix( SW_FT_Long a, + SW_FT_Long b ); + + + + /*************************************************************************/ + /* */ + /*
*/ + /* computations */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * SW_FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed-point value expressed in degrees. + * + */ + typedef SW_FT_Fixed SW_FT_Angle; + + + /************************************************************************* + * + * @macro: + * SW_FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @SW_FT_Angle units. + * + */ +#define SW_FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************* + * + * @macro: + * SW_FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @SW_FT_Angle units. + * + */ +#define SW_FT_ANGLE_2PI ( SW_FT_ANGLE_PI * 2 ) + + + /************************************************************************* + * + * @macro: + * SW_FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @SW_FT_Angle units. + * + */ +#define SW_FT_ANGLE_PI2 ( SW_FT_ANGLE_PI / 2 ) + + + /************************************************************************* + * + * @macro: + * SW_FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @SW_FT_Angle units. + * + */ +#define SW_FT_ANGLE_PI4 ( SW_FT_ANGLE_PI / 4 ) + + + /************************************************************************* + * + * @function: + * SW_FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @SW_FT_Vector_Unit. + * + */ + SW_FT_Fixed + SW_FT_Sin( SW_FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * SW_FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @SW_FT_Vector_Unit. + * + */ + SW_FT_Fixed + SW_FT_Cos( SW_FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * SW_FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + SW_FT_Fixed + SW_FT_Tan( SW_FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * SW_FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in + * the 2d plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + SW_FT_Angle + SW_FT_Atan2( SW_FT_Fixed x, + SW_FT_Fixed y ); + + + /************************************************************************* + * + * @function: + * SW_FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `value2-value1'. + * + */ + SW_FT_Angle + SW_FT_Angle_Diff( SW_FT_Angle angle1, + SW_FT_Angle angle2 ); + + + /************************************************************************* + * + * @function: + * SW_FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x' will be `sin(angle)', and the value of + * `vec.y' will be `cos(angle)'. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + void + SW_FT_Vector_Unit( SW_FT_Vector* vec, + SW_FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * SW_FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + void + SW_FT_Vector_Rotate( SW_FT_Vector* vec, + SW_FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * SW_FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + SW_FT_Fixed + SW_FT_Vector_Length( SW_FT_Vector* vec ); + + + /************************************************************************* + * + * @function: + * SW_FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + void + SW_FT_Vector_Polarize( SW_FT_Vector* vec, + SW_FT_Fixed *length, + SW_FT_Angle *angle ); + + + /************************************************************************* + * + * @function: + * SW_FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + void + SW_FT_Vector_From_Polar( SW_FT_Vector* vec, + SW_FT_Fixed length, + SW_FT_Angle angle ); + + +#endif // V_FT_MATH_H diff --git a/src/vector/freetype/v_ft_raster.cpp b/src/vector/freetype/v_ft_raster.cpp new file mode 100644 index 0000000000..6059f0c3b5 --- /dev/null +++ b/src/vector/freetype/v_ft_raster.cpp @@ -0,0 +1,1674 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 2000-2003, 2005-2014 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is a new anti-aliasing scan-converter for FreeType 2. The */ + /* algorithm used here is _very_ different from the one in the standard */ + /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ + /* coverage of the outline on each pixel cell. */ + /* */ + /* It is based on ideas that I initially found in Raph Levien's */ + /* excellent LibArt graphics library (see http://www.levien.com/libart */ + /* for more information, though the web pages do not tell anything */ + /* about the renderer; you'll have to dive into the source code to */ + /* understand how it works). */ + /* */ + /* Note, however, that this is a _very_ different implementation */ + /* compared to Raph's. Coverage information is stored in a very */ + /* different way, and I don't use sorted vector paths. Also, it doesn't */ + /* use floating point values. */ + /* */ + /* This renderer has the following advantages: */ + /* */ + /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ + /* callback function that will be called by the renderer to draw gray */ + /* spans on any target surface. You can thus do direct composition on */ + /* any kind of bitmap, provided that you give the renderer the right */ + /* callback. */ + /* */ + /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ + /* each pixel cell. */ + /* */ + /* - It performs a single pass on the outline (the `standard' FT2 */ + /* renderer makes two passes). */ + /* */ + /* - It can easily be modified to render to _any_ number of gray levels */ + /* cheaply. */ + /* */ + /* - For small (< 20) pixel sizes, it is faster than the standard */ + /* renderer. */ + /* */ + /*************************************************************************/ + + +#include "v_ft_raster.h" +#include "v_ft_math.h" + + /* Auxiliary macros for token concatenation. */ +#define SW_FT_ERR_XCAT( x, y ) x ## y +#define SW_FT_ERR_CAT( x, y ) SW_FT_ERR_XCAT( x, y ) + +#define SW_FT_BEGIN_STMNT do { +#define SW_FT_END_STMNT } while ( 0 ) + + +#include +#include +#include +#include +#define SW_FT_UINT_MAX UINT_MAX +#define SW_FT_INT_MAX INT_MAX +#define SW_FT_ULONG_MAX ULONG_MAX +#define SW_FT_CHAR_BIT CHAR_BIT + +#define ft_memset memset + +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf + +typedef ptrdiff_t SW_FT_PtrDist; + + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 + +#define SW_FT_BEGIN_HEADER +#define SW_FT_END_HEADER + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define SW_FT_UNUSED( x ) (x) = (x) + + +#define SW_FT_THROW( e ) SW_FT_ERR_CAT( ErrRaster_, e ) + + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ +#define SW_FT_RENDER_POOL_SIZE 16384L + +typedef int +(*SW_FT_Outline_MoveToFunc)( const SW_FT_Vector* to, + void* user ); + +#define SW_FT_Outline_MoveTo_Func SW_FT_Outline_MoveToFunc + +typedef int +(*SW_FT_Outline_LineToFunc)( const SW_FT_Vector* to, + void* user ); + +#define SW_FT_Outline_LineTo_Func SW_FT_Outline_LineToFunc + + +typedef int +(*SW_FT_Outline_ConicToFunc)( const SW_FT_Vector* control, + const SW_FT_Vector* to, + void* user ); + +#define SW_FT_Outline_ConicTo_Func SW_FT_Outline_ConicToFunc + +typedef int +(*SW_FT_Outline_CubicToFunc)( const SW_FT_Vector* control1, + const SW_FT_Vector* control2, + const SW_FT_Vector* to, + void* user ); + +#define SW_FT_Outline_CubicTo_Func SW_FT_Outline_CubicToFunc + +typedef struct SW_FT_Outline_Funcs_ +{ + SW_FT_Outline_MoveToFunc move_to; + SW_FT_Outline_LineToFunc line_to; + SW_FT_Outline_ConicToFunc conic_to; + SW_FT_Outline_CubicToFunc cubic_to; + + int shift; + SW_FT_Pos delta; + +} SW_FT_Outline_Funcs; + + + +#define SW_FT_DEFINE_OUTLINE_FUNCS( class_, \ + move_to_, line_to_, \ + conic_to_, cubic_to_, \ + shift_, delta_ ) \ + static const SW_FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + +#define SW_FT_DEFINE_RASTER_FUNCS( class_, \ + raster_new_, raster_reset_, \ + raster_render_, \ + raster_done_ ) \ + const SW_FT_Raster_Funcs class_ = \ + { \ + raster_new_, \ + raster_reset_, \ + raster_render_, \ + raster_done_ \ + }; + + +#ifndef SW_FT_MEM_SET +#define SW_FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef SW_FT_MEM_ZERO +#define SW_FT_MEM_ZERO( dest, count ) SW_FT_MEM_SET( dest, 0, count ) +#endif + + /* as usual, for the speed hungry :-) */ + +#undef RAS_ARG +#undef RAS_ARG_ +#undef RAS_VAR +#undef RAS_VAR_ + +#ifndef SW_FT_STATIC_RASTER + +#define RAS_ARG gray_PWorker worker +#define RAS_ARG_ gray_PWorker worker, + +#define RAS_VAR worker +#define RAS_VAR_ worker, + +#else /* SW_FT_STATIC_RASTER */ + +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + +#endif /* SW_FT_STATIC_RASTER */ + + + /* must be at least 6 bits! */ +#define PIXEL_BITS 8 + +#undef FLOOR +#undef CEILING +#undef TRUNC +#undef SCALED + +#define ONE_PIXEL ( 1L << PIXEL_BITS ) +#define PIXEL_MASK ( -1L << PIXEL_BITS ) +#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) +#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) +#define FLOOR( x ) ( (x) & -ONE_PIXEL ) +#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) +#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) + +#if PIXEL_BITS >= 6 +#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) +#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#else +#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) +#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) +#endif + + + /* Compute `dividend / divisor' and return both its quotient and */ + /* remainder, cast to a specific type. This macro also ensures that */ + /* the remainder is always positive. */ +#define SW_FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ + SW_FT_BEGIN_STMNT \ + (quotient) = (type)( (dividend) / (divisor) ); \ + (remainder) = (type)( (dividend) % (divisor) ); \ + if ( (remainder) < 0 ) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + SW_FT_END_STMNT + +#ifdef __arm__ + /* Work around a bug specific to GCC which make the compiler fail to */ + /* optimize a division and modulo operation on the same parameters */ + /* into a single call to `__aeabi_idivmod'. See */ + /* */ + /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */ +#undef SW_FT_DIV_MOD +#define SW_FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ + SW_FT_BEGIN_STMNT \ + (quotient) = (type)( (dividend) / (divisor) ); \ + (remainder) = (type)( (dividend) - (quotient) * (divisor) ); \ + if ( (remainder) < 0 ) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + SW_FT_END_STMNT +#endif /* __arm__ */ + + /* These macros speed up repetitive divisions by replacing them */ + /* with multiplications and right shifts. */ +#define SW_FT_UDIVPREP( b ) \ + long b ## _r = (long)( SW_FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) +#define SW_FT_UDIV( a, b ) \ + ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ + ( sizeof( long ) * SW_FT_CHAR_BIT - PIXEL_BITS ) ) + + + /*************************************************************************/ + /* */ + /* TYPE DEFINITIONS */ + /* */ + + /* don't change the following types to SW_FT_Int or SW_FT_Pos, since we might */ + /* need to define them to "float" or "double" when experimenting with */ + /* new algorithms */ + + typedef long TCoord; /* integer scanline/pixel coordinate */ + typedef long TPos; /* sub-pixel coordinate */ + + /* determine the type used to store cell areas. This normally takes at */ + /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ + /* `long' instead of `int', otherwise bad things happen */ + +#if PIXEL_BITS <= 7 + + typedef int TArea; + +#else /* PIXEL_BITS >= 8 */ + + /* approximately determine the size of integers using an ANSI-C header */ +#if SW_FT_UINT_MAX == 0xFFFFU + typedef long TArea; +#else + typedef int TArea; +#endif + +#endif /* PIXEL_BITS >= 8 */ + + + /* maximum number of gray spans in a call to the span callback */ +#define SW_FT_MAX_GRAY_SPANS 256 + + + typedef struct TCell_* PCell; + + typedef struct TCell_ + { + TPos x; /* same with gray_TWorker.ex */ + TCoord cover; /* same with gray_TWorker.cover */ + TArea area; + PCell next; + + } TCell; + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `structure was padded due to */ + /* __declspec(align())' in order to compile cleanly with */ + /* the maximum level of warnings. */ +#pragma warning( push ) +#pragma warning( disable : 4324 ) +#endif /* _MSC_VER */ + + typedef struct gray_TWorker_ + { + TCoord ex, ey; + TPos min_ex, max_ex; + TPos min_ey, max_ey; + TPos count_ex, count_ey; + + TArea area; + TCoord cover; + int invalid; + + PCell cells; + SW_FT_PtrDist max_cells; + SW_FT_PtrDist num_cells; + + TPos x, y; + + + SW_FT_Vector bez_stack[32 * 3 + 1]; + int lev_stack[32]; + + SW_FT_Outline outline; + SW_FT_BBox clip_box; + + SW_FT_Span gray_spans[SW_FT_MAX_GRAY_SPANS]; + int num_gray_spans; + + SW_FT_Raster_Span_Func render_span; + void* render_span_data; + + int band_size; + int band_shoot; + + ft_jmp_buf jump_buffer; + + void* buffer; + long buffer_size; + + PCell* ycells; + TPos ycount; + + } gray_TWorker, *gray_PWorker; + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + + +#ifndef SW_FT_STATIC_RASTER +#define ras (*worker) +#else + static gray_TWorker ras; +#endif + + + typedef struct gray_TRaster_ + { + void* memory; + + } gray_TRaster, *gray_PRaster; + + + + /*************************************************************************/ + /* */ + /* Initialize the cells table. */ + /* */ + static void + gray_init_cells( RAS_ARG_ void* buffer, + long byte_size ) + { + ras.buffer = buffer; + ras.buffer_size = byte_size; + + ras.ycells = (PCell*) buffer; + ras.cells = NULL; + ras.max_cells = 0; + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; + } + + + /*************************************************************************/ + /* */ + /* Compute the outline bounding box. */ + /* */ + static void + gray_compute_cbox( RAS_ARG ) + { + SW_FT_Outline* outline = &ras.outline; + SW_FT_Vector* vec = outline->points; + SW_FT_Vector* limit = vec + outline->n_points; + + + if ( outline->n_points <= 0 ) + { + ras.min_ex = ras.max_ex = 0; + ras.min_ey = ras.max_ey = 0; + return; + } + + ras.min_ex = ras.max_ex = vec->x; + ras.min_ey = ras.max_ey = vec->y; + + vec++; + + for ( ; vec < limit; vec++ ) + { + TPos x = vec->x; + TPos y = vec->y; + + + if ( x < ras.min_ex ) ras.min_ex = x; + if ( x > ras.max_ex ) ras.max_ex = x; + if ( y < ras.min_ey ) ras.min_ey = y; + if ( y > ras.max_ey ) ras.max_ey = y; + } + + /* truncate the bounding box to integer pixels */ + ras.min_ex = ras.min_ex >> 6; + ras.min_ey = ras.min_ey >> 6; + ras.max_ex = ( ras.max_ex + 63 ) >> 6; + ras.max_ey = ( ras.max_ey + 63 ) >> 6; + } + + + /*************************************************************************/ + /* */ + /* Record the current cell in the table. */ + /* */ + static PCell + gray_find_cell( RAS_ARG ) + { + PCell *pcell, cell; + TPos x = ras.ex; + + + if ( x > ras.count_ex ) + x = ras.count_ex; + + pcell = &ras.ycells[ras.ey]; + for (;;) + { + cell = *pcell; + if ( cell == NULL || cell->x > x ) + break; + + if ( cell->x == x ) + goto Exit; + + pcell = &cell->next; + } + + if ( ras.num_cells >= ras.max_cells ) + ft_longjmp( ras.jump_buffer, 1 ); + + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = 0; + cell->cover = 0; + + cell->next = *pcell; + *pcell = cell; + + Exit: + return cell; + } + + + static void + gray_record_cell( RAS_ARG ) + { + if ( ras.area | ras.cover ) + { + PCell cell = gray_find_cell( RAS_VAR ); + + + cell->area += ras.area; + cell->cover += ras.cover; + } + } + + + /*************************************************************************/ + /* */ + /* Set the current cell to a new position. */ + /* */ + static void + gray_set_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + /* Move the cell pointer to a new position. We set the `invalid' */ + /* flag to indicate that the cell isn't part of those we're interested */ + /* in during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + /* All cells that are on the left of the clipping region go to the */ + /* min_ex - 1 horizontal position. */ + ey -= ras.min_ey; + + if ( ex > ras.max_ex ) + ex = ras.max_ex; + + ex -= ras.min_ex; + if ( ex < 0 ) + ex = -1; + + /* are we moving to a different cell ? */ + if ( ex != ras.ex || ey != ras.ey ) + { + /* record the current one if it is valid */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; + } + + ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || + ex >= ras.count_ex ); + } + + + /*************************************************************************/ + /* */ + /* Start a new contour at a given cell. */ + /* */ + static void + gray_start_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + if ( ex > ras.max_ex ) + ex = (TCoord)( ras.max_ex ); + + if ( ex < ras.min_ex ) + ex = (TCoord)( ras.min_ex - 1 ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex - ras.min_ex; + ras.ey = ey - ras.min_ey; + ras.invalid = 0; + + gray_set_cell( RAS_VAR_ ex, ey ); + } + + /*************************************************************************/ + /* */ + /* Render a straight line across multiple cells in any direction. */ + /* */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TPos dx, dy, fx1, fy1, fx2, fy2; + TCoord ex1, ex2, ey1, ey2; + + + ex1 = TRUNC( ras.x ); + ex2 = TRUNC( to_x ); + ey1 = TRUNC( ras.y ); + ey2 = TRUNC( to_y ); + + /* perform vertical clipping */ + if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) || + ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) + goto End; + + dx = to_x - ras.x; + dy = to_y - ras.y; + + fx1 = ras.x - SUBPIXELS( ex1 ); + fy1 = ras.y - SUBPIXELS( ey1 ); + + if ( ex1 == ex2 && ey1 == ey2 ) /* inside one cell */ + ; + else if ( dy == 0 ) /* ex1 != ex2 */ /* any horizontal line */ + { + ex1 = ex2; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } + else if ( dx == 0 ) + { + if ( dy > 0 ) /* vertical line up */ + do + { + fy2 = ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * fx1 * 2; + fy1 = 0; + ey1++; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ey1 != ey2 ); + else /* vertical line down */ + do + { + fy2 = 0; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * fx1 * 2; + fy1 = ONE_PIXEL; + ey1--; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ey1 != ey2 ); + } + else /* any other line */ + { + TArea prod = dx * fy1 - dy * fx1; + SW_FT_UDIVPREP( dx ); + SW_FT_UDIVPREP( dy ); + + + /* The fundamental value `prod' determines which side and the */ + /* exact coordinate where the line exits current cell. It is */ + /* also easily updated when moving from one cell to the next. */ + do + { + if ( prod <= 0 && + prod - dx * ONE_PIXEL > 0 ) /* left */ + { + fx2 = 0; + fy2 = (TPos)SW_FT_UDIV( -prod, -dx ); + prod -= dy * ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = ONE_PIXEL; + fy1 = fy2; + ex1--; + } + else if ( prod - dx * ONE_PIXEL <= 0 && + prod - dx * ONE_PIXEL + dy * ONE_PIXEL > 0 ) /* up */ + { + prod -= dx * ONE_PIXEL; + fx2 = (TPos)SW_FT_UDIV( -prod, dy ); + fy2 = ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = fx2; + fy1 = 0; + ey1++; + } + else if ( prod - dx * ONE_PIXEL + dy * ONE_PIXEL <= 0 && + prod + dy * ONE_PIXEL >= 0 ) /* right */ + { + prod += dy * ONE_PIXEL; + fx2 = ONE_PIXEL; + fy2 = (TPos)SW_FT_UDIV( prod, dx ); + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = 0; + fy1 = fy2; + ex1++; + } + else /* ( prod + dy * ONE_PIXEL < 0 && + prod > 0 ) down */ + { + fx2 = (TPos)SW_FT_UDIV( prod, -dy ); + fy2 = 0; + prod += dx * ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = fx2; + fy1 = ONE_PIXEL; + ey1--; + } + + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ex1 != ex2 || ey1 != ey2 ); + } + + fx2 = to_x - SUBPIXELS( ex2 ); + fy2 = to_y - SUBPIXELS( ey2 ); + + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + + End: + ras.x = to_x; + ras.y = to_y; + } + + static void + gray_split_conic( SW_FT_Vector* base ) + { + TPos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static void + gray_render_conic( RAS_ARG_ const SW_FT_Vector* control, + const SW_FT_Vector* to ) + { + TPos dx, dy; + TPos min, max, y; + int top, level; + int* levels; + SW_FT_Vector* arc; + + + levels = ras.lev_stack; + + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + top = 0; + + dx = SW_FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); + dy = SW_FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); + if ( dx < dy ) + dx = dy; + + if ( dx < ONE_PIXEL / 4 ) + goto Draw; + + /* short-cut the arc that crosses the current band */ + min = max = arc[0].y; + + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) + goto Draw; + + level = 0; + do + { + dx >>= 2; + level++; + } while ( dx > ONE_PIXEL / 4 ); + + levels[0] = level; + + do + { + level = levels[top]; + if ( level > 0 ) + { + gray_split_conic( arc ); + arc += 2; + top++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + top--; + arc -= 2; + + } while ( top >= 0 ); + } + + + static void + gray_split_cubic( SW_FT_Vector* base ) + { + TPos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static void + gray_render_cubic( RAS_ARG_ const SW_FT_Vector* control1, + const SW_FT_Vector* control2, + const SW_FT_Vector* to ) + { + SW_FT_Vector* arc; + TPos min, max, y; + + + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + /* Short-cut the arc that crosses the current band. */ + min = max = arc[0].y; + + y = arc[1].y; + if ( y < min ) + min = y; + if ( y > max ) + max = y; + + y = arc[2].y; + if ( y < min ) + min = y; + if ( y > max ) + max = y; + + y = arc[3].y; + if ( y < min ) + min = y; + if ( y > max ) + max = y; + + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) + goto Draw; + + for (;;) + { + /* Decide whether to split or draw. See `Rapid Termination */ + /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ + /* F. Hain, at */ + /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ + + { + TPos dx, dy, dx_, dy_; + TPos dx1, dy1, dx2, dy2; + TPos L, s, s_limit; + + + /* dx and dy are x and y components of the P0-P3 chord vector. */ + dx = dx_ = arc[3].x - arc[0].x; + dy = dy_ = arc[3].y - arc[0].y; + + L = SW_FT_HYPOT( dx_, dy_ ); + + /* Avoid possible arithmetic overflow below by splitting. */ + if ( L > 32767 ) + goto Split; + + /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ + s_limit = L * (TPos)( ONE_PIXEL / 6 ); + + /* s is L * the perpendicular distance from P1 to the line P0-P3. */ + dx1 = arc[1].x - arc[0].x; + dy1 = arc[1].y - arc[0].y; + s = SW_FT_ABS( dy * dx1 - dx * dy1 ); + + if ( s > s_limit ) + goto Split; + + /* s is L * the perpendicular distance from P2 to the line P0-P3. */ + dx2 = arc[2].x - arc[0].x; + dy2 = arc[2].y - arc[0].y; + s = SW_FT_ABS( dy * dx2 - dx * dy2 ); + + if ( s > s_limit ) + goto Split; + + /* Split super curvy segments where the off points are so far + from the chord that the angles P0-P1-P3 or P0-P2-P3 become + acute as detected by appropriate dot products. */ + if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 || + dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 ) + goto Split; + + /* No reason to split. */ + goto Draw; + } + + Split: + gray_split_cubic( arc ); + arc += 3; + continue; + + Draw: + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + + if ( arc == ras.bez_stack ) + return; + + arc -= 3; + } + } + + + static int + gray_move_to( const SW_FT_Vector* to, + gray_PWorker worker ) + { + TPos x, y; + + + /* record current cell, if any */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + + worker->x = x; + worker->y = y; + return 0; + } + + + static int + gray_line_to( const SW_FT_Vector* to, + gray_PWorker worker ) + { + gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); + return 0; + } + + + static int + gray_conic_to( const SW_FT_Vector* control, + const SW_FT_Vector* to, + gray_PWorker worker ) + { + gray_render_conic( RAS_VAR_ control, to ); + return 0; + } + + + static int + gray_cubic_to( const SW_FT_Vector* control1, + const SW_FT_Vector* control2, + const SW_FT_Vector* to, + gray_PWorker worker ) + { + gray_render_cubic( RAS_VAR_ control1, control2, to ); + return 0; + } + + + static void + gray_hline( RAS_ARG_ TCoord x, + TCoord y, + TPos area, + TCoord acount ) + { + int coverage; + + + /* compute the coverage line's coverage, depending on the */ + /* outline fill rule */ + /* */ + /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ + /* */ + coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); + /* use range 0..256 */ + if ( coverage < 0 ) + coverage = -coverage; + + if ( ras.outline.flags & SW_FT_OUTLINE_EVEN_ODD_FILL ) + { + coverage &= 511; + + if ( coverage > 256 ) + coverage = 512 - coverage; + else if ( coverage == 256 ) + coverage = 255; + } + else + { + /* normal non-zero winding rule */ + if ( coverage >= 256 ) + coverage = 255; + } + + y += (TCoord)ras.min_ey; + x += (TCoord)ras.min_ex; + + /* SW_FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ + if ( x >= 32767 ) + x = 32767; + + /* SW_FT_Span.y is an integer, so limit our coordinates appropriately */ + if ( y >= SW_FT_INT_MAX ) + y = SW_FT_INT_MAX; + + if ( coverage ) + { + SW_FT_Span* span; + int count; + + + /* see whether we can add this span to the current list */ + count = ras.num_gray_spans; + span = ras.gray_spans + count - 1; + if ( count > 0 && + span->y == y && + (int)span->x + span->len == (int)x && + span->coverage == coverage ) + { + span->len = (unsigned short)( span->len + acount ); + return; + } + + if ( count >= SW_FT_MAX_GRAY_SPANS ) + { + if ( ras.render_span && count > 0 ) + ras.render_span(count, ras.gray_spans, + ras.render_span_data ); + + #ifdef DEBUG_GRAYS + + if ( 1 ) + { + int n; + + + fprintf( stderr, "count = %3d ", count ); + span = ras.gray_spans; + for ( n = 0; n < count; n++, span++ ) + fprintf( stderr, "[%d , %d..%d] : %d ", + span->y, span->x, span->x + span->len - 1, span->coverage ); + fprintf( stderr, "\n" ); + } + + #endif /* DEBUG_GRAYS */ + + ras.num_gray_spans = 0; + + span = ras.gray_spans; + } + else + span++; + + /* add a gray span to the current list */ + span->x = (short)x; + span->y = (short)y; + span->len = (unsigned short)acount; + span->coverage = (unsigned char)coverage; + + ras.num_gray_spans++; + } + } + + static void + gray_sweep( RAS_ARG) + { + int yindex; + + if ( ras.num_cells == 0 ) + return; + + ras.num_gray_spans = 0; + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + + + for ( ; cell != NULL; cell = cell->next ) + { + TPos area; + + + if ( cell->x > x && cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + cell->x - x ); + + cover += cell->cover; + area = cover * ( ONE_PIXEL * 2 ) - cell->area; + + if ( area != 0 && cell->x >= 0 ) + gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); + + x = cell->x + 1; + } + + if ( cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + ras.count_ex - x ); + } + + if ( ras.render_span && ras.num_gray_spans > 0 ) + ras.render_span(ras.num_gray_spans, + ras.gray_spans, ras.render_span_data ); + } + + + /*************************************************************************/ + /* */ + /* The following function should only compile in stand-alone mode, */ + /* i.e., when building this component without the rest of FreeType. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Outline_Decompose */ + /* */ + /* */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + static int + SW_FT_Outline_Decompose( const SW_FT_Outline* outline, + const SW_FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + SW_FT_Vector v_last; + SW_FT_Vector v_control; + SW_FT_Vector v_start; + + SW_FT_Vector* point; + SW_FT_Vector* limit; + char* tags; + + int error; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + char tag; /* current point's state */ + + int shift; + TPos delta; + + + if ( !outline || !func_interface ) + return SW_FT_THROW( Invalid_Argument ); + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + int last; /* index of last point in contour */ + + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = SW_FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == SW_FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == SW_FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( SW_FT_CURVE_TAG( outline->tags[last] ) == SW_FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + } + point--; + tags--; + } + + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = SW_FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case SW_FT_CURVE_TAG_ON: /* emit a single line_to */ + { + SW_FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case SW_FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + SW_FT_Vector vec; + SW_FT_Vector v_middle; + + + point++; + tags++; + tag = SW_FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == SW_FT_CURVE_TAG_ON ) + { + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != SW_FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* SW_FT_CURVE_TAG_CUBIC */ + { + SW_FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + SW_FT_CURVE_TAG( tags[1] ) != SW_FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + SW_FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + return 0; + + Exit: + return error; + + Invalid_Outline: + return SW_FT_THROW( Invalid_Outline ); + } + + + typedef struct gray_TBand_ + { + TPos min, max; + + } gray_TBand; + + + + SW_FT_DEFINE_OUTLINE_FUNCS(func_interface, + (SW_FT_Outline_MoveTo_Func) gray_move_to, + (SW_FT_Outline_LineTo_Func) gray_line_to, + (SW_FT_Outline_ConicTo_Func)gray_conic_to, + (SW_FT_Outline_CubicTo_Func)gray_cubic_to, + 0, + 0 + ) + + static int + gray_convert_glyph_inner( RAS_ARG ) + { + + volatile int error = 0; + + if ( ft_setjmp( ras.jump_buffer ) == 0 ) + { + error = SW_FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + } + else + error = SW_FT_THROW( Memory_Overflow ); + + return error; + } + + + static int + gray_convert_glyph( RAS_ARG ) + { + gray_TBand bands[40]; + gray_TBand* volatile band; + int volatile n, num_bands; + TPos volatile min, max, max_y; + SW_FT_BBox* clip; + + + /* Set up state in the raster object */ + gray_compute_cbox( RAS_VAR ); + + /* clip to target bitmap, exit if nothing to do */ + clip = &ras.clip_box; + + if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || + ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) + return 0; + + if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; + if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; + + if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; + if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; + + ras.count_ex = ras.max_ex - ras.min_ex; + ras.count_ey = ras.max_ey - ras.min_ey; + + /* set up vertical bands */ + num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); + if ( num_bands == 0 ) + num_bands = 1; + if ( num_bands >= 39 ) + num_bands = 39; + + ras.band_shoot = 0; + + min = ras.min_ey; + max_y = ras.max_ey; + + for ( n = 0; n < num_bands; n++, min = max ) + { + max = min + ras.band_size; + if ( n == num_bands - 1 || max > max_y ) + max = max_y; + + bands[0].min = min; + bands[0].max = max; + band = bands; + + while ( band >= bands ) + { + TPos bottom, top, middle; + int error; + + { + PCell cells_max; + int yindex; + long cell_start, cell_end, cell_mod; + + + ras.ycells = (PCell*)ras.buffer; + ras.ycount = band->max - band->min; + + cell_start = sizeof ( PCell ) * ras.ycount; + cell_mod = cell_start % sizeof ( TCell ); + if ( cell_mod > 0 ) + cell_start += sizeof ( TCell ) - cell_mod; + + cell_end = ras.buffer_size; + cell_end -= cell_end % sizeof ( TCell ); + + cells_max = (PCell)( (char*)ras.buffer + cell_end ); + ras.cells = (PCell)( (char*)ras.buffer + cell_start ); + if ( ras.cells >= cells_max ) + goto ReduceBands; + + ras.max_cells = cells_max - ras.cells; + if ( ras.max_cells < 2 ) + goto ReduceBands; + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + ras.ycells[yindex] = NULL; + } + + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + ras.count_ey = band->max - band->min; + + error = gray_convert_glyph_inner( RAS_VAR ); + + if ( !error ) + { + gray_sweep( RAS_VAR); + band--; + continue; + } + else if ( error != ErrRaster_Memory_Overflow ) + return 1; + + ReduceBands: + /* render pool overflow; we will reduce the render band by half */ + bottom = band->min; + top = band->max; + middle = bottom + ( ( top - bottom ) >> 1 ); + + /* This is too complex for a single scanline; there must */ + /* be some problems. */ + if ( middle == bottom ) + { + return 1; + } + + if ( bottom-top >= ras.band_size ) + ras.band_shoot++; + + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + band++; + } + } + + if ( ras.band_shoot > 8 && ras.band_size > 16 ) + ras.band_size = ras.band_size / 2; + + return 0; + } + + static int + gray_raster_render( gray_PRaster raster, + const SW_FT_Raster_Params* params ) + { + const SW_FT_Outline* outline = (const SW_FT_Outline*)params->source; + + gray_TWorker worker[1]; + + TCell buffer[SW_FT_RENDER_POOL_SIZE / sizeof ( TCell )]; + long buffer_size = sizeof ( buffer ); + int band_size = (int)( buffer_size / + (long)( sizeof ( TCell ) * 8 ) ); + + if ( !raster) + return SW_FT_THROW( Invalid_Argument ); + + if ( !outline ) + return SW_FT_THROW( Invalid_Outline ); + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return 0; + + if ( !outline->contours || !outline->points ) + return SW_FT_THROW( Invalid_Outline ); + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return SW_FT_THROW( Invalid_Outline ); + + /* this version does not support monochrome rendering */ + if ( !( params->flags & SW_FT_RASTER_FLAG_AA ) ) + return SW_FT_THROW( Invalid_Mode ); + + if ( params->flags & SW_FT_RASTER_FLAG_CLIP ) + ras.clip_box = params->clip_box; + else + { + ras.clip_box.xMin = -32768L; + ras.clip_box.yMin = -32768L; + ras.clip_box.xMax = 32767L; + ras.clip_box.yMax = 32767L; + } + + gray_init_cells( RAS_VAR_ buffer, buffer_size ); + + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + ras.band_size = band_size; + ras.num_gray_spans = 0; + + ras.render_span = (SW_FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + + return gray_convert_glyph( RAS_VAR ); + } + + /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ + /**** a static object. *****/ + + static int + gray_raster_new(SW_FT_Raster* araster ) + { + static gray_TRaster the_raster; + + *araster = (SW_FT_Raster)&the_raster; + SW_FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + + return 0; + } + + + static void + gray_raster_done( SW_FT_Raster raster ) + { + /* nothing */ + SW_FT_UNUSED( raster ); + } + + static void + gray_raster_reset( SW_FT_Raster raster, + char* pool_base, + long pool_size ) + { + SW_FT_UNUSED( raster ); + SW_FT_UNUSED( pool_base ); + SW_FT_UNUSED( pool_size ); + } + + + SW_FT_DEFINE_RASTER_FUNCS(sw_ft_grays_raster, + + (SW_FT_Raster_New_Func) gray_raster_new, + (SW_FT_Raster_Reset_Func) gray_raster_reset, + (SW_FT_Raster_Render_Func) gray_raster_render, + (SW_FT_Raster_Done_Func) gray_raster_done + ) + + +/* END */ diff --git a/src/vector/freetype/v_ft_raster.h b/src/vector/freetype/v_ft_raster.h new file mode 100644 index 0000000000..e67f480495 --- /dev/null +++ b/src/vector/freetype/v_ft_raster.h @@ -0,0 +1,607 @@ +#ifndef V_FT_IMG_H +#define V_FT_IMG_H +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* Copyright 1996-2010, 2013 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* SW_FT_Outlines into SW_FT_Bitmaps. */ + /* */ + /*************************************************************************/ + +#include "v_ft_types.h" + + /*************************************************************************/ + /* */ + /* */ + /* FT_BBox */ + /* */ + /* */ + /* A structure used to hold an outline's bounding box, i.e., the */ + /* coordinates of its extrema in the horizontal and vertical */ + /* directions. */ + /* */ + /* */ + /* xMin :: The horizontal minimum (left-most). */ + /* */ + /* yMin :: The vertical minimum (bottom-most). */ + /* */ + /* xMax :: The horizontal maximum (right-most). */ + /* */ + /* yMax :: The vertical maximum (top-most). */ + /* */ + /* */ + /* The bounding box is specified with the coordinates of the lower */ + /* left and the upper right corner. In PostScript, those values are */ + /* often called (llx,lly) and (urx,ury), respectively. */ + /* */ + /* If `yMin' is negative, this value gives the glyph's descender. */ + /* Otherwise, the glyph doesn't descend below the baseline. */ + /* Similarly, if `ymax' is positive, this value gives the glyph's */ + /* ascender. */ + /* */ + /* `xMin' gives the horizontal distance from the glyph's origin to */ + /* the left edge of the glyph's bounding box. If `xMin' is negative, */ + /* the glyph extends to the left of the origin. */ + /* */ + typedef struct SW_FT_BBox_ + { + SW_FT_Pos xMin, yMin; + SW_FT_Pos xMax, yMax; + + } SW_FT_BBox; + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Outline */ +/* */ +/* */ +/* This structure is used to describe an outline to the scan-line */ +/* converter. */ +/* */ +/* */ +/* n_contours :: The number of contours in the outline. */ +/* */ +/* n_points :: The number of points in the outline. */ +/* */ +/* points :: A pointer to an array of `n_points' @SW_FT_Vector */ +/* elements, giving the outline's point coordinates. */ +/* */ +/* tags :: A pointer to an array of `n_points' chars, giving */ +/* each outline point's type. */ +/* */ +/* If bit~0 is unset, the point is `off' the curve, */ +/* i.e., a Bézier control point, while it is `on' if */ +/* set. */ +/* */ +/* Bit~1 is meaningful for `off' points only. If set, */ +/* it indicates a third-order Bézier arc control point; */ +/* and a second-order control point if unset. */ +/* */ +/* If bit~2 is set, bits 5-7 contain the drop-out mode */ +/* (as defined in the OpenType specification; the value */ +/* is the same as the argument to the SCANMODE */ +/* instruction). */ +/* */ +/* Bits 3 and~4 are reserved for internal purposes. */ +/* */ +/* contours :: An array of `n_contours' shorts, giving the end */ +/* point of each contour within the outline. For */ +/* example, the first contour is defined by the points */ +/* `0' to `contours[0]', the second one is defined by */ +/* the points `contours[0]+1' to `contours[1]', etc. */ +/* */ +/* flags :: A set of bit flags used to characterize the outline */ +/* and give hints to the scan-converter and hinter on */ +/* how to convert/grid-fit it. See @SW_FT_OUTLINE_FLAGS.*/ +/* */ +typedef struct SW_FT_Outline_ +{ + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + SW_FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + +} SW_FT_Outline; + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_OUTLINE_FLAGS */ + /* */ + /* */ + /* A list of bit-field constants use for the flags in an outline's */ + /* `flags' field. */ + /* */ + /* */ + /* SW_FT_OUTLINE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* SW_FT_OUTLINE_OWNER :: */ + /* If set, this flag indicates that the outline's field arrays */ + /* (i.e., `points', `flags', and `contours') are `owned' by the */ + /* outline object, and should thus be freed when it is destroyed. */ + /* */ + /* SW_FT_OUTLINE_EVEN_ODD_FILL :: */ + /* By default, outlines are filled using the non-zero winding rule. */ + /* If set to 1, the outline will be filled using the even-odd fill */ + /* rule (only works with the smooth rasterizer). */ + /* */ + /* SW_FT_OUTLINE_REVERSE_FILL :: */ + /* By default, outside contours of an outline are oriented in */ + /* clock-wise direction, as defined in the TrueType specification. */ + /* This flag is set if the outline uses the opposite direction */ + /* (typically for Type~1 fonts). This flag is ignored by the scan */ + /* converter. */ + /* */ + /* */ + /* */ + /* There exists a second mechanism to pass the drop-out mode to the */ + /* B/W rasterizer; see the `tags' field in @SW_FT_Outline. */ + /* */ + /* Please refer to the description of the `SCANTYPE' instruction in */ + /* the OpenType specification (in file `ttinst1.doc') how simple */ + /* drop-outs, smart drop-outs, and stubs are defined. */ + /* */ +#define SW_FT_OUTLINE_NONE 0x0 +#define SW_FT_OUTLINE_OWNER 0x1 +#define SW_FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define SW_FT_OUTLINE_REVERSE_FILL 0x4 + + /* */ + +#define SW_FT_CURVE_TAG( flag ) ( flag & 3 ) + +#define SW_FT_CURVE_TAG_ON 1 +#define SW_FT_CURVE_TAG_CONIC 0 +#define SW_FT_CURVE_TAG_CUBIC 2 + + +#define SW_FT_Curve_Tag_On SW_FT_CURVE_TAG_ON +#define SW_FT_Curve_Tag_Conic SW_FT_CURVE_TAG_CONIC +#define SW_FT_Curve_Tag_Cubic SW_FT_CURVE_TAG_CUBIC + + /*************************************************************************/ + /* */ + /* A raster is a scan converter, in charge of rendering an outline into */ + /* a a bitmap. This section contains the public API for rasters. */ + /* */ + /* Note that in FreeType 2, all rasters are now encapsulated within */ + /* specific modules called `renderers'. See `ftrender.h' for more */ + /* details on renderers. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster */ + /* */ + /* */ + /* A handle (pointer) to a raster object. Each object can be used */ + /* independently to convert an outline into a bitmap or pixmap. */ + /* */ + typedef struct SW_FT_RasterRec_* SW_FT_Raster; + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Span */ + /* */ + /* */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* */ + /* x :: The span's horizontal start position. */ + /* */ + /* len :: The span's length in pixels. */ + /* */ + /* coverage :: The span color/coverage, ranging from 0 (background) */ + /* to 255 (foreground). Only used for anti-aliased */ + /* rendering. */ + /* */ + /* */ + /* This structure is used by the span drawing callback type named */ + /* @SW_FT_SpanFunc that takes the y~coordinate of the span as a */ + /* parameter. */ + /* */ + /* The coverage value is always between 0 and 255. If you want less */ + /* gray values, the callback function has to reduce them. */ + /* */ + typedef struct SW_FT_Span_ + { + short x; + short y; + unsigned short len; + unsigned char coverage; + + } SW_FT_Span; + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_SpanFunc */ + /* */ + /* */ + /* A function used as a call-back by the anti-aliased renderer in */ + /* order to let client applications draw themselves the gray pixel */ + /* spans on each scan line. */ + /* */ + /* */ + /* y :: The scanline's y~coordinate. */ + /* */ + /* count :: The number of spans to draw on this scanline. */ + /* */ + /* spans :: A table of `count' spans to draw on the scanline. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* */ + /* This callback allows client applications to directly render the */ + /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ + /* */ + /* This can be used to write anti-aliased outlines directly to a */ + /* given background bitmap, and even perform translucency. */ + /* */ + /* Note that the `count' field cannot be greater than a fixed value */ + /* defined by the `SW_FT_MAX_GRAY_SPANS' configuration macro in */ + /* `ftoption.h'. By default, this value is set to~32, which means */ + /* that if there are more than 32~spans on a given scanline, the */ + /* callback is called several times with the same `y' parameter in */ + /* order to draw all callbacks. */ + /* */ + /* Otherwise, the callback is only called once per scan-line, and */ + /* only for those scanlines that do have `gray' pixels on them. */ + /* */ + typedef void + (*SW_FT_SpanFunc)( int count, + const SW_FT_Span* spans, + void* user ); + +#define SW_FT_Raster_Span_Func SW_FT_SpanFunc + + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_RASTER_FLAG_XXX */ + /* */ + /* */ + /* A list of bit flag constants as used in the `flags' field of a */ + /* @SW_FT_Raster_Params structure. */ + /* */ + /* */ + /* SW_FT_RASTER_FLAG_DEFAULT :: This value is 0. */ + /* */ + /* SW_FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ + /* anti-aliased glyph image should be */ + /* generated. Otherwise, it will be */ + /* monochrome (1-bit). */ + /* */ + /* SW_FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ + /* rendering. In this mode, client */ + /* applications must provide their own span */ + /* callback. This lets them directly */ + /* draw or compose over an existing bitmap. */ + /* If this bit is not set, the target */ + /* pixmap's buffer _must_ be zeroed before */ + /* rendering. */ + /* */ + /* Note that for now, direct rendering is */ + /* only possible with anti-aliased glyphs. */ + /* */ + /* SW_FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ + /* rendering mode. If set, the output will */ + /* be clipped to a box specified in the */ + /* `clip_box' field of the */ + /* @SW_FT_Raster_Params structure. */ + /* */ + /* Note that by default, the glyph bitmap */ + /* is clipped to the target pixmap, except */ + /* in direct rendering mode where all spans */ + /* are generated if no clipping box is set. */ + /* */ +#define SW_FT_RASTER_FLAG_DEFAULT 0x0 +#define SW_FT_RASTER_FLAG_AA 0x1 +#define SW_FT_RASTER_FLAG_DIRECT 0x2 +#define SW_FT_RASTER_FLAG_CLIP 0x4 + + /* deprecated */ +#define ft_raster_flag_default SW_FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa SW_FT_RASTER_FLAG_AA +#define ft_raster_flag_direct SW_FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip SW_FT_RASTER_FLAG_CLIP + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster_Params */ + /* */ + /* */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* */ + /* target :: The target bitmap. */ + /* */ + /* source :: A pointer to the source glyph image (e.g., an */ + /* @SW_FT_Outline). */ + /* */ + /* flags :: The rendering flags. */ + /* */ + /* gray_spans :: The gray span drawing callback. */ + /* */ + /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */ + /* */ + /* bit_test :: The bit test callback. UNIMPLEMENTED! */ + /* */ + /* bit_set :: The bit set callback. UNIMPLEMENTED! */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* clip_box :: An optional clipping box. It is only used in */ + /* direct rendering mode. Note that coordinates here */ + /* should be expressed in _integer_ pixels (and not in */ + /* 26.6 fixed-point units). */ + /* */ + /* */ + /* An anti-aliased glyph bitmap is drawn if the @SW_FT_RASTER_FLAG_AA */ + /* bit flag is set in the `flags' field, otherwise a monochrome */ + /* bitmap is generated. */ + /* */ + /* If the @SW_FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ + /* raster will call the `gray_spans' callback to draw gray pixel */ + /* spans, in the case of an aa glyph bitmap, it will call */ + /* `black_spans', and `bit_test' and `bit_set' in the case of a */ + /* monochrome bitmap. This allows direct composition over a */ + /* pre-existing bitmap through user-provided callbacks to perform the */ + /* span drawing/composition. */ + /* */ + /* Note that the `bit_test' and `bit_set' callbacks are required when */ + /* rendering a monochrome bitmap, as they are crucial to implement */ + /* correct drop-out control as defined in the TrueType specification. */ + /* */ + typedef struct SW_FT_Raster_Params_ + { + const void* source; + int flags; + SW_FT_SpanFunc gray_spans; + void* user; + SW_FT_BBox clip_box; + + } SW_FT_Raster_Params; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Outline_Check */ +/* */ +/* */ +/* Check the contents of an outline descriptor. */ +/* */ +/* */ +/* outline :: A handle to a source outline. */ +/* */ +/* */ +/* FreeType error code. 0~means success. */ +/* */ +SW_FT_Error +SW_FT_Outline_Check( SW_FT_Outline* outline ); + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Outline_Get_CBox */ +/* */ +/* */ +/* Return an outline's `control box'. The control box encloses all */ +/* the outline's points, including Bézier control points. Though it */ +/* coincides with the exact bounding box for most glyphs, it can be */ +/* slightly larger in some situations (like when rotating an outline */ +/* that contains Bézier outside arcs). */ +/* */ +/* Computing the control box is very fast, while getting the bounding */ +/* box can take much more time as it needs to walk over all segments */ +/* and arcs in the outline. To get the latter, you can use the */ +/* `ftbbox' component, which is dedicated to this single task. */ +/* */ +/* */ +/* outline :: A pointer to the source outline descriptor. */ +/* */ +/* */ +/* acbox :: The outline's control box. */ +/* */ +/* */ +/* See @SW_FT_Glyph_Get_CBox for a discussion of tricky fonts. */ +/* */ +void +SW_FT_Outline_Get_CBox( const SW_FT_Outline* outline, + SW_FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster_NewFunc */ + /* */ + /* */ + /* A function used to create a new raster object. */ + /* */ + /* */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* */ + /* raster :: A handle to the new raster object. */ + /* */ + /* */ + /* Error code. 0~means success. */ + /* */ + /* */ + /* The `memory' parameter is a typeless pointer in order to avoid */ + /* un-wanted dependencies on the rest of the FreeType code. In */ + /* practice, it is an @SW_FT_Memory object, i.e., a handle to the */ + /* standard FreeType memory allocator. However, this field can be */ + /* completely ignored by a given raster implementation. */ + /* */ + typedef int + (*SW_FT_Raster_NewFunc)( SW_FT_Raster* raster ); + +#define SW_FT_Raster_New_Func SW_FT_Raster_NewFunc + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster_DoneFunc */ + /* */ + /* */ + /* A function used to destroy a given raster object. */ + /* */ + /* */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void + (*SW_FT_Raster_DoneFunc)( SW_FT_Raster raster ); + +#define SW_FT_Raster_Done_Func SW_FT_Raster_DoneFunc + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster_ResetFunc */ + /* */ + /* */ + /* FreeType provides an area of memory called the `render pool', */ + /* available to all registered rasters. This pool can be freely used */ + /* during a given scan-conversion but is shared by all rasters. Its */ + /* content is thus transient. */ + /* */ + /* This function is called each time the render pool changes, or just */ + /* after a new raster object is created. */ + /* */ + /* */ + /* raster :: A handle to the new raster object. */ + /* */ + /* pool_base :: The address in memory of the render pool. */ + /* */ + /* pool_size :: The size in bytes of the render pool. */ + /* */ + /* */ + /* Rasters can ignore the render pool and rely on dynamic memory */ + /* allocation if they want to (a handle to the memory allocator is */ + /* passed to the raster constructor). However, this is not */ + /* recommended for efficiency purposes. */ + /* */ + typedef void + (*SW_FT_Raster_ResetFunc)( SW_FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define SW_FT_Raster_Reset_Func SW_FT_Raster_ResetFunc + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster_RenderFunc */ + /* */ + /* */ + /* Invoke a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to an @SW_FT_Raster_Params structure used to */ + /* store the rendering parameters. */ + /* */ + /* */ + /* Error code. 0~means success. */ + /* */ + /* */ + /* The exact format of the source image depends on the raster's glyph */ + /* format defined in its @SW_FT_Raster_Funcs structure. It can be an */ + /* @SW_FT_Outline or anything else in order to support a large array of */ + /* glyph formats. */ + /* */ + /* Note also that the render function can fail and return a */ + /* `SW_FT_Err_Unimplemented_Feature' error code if the raster used does */ + /* not support direct composition. */ + /* */ + /* XXX: For now, the standard raster doesn't support direct */ + /* composition but this should change for the final release (see */ + /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ + /* for examples of distinct implementations that support direct */ + /* composition). */ + /* */ + typedef int + (*SW_FT_Raster_RenderFunc)( SW_FT_Raster raster, + const SW_FT_Raster_Params* params ); + +#define SW_FT_Raster_Render_Func SW_FT_Raster_RenderFunc + + + /*************************************************************************/ + /* */ + /* */ + /* SW_FT_Raster_Funcs */ + /* */ + /* */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* */ + /* glyph_format :: The supported glyph format for this raster. */ + /* */ + /* raster_new :: The raster constructor. */ + /* */ + /* raster_reset :: Used to reset the render pool within the raster. */ + /* */ + /* raster_render :: A function to render a glyph into a given bitmap. */ + /* */ + /* raster_done :: The raster destructor. */ + /* */ + typedef struct SW_FT_Raster_Funcs_ + { + SW_FT_Raster_NewFunc raster_new; + SW_FT_Raster_ResetFunc raster_reset; + SW_FT_Raster_RenderFunc raster_render; + SW_FT_Raster_DoneFunc raster_done; + + } SW_FT_Raster_Funcs; + + +extern const SW_FT_Raster_Funcs sw_ft_grays_raster; + +#endif // V_FT_IMG_H diff --git a/src/vector/freetype/v_ft_stroker.cpp b/src/vector/freetype/v_ft_stroker.cpp new file mode 100644 index 0000000000..3315262c94 --- /dev/null +++ b/src/vector/freetype/v_ft_stroker.cpp @@ -0,0 +1,2292 @@ + +/***************************************************************************/ +/* */ +/* ftstroke.c */ +/* */ +/* FreeType path stroker (body). */ +/* */ +/* Copyright 2002-2006, 2008-2011, 2013 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "v_ft_math.h" +#include "v_ft_stroker.h" +#include +#include +#include + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BEZIER COMPUTATIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define SW_FT_SMALL_CONIC_THRESHOLD ( SW_FT_ANGLE_PI / 6 ) +#define SW_FT_SMALL_CUBIC_THRESHOLD ( SW_FT_ANGLE_PI / 8 ) + +#define SW_FT_EPSILON 2 + +#define SW_FT_IS_SMALL( x ) ( (x) > -SW_FT_EPSILON && (x) < SW_FT_EPSILON ) + + + static SW_FT_Pos + ft_pos_abs( SW_FT_Pos x ) + { + return x >= 0 ? x : -x; + } + + + static void + ft_conic_split( SW_FT_Vector* base ) + { + SW_FT_Pos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static SW_FT_Bool + ft_conic_is_small_enough( SW_FT_Vector* base, + SW_FT_Angle *angle_in, + SW_FT_Angle *angle_out ) + { + SW_FT_Vector d1, d2; + SW_FT_Angle theta; + SW_FT_Int close1, close2; + + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + + close1 = SW_FT_IS_SMALL( d1.x ) && SW_FT_IS_SMALL( d1.y ); + close2 = SW_FT_IS_SMALL( d2.x ) && SW_FT_IS_SMALL( d2.y ); + + if ( close1 ) + { + if ( close2 ) + { + /* basically a point; */ + /* do nothing to retain original direction */ + } + else + { + *angle_in = + *angle_out = SW_FT_Atan2( d2.x, d2.y ); + } + } + else /* !close1 */ + { + if ( close2 ) + { + *angle_in = + *angle_out = SW_FT_Atan2( d1.x, d1.y ); + } + else + { + *angle_in = SW_FT_Atan2( d1.x, d1.y ); + *angle_out = SW_FT_Atan2( d2.x, d2.y ); + } + } + + theta = ft_pos_abs( SW_FT_Angle_Diff( *angle_in, *angle_out ) ); + + return SW_FT_BOOL( theta < SW_FT_SMALL_CONIC_THRESHOLD ); + } + + + static void + ft_cubic_split( SW_FT_Vector* base ) + { + SW_FT_Pos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + /* Return the average of `angle1' and `angle2'. */ + /* This gives correct result even if `angle1' and `angle2' */ + /* have opposite signs. */ + static SW_FT_Angle + ft_angle_mean( SW_FT_Angle angle1, + SW_FT_Angle angle2 ) + { + return angle1 + SW_FT_Angle_Diff( angle1, angle2 ) / 2; + } + + + static SW_FT_Bool + ft_cubic_is_small_enough( SW_FT_Vector* base, + SW_FT_Angle *angle_in, + SW_FT_Angle *angle_mid, + SW_FT_Angle *angle_out ) + { + SW_FT_Vector d1, d2, d3; + SW_FT_Angle theta1, theta2; + SW_FT_Int close1, close2, close3; + + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + + close1 = SW_FT_IS_SMALL( d1.x ) && SW_FT_IS_SMALL( d1.y ); + close2 = SW_FT_IS_SMALL( d2.x ) && SW_FT_IS_SMALL( d2.y ); + close3 = SW_FT_IS_SMALL( d3.x ) && SW_FT_IS_SMALL( d3.y ); + + if ( close1 ) + { + if ( close2 ) + { + if ( close3 ) + { + /* basically a point; */ + /* do nothing to retain original direction */ + } + else /* !close3 */ + { + *angle_in = + *angle_mid = + *angle_out = SW_FT_Atan2( d3.x, d3.y ); + } + } + else /* !close2 */ + { + if ( close3 ) + { + *angle_in = + *angle_mid = + *angle_out = SW_FT_Atan2( d2.x, d2.y ); + } + else /* !close3 */ + { + *angle_in = + *angle_mid = SW_FT_Atan2( d2.x, d2.y ); + *angle_out = SW_FT_Atan2( d3.x, d3.y ); + } + } + } + else /* !close1 */ + { + if ( close2 ) + { + if ( close3 ) + { + *angle_in = + *angle_mid = + *angle_out = SW_FT_Atan2( d1.x, d1.y ); + } + else /* !close3 */ + { + *angle_in = SW_FT_Atan2( d1.x, d1.y ); + *angle_out = SW_FT_Atan2( d3.x, d3.y ); + *angle_mid = ft_angle_mean( *angle_in, *angle_out ); + } + } + else /* !close2 */ + { + if ( close3 ) + { + *angle_in = SW_FT_Atan2( d1.x, d1.y ); + *angle_mid = + *angle_out = SW_FT_Atan2( d2.x, d2.y ); + } + else /* !close3 */ + { + *angle_in = SW_FT_Atan2( d1.x, d1.y ); + *angle_mid = SW_FT_Atan2( d2.x, d2.y ); + *angle_out = SW_FT_Atan2( d3.x, d3.y ); + } + } + } + + theta1 = ft_pos_abs( SW_FT_Angle_Diff( *angle_in, *angle_mid ) ); + theta2 = ft_pos_abs( SW_FT_Angle_Diff( *angle_mid, *angle_out ) ); + + return SW_FT_BOOL( theta1 < SW_FT_SMALL_CUBIC_THRESHOLD && + theta2 < SW_FT_SMALL_CUBIC_THRESHOLD ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STROKE BORDERS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef enum SW_FT_StrokeTags_ + { + SW_FT_STROKE_TAG_ON = 1, /* on-curve point */ + SW_FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + SW_FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + SW_FT_STROKE_TAG_END = 8 /* sub-path end */ + + } SW_FT_StrokeTags; + +#define SW_FT_STROKE_TAG_BEGIN_END ( SW_FT_STROKE_TAG_BEGIN | SW_FT_STROKE_TAG_END ) + + typedef struct SW_FT_StrokeBorderRec_ + { + SW_FT_UInt num_points; + SW_FT_UInt max_points; + SW_FT_Vector* points; + SW_FT_Byte* tags; + SW_FT_Bool movable; /* TRUE for ends of lineto borders */ + SW_FT_Int start; /* index of current sub-path start point */ + SW_FT_Bool valid; + + } SW_FT_StrokeBorderRec, *SW_FT_StrokeBorder; + + + + SW_FT_Error + SW_FT_Outline_Check( SW_FT_Outline* outline ) + { + if ( outline ) + { + SW_FT_Int n_points = outline->n_points; + SW_FT_Int n_contours = outline->n_contours; + SW_FT_Int end0, end; + SW_FT_Int n; + + + /* empty glyph? */ + if ( n_points == 0 && n_contours == 0 ) + return 0; + + /* check point and contour counts */ + if ( n_points <= 0 || n_contours <= 0 ) + goto Bad; + + end0 = end = -1; + for ( n = 0; n < n_contours; n++ ) + { + end = outline->contours[n]; + + /* note that we don't accept empty contours */ + if ( end <= end0 || end >= n_points ) + goto Bad; + + end0 = end; + } + + if ( end != n_points - 1 ) + goto Bad; + + /* XXX: check the tags array */ + return 0; + } + + Bad: + return -1;//SW_FT_THROW( Invalid_Argument ); + } + + + + void + SW_FT_Outline_Get_CBox( const SW_FT_Outline* outline, + SW_FT_BBox *acbox ) + { + SW_FT_Pos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + SW_FT_Vector* vec = outline->points; + SW_FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + SW_FT_Pos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + + + + static SW_FT_Error + ft_stroke_border_grow( SW_FT_StrokeBorder border, + SW_FT_UInt new_points ) + { + SW_FT_UInt old_max = border->max_points; + SW_FT_UInt new_max = border->num_points + new_points; + SW_FT_Error error = 0; + + + if ( new_max > old_max ) + { + SW_FT_UInt cur_max = old_max; + + + while ( cur_max < new_max ) + cur_max += ( cur_max >> 1 ) + 16; + + border->points = (SW_FT_Vector *) realloc(border->points, cur_max * sizeof(SW_FT_Vector)); + border->tags = (SW_FT_Byte *) realloc(border->tags, cur_max * sizeof(SW_FT_Byte)); + + if ( !border->points || !border->tags) + goto Exit; + + border->max_points = cur_max; + } + + Exit: + return error; + } + + + static void + ft_stroke_border_close( SW_FT_StrokeBorder border, + SW_FT_Bool reverse ) + { + SW_FT_UInt start = border->start; + SW_FT_UInt count = border->num_points; + + + assert( border->start >= 0 ); + + /* don't record empty paths! */ + if ( count <= start + 1U ) + border->num_points = start; + else + { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; + + if ( reverse ) + { + /* reverse the points */ + { + SW_FT_Vector* vec1 = border->points + start + 1; + SW_FT_Vector* vec2 = border->points + count - 1; + + + for ( ; vec1 < vec2; vec1++, vec2-- ) + { + SW_FT_Vector tmp; + + + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + + /* then the tags */ + { + SW_FT_Byte* tag1 = border->tags + start + 1; + SW_FT_Byte* tag2 = border->tags + count - 1; + + + for ( ; tag1 < tag2; tag1++, tag2-- ) + { + SW_FT_Byte tmp; + + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + + border->tags[start ] |= SW_FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= SW_FT_STROKE_TAG_END; + } + + border->start = -1; + border->movable = FALSE; + } + + + static SW_FT_Error + ft_stroke_border_lineto( SW_FT_StrokeBorder border, + SW_FT_Vector* to, + SW_FT_Bool movable ) + { + SW_FT_Error error = 0; + + + assert( border->start >= 0 ); + + if ( border->movable ) + { + /* move last point */ + border->points[border->num_points - 1] = *to; + } + else + { + /* don't add zero-length lineto */ + if ( border->num_points > 0 && + SW_FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) && + SW_FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) ) + return error; + + /* add one point */ + error = ft_stroke_border_grow( border, 1 ); + if ( !error ) + { + SW_FT_Vector* vec = border->points + border->num_points; + SW_FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *to; + tag[0] = SW_FT_STROKE_TAG_ON; + + border->num_points += 1; + } + } + border->movable = movable; + return error; + } + + + static SW_FT_Error + ft_stroke_border_conicto( SW_FT_StrokeBorder border, + SW_FT_Vector* control, + SW_FT_Vector* to ) + { + SW_FT_Error error; + + + assert( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 2 ); + if ( !error ) + { + SW_FT_Vector* vec = border->points + border->num_points; + SW_FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control; + vec[1] = *to; + + tag[0] = 0; + tag[1] = SW_FT_STROKE_TAG_ON; + + border->num_points += 2; + } + + border->movable = FALSE; + + return error; + } + + + static SW_FT_Error + ft_stroke_border_cubicto( SW_FT_StrokeBorder border, + SW_FT_Vector* control1, + SW_FT_Vector* control2, + SW_FT_Vector* to ) + { + SW_FT_Error error; + + + assert( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 3 ); + if ( !error ) + { + SW_FT_Vector* vec = border->points + border->num_points; + SW_FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + + tag[0] = SW_FT_STROKE_TAG_CUBIC; + tag[1] = SW_FT_STROKE_TAG_CUBIC; + tag[2] = SW_FT_STROKE_TAG_ON; + + border->num_points += 3; + } + + border->movable = FALSE; + + return error; + } + + +#define SW_FT_ARC_CUBIC_ANGLE ( SW_FT_ANGLE_PI / 2 ) + + + static SW_FT_Error + ft_stroke_border_arcto( SW_FT_StrokeBorder border, + SW_FT_Vector* center, + SW_FT_Fixed radius, + SW_FT_Angle angle_start, + SW_FT_Angle angle_diff ) + { + SW_FT_Angle total, angle, step, rotate, next, theta; + SW_FT_Vector a, b, a2, b2; + SW_FT_Fixed length; + SW_FT_Error error = 0; + + + /* compute start point */ + SW_FT_Vector_From_Polar( &a, radius, angle_start ); + a.x += center->x; + a.y += center->y; + + total = angle_diff; + angle = angle_start; + rotate = ( angle_diff >= 0 ) ? SW_FT_ANGLE_PI2 : -SW_FT_ANGLE_PI2; + + while ( total != 0 ) + { + step = total; + if ( step > SW_FT_ARC_CUBIC_ANGLE ) + step = SW_FT_ARC_CUBIC_ANGLE; + + else if ( step < -SW_FT_ARC_CUBIC_ANGLE ) + step = -SW_FT_ARC_CUBIC_ANGLE; + + next = angle + step; + theta = step; + if ( theta < 0 ) + theta = -theta; + + theta >>= 1; + + /* compute end point */ + SW_FT_Vector_From_Polar( &b, radius, next ); + b.x += center->x; + b.y += center->y; + + /* compute first and second control points */ + length = SW_FT_MulDiv( radius, SW_FT_Sin( theta ) * 4, + ( 0x10000L + SW_FT_Cos( theta ) ) * 3 ); + + SW_FT_Vector_From_Polar( &a2, length, angle + rotate ); + a2.x += a.x; + a2.y += a.y; + + SW_FT_Vector_From_Polar( &b2, length, next - rotate ); + b2.x += b.x; + b2.y += b.y; + + /* add cubic arc */ + error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); + if ( error ) + break; + + /* process the rest of the arc ?? */ + a = b; + total -= step; + angle = next; + } + + return error; + } + + + static SW_FT_Error + ft_stroke_border_moveto( SW_FT_StrokeBorder border, + SW_FT_Vector* to ) + { + /* close current open path if any ? */ + if ( border->start >= 0 ) + ft_stroke_border_close( border, FALSE ); + + border->start = border->num_points; + border->movable = FALSE; + + return ft_stroke_border_lineto( border, to, FALSE ); + } + + + static void + ft_stroke_border_init( SW_FT_StrokeBorder border) + { + border->points = NULL; + border->tags = NULL; + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_reset( SW_FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_done( SW_FT_StrokeBorder border ) + { + + free( border->points ); + free( border->tags ); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static SW_FT_Error + ft_stroke_border_get_counts( SW_FT_StrokeBorder border, + SW_FT_UInt *anum_points, + SW_FT_UInt *anum_contours ) + { + SW_FT_Error error = 0; + SW_FT_UInt num_points = 0; + SW_FT_UInt num_contours = 0; + + SW_FT_UInt count = border->num_points; + SW_FT_Vector* point = border->points; + SW_FT_Byte* tags = border->tags; + SW_FT_Int in_contour = 0; + + + for ( ; count > 0; count--, num_points++, point++, tags++ ) + { + if ( tags[0] & SW_FT_STROKE_TAG_BEGIN ) + { + if ( in_contour != 0 ) + goto Fail; + + in_contour = 1; + } + else if ( in_contour == 0 ) + goto Fail; + + if ( tags[0] & SW_FT_STROKE_TAG_END ) + { + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = TRUE; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + + Fail: + num_points = 0; + num_contours = 0; + goto Exit; + } + + + static void + ft_stroke_border_export( SW_FT_StrokeBorder border, + SW_FT_Outline* outline ) + { + /* copy point locations */ + memcpy( outline->points + outline->n_points, + border->points, + border->num_points * sizeof(SW_FT_Vector)); + + /* copy tags */ + { + SW_FT_UInt count = border->num_points; + SW_FT_Byte* read = border->tags; + SW_FT_Byte* write = (SW_FT_Byte*)outline->tags + outline->n_points; + + + for ( ; count > 0; count--, read++, write++ ) + { + if ( *read & SW_FT_STROKE_TAG_ON ) + *write = SW_FT_CURVE_TAG_ON; + else if ( *read & SW_FT_STROKE_TAG_CUBIC ) + *write = SW_FT_CURVE_TAG_CUBIC; + else + *write = SW_FT_CURVE_TAG_CONIC; + } + } + + /* copy contours */ + { + SW_FT_UInt count = border->num_points; + SW_FT_Byte* tags = border->tags; + SW_FT_Short* write = outline->contours + outline->n_contours; + SW_FT_Short idx = (SW_FT_Short)outline->n_points; + + + for ( ; count > 0; count--, tags++, idx++ ) + { + if ( *tags & SW_FT_STROKE_TAG_END ) + { + *write++ = idx; + outline->n_contours++; + } + } + } + + outline->n_points = (short)( outline->n_points + border->num_points ); + + assert( SW_FT_Outline_Check( outline ) == 0 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STROKER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define SW_FT_SIDE_TO_ROTATE( s ) ( SW_FT_ANGLE_PI2 - (s) * SW_FT_ANGLE_PI ) + + typedef struct SW_FT_StrokerRec_ + { + SW_FT_Angle angle_in; /* direction into curr join */ + SW_FT_Angle angle_out; /* direction out of join */ + SW_FT_Vector center; /* current position */ + SW_FT_Fixed line_length; /* length of last lineto */ + SW_FT_Bool first_point; /* is this the start? */ + SW_FT_Bool subpath_open; /* is the subpath open? */ + SW_FT_Angle subpath_angle; /* subpath start direction */ + SW_FT_Vector subpath_start; /* subpath start position */ + SW_FT_Fixed subpath_line_length; /* subpath start lineto len */ + SW_FT_Bool handle_wide_strokes; /* use wide strokes logic? */ + + SW_FT_Stroker_LineCap line_cap; + SW_FT_Stroker_LineJoin line_join; + SW_FT_Stroker_LineJoin line_join_saved; + SW_FT_Fixed miter_limit; + SW_FT_Fixed radius; + + SW_FT_StrokeBorderRec borders[2]; + } SW_FT_StrokerRec; + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_New( SW_FT_Stroker *astroker ) + { + SW_FT_Error error = 0; /* assigned in SW_FT_NEW */ + SW_FT_Stroker stroker = NULL; + + + stroker = (SW_FT_StrokerRec *) calloc(1, sizeof(SW_FT_StrokerRec)); + if ( stroker ) + { + + ft_stroke_border_init( &stroker->borders[0]); + ft_stroke_border_init( &stroker->borders[1]); + } + + *astroker = stroker; + + return error; + } + + void + SW_FT_Stroker_Rewind( SW_FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } + } + + + /* documentation is in ftstroke.h */ + + void + SW_FT_Stroker_Set( SW_FT_Stroker stroker, + SW_FT_Fixed radius, + SW_FT_Stroker_LineCap line_cap, + SW_FT_Stroker_LineJoin line_join, + SW_FT_Fixed miter_limit ) + { + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + + /* ensure miter limit has sensible value */ + if ( stroker->miter_limit < 0x10000 ) + stroker->miter_limit = 0x10000; + + /* save line join style: */ + /* line join style can be temporarily changed when stroking curves */ + stroker->line_join_saved = line_join; + + SW_FT_Stroker_Rewind( stroker ); + } + + /* documentation is in ftstroke.h */ + + void + SW_FT_Stroker_Done( SW_FT_Stroker stroker ) + { + if ( stroker ) + { + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + free( stroker ); + } + } + + + /* create a circular arc at a corner or cap */ + static SW_FT_Error + ft_stroker_arcto( SW_FT_Stroker stroker, + SW_FT_Int side ) + { + SW_FT_Angle total, rotate; + SW_FT_Fixed radius = stroker->radius; + SW_FT_Error error = 0; + SW_FT_StrokeBorder border = stroker->borders + side; + + + rotate = SW_FT_SIDE_TO_ROTATE( side ); + + total = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( total == SW_FT_ANGLE_PI ) + total = -rotate * 2; + + error = ft_stroke_border_arcto( border, + &stroker->center, + radius, + stroker->angle_in + rotate, + total ); + border->movable = FALSE; + return error; + } + + + /* add a cap at the end of an opened path */ + static SW_FT_Error + ft_stroker_cap( SW_FT_Stroker stroker, + SW_FT_Angle angle, + SW_FT_Int side ) + { + SW_FT_Error error = 0; + + + if ( stroker->line_cap == SW_FT_STROKER_LINECAP_ROUND ) + { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + SW_FT_ANGLE_PI; + + error = ft_stroker_arcto( stroker, side ); + } + else if ( stroker->line_cap == SW_FT_STROKER_LINECAP_SQUARE ) + { + /* add a square cap */ + SW_FT_Vector delta, delta2; + SW_FT_Angle rotate = SW_FT_SIDE_TO_ROTATE( side ); + SW_FT_Fixed radius = stroker->radius; + SW_FT_StrokeBorder border = stroker->borders + side; + + + SW_FT_Vector_From_Polar( &delta2, radius, angle + rotate ); + SW_FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += stroker->center.x + delta2.x; + delta.y += stroker->center.y + delta2.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + SW_FT_Vector_From_Polar( &delta2, radius, angle - rotate ); + SW_FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += delta2.x + stroker->center.x; + delta.y += delta2.y + stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else if ( stroker->line_cap == SW_FT_STROKER_LINECAP_BUTT ) + { + /* add a butt ending */ + SW_FT_Vector delta; + SW_FT_Angle rotate = SW_FT_SIDE_TO_ROTATE( side ); + SW_FT_Fixed radius = stroker->radius; + SW_FT_StrokeBorder border = stroker->borders + side; + + + SW_FT_Vector_From_Polar( &delta, radius, angle + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + SW_FT_Vector_From_Polar( &delta, radius, angle - rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + + Exit: + return error; + } + + + /* process an inside corner, i.e. compute intersection */ + static SW_FT_Error + ft_stroker_inside( SW_FT_Stroker stroker, + SW_FT_Int side, + SW_FT_Fixed line_length ) + { + SW_FT_StrokeBorder border = stroker->borders + side; + SW_FT_Angle phi, theta, rotate; + SW_FT_Fixed length, thcos; + SW_FT_Vector delta; + SW_FT_Error error = 0; + SW_FT_Bool intersect; /* use intersection of lines? */ + + + rotate = SW_FT_SIDE_TO_ROTATE( side ); + + theta = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; + + /* Only intersect borders if between two lineto's and both */ + /* lines are long enough (line_length is zero for curves). */ + if ( !border->movable || line_length == 0 ) + intersect = FALSE; + else + { + /* compute minimum required length of lines */ + SW_FT_Fixed min_length = ft_pos_abs( SW_FT_MulFix( stroker->radius, + SW_FT_Tan( theta ) ) ); + + + intersect = SW_FT_BOOL( stroker->line_length >= min_length && + line_length >= min_length ); + } + + if ( !intersect ) + { + SW_FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + } + else + { + /* compute median angle */ + phi = stroker->angle_in + theta; + + thcos = SW_FT_Cos( theta ); + + length = SW_FT_DivFix( stroker->radius, thcos ); + + SW_FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + + return error; + } + + + /* process an outside corner, i.e. compute bevel/miter/round */ + static SW_FT_Error + ft_stroker_outside( SW_FT_Stroker stroker, + SW_FT_Int side, + SW_FT_Fixed line_length ) + { + SW_FT_StrokeBorder border = stroker->borders + side; + SW_FT_Error error; + SW_FT_Angle rotate; + + + if ( stroker->line_join == SW_FT_STROKER_LINEJOIN_ROUND ) + error = ft_stroker_arcto( stroker, side ); + else + { + /* this is a mitered (pointed) or beveled (truncated) corner */ + SW_FT_Fixed sigma = 0, radius = stroker->radius; + SW_FT_Angle theta = 0, phi = 0; + SW_FT_Fixed thcos = 0; + SW_FT_Bool bevel, fixed_bevel; + + + rotate = SW_FT_SIDE_TO_ROTATE( side ); + + bevel = + SW_FT_BOOL( stroker->line_join == SW_FT_STROKER_LINEJOIN_BEVEL ); + + fixed_bevel = + SW_FT_BOOL( stroker->line_join != SW_FT_STROKER_LINEJOIN_MITER_VARIABLE ); + + if ( !bevel ) + { + theta = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + if ( theta == SW_FT_ANGLE_PI ) + { + theta = rotate; + phi = stroker->angle_in; + } + else + { + theta /= 2; + phi = stroker->angle_in + theta + rotate; + } + + thcos = SW_FT_Cos( theta ); + sigma = SW_FT_MulFix( stroker->miter_limit, thcos ); + + /* is miter limit exceeded? */ + if ( sigma < 0x10000L ) + { + /* don't create variable bevels for very small deviations; */ + /* SW_FT_Sin(x) = 0 for x <= 57 */ + if ( fixed_bevel || ft_pos_abs( theta ) > 57 ) + bevel = TRUE; + } + } + + if ( bevel ) /* this is a bevel (broken angle) */ + { + if ( fixed_bevel ) + { + /* the outer corners are simply joined together */ + SW_FT_Vector delta; + + + /* add bevel */ + SW_FT_Vector_From_Polar( &delta, + radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else /* variable bevel */ + { + /* the miter is truncated */ + SW_FT_Vector middle, delta; + SW_FT_Fixed length; + + + /* compute middle point */ + SW_FT_Vector_From_Polar( &middle, + SW_FT_MulFix( radius, stroker->miter_limit ), + phi ); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + + /* compute first angle point */ + length = SW_FT_MulDiv( radius, 0x10000L - sigma, + ft_pos_abs( SW_FT_Sin( theta ) ) ); + + SW_FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + SW_FT_Vector_From_Polar( &delta, length, phi - rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* finally, add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if ( line_length == 0 ) + { + SW_FT_Vector_From_Polar( &delta, + radius, + stroker->angle_out + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + } + } + else /* this is a miter (intersection) */ + { + SW_FT_Fixed length; + SW_FT_Vector delta; + + + length = SW_FT_DivFix( stroker->radius, thcos ); + + SW_FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* now add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if ( line_length == 0 ) + { + SW_FT_Vector_From_Polar( &delta, + stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + } + } + + Exit: + return error; + } + + + static SW_FT_Error + ft_stroker_process_corner( SW_FT_Stroker stroker, + SW_FT_Fixed line_length ) + { + SW_FT_Error error = 0; + SW_FT_Angle turn; + SW_FT_Int inside_side; + + + turn = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn == 0 ) + goto Exit; + + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + /* process the inside side */ + error = ft_stroker_inside( stroker, inside_side, line_length ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side, line_length ); + + Exit: + return error; + } + + + /* add two points to the left and right borders corresponding to the */ + /* start of the subpath */ + static SW_FT_Error + ft_stroker_subpath_start( SW_FT_Stroker stroker, + SW_FT_Angle start_angle, + SW_FT_Fixed line_length ) + { + SW_FT_Vector delta; + SW_FT_Vector point; + SW_FT_Error error; + SW_FT_StrokeBorder border; + + + SW_FT_Vector_From_Polar( &delta, stroker->radius, + start_angle + SW_FT_ANGLE_PI2 ); + + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + + border = stroker->borders; + error = ft_stroke_border_moveto( border, &point ); + if ( error ) + goto Exit; + + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + + border++; + error = ft_stroke_border_moveto( border, &point ); + + /* save angle, position, and line length for last join */ + /* (line_length is zero for curves) */ + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + stroker->subpath_line_length = line_length; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_LineTo( SW_FT_Stroker stroker, + SW_FT_Vector* to ) + { + SW_FT_Error error = 0; + SW_FT_StrokeBorder border; + SW_FT_Vector delta; + SW_FT_Angle angle; + SW_FT_Int side; + SW_FT_Fixed line_length; + + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + + /* a zero-length lineto is a no-op; avoid creating a spurious corner */ + if ( delta.x == 0 && delta.y == 0 ) + goto Exit; + + /* compute length of line */ + line_length = SW_FT_Vector_Length( &delta ); + + angle = SW_FT_Atan2( delta.x, delta.y ); + SW_FT_Vector_From_Polar( &delta, stroker->radius, angle + SW_FT_ANGLE_PI2 ); + + /* process corner if necessary */ + if ( stroker->first_point ) + { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start( stroker, angle, line_length ); + if ( error ) + goto Exit; + } + else + { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner( stroker, line_length ); + if ( error ) + goto Exit; + } + + /* now add a line segment to both the `inside' and `outside' paths */ + for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) + { + SW_FT_Vector point; + + + point.x = to->x + delta.x; + point.y = to->y + delta.y; + + /* the ends of lineto borders are movable */ + error = ft_stroke_border_lineto( border, &point, TRUE ); + if ( error ) + goto Exit; + + delta.x = -delta.x; + delta.y = -delta.y; + } + + stroker->angle_in = angle; + stroker->center = *to; + stroker->line_length = line_length; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_ConicTo( SW_FT_Stroker stroker, + SW_FT_Vector* control, + SW_FT_Vector* to ) + { + SW_FT_Error error = 0; + SW_FT_Vector bez_stack[34]; + SW_FT_Vector* arc; + SW_FT_Vector* limit = bez_stack + 30; + SW_FT_Bool first_arc = TRUE; + + + /* if all control points are coincident, this is a no-op; */ + /* avoid creating a spurious corner */ + if ( SW_FT_IS_SMALL( stroker->center.x - control->x ) && + SW_FT_IS_SMALL( stroker->center.y - control->y ) && + SW_FT_IS_SMALL( control->x - to->x ) && + SW_FT_IS_SMALL( control->y - to->y ) ) + { + stroker->center = *to; + goto Exit; + } + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + + while ( arc >= bez_stack ) + { + SW_FT_Angle angle_in, angle_out; + + + /* initialize with current direction */ + angle_in = angle_out = stroker->angle_in; + + if ( arc < limit && + !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) + { + if ( stroker->first_point ) + stroker->angle_in = angle_in; + + ft_conic_split( arc ); + arc += 2; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, angle_in, 0 ); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner( stroker, 0 ); + } + } + else if ( ft_pos_abs( SW_FT_Angle_Diff( stroker->angle_in, angle_in ) ) > + SW_FT_SMALL_CONIC_THRESHOLD / 4 ) + { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[2]; + stroker->angle_out = angle_in; + stroker->line_join = SW_FT_STROKER_LINEJOIN_ROUND; + + error = ft_stroker_process_corner( stroker, 0 ); + + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; + } + + if ( error ) + goto Exit; + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + SW_FT_Vector ctrl, end; + SW_FT_Angle theta, phi, rotate, alpha0 = 0; + SW_FT_Fixed length; + SW_FT_StrokeBorder border; + SW_FT_Int side; + + + theta = SW_FT_Angle_Diff( angle_in, angle_out ) / 2; + phi = angle_in + theta; + length = SW_FT_DivFix( stroker->radius, SW_FT_Cos( theta ) ); + + /* compute direction of original arc */ + if ( stroker->handle_wide_strokes ) + alpha0 = SW_FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y ); + + for ( border = stroker->borders, side = 0; + side <= 1; + side++, border++ ) + { + rotate = SW_FT_SIDE_TO_ROTATE( side ); + + /* compute control point */ + SW_FT_Vector_From_Polar( &ctrl, length, phi + rotate ); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + SW_FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + if ( stroker->handle_wide_strokes ) + { + SW_FT_Vector start; + SW_FT_Angle alpha1; + + + /* determine whether the border radius is greater than the */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = SW_FT_Atan2( end.x - start.x, end.y - start.y ); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if ( ft_pos_abs( SW_FT_Angle_Diff( alpha0, alpha1 ) ) > + SW_FT_ANGLE_PI / 2 ) + { + SW_FT_Angle beta, gamma; + SW_FT_Vector bvec, delta; + SW_FT_Fixed blen, sinA, sinB, alen; + + + /* use the sine rule to find the intersection point */ + beta = SW_FT_Atan2( arc[2].x - start.x, arc[2].y - start.y ); + gamma = SW_FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = SW_FT_Vector_Length( &bvec ); + + sinA = ft_pos_abs( SW_FT_Sin( alpha1 - gamma ) ); + sinB = ft_pos_abs( SW_FT_Sin( beta - gamma ) ); + + alen = SW_FT_MulDiv( blen, sinA, sinB ); + + SW_FT_Vector_From_Polar( &delta, alen, beta ); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_conicto( border, &ctrl, &start ); + if ( error ) + goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_conicto( border, &ctrl, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 2; + + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_CubicTo( SW_FT_Stroker stroker, + SW_FT_Vector* control1, + SW_FT_Vector* control2, + SW_FT_Vector* to ) + { + SW_FT_Error error = 0; + SW_FT_Vector bez_stack[37]; + SW_FT_Vector* arc; + SW_FT_Vector* limit = bez_stack + 32; + SW_FT_Bool first_arc = TRUE; + + + /* if all control points are coincident, this is a no-op; */ + /* avoid creating a spurious corner */ + if ( SW_FT_IS_SMALL( stroker->center.x - control1->x ) && + SW_FT_IS_SMALL( stroker->center.y - control1->y ) && + SW_FT_IS_SMALL( control1->x - control2->x ) && + SW_FT_IS_SMALL( control1->y - control2->y ) && + SW_FT_IS_SMALL( control2->x - to->x ) && + SW_FT_IS_SMALL( control2->y - to->y ) ) + { + stroker->center = *to; + goto Exit; + } + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + + while ( arc >= bez_stack ) + { + SW_FT_Angle angle_in, angle_mid, angle_out; + + + /* initialize with current direction */ + angle_in = angle_out = angle_mid = stroker->angle_in; + + if ( arc < limit && + !ft_cubic_is_small_enough( arc, &angle_in, + &angle_mid, &angle_out ) ) + { + if ( stroker->first_point ) + stroker->angle_in = angle_in; + + ft_cubic_split( arc ); + arc += 3; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, angle_in, 0 ); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner( stroker, 0 ); + } + } + else if ( ft_pos_abs( SW_FT_Angle_Diff( stroker->angle_in, angle_in ) ) > + SW_FT_SMALL_CUBIC_THRESHOLD / 4 ) + { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[3]; + stroker->angle_out = angle_in; + stroker->line_join = SW_FT_STROKER_LINEJOIN_ROUND; + + error = ft_stroker_process_corner( stroker, 0 ); + + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; + } + + if ( error ) + goto Exit; + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + SW_FT_Vector ctrl1, ctrl2, end; + SW_FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; + SW_FT_Fixed length1, length2; + SW_FT_StrokeBorder border; + SW_FT_Int side; + + + theta1 = SW_FT_Angle_Diff( angle_in, angle_mid ) / 2; + theta2 = SW_FT_Angle_Diff( angle_mid, angle_out ) / 2; + phi1 = ft_angle_mean( angle_in, angle_mid ); + phi2 = ft_angle_mean( angle_mid, angle_out ); + length1 = SW_FT_DivFix( stroker->radius, SW_FT_Cos( theta1 ) ); + length2 = SW_FT_DivFix( stroker->radius, SW_FT_Cos( theta2 ) ); + + /* compute direction of original arc */ + if ( stroker->handle_wide_strokes ) + alpha0 = SW_FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y ); + + for ( border = stroker->borders, side = 0; + side <= 1; + side++, border++ ) + { + rotate = SW_FT_SIDE_TO_ROTATE( side ); + + /* compute control points */ + SW_FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + SW_FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + SW_FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + if ( stroker->handle_wide_strokes ) + { + SW_FT_Vector start; + SW_FT_Angle alpha1; + + + /* determine whether the border radius is greater than the */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = SW_FT_Atan2( end.x - start.x, end.y - start.y ); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if ( ft_pos_abs( SW_FT_Angle_Diff( alpha0, alpha1 ) ) > + SW_FT_ANGLE_PI / 2 ) + { + SW_FT_Angle beta, gamma; + SW_FT_Vector bvec, delta; + SW_FT_Fixed blen, sinA, sinB, alen; + + + /* use the sine rule to find the intersection point */ + beta = SW_FT_Atan2( arc[3].x - start.x, arc[3].y - start.y ); + gamma = SW_FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = SW_FT_Vector_Length( &bvec ); + + sinA = ft_pos_abs( SW_FT_Sin( alpha1 - gamma ) ); + sinB = ft_pos_abs( SW_FT_Sin( beta - gamma ) ); + + alen = SW_FT_MulDiv( blen, sinA, sinB ); + + SW_FT_Vector_From_Polar( &delta, alen, beta ); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_cubicto( border, + &ctrl2, + &ctrl1, + &start ); + if ( error ) + goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 3; + + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_BeginSubPath( SW_FT_Stroker stroker, + SW_FT_Vector* to, + SW_FT_Bool open ) + { + /* We cannot process the first point, because there is not enough */ + /* information regarding its corner/cap. The latter will be processed */ + /* in the `SW_FT_Stroker_EndSubPath' routine. */ + /* */ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + + /* Determine if we need to check whether the border radius is greater */ + /* than the radius of curvature of a curve, to handle this case */ + /* specially. This is only required if bevel joins or butt caps may */ + /* be created, because round & miter joins and round & square caps */ + /* cover the negative sector created with wide strokes. */ + stroker->handle_wide_strokes = + SW_FT_BOOL( stroker->line_join != SW_FT_STROKER_LINEJOIN_ROUND || + ( stroker->subpath_open && + stroker->line_cap == SW_FT_STROKER_LINECAP_BUTT ) ); + + /* record the subpath start point for each border */ + stroker->subpath_start = *to; + + stroker->angle_in = 0; + + return 0; + } + + + static SW_FT_Error + ft_stroker_add_reverse_left( SW_FT_Stroker stroker, + SW_FT_Bool open ) + { + SW_FT_StrokeBorder right = stroker->borders + 0; + SW_FT_StrokeBorder left = stroker->borders + 1; + SW_FT_Int new_points; + SW_FT_Error error = 0; + + + assert( left->start >= 0 ); + + new_points = left->num_points - left->start; + if ( new_points > 0 ) + { + error = ft_stroke_border_grow( right, (SW_FT_UInt)new_points ); + if ( error ) + goto Exit; + + { + SW_FT_Vector* dst_point = right->points + right->num_points; + SW_FT_Byte* dst_tag = right->tags + right->num_points; + SW_FT_Vector* src_point = left->points + left->num_points - 1; + SW_FT_Byte* src_tag = left->tags + left->num_points - 1; + + + while ( src_point >= left->points + left->start ) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + + if ( open ) + dst_tag[0] &= ~SW_FT_STROKE_TAG_BEGIN_END; + else + { + SW_FT_Byte ttag = + (SW_FT_Byte)( dst_tag[0] & SW_FT_STROKE_TAG_BEGIN_END ); + + + /* switch begin/end tags if necessary */ + if ( ttag == SW_FT_STROKE_TAG_BEGIN || + ttag == SW_FT_STROKE_TAG_END ) + dst_tag[0] ^= SW_FT_STROKE_TAG_BEGIN_END; + } + + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + + left->num_points = left->start; + right->num_points += new_points; + + right->movable = FALSE; + left->movable = FALSE; + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + /* there's a lot of magic in this function! */ + SW_FT_Error + SW_FT_Stroker_EndSubPath( SW_FT_Stroker stroker ) + { + SW_FT_Error error = 0; + + + if ( stroker->subpath_open ) + { + SW_FT_StrokeBorder right = stroker->borders; + + + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); + if ( error ) + goto Exit; + + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left( stroker, TRUE ); + if ( error ) + goto Exit; + + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = ft_stroker_cap( stroker, + stroker->subpath_angle + SW_FT_ANGLE_PI, 0 ); + if ( error ) + goto Exit; + + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close( right, FALSE ); + } + else + { + SW_FT_Angle turn; + SW_FT_Int inside_side; + + + /* close the path if needed */ + if ( stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y ) + { + error = SW_FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } + + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + turn = SW_FT_Angle_Diff( stroker->angle_in, + stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn != 0 ) + { + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + error = ft_stroker_inside( stroker, + inside_side, + stroker->subpath_line_length ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, + 1 - inside_side, + stroker->subpath_line_length ); + if ( error ) + goto Exit; + } + + /* then end our two subpaths */ + ft_stroke_border_close( stroker->borders + 0, FALSE ); + ft_stroke_border_close( stroker->borders + 1, TRUE ); + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_GetBorderCounts( SW_FT_Stroker stroker, + SW_FT_StrokerBorder border, + SW_FT_UInt *anum_points, + SW_FT_UInt *anum_contours ) + { + SW_FT_UInt num_points = 0, num_contours = 0; + SW_FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = -1;//SW_FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + SW_FT_Error + SW_FT_Stroker_GetCounts( SW_FT_Stroker stroker, + SW_FT_UInt *anum_points, + SW_FT_UInt *anum_contours ) + { + SW_FT_UInt count1, count2, num_points = 0; + SW_FT_UInt count3, count4, num_contours = 0; + SW_FT_Error error; + + + error = ft_stroke_border_get_counts( stroker->borders + 0, + &count1, &count2 ); + if ( error ) + goto Exit; + + error = ft_stroke_border_get_counts( stroker->borders + 1, + &count3, &count4 ); + if ( error ) + goto Exit; + + num_points = count1 + count3; + num_contours = count2 + count4; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + } + + + /* documentation is in ftstroke.h */ + + void + SW_FT_Stroker_ExportBorder( SW_FT_Stroker stroker, + SW_FT_StrokerBorder border, + SW_FT_Outline* outline ) + { + if ( border == SW_FT_STROKER_BORDER_LEFT || + border == SW_FT_STROKER_BORDER_RIGHT ) + { + SW_FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + + /* documentation is in ftstroke.h */ + + void + SW_FT_Stroker_Export( SW_FT_Stroker stroker, + SW_FT_Outline* outline ) + { + SW_FT_Stroker_ExportBorder( stroker, SW_FT_STROKER_BORDER_LEFT, outline ); + SW_FT_Stroker_ExportBorder( stroker, SW_FT_STROKER_BORDER_RIGHT, outline ); + } + + + /* documentation is in ftstroke.h */ + + /* + * The following is very similar to SW_FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ + SW_FT_Error + SW_FT_Stroker_ParseOutline( SW_FT_Stroker stroker, + const SW_FT_Outline* outline, + SW_FT_Bool opened ) + { + SW_FT_Vector v_last; + SW_FT_Vector v_control; + SW_FT_Vector v_start; + + SW_FT_Vector* point; + SW_FT_Vector* limit; + char* tags; + + SW_FT_Error error; + + SW_FT_Int n; /* index of contour in outline */ + SW_FT_UInt first; /* index of first point in contour */ + SW_FT_Int tag; /* current point's state */ + + + if ( !outline || !stroker ) + return -1;//SW_FT_THROW( Invalid_Argument ); + + SW_FT_Stroker_Rewind( stroker ); + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + SW_FT_UInt last; /* index of last point in contour */ + + + last = outline->contours[n]; + limit = outline->points + last; + + /* skip empty points; we don't stroke these */ + if ( last <= first ) + { + first = last + 1; + continue; + } + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = SW_FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == SW_FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == SW_FT_CURVE_TAG_CONIC ) + { + /* First point is conic control. Yes, this happens. */ + if ( SW_FT_CURVE_TAG( outline->tags[last] ) == SW_FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + } + point--; + tags--; + } + + error = SW_FT_Stroker_BeginSubPath( stroker, &v_start, opened ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = SW_FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case SW_FT_CURVE_TAG_ON: /* emit a single line_to */ + { + SW_FT_Vector vec; + + + vec.x = point->x; + vec.y = point->y; + + error = SW_FT_Stroker_LineTo( stroker, &vec ); + if ( error ) + goto Exit; + continue; + } + + case SW_FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if ( point < limit ) + { + SW_FT_Vector vec; + SW_FT_Vector v_middle; + + + point++; + tags++; + tag = SW_FT_CURVE_TAG( tags[0] ); + + vec = point[0]; + + if ( tag == SW_FT_CURVE_TAG_ON ) + { + error = SW_FT_Stroker_ConicTo( stroker, &v_control, &vec ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != SW_FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = SW_FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = SW_FT_Stroker_ConicTo( stroker, &v_control, &v_start ); + goto Close; + + default: /* SW_FT_CURVE_TAG_CUBIC */ + { + SW_FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + SW_FT_CURVE_TAG( tags[1] ) != SW_FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1 = point[-2]; + vec2 = point[-1]; + + if ( point <= limit ) + { + SW_FT_Vector vec; + + + vec = point[0]; + + error = SW_FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); + if ( error ) + goto Exit; + continue; + } + + error = SW_FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); + goto Close; + } + } + } + + Close: + if ( error ) + goto Exit; + + /* don't try to end the path if no segments have been generated */ + if ( !stroker->first_point ) + { + error = SW_FT_Stroker_EndSubPath( stroker ); + if ( error ) + goto Exit; + } + + first = last + 1; + } + + return 0; + + Exit: + return error; + + Invalid_Outline: + return -2;//SW_FT_THROW( Invalid_Outline ); + } + + +/* END */ diff --git a/src/vector/freetype/v_ft_stroker.h b/src/vector/freetype/v_ft_stroker.h new file mode 100644 index 0000000000..d2b54e47b8 --- /dev/null +++ b/src/vector/freetype/v_ft_stroker.h @@ -0,0 +1,325 @@ +#ifndef V_FT_STROKER_H +#define V_FT_STROKER_H +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* Copyright 2002-2006, 2008, 2009, 2011-2012 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include "v_ft_raster.h" + + /************************************************************** + * + * @type: + * SW_FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct SW_FT_StrokerRec_* SW_FT_Stroker; + + + /************************************************************** + * + * @enum: + * SW_FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * SW_FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * SW_FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins. The outer corner of + * the joined lines is filled by enclosing the triangular + * region of the corner with a straight line between the + * outer corners of each stroke. + * + * SW_FT_STROKER_LINEJOIN_MITER_FIXED :: + * Used to render mitered line joins, with fixed bevels if the + * miter limit is exceeded. The outer edges of the strokes + * for the two segments are extended until they meet at an + * angle. If the segments meet at too sharp an angle (such + * that the miter would extend from the intersection of the + * segments a distance greater than the product of the miter + * limit value and the border radius), then a bevel join (see + * above) is used instead. This prevents long spikes being + * created. SW_FT_STROKER_LINEJOIN_MITER_FIXED generates a miter + * line join as used in PostScript and PDF. + * + * SW_FT_STROKER_LINEJOIN_MITER_VARIABLE :: + * SW_FT_STROKER_LINEJOIN_MITER :: + * Used to render mitered line joins, with variable bevels if + * the miter limit is exceeded. The intersection of the + * strokes is clipped at a line perpendicular to the bisector + * of the angle between the strokes, at the distance from the + * intersection of the segments equal to the product of the + * miter limit value and the border radius. This prevents + * long spikes being created. + * SW_FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line + * join as used in XPS. SW_FT_STROKER_LINEJOIN_MITER is an alias + * for SW_FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for + * backwards compatibility. + */ + typedef enum SW_FT_Stroker_LineJoin_ + { + SW_FT_STROKER_LINEJOIN_ROUND = 0, + SW_FT_STROKER_LINEJOIN_BEVEL = 1, + SW_FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + SW_FT_STROKER_LINEJOIN_MITER = SW_FT_STROKER_LINEJOIN_MITER_VARIABLE, + SW_FT_STROKER_LINEJOIN_MITER_FIXED = 3 + + } SW_FT_Stroker_LineJoin; + + + /************************************************************** + * + * @enum: + * SW_FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * SW_FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * SW_FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * SW_FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ + typedef enum SW_FT_Stroker_LineCap_ + { + SW_FT_STROKER_LINECAP_BUTT = 0, + SW_FT_STROKER_LINECAP_ROUND, + SW_FT_STROKER_LINECAP_SQUARE + + } SW_FT_Stroker_LineCap; + + + /************************************************************** + * + * @enum: + * SW_FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @SW_FT_Stroker_GetBorderCounts and @SW_FT_Stroker_ExportBorder. + * + * @values: + * SW_FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * SW_FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and the + * `left' and `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @SW_FT_Outline_GetInsideBorder and + * @SW_FT_Outline_GetOutsideBorder to get these. + */ + typedef enum SW_FT_StrokerBorder_ + { + SW_FT_STROKER_BORDER_LEFT = 0, + SW_FT_STROKER_BORDER_RIGHT + + } SW_FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * SW_FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + SW_FT_Error + SW_FT_Stroker_New( SW_FT_Stroker *astroker ); + + + /************************************************************** + * + * @function: + * SW_FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the SW_FT_STROKER_LINEJOIN_MITER_FIXED and + * SW_FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles, + * expressed as 16.16 fixed-point value. + * + * @note: + * The radius is expressed in the same units as the outline + * coordinates. + */ + void + SW_FT_Stroker_Set( SW_FT_Stroker stroker, + SW_FT_Fixed radius, + SW_FT_Stroker_LineCap line_cap, + SW_FT_Stroker_LineJoin line_join, + SW_FT_Fixed miter_limit ); + + /************************************************************** + * + * @function: + * SW_FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @SW_FT_Stroker_GetCounts and @SW_FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead + * of a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened' is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct `border' outlines. + * + * If `opened' is~1, the outline is processed as an open path, and the + * stroker generates a single `stroke' outline. + * + * This function calls @SW_FT_Stroker_Rewind automatically. + */ + SW_FT_Error + SW_FT_Stroker_ParseOutline( SW_FT_Stroker stroker, + const SW_FT_Outline* outline, + SW_FT_Bool opened ); + + + /************************************************************** + * + * @function: + * SW_FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + SW_FT_Error + SW_FT_Stroker_GetCounts( SW_FT_Stroker stroker, + SW_FT_UInt *anum_points, + SW_FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * SW_FT_Stroker_Export + * + * @description: + * Call this function after @SW_FT_Stroker_GetBorderCounts to + * export all borders to your own @SW_FT_Outline structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + void + SW_FT_Stroker_Export( SW_FT_Stroker stroker, + SW_FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * SW_FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ + void + SW_FT_Stroker_Done( SW_FT_Stroker stroker ); + + +#endif // V_FT_STROKER_H diff --git a/src/vector/freetype/v_ft_types.h b/src/vector/freetype/v_ft_types.h new file mode 100644 index 0000000000..a01c4f2872 --- /dev/null +++ b/src/vector/freetype/v_ft_types.h @@ -0,0 +1,160 @@ +#ifndef V_FT_TYPES_H +#define V_FT_TYPES_H + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Fixed */ +/* */ +/* */ +/* This type is used to store 16.16 fixed-point values, like scaling */ +/* values or matrix coefficients. */ +/* */ +typedef signed long SW_FT_Fixed; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Int */ +/* */ +/* */ +/* A typedef for the int type. */ +/* */ +typedef signed int SW_FT_Int; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_UInt */ +/* */ +/* */ +/* A typedef for the unsigned int type. */ +/* */ +typedef unsigned int SW_FT_UInt; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Long */ +/* */ +/* */ +/* A typedef for signed long. */ +/* */ +typedef signed long SW_FT_Long; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_ULong */ +/* */ +/* */ +/* A typedef for unsigned long. */ +/* */ +typedef unsigned long SW_FT_ULong; + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Short */ +/* */ +/* */ +/* A typedef for signed short. */ +/* */ +typedef signed short SW_FT_Short; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Byte */ +/* */ +/* */ +/* A simple typedef for the _unsigned_ char type. */ +/* */ +typedef unsigned char SW_FT_Byte; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Bool */ +/* */ +/* */ +/* A typedef of unsigned char, used for simple booleans. As usual, */ +/* values 1 and~0 represent true and false, respectively. */ +/* */ +typedef unsigned char SW_FT_Bool; + + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Error */ +/* */ +/* */ +/* The FreeType error code type. A value of~0 is always interpreted */ +/* as a successful operation. */ +/* */ +typedef int SW_FT_Error; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Pos */ +/* */ +/* */ +/* The type SW_FT_Pos is used to store vectorial coordinates. Depending */ +/* on the context, these can represent distances in integer font */ +/* units, or 16.16, or 26.6 fixed-point pixel coordinates. */ +/* */ +typedef signed long SW_FT_Pos; + + +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Vector */ +/* */ +/* */ +/* A simple structure used to store a 2D vector; coordinates are of */ +/* the SW_FT_Pos type. */ +/* */ +/* */ +/* x :: The horizontal coordinate. */ +/* y :: The vertical coordinate. */ +/* */ +typedef struct SW_FT_Vector_ +{ + SW_FT_Pos x; + SW_FT_Pos y; + +} SW_FT_Vector; + + +typedef long long int SW_FT_Int64; +typedef unsigned long long int SW_FT_UInt64; + +typedef signed int SW_FT_Int32; +typedef unsigned int SW_FT_UInt32; + + +#define SW_FT_BOOL( x ) ( (SW_FT_Bool)( x ) ) + +#define SW_FT_SIZEOF_LONG 4 + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +#endif // V_FT_TYPES_H diff --git a/src/vector/meson.build b/src/vector/meson.build new file mode 100644 index 0000000000..761309ab00 --- /dev/null +++ b/src/vector/meson.build @@ -0,0 +1,29 @@ + +subdir('freetype') + +vector_dep = [freetype_dep] + +source_file = files('vdasher.cpp') +source_file += files('vbrush.cpp') +source_file += files('vbitmap.cpp') +source_file += files('vpainter.cpp') +source_file += files('vcompositionfunctions.cpp') +source_file += files('vdrawhelper.cpp') +source_file += files('vdrawhelper_sse2.cpp') + +source_file += files('vregion.cpp') +source_file += files('vrle.cpp') +source_file += files('vpath.cpp') +source_file += files('vpathmesure.cpp') +source_file += files('vmatrix.cpp') +source_file += files('velapsedtimer.cpp') +source_file += files('vdebug.cpp') +source_file += files('vinterpolator.cpp') +source_file += files('vbezier.cpp') +source_file += files('vraster.cpp') + +vector_dep += declare_dependency( include_directories : include_directories('.'), + sources : source_file + ) + + diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp new file mode 100644 index 0000000000..3ae1e1dc64 --- /dev/null +++ b/src/vector/vbezier.cpp @@ -0,0 +1,116 @@ +#include "vbezier.h" + +#include + +// Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. +// This uses alpha = 1, beta = 3/8, which results in a maximum error of less +// than 7% compared to the correct value. +static inline float +lineLength(float x1, float y1, float x2, float y2) +{ + float x = x2 - x1; + float y = y2 - y1; + + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; + + return (x > y ? x + 0.375 * y : y + 0.375 * x); +} + +VBezier VBezier::fromPoints(const VPointF &p1, const VPointF &p2, + const VPointF &p3, const VPointF &p4) +{ + VBezier b; + b.x1 = p1.x(); + b.y1 = p1.y(); + b.x2 = p2.x(); + b.y2 = p2.y(); + b.x3 = p3.x(); + b.y3 = p3.y(); + b.x4 = p4.x(); + b.y4 = p4.y(); + return b; +} + +float +VBezier::length()const +{ + VBezier left, right; /* bez poly splits */ + float len = 0.0; /* arc length */ + float chord; /* chord length */ + float length; + + len = len + lineLength(x1, y1, x2, y2); + len = len + lineLength(x2, y2, x3, y3); + len = len + lineLength(x3, y3, x4, y4); + + chord = lineLength(x1, y1, x4, y4); + + if (!floatCmp(len, chord)) { + split(&left, &right); /* split in two */ + length = + left.length() + /* try left side */ + right.length(); /* try right side */ + + return length; + } + + return len; +} + +VBezier VBezier::onInterval(float t0, float t1) const +{ + if (t0 == 0 && t1 == 1) + return *this; + + VBezier bezier = *this; + + VBezier result; + bezier.parameterSplitLeft(t0, &result); + float trueT = (t1-t0)/(1-t0); + bezier.parameterSplitLeft(trueT, &result); + + return result; +} + +float VBezier::tAtLength(float l) const +{ + float len = length(); + float t = 1.0; + const float error = 0.01; + if (l > len || floatCmp(l, len)) + return t; + + t *= 0.5; + + float lastBigger = 1.0; + while (1) { + VBezier right = *this; + VBezier left; + right.parameterSplitLeft(t, &left); + float lLen = left.length(); + if (fabs(lLen - l) < error) + break; + + if (lLen < l) { + t += (lastBigger - t) * 0.5; + } else { + lastBigger = t; + t -= t * 0.5; + } + } + return t; +} + +void +VBezier::splitAtLength(float len, VBezier *left, VBezier *right) +{ + float t; + + *right = *this; + t = right->tAtLength(len); + right->parameterSplitLeft(t, left); +} + + + diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h new file mode 100644 index 0000000000..92f4418329 --- /dev/null +++ b/src/vector/vbezier.h @@ -0,0 +1,110 @@ +#ifndef VBEZIER_H +#define VBEZIER_H + +#include + +class VBezier +{ +public: + VBezier(){} + VPointF pointAt(float t)const; + VBezier onInterval(float t0, float t1)const; + float length()const; + static void coefficients(float t, float &a, float &b, float &c, float &d); + static VBezier fromPoints(const VPointF &start, const VPointF &cp1, const VPointF &cp2, const VPointF &end); + inline void parameterSplitLeft(float t, VBezier *left); + inline void split(VBezier *firstHalf, VBezier *secondHalf) const; + float tAtLength(float len) const; + void splitAtLength(float len, VBezier *left, VBezier *right); + VPointF pt1() const { return VPointF(x1, y1); } + VPointF pt2() const { return VPointF(x2, y2); } + VPointF pt3() const { return VPointF(x3, y3); } + VPointF pt4() const { return VPointF(x4, y4); } +private: + VPointF derivative(float t)const; + float x1,y1,x2,y2,x3,y3,x4,y4; +}; + +inline void VBezier::coefficients(float t, float &a, float &b, float &c, float &d) +{ + float m_t = 1. - t; + b = m_t * m_t; + c = t * t; + d = c * t; + a = b * m_t; + b *= 3. * t; + c *= 3. * m_t; +} + +inline VPointF VBezier::pointAt(float t) const +{ + // numerically more stable: + float x, y; + + float m_t = 1. - t; + { + float a = x1*m_t + x2*t; + float b = x2*m_t + x3*t; + float c = x3*m_t + x4*t; + a = a*m_t + b*t; + b = b*m_t + c*t; + x = a*m_t + b*t; + } + { + float a = y1*m_t + y2*t; + float b = y2*m_t + y3*t; + float c = y3*m_t + y4*t; + a = a*m_t + b*t; + b = b*m_t + c*t; + y = a*m_t + b*t; + } + return VPointF(x, y); +} + +inline void VBezier::parameterSplitLeft(float t, VBezier *left) +{ + left->x1 = x1; + left->y1 = y1; + + left->x2 = x1 + t * ( x2 - x1 ); + left->y2 = y1 + t * ( y2 - y1 ); + + left->x3 = x2 + t * ( x3 - x2 ); // temporary holding spot + left->y3 = y2 + t * ( y3 - y2 ); // temporary holding spot + + x3 = x3 + t * ( x4 - x3 ); + y3 = y3 + t * ( y4 - y3 ); + + x2 = left->x3 + t * ( x3 - left->x3); + y2 = left->y3 + t * ( y3 - left->y3); + + left->x3 = left->x2 + t * ( left->x3 - left->x2 ); + left->y3 = left->y2 + t * ( left->y3 - left->y2 ); + + left->x4 = x1 = left->x3 + t * (x2 - left->x3); + left->y4 = y1 = left->y3 + t * (y2 - left->y3); +} + +inline void VBezier::split(VBezier *firstHalf, VBezier *secondHalf) const +{ + float c = (x2 + x3)*.5; + firstHalf->x2 = (x1 + x2)*.5; + secondHalf->x3 = (x3 + x4)*.5; + firstHalf->x1 = x1; + secondHalf->x4 = x4; + firstHalf->x3 = (firstHalf->x2 + c)*.5; + secondHalf->x2 = (secondHalf->x3 + c)*.5; + firstHalf->x4 = secondHalf->x1 = (firstHalf->x3 + secondHalf->x2)*.5; + + c = (y2 + y3)/2; + firstHalf->y2 = (y1 + y2)*.5; + secondHalf->y3 = (y3 + y4)*.5; + firstHalf->y1 = y1; + secondHalf->y4 = y4; + firstHalf->y3 = (firstHalf->y2 + c)*.5; + secondHalf->y2 = (secondHalf->y3 + c)*.5; + firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2)*.5; +} + + +#endif //VBEZIER_H diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp new file mode 100644 index 0000000000..4746df9cd0 --- /dev/null +++ b/src/vector/vbitmap.cpp @@ -0,0 +1,282 @@ +#include "vbitmap.h" +#include "vglobal.h" +#include + +struct VBitmapData +{ + ~VBitmapData(); + VBitmapData(); + static VBitmapData *create(int width, int height, VBitmap::Format format); + RefCount ref; + int width; + int height; + int depth; + int stride; + int nBytes; + VBitmap::Format format; + uchar *data; + VBitmapCleanupFunction cleanupFunction; + void* cleanupInfo; + uint ownData : 1; + uint roData : 1; +}; + +VBitmapData::~VBitmapData() +{ + if (cleanupFunction) + cleanupFunction(cleanupInfo); + if (data && ownData) + free(data); + data = 0; +} + +VBitmapData::VBitmapData() + : ref(0), width(0), height(0), depth(0), stride(0), + format(VBitmap::Format::ARGB32), data(nullptr), + cleanupFunction(0), cleanupInfo(0), ownData(true), roData(false) +{ +} + +VBitmapData * VBitmapData::create(int width, int height, VBitmap::Format format) +{ + if ((width <= 0) || (height <= 0) || format == VBitmap::Format::Invalid) + return nullptr; + + int depth = 1; + switch (format) { + case VBitmap::Format::Alpha8: + depth = 8; + case VBitmap::Format::ARGB32: + case VBitmap::Format::ARGB32_Premultiplied: + depth = 32; + break; + default: + break; + } + + const int stride = ((width * depth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4) + + VBitmapData *d = new VBitmapData; + + d->width = width; + d->height = height; + d->depth = depth; + d->format = format; + d->stride = stride; + d->nBytes = d->stride*height; + d->data = (uchar *)malloc(d->nBytes); + + if (!d->data) { + delete d; + return 0; + } + + return d; +} + +inline void VBitmap::cleanUp(VBitmapData *d) +{ + delete d; +} + +void VBitmap::detach() +{ + if (d) { + if (d->ref.isShared() || d->roData) + *this = copy(); + } +} + +VBitmap::~VBitmap() +{ + if (!d) return; + + if (!d->ref.deref()) + cleanUp(d); +} + +VBitmap::VBitmap() + : d(nullptr) +{ + +} + +VBitmap::VBitmap(const VBitmap &other) +{ + d = other.d; + if (d) + d->ref.ref(); +} + +VBitmap::VBitmap(VBitmap &&other): d(other.d) +{ + other.d = nullptr; +} + +VBitmap &VBitmap::operator=(const VBitmap &other) +{ + if (!d) { + d = other.d; + if (d) + d->ref.ref(); + } else { + if (!d->ref.deref()) + cleanUp(d); + other.d->ref.ref(); + d = other.d; + } + + return *this; +} + +inline VBitmap &VBitmap::operator=(VBitmap &&other) +{ + if (d && !d->ref.deref()) + cleanUp(d); + d = other.d; + return *this; +} + +VBitmap::VBitmap(int w, int h, VBitmap::Format format) +{ + +} +VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap::Format format, + VBitmapCleanupFunction f, void *cleanupInfo) +{ + d = new VBitmapData; + d->data = data; + d->format = format; + d->width = w; + d->height = h; + d->stride = bytesPerLine; + d->cleanupFunction = nullptr; + d->cleanupInfo = nullptr; + d->ownData = false; + d->roData = false; + d->ref = 1; +} + +VBitmap VBitmap::copy(const VRect& r) const +{ + if (!d) + return VBitmap(); + + if (r.isNull()) { + VBitmap image(d->width, d->height, d->format); + if (image.isNull()) + return image; + + if (image.d->nBytes != d->nBytes) { + int bpl = vMin(stride(), image.stride()); + for (int i = 0; i < height(); i++) + memcpy(image.scanLine(i), scanLine(i), bpl); + } else + memcpy(image.bits(), bits(), d->nBytes); + return image; + } + + int x = r.x(); + int y = r.y(); + int w = r.width(); + int h = r.height(); + + int dx = 0; + int dy = 0; + if (w <= 0 || h <= 0) + return VBitmap(); + + VBitmap image(w, h, d->format); + if (image.isNull()) + return image; + + if (x < 0 || y < 0 || x + w > d->width || y + h > d->height) { + // bitBlt will not cover entire image - clear it. + image.fill(0); + if (x < 0) { + dx = -x; + x = 0; + } + if (y < 0) { + dy = -y; + y = 0; + } + } + //TODO implement properly. +} + +int VBitmap::stride() const +{ + return d ? d->stride : 0; +} + +int VBitmap::width() const +{ + return d ? d->width : 0; +} + +int VBitmap::height() const +{ + return d ? d->height : 0; +} + +uchar *VBitmap::bits() +{ + if (!d) + return 0; + detach(); + + // In case detach ran out of memory... + if (!d) + return 0; + + return d->data; +} + +const uchar *VBitmap::bits() const +{ + return d ? d->data : 0; +} + +bool VBitmap::isNull() const +{ + return !d; +} + +uchar *VBitmap::scanLine(int i) +{ + if (!d) + return 0; + + detach(); + + // In case detach() ran out of memory + if (!d) + return 0; + + return d->data + i * d->stride; +} + +const uchar *VBitmap::scanLine(int i) const +{ + if (!d) + return 0; + + //assert(i >= 0 && i < height()); + return d->data + i * d->stride; +} + +VBitmap::Format VBitmap::format() const +{ + if (!d) + return VBitmap::Format::Invalid; + return d->format; +} + + +void VBitmap::fill(uint pixel) +{ + if (!d) + return; +} + diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h new file mode 100644 index 0000000000..5017063ba3 --- /dev/null +++ b/src/vector/vbitmap.h @@ -0,0 +1,47 @@ +#ifndef VBITMAP_H +#define VBITMAP_H + +#include "vrect.h" + +struct VBitmapData; +typedef void (*VBitmapCleanupFunction)(void *); +class VBitmap +{ +public: + enum class Format { + Invalid, + Alpha8, + ARGB32, + ARGB32_Premultiplied, + Last + }; + ~VBitmap(); + VBitmap(); + VBitmap(const VBitmap &other); + VBitmap(VBitmap &&other); + VBitmap &operator=(const VBitmap &); + VBitmap &operator=(VBitmap &&other); + + VBitmap(int w, int h, VBitmap::Format format); + VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap::Format format, + VBitmapCleanupFunction f = nullptr, void *cleanupInfo = nullptr); + + VBitmap copy(const VRect &rect = VRect()) const; + void fill(uint pixel); + + int width() const; + int height() const; + uchar *bits(); + const uchar *bits() const; + uchar *scanLine(int); + const uchar *scanLine(int) const; + int stride() const; + bool isNull() const; + VBitmap::Format format() const; +private: + void detach(); + void cleanUp(VBitmapData *x); + VBitmapData *d; +}; + +#endif // VBITMAP_H diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp new file mode 100644 index 0000000000..300afbcef1 --- /dev/null +++ b/src/vector/vbrush.cpp @@ -0,0 +1,77 @@ +#include"vbrush.h" + +VGradient::VGradient(VGradient::Type type):mType(type), mSpread(VGradient::Spread::Pad), mMode(VGradient::Mode::Absolute) +{ + +} + +void VGradient::setStops(const VGradientStops &stops) +{ + mStops = stops; +} + +VLinearGradient::VLinearGradient(const VPointF &start, + const VPointF &stop):VGradient(VGradient::Type::Linear) +{ + linear.x1 = start.x(); + linear.y1 = start.y(); + linear.x1 = stop.x(); + linear.y1 = stop.y(); +} + +VLinearGradient::VLinearGradient(float xStart, float yStart, + float xStop, float yStop):VGradient(VGradient::Type::Linear) +{ + linear.x1 = xStart; + linear.y1 = yStart; + linear.x1 = xStop; + linear.y1 = yStop; +} + +VRadialGradient::VRadialGradient(const VPointF ¢er, float cradius, + const VPointF &focalPoint, float fradius):VGradient(VGradient::Type::Radial) +{ + radial.cx = center.x(); + radial.cy = center.y(); + radial.fx = focalPoint.x(); + radial.fy = focalPoint.y(); + radial.cradius = cradius; + radial.fradius = fradius; +} + +VRadialGradient::VRadialGradient(float cx, float cy, float cradius, + float fx, float fy, float fradius):VGradient(VGradient::Type::Radial) +{ + radial.cx = cx; + radial.cy = cy; + radial.fx = fx; + radial.fy = fy; + radial.cradius = cradius; + radial.fradius = fradius; +} + +VBrush::VBrush(const VColor &color):mType(VBrush::Type::Solid), + mColor(color) +{ + +} + +VBrush::VBrush(int r, int g, int b, int a):mType(VBrush::Type::Solid), + mColor(r, g, b, a) + +{ + +} + +VBrush::VBrush(const VGradient *gradient):mType(VBrush::Type::NoBrush) +{ + if (!gradient) return; + + mGradient = gradient; + + if (gradient->mType == VGradient::Type::Linear) { + mType = VBrush::Type::LinearGradient; + } else if (gradient->mType == VGradient::Type::Linear) { + mType = VBrush::Type::RadialGradient; + } +} diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h new file mode 100644 index 0000000000..e93c9b1e0b --- /dev/null +++ b/src/vector/vbrush.h @@ -0,0 +1,82 @@ +#ifndef VBRUSH_H +#define VBRUSH_H + +#include"vglobal.h" +#include"vpoint.h" +#include"vmatrix.h" +#include + +typedef std::pair VGradientStop; +typedef std::vector VGradientStops; +class VGradient +{ +public: + enum class Mode { + Absolute, + Relative + }; + enum class Spread { + Pad, + Repeat, + Reflect + }; + enum class Type { + Linear, + Radial + }; + VGradient(VGradient::Type type); + void setStops(const VGradientStops &stops); + VGradient(){} +public: + static constexpr int colorTableSize = 1024; + VGradient::Type mType; + VGradient::Spread mSpread; + VGradient::Mode mMode; + VGradientStops mStops; + union { + struct { + float x1, y1, x2, y2; + } linear; + struct { + float cx, cy, fx, fy, cradius, fradius; + } radial; + }; + VMatrix mMatrix; +}; + +class VLinearGradient : public VGradient +{ +public: + VLinearGradient(const VPointF &start, const VPointF &stop); + VLinearGradient(float xStart, float yStart, float xStop, float yStop); +}; + +class VRadialGradient : public VGradient +{ +public: + VRadialGradient(const VPointF ¢er, float cradius, const VPointF &focalPoint, float fradius); + VRadialGradient(float cx, float cy, float cradius, float fx, float fy, float fradius); +}; + +class VBrush +{ +public: + enum class Type { + NoBrush, + Solid, + LinearGradient, + RadialGradient, + Texture + }; + VBrush():mType(Type::NoBrush){} + VBrush(const VColor &color); + VBrush(const VGradient *gradient); + VBrush(int r, int g, int b, int a); + inline VBrush::Type type() const{return mType;} +public: + VBrush::Type mType; + VColor mColor; + const VGradient *mGradient; +}; + +#endif // VBRUSH_H diff --git a/src/vector/vcompositionfunctions.cpp b/src/vector/vcompositionfunctions.cpp new file mode 100644 index 0000000000..5122210a6d --- /dev/null +++ b/src/vector/vcompositionfunctions.cpp @@ -0,0 +1,99 @@ +#include"vdrawhelper.h" + +/* + result = s + dest = s * ca + d * cia +*/ +void comp_func_solid_Source(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +{ + int ialpha, i; + + if (const_alpha == 255) + { + memfill32(dest, color, length); + } + else + { + ialpha = 255 - const_alpha; + color = BYTE_MUL(color, const_alpha); + for (i = 0; i < length; ++i) + dest[i] = color + BYTE_MUL(dest[i], ialpha); + } +} + +/* + r = s + d * sia + dest = r * ca + d * cia + = (s + d * sia) * ca + d * cia + = s * ca + d * (sia * ca + cia) + = s * ca + d * (1 - sa*ca) + = s' + d ( 1 - s'a) +*/ +void comp_func_solid_SourceOver(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +{ + int ialpha, i; + + if (const_alpha != 255) + color = BYTE_MUL(color, const_alpha); + ialpha = 255 - vAlpha(color); + for (i = 0; i < length; ++i) + dest[i] = color + BYTE_MUL(dest[i], ialpha); +} + + +void comp_func_Source(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +{ + if (const_alpha == 255) { + memcpy(dest, src, size_t(length) * sizeof(uint)); + } else { + uint ialpha = 255 - const_alpha; + for (int i = 0; i < length; ++i) { + dest[i] = INTERPOLATE_PIXEL_255(src[i], const_alpha, dest[i], ialpha); + } + } +} + +/* s' = s * ca + * d' = s' + d (1 - s'a) + */ +void comp_func_SourceOver(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +{ + uint s, sia; + + if (const_alpha == 255) { + for (int i = 0; i < length; ++i) { + s = src[i]; + if (s >= 0xff000000) + dest[i] = s; + else if (s != 0) { + sia = vAlpha(~s); + dest[i] = s + BYTE_MUL(dest[i], sia); + } + } + } else { + /* source' = source * const_alpha + * dest = source' + dest ( 1- source'a) + */ + for (int i = 0; i < length; ++i) { + uint s = BYTE_MUL(src[i], const_alpha); + sia = vAlpha(~s); + dest[i] = s + BYTE_MUL(dest[i], sia); + } + } +} + + +CompositionFunctionSolid COMP_functionForModeSolid_C[] = { + comp_func_solid_Source, + comp_func_solid_SourceOver +}; + +CompositionFunction COMP_functionForMode_C[] = { + comp_func_Source, + comp_func_SourceOver +}; + +void vInitBlendFunctions() +{ +} + diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp new file mode 100644 index 0000000000..f819bf9427 --- /dev/null +++ b/src/vector/vdasher.cpp @@ -0,0 +1,240 @@ +#include"vdasher.h" +#include"vbezier.h" + +class VLine +{ +public: + VLine():mX1(0),mY1(0),mX2(0),mY2(0){} + VLine(float x1, float y1, float x2, float y2):mX1(x1),mY1(y1),mX2(x2),mY2(y2){} + VLine(const VPointF &p1, const VPointF &p2):mX1(p1.x()),mY1(p1.y()),mX2(p2.x()),mY2(p2.y()){} + float length() const; + void splitAtLength(float length, VLine &left, VLine &right) const; + VPointF p1() const {return VPointF(mX1, mY1);} + VPointF p2() const {return VPointF(mX2, mY2);} +private: + float mX1; + float mY1; + float mX2; + float mY2; +}; + +// approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. +// With alpha = 1, beta = 3/8, giving results with the largest error less +// than 7% compared to the exact value. +float +VLine::length() const +{ + float x = mX2 - mX1; + float y = mY2 - mY1; + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; + return (x > y ? x + 0.375 * y : y + 0.375 * x); +} + +void +VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const +{ + float len = length(); + double dx = ((mX2 - mX1)/len) *lengthAt; + double dy = ((mY2 - mY1)/len) *lengthAt; + + left.mX1 = mX1; + left.mY1 = mY1; + left.mX2 = left.mX1 + dx; + left.mY2 = left.mY1 + dy; + + right.mX1 = left.mX2; + right.mY1 = left.mY2; + right.mX2 = mX2; + right.mY2 = mY2; +} + +VDasher::VDasher(const float *dashArray, int size) +{ + if (!(size % 2)) + vCritical<<"invalid dashArray format"; + + mDashArray = reinterpret_cast(dashArray); + mArraySize = size/2; + mDashOffset = dashArray[size-1]; + mCurrentDashIndex = 0; + mCurrentDashLength = 0; + mIsCurrentOperationGap = false; +} + +void VDasher::moveTo(const VPointF &p) +{ + mIsCurrentOperationGap = false; + mStartPt = p; + mCurPt = p; + + if (!floatCmp(mDashOffset, 0.0)) { + float totalLength = 0.0; + for (int i = 0; i < mArraySize ; i++) { + totalLength = mDashArray[i].length + mDashArray[i].gap; + } + float normalizeLen = fmod(mDashOffset, totalLength); + if (normalizeLen < 0.0 ) { + normalizeLen = totalLength + normalizeLen; + } + // now the length is less than total length and +ve + // findout the current dash index , dashlength and gap. + for (int i = 0; i < mArraySize; i++) { + if (normalizeLen < mDashArray[i].length) { + mCurrentDashIndex = i; + mCurrentDashLength = mDashArray[i].length - normalizeLen; + mIsCurrentOperationGap = false; + break; + } + normalizeLen -= mDashArray[i].length; + if (normalizeLen < mDashArray[i].gap) { + mCurrentDashIndex = i; + mCurrentDashLength = mDashArray[i].gap - normalizeLen; + mIsCurrentOperationGap = true; + break; + } + normalizeLen -= mDashArray[i].gap; + } + } else { + mCurrentDashIndex = 0; + mCurrentDashLength = mDashArray[0].length; + } +} + +void VDasher::lineTo(const VPointF &p) +{ + VLine left, right; + VLine line(mCurPt, p); + float length = line.length(); + if (length < mCurrentDashLength) { + mCurrentDashLength -= length; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(mCurPt); + mDashedPath.lineTo(p); + } + } else { + while (length > mCurrentDashLength) { + length -= mCurrentDashLength; + line.splitAtLength(mCurrentDashLength, left, right); + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(left.p1()); + mDashedPath.lineTo(left.p2()); + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize ; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + mIsCurrentOperationGap = !mIsCurrentOperationGap; + line = right; + mCurPt = line.p1(); + } + // remainder + mCurrentDashLength -= length; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(line.p1()); + mDashedPath.lineTo(line.p2()); + } + if (mCurrentDashLength < 1.0) { + // move to next dash + if (!mIsCurrentOperationGap) { + mIsCurrentOperationGap = true; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mIsCurrentOperationGap = false; + mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + } + } + mCurPt = p; +} + +void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) +{ + VBezier left, right; + float bezLen = 0.0; + VBezier b = VBezier::fromPoints(mCurPt, cp1, cp2, e); + bezLen = b.length(); + if (bezLen < mCurrentDashLength) { + mCurrentDashLength -= bezLen; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(mCurPt); + mDashedPath.cubicTo(cp1, cp2, e); + } + } else { + while (bezLen > mCurrentDashLength) { + bezLen -= mCurrentDashLength; + b.splitAtLength(mCurrentDashLength, &left, &right); + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(left.pt1()); + mDashedPath.cubicTo(left.pt2(), left.pt3(), left.pt4());; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize ; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + mIsCurrentOperationGap = !mIsCurrentOperationGap; + b = right; + mCurPt = b.pt1(); + } + // remainder + mCurrentDashLength -= bezLen; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(b.pt1()); + mDashedPath.cubicTo(b.pt2(), b.pt3(), b.pt4()); + } + if (mCurrentDashLength < 1.0) { + // move to next dash + if (!mIsCurrentOperationGap) + { + mIsCurrentOperationGap = true; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } + else + { + mIsCurrentOperationGap = false; + mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + } + } + mCurPt = e; +} + + +VPath VDasher::dashed(const VPath &path) +{ + if (path.isEmpty()) return VPath(); + + mDashedPath = VPath(); + const std::vector &elms = path.elements(); + const std::vector &pts = path.points(); + const VPointF *ptPtr = pts.data(); + + for (auto i : elms) { + switch (i) { + case VPath::Element::MoveTo: { + moveTo(*ptPtr++); + break; + } + case VPath::Element::LineTo: { + lineTo(*ptPtr++); + break; + } + case VPath::Element::CubicTo: { + cubicTo(*ptPtr, *(ptPtr + 1), *(ptPtr + 2)); + ptPtr += 3; + break; + } + case VPath::Element::Close: { + // The point is already joined to start point in VPath + // no need to do anything here. + break; + } + default: + break; + } + } + return mDashedPath; +} + diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h new file mode 100644 index 0000000000..ed975585e3 --- /dev/null +++ b/src/vector/vdasher.h @@ -0,0 +1,29 @@ +#ifndef VDASHER_H +#define VDASHER_H +#include "vpath.h" +class VDasher +{ + public: + VDasher(const float *dashArray, int size); + VPath dashed(const VPath &path); + private: + void moveTo(const VPointF &p); + void lineTo(const VPointF &p); + void cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e); + void close(); +private: + struct Dash { + float length; + float gap; + }; + const VDasher::Dash *mDashArray; + int mArraySize; + VPointF mStartPt; + VPointF mCurPt; + int mCurrentDashIndex; + int mCurrentDashLength; + bool mIsCurrentOperationGap; + float mDashOffset; + VPath mDashedPath; +}; +#endif // VDASHER_H diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp new file mode 100644 index 0000000000..de0fe79948 --- /dev/null +++ b/src/vector/vdebug.cpp @@ -0,0 +1,719 @@ +#include "vdebug.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + + /* Returns microseconds since epoch */ + uint64_t timestamp_now() + { + return std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); + } + + /* I want [2016-10-13 00:01:23.528514] */ + void format_timestamp(std::ostream & os, uint64_t timestamp) + { + // The next 3 lines do not work on MSVC! + // auto duration = std::chrono::microseconds(timestamp); + // std::chrono::high_resolution_clock::time_point time_point(duration); + // std::time_t time_t = std::chrono::high_resolution_clock::to_time_t(time_point); + std::time_t time_t = timestamp / 1000000; + auto gmtime = std::gmtime(&time_t); + char buffer[32]; + strftime(buffer, 32, "%Y-%m-%d %T.", gmtime); + char microseconds[7]; + sprintf(microseconds, "%06llu", timestamp % 1000000); + os << '[' << buffer << microseconds << ']'; + } + + std::thread::id this_thread_id() + { + static thread_local const std::thread::id id = std::this_thread::get_id(); + return id; + } + + template < typename T, typename Tuple > + struct TupleIndex; + + template < typename T,typename ... Types > + struct TupleIndex < T, std::tuple < T, Types... > > + { + static constexpr const std::size_t value = 0; + }; + + template < typename T, typename U, typename ... Types > + struct TupleIndex < T, std::tuple < U, Types... > > + { + static constexpr const std::size_t value = 1 + TupleIndex < T, std::tuple < Types... > >::value; + }; + +} // anonymous namespace + + typedef std::tuple < char, uint32_t, uint64_t, int32_t, int64_t, double, VDebug::string_literal_t, char * > SupportedTypes; + + char const * to_string(LogLevel loglevel) + { + switch (loglevel) + { + case LogLevel::OFF: + return "OFF"; + case LogLevel::INFO: + return "INFO"; + case LogLevel::WARN: + return "WARN"; + case LogLevel::CRIT: + return "CRIT"; + } + return "XXXX"; + } + + template < typename Arg > + void VDebug::encode(Arg arg) + { + *reinterpret_cast(buffer()) = arg; + m_bytes_used += sizeof(Arg); + } + + template < typename Arg > + void VDebug::encode(Arg arg, uint8_t type_id) + { + resize_buffer_if_needed(sizeof(Arg) + sizeof(uint8_t)); + encode < uint8_t >(type_id); + encode < Arg >(arg); + } + + VDebug::VDebug(LogLevel level, char const * file, char const * function, uint32_t line) + : m_bytes_used(0) + , m_buffer_size(sizeof(m_stack_buffer)) + { + encode < uint64_t >(timestamp_now()); + encode < std::thread::id >(this_thread_id()); + encode < string_literal_t >(string_literal_t(file)); + encode < string_literal_t >(string_literal_t(function)); + encode < uint32_t >(line); + encode < LogLevel >(level); + if (level == LogLevel::INFO) { + m_logAll = true; + }else { + m_logAll = true; + } + } + + VDebug::~VDebug() = default; + + void VDebug::stringify(std::ostream & os) + { + char * b = !m_heap_buffer ? m_stack_buffer : m_heap_buffer.get(); + char const * const end = b + m_bytes_used; + uint64_t timestamp = *reinterpret_cast < uint64_t * >(b); b += sizeof(uint64_t); + std::thread::id threadid = *reinterpret_cast < std::thread::id * >(b); b += sizeof(std::thread::id); + string_literal_t file = *reinterpret_cast < string_literal_t * >(b); b += sizeof(string_literal_t); + string_literal_t function = *reinterpret_cast < string_literal_t * >(b); b += sizeof(string_literal_t); + uint32_t line = *reinterpret_cast < uint32_t * >(b); b += sizeof(uint32_t); + LogLevel loglevel = *reinterpret_cast < LogLevel * >(b); b += sizeof(LogLevel); + if (m_logAll) { + format_timestamp(os, timestamp); + + os << '[' << to_string(loglevel) << ']' + << '[' << threadid << ']' + << '[' << file.m_s << ':' << function.m_s << ':' << line << "] "; + + } + + stringify(os, b, end); + os << std::endl; + + if (loglevel >= LogLevel::CRIT) + os.flush(); + } + + template < typename Arg > + char * decode(std::ostream & os, char * b, Arg * dummy) + { + Arg arg = *reinterpret_cast < Arg * >(b); + os << arg; + return b + sizeof(Arg); + } + + template <> + char * decode(std::ostream & os, char * b, VDebug::string_literal_t * dummy) + { + VDebug::string_literal_t s = *reinterpret_cast < VDebug::string_literal_t * >(b); + os << s.m_s; + return b + sizeof(VDebug::string_literal_t); + } + + template <> + char * decode(std::ostream & os, char * b, char ** dummy) + { + while (*b != '\0') + { + os << *b; + ++b; + } + return ++b; + } + + void VDebug::stringify(std::ostream & os, char * start, char const * const end) + { + if (start == end) + return; + + int type_id = static_cast < int >(*start); start++; + + switch (type_id) + { + case 0: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 1: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 2: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 3: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 4: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 5: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 6: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + case 7: + stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + return; + } + } + + char * VDebug::buffer() + { + return !m_heap_buffer ? &m_stack_buffer[m_bytes_used] : &(m_heap_buffer.get())[m_bytes_used]; + } + + void VDebug::resize_buffer_if_needed(size_t additional_bytes) + { + size_t const required_size = m_bytes_used + additional_bytes; + + if (required_size <= m_buffer_size) + return; + + if (!m_heap_buffer) + { + m_buffer_size = std::max(static_cast(512), required_size); + m_heap_buffer.reset(new char[m_buffer_size]); + memcpy(m_heap_buffer.get(), m_stack_buffer, m_bytes_used); + return; + } + else + { + m_buffer_size = std::max(static_cast(2 * m_buffer_size), required_size); + std::unique_ptr < char [] > new_heap_buffer(new char[m_buffer_size]); + memcpy(new_heap_buffer.get(), m_heap_buffer.get(), m_bytes_used); + m_heap_buffer.swap(new_heap_buffer); + } + } + + void VDebug::encode(char const * arg) + { + if (arg != nullptr) + encode_c_string(arg, strlen(arg)); + } + + void VDebug::encode(char * arg) + { + if (arg != nullptr) + encode_c_string(arg, strlen(arg)); + } + + void VDebug::encode_c_string(char const * arg, size_t length) + { + if (length == 0) + return; + + resize_buffer_if_needed(1 + length + 1); + char * b = buffer(); + auto type_id = TupleIndex < char *, SupportedTypes >::value; + *reinterpret_cast(b++) = static_cast(type_id); + memcpy(b, arg, length + 1); + m_bytes_used += 1 + length + 1; + } + + void VDebug::encode(string_literal_t arg) + { + encode < string_literal_t >(arg, TupleIndex < string_literal_t, SupportedTypes >::value); + } + + VDebug& VDebug::operator<<(std::string const & arg) + { + encode_c_string(arg.c_str(), arg.length()); + return *this; + } + + VDebug& VDebug::operator<<(int32_t arg) + { + encode < int32_t >(arg, TupleIndex < int32_t, SupportedTypes >::value); + return *this; + } + + VDebug& VDebug::operator<<(uint32_t arg) + { + encode < uint32_t >(arg, TupleIndex < uint32_t, SupportedTypes >::value); + return *this; + } + +// VDebug& VDebug::operator<<(int64_t arg) +// { +// encode < int64_t >(arg, TupleIndex < int64_t, SupportedTypes >::value); +// return *this; +// } + +// VDebug& VDebug::operator<<(uint64_t arg) +// { +// encode < uint64_t >(arg, TupleIndex < uint64_t, SupportedTypes >::value); +// return *this; +// } + VDebug& VDebug::operator<<(unsigned long arg) + { + encode < uint64_t >(arg, TupleIndex < uint64_t, SupportedTypes >::value); + return *this; + } + + VDebug& VDebug::operator<<(long arg) + { + encode < int64_t >(arg, TupleIndex < int64_t, SupportedTypes >::value); + return *this; + } + + VDebug& VDebug::operator<<(double arg) + { + encode < double >(arg, TupleIndex < double, SupportedTypes >::value); + return *this; + } + + VDebug& VDebug::operator<<(char arg) + { + encode < char >(arg, TupleIndex < char, SupportedTypes >::value); + return *this; + } + + struct BufferBase + { + virtual ~BufferBase() = default; + virtual void push(VDebug && logline) = 0; + virtual bool try_pop(VDebug & logline) = 0; + }; + + struct SpinLock + { + SpinLock(std::atomic_flag & flag) : m_flag(flag) + { + while (m_flag.test_and_set(std::memory_order_acquire)); + } + + ~SpinLock() + { + m_flag.clear(std::memory_order_release); + } + + private: + std::atomic_flag & m_flag; + }; + + /* Multi Producer Single Consumer Ring Buffer */ + class RingBuffer : public BufferBase + { + public: + struct alignas(64) Item + { + Item() + : flag() + , written(0) + , logline(LogLevel::INFO, nullptr, nullptr, 0) + { + } + + std::atomic_flag flag; + char written; + char padding[256 - sizeof(std::atomic_flag) - sizeof(char) - sizeof(VDebug)]; + VDebug logline; + }; + + RingBuffer(size_t const size) + : m_size(size) + , m_ring(static_cast(std::malloc(size * sizeof(Item)))) + , m_write_index(0) + , m_read_index(0) + { + for (size_t i = 0; i < m_size; ++i) + { + new (&m_ring[i]) Item(); + } + static_assert(sizeof(Item) == 256, "Unexpected size != 256"); + } + + ~RingBuffer() + { + for (size_t i = 0; i < m_size; ++i) + { + m_ring[i].~Item(); + } + std::free(m_ring); + } + + void push(VDebug && logline) override + { + unsigned int write_index = m_write_index.fetch_add(1, std::memory_order_relaxed) % m_size; + Item & item = m_ring[write_index]; + SpinLock spinlock(item.flag); + item.logline = std::move(logline); + item.written = 1; + } + + bool try_pop(VDebug & logline) override + { + Item & item = m_ring[m_read_index % m_size]; + SpinLock spinlock(item.flag); + if (item.written == 1) + { + logline = std::move(item.logline); + item.written = 0; + ++m_read_index; + return true; + } + return false; + } + + RingBuffer(RingBuffer const &) = delete; + RingBuffer& operator=(RingBuffer const &) = delete; + + private: + size_t const m_size; + Item * m_ring; + std::atomic < unsigned int > m_write_index; + char pad[64]; + unsigned int m_read_index; + }; + + + class Buffer + { + public: + struct Item + { + Item(VDebug && logline) : logline(std::move(logline)) {} + char padding[256 - sizeof(VDebug)]; + VDebug logline; + }; + + static constexpr const size_t size = 32768; // 8MB. Helps reduce memory fragmentation + + Buffer() : m_buffer(static_cast(std::malloc(size * sizeof(Item)))) + { + for (size_t i = 0; i <= size; ++i) + { + m_write_state[i].store(0, std::memory_order_relaxed); + } + static_assert(sizeof(Item) == 256, "Unexpected size != 256"); + } + + ~Buffer() + { + unsigned int write_count = m_write_state[size].load(); + for (size_t i = 0; i < write_count; ++i) + { + m_buffer[i].~Item(); + } + std::free(m_buffer); + } + + // Returns true if we need to switch to next buffer + bool push(VDebug && logline, unsigned int const write_index) + { + new (&m_buffer[write_index]) Item(std::move(logline)); + m_write_state[write_index].store(1, std::memory_order_release); + return m_write_state[size].fetch_add(1, std::memory_order_acquire) + 1 == size; + } + + bool try_pop(VDebug & logline, unsigned int const read_index) + { + if (m_write_state[read_index].load(std::memory_order_acquire)) + { + Item & item = m_buffer[read_index]; + logline = std::move(item.logline); + return true; + } + return false; + } + + Buffer(Buffer const &) = delete; + Buffer& operator=(Buffer const &) = delete; + + private: + Item * m_buffer; + std::atomic < unsigned int > m_write_state[size + 1]; + }; + + class QueueBuffer : public BufferBase + { + public: + QueueBuffer(QueueBuffer const &) = delete; + QueueBuffer& operator=(QueueBuffer const &) = delete; + + QueueBuffer() : m_current_read_buffer{nullptr} + , m_write_index(0) + , m_flag() + , m_read_index(0) + { + setup_next_write_buffer(); + } + + void push(VDebug && logline) override + { + unsigned int write_index = m_write_index.fetch_add(1, std::memory_order_relaxed); + if (write_index < Buffer::size) + { + if (m_current_write_buffer.load(std::memory_order_acquire)->push(std::move(logline), write_index)) + { + setup_next_write_buffer(); + } + } + else + { + while (m_write_index.load(std::memory_order_acquire) >= Buffer::size); + push(std::move(logline)); + } + } + + bool try_pop(VDebug & logline) override + { + if (m_current_read_buffer == nullptr) + m_current_read_buffer = get_next_read_buffer(); + + Buffer * read_buffer = m_current_read_buffer; + + if (read_buffer == nullptr) + return false; + + if (bool success = read_buffer->try_pop(logline, m_read_index)) + { + m_read_index++; + if (m_read_index == Buffer::size) + { + m_read_index = 0; + m_current_read_buffer = nullptr; + SpinLock spinlock(m_flag); + m_buffers.pop(); + } + return true; + } + + return false; + } + + private: + void setup_next_write_buffer() + { + std::unique_ptr < Buffer > next_write_buffer(new Buffer()); + m_current_write_buffer.store(next_write_buffer.get(), std::memory_order_release); + SpinLock spinlock(m_flag); + m_buffers.push(std::move(next_write_buffer)); + m_write_index.store(0, std::memory_order_relaxed); + } + + Buffer * get_next_read_buffer() + { + SpinLock spinlock(m_flag); + return m_buffers.empty() ? nullptr : m_buffers.front().get(); + } + + private: + std::queue < std::unique_ptr < Buffer > > m_buffers; + std::atomic < Buffer * > m_current_write_buffer; + Buffer * m_current_read_buffer; + std::atomic < unsigned int > m_write_index; + std::atomic_flag m_flag; + unsigned int m_read_index; + }; + + class FileWriter + { + public: + FileWriter(std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) + : m_log_file_roll_size_bytes(log_file_roll_size_mb * 1024 * 1024) + , m_name(log_directory + log_file_name) + { + roll_file(); + } + + void write(VDebug & logline) + { + auto pos = m_os->tellp(); + logline.stringify(*m_os); + m_bytes_written += m_os->tellp() - pos; + if (m_bytes_written > m_log_file_roll_size_bytes) + { + roll_file(); + } + } + + private: + void roll_file() + { + if (m_os) + { + m_os->flush(); + m_os->close(); + } + + m_bytes_written = 0; + m_os.reset(new std::ofstream()); + // TODO Optimize this part. Does it even matter ? + std::string log_file_name = m_name; + log_file_name.append("."); + log_file_name.append(std::to_string(++m_file_number)); + log_file_name.append(".txt"); + m_os->open(log_file_name, std::ofstream::out | std::ofstream::trunc); + } + + private: + uint32_t m_file_number = 0; + std::streamoff m_bytes_written = 0; + uint32_t const m_log_file_roll_size_bytes; + std::string const m_name; + std::unique_ptr < std::ofstream > m_os; + }; + + class NanoLogger + { + public: + NanoLogger(NonGuaranteedLogger ngl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) + : m_state(State::INIT) + , m_buffer_base(new RingBuffer(std::max(1u, ngl.ring_buffer_size_mb) * 1024 * 4)) + , m_file_writer(log_directory, log_file_name, std::max(1u, log_file_roll_size_mb)) + , m_thread(&NanoLogger::pop, this) + { + m_state.store(State::READY, std::memory_order_release); + } + + NanoLogger(GuaranteedLogger gl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) + : m_state(State::INIT) + , m_buffer_base(new QueueBuffer()) + , m_file_writer(log_directory, log_file_name, std::max(1u, log_file_roll_size_mb)) + , m_thread(&NanoLogger::pop, this) + { + m_state.store(State::READY, std::memory_order_release); + } + + ~NanoLogger() + { + m_state.store(State::SHUTDOWN); + m_thread.join(); + } + + void add(VDebug && logline) + { + m_buffer_base->push(std::move(logline)); + } + + void pop() + { + // Wait for constructor to complete and pull all stores done there to this thread / core. + while (m_state.load(std::memory_order_acquire) == State::INIT) + std::this_thread::sleep_for(std::chrono::microseconds(50)); + + VDebug logline(LogLevel::INFO, nullptr, nullptr, 0); + + while (m_state.load() == State::READY) + { + if (m_buffer_base->try_pop(logline)) + m_file_writer.write(logline); + else + std::this_thread::sleep_for(std::chrono::microseconds(50)); + } + + // Pop and log all remaining entries + while (m_buffer_base->try_pop(logline)) + { + m_file_writer.write(logline); + } + } + + private: + enum class State + { + INIT, + READY, + SHUTDOWN + }; + + std::atomic < State > m_state; + std::unique_ptr < BufferBase > m_buffer_base; + FileWriter m_file_writer; + std::thread m_thread; + }; + + std::unique_ptr < NanoLogger > nanologger; + std::atomic < NanoLogger * > atomic_nanologger; + + bool VDebugServer::operator==(VDebug & logline) + { + atomic_nanologger.load(std::memory_order_acquire)->add(std::move(logline)); + return true; + } + + void initialize(NonGuaranteedLogger ngl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) + { + nanologger.reset(new NanoLogger(ngl, log_directory, log_file_name, log_file_roll_size_mb)); + atomic_nanologger.store(nanologger.get(), std::memory_order_seq_cst); + } + + void initialize(GuaranteedLogger gl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) + { + nanologger.reset(new NanoLogger(gl, log_directory, log_file_name, log_file_roll_size_mb)); + atomic_nanologger.store(nanologger.get(), std::memory_order_seq_cst); + } + + std::atomic < unsigned int > loglevel = {0}; + + void set_log_level(LogLevel level) + { + loglevel.store(static_cast(level), std::memory_order_release); + } + + bool is_logged(LogLevel level) + { + return static_cast(level) >= loglevel.load(std::memory_order_relaxed); + } + + void initDebug() + { + initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); + set_log_level(LogLevel::INFO); + } + +#ifndef DEBUG_CONSTRUCTOR_FUNCTION +# define DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) \ + namespace { \ + static const struct AFUNC ## _ctor_class_ { \ + inline AFUNC ## _ctor_class_() { AFUNC(); } \ + } AFUNC ## _ctor_instance_; \ + } + +# define DEBUG_CONSTRUCTOR_FUNCTION(AFUNC) DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) +#endif + + DEBUG_CONSTRUCTOR_FUNCTION(initDebug) + diff --git a/src/vector/vdebug.h b/src/vector/vdebug.h new file mode 100644 index 0000000000..536bc48e72 --- /dev/null +++ b/src/vector/vdebug.h @@ -0,0 +1,143 @@ +#ifndef VDEBUG_H +#define VDEBUG_H +#include +#include +#include +#include +#include + + + +enum class LogLevel : uint8_t { INFO, WARN, CRIT, OFF }; + + +class VDebug +{ +public: + VDebug(); + VDebug& debug() {return *this;} + VDebug(LogLevel level, char const * file, char const * function, uint32_t line); + ~VDebug(); + + VDebug(VDebug &&) = default; + VDebug& operator=(VDebug &&) = default; + + void stringify(std::ostream & os); + + VDebug& operator<<(char arg); + VDebug& operator<<(int32_t arg); + VDebug& operator<<(uint32_t arg); + //VDebug& operator<<(int64_t arg); + //VDebug& operator<<(uint64_t arg); + + VDebug& operator<<(long arg); + VDebug& operator<<(unsigned long arg); + VDebug& operator<<(double arg); + VDebug& operator<<(std::string const & arg); + + template < size_t N > + VDebug& operator<<(const char (&arg)[N]) { + encode(string_literal_t(arg)); + return *this; + } + + template < typename Arg > + typename std::enable_if < std::is_same < Arg, char const * >::value, VDebug& >::type + operator<<(Arg const & arg) { + encode(arg); + return *this; + } + + template < typename Arg > + typename std::enable_if < std::is_same < Arg, char * >::value, VDebug& >::type + operator<<(Arg const & arg) { + encode(arg); + return *this; + } + + struct string_literal_t { + explicit string_literal_t(char const * s) : m_s(s) {} + char const * m_s; + }; + +private: + char * buffer(); + + template < typename Arg > + void encode(Arg arg); + + template < typename Arg > + void encode(Arg arg, uint8_t type_id); + + void encode(char * arg); + void encode(char const * arg); + void encode(string_literal_t arg); + void encode_c_string(char const * arg, size_t length); + void resize_buffer_if_needed(size_t additional_bytes); + void stringify(std::ostream & os, char * start, char const * const end); + +private: + size_t m_bytes_used; + size_t m_buffer_size; + std::unique_ptr < char [] > m_heap_buffer; + bool m_logAll; + char m_stack_buffer[256 - sizeof(bool) - 2 * sizeof(size_t) - sizeof(decltype(m_heap_buffer)) - 8 /* Reserved */]; +}; + +struct VDebugServer +{ + /* + * Ideally this should have been operator+= + * Could not get that to compile, so here we are... + */ + bool operator==(VDebug &); +}; + +void set_log_level(LogLevel level); + +bool is_logged(LogLevel level); + + +/* + * Non guaranteed logging. Uses a ring buffer to hold log lines. + * When the ring gets full, the previous log line in the slot will be dropped. + * Does not block producer even if the ring buffer is full. + * ring_buffer_size_mb - LogLines are pushed into a mpsc ring buffer whose size + * is determined by this parameter. Since each LogLine is 256 bytes, + * ring_buffer_size = ring_buffer_size_mb * 1024 * 1024 / 256 + */ +struct NonGuaranteedLogger +{ + NonGuaranteedLogger(uint32_t ring_buffer_size_mb_) : ring_buffer_size_mb(ring_buffer_size_mb_) {} + uint32_t ring_buffer_size_mb; +}; + +/* + * Provides a guarantee log lines will not be dropped. + */ +struct GuaranteedLogger +{ +}; + +/* + * Ensure initialize() is called prior to any log statements. + * log_directory - where to create the logs. For example - "/tmp/" + * log_file_name - root of the file name. For example - "nanolog" + * This will create log files of the form - + * /tmp/nanolog.1.txt + * /tmp/nanolog.2.txt + * etc. + * log_file_roll_size_mb - mega bytes after which we roll to next log file. + */ +void initialize(GuaranteedLogger gl, std::string const & log_directory, + std::string const & log_file_name, uint32_t log_file_roll_size_mb); +void initialize(NonGuaranteedLogger ngl, std::string const & log_directory, + std::string const & log_file_name, uint32_t log_file_roll_size_mb); + + +#define VDEBUG_LOG(LEVEL) VDebugServer() == VDebug(LEVEL, __FILE__, __func__, __LINE__).debug() +#define vDebug is_logged(LogLevel::INFO) && VDEBUG_LOG(LogLevel::INFO) +#define vWarning is_logged(LogLevel::WARN) && VDEBUG_LOG(LogLevel::WARN) +#define vCritical is_logged(LogLevel::CRIT) && VDEBUG_LOG(LogLevel::CRIT) + +#endif // VDEBUG_H diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp new file mode 100644 index 0000000000..641d3d677d --- /dev/null +++ b/src/vector/vdrawhelper.cpp @@ -0,0 +1,544 @@ +#include"vdrawhelper.h" +#include +#include +#include +#include + + +class VGradientCache +{ +public: + struct CacheInfo : public VSpanData::Pinnable + { + inline CacheInfo(VGradientStops s):stops(s) {} + uint32_t buffer32[VGradient::colorTableSize]; + VGradientStops stops; + bool alpha; + }; + + typedef std::unordered_multimap> VGradientColorTableHash; + bool generateGradientColorTable(const VGradientStops &stops, + uint32_t *colorTable, int size); + inline const std::shared_ptr getBuffer(const VGradient &gradient) + { + uint64_t hash_val = 0; + std::shared_ptr info; + + const VGradientStops &stops = gradient.mStops; + for (uint i = 0; i < stops.size() && i <= 2; i++) + hash_val += stops[i].second.premulARGB(); + + cacheAccess.lock(); + + int count = cache.count(hash_val); + if (!count) { + // key is not present in the hash + info = addCacheElement(hash_val, gradient); + } else if (count == 1) { + VGradientColorTableHash::const_iterator it = cache.find(hash_val); + if (it->second->stops == stops) { + info = it->second; + } else { + // didn't find an exact match + info = addCacheElement(hash_val, gradient); + } + } else { + // we have a multiple data with same key + auto range = cache.equal_range(hash_val); + for (auto i = range.first; i != range.second; ++i) { + if (i->second->stops == stops) { + info = i->second; + break; + } + } + if (!info) { + // didn't find an exact match + info = addCacheElement(hash_val, gradient); + } + } + cacheAccess.unlock(); + return info; + } + +protected: + inline uint maxCacheSize() const { return 60; } + const std::shared_ptr addCacheElement(uint64_t hash_val, const VGradient &gradient) + { + if (cache.size() == maxCacheSize()) { + int count = rand() % maxCacheSize(); + while (count--) { + cache.erase(cache.begin()); + } + } + auto cache_entry = std::make_shared(gradient.mStops); + cache_entry->alpha = generateGradientColorTable(gradient.mStops, cache_entry->buffer32, VGradient::colorTableSize); + cache.insert(std::make_pair(hash_val, cache_entry)); + return cache_entry; + } + + VGradientColorTableHash cache; + std::mutex cacheAccess; +}; + +bool +VGradientCache::generateGradientColorTable(const VGradientStops &stops, + uint32_t *colorTable, int size) +{ + int dist, idist, pos = 0, i; + bool alpha = false; + int stopCount = stops.size(); + const VGradientStop *curr, *next, *start; + uint32_t curColor, nextColor; + float delta, t, incr, fpos; + + start = stops.data(); + curr = start; + if (!curr->second.isOpaque()) alpha = true; + curColor = curr->second.premulARGB(); + incr = 1.0 / (float)size; + fpos = 1.5 * incr; + + colorTable[pos++] = curColor; + + while (fpos <= curr->first) { + colorTable[pos] = colorTable[pos - 1]; + pos++; + fpos += incr; + } + + for (i = 0; i < stopCount - 1; ++i) { + curr = (start + i); + next = (start + i + 1); + delta = 1/(next->first - curr->first); + if (!next->second.isOpaque()) alpha = true; + nextColor = next->second.premulARGB(); + while (fpos < next->first && pos < size) + { + t = (fpos - curr->first) * delta; + dist = (int)(255 * t); + idist = 255 - dist; + colorTable[pos] = INTERPOLATE_PIXEL_255(curColor, idist, nextColor, dist); + ++pos; + fpos += incr; + } + curColor = nextColor; + } + + for (;pos < size; ++pos) + colorTable[pos] = curColor; + + // Make sure the last color stop is represented at the end of the table + colorTable[size-1] = curColor; + return alpha; +} + +static VGradientCache VGradientCacheInstance; + +void VRasterBuffer::init() +{ + mBuffer = nullptr; + mWidth = 0; + mHeight = 0; + mCompositionMode = VPainter::CompModeSrcOver; +} + +void VRasterBuffer::clear() +{ + memset(mBuffer, 0, mHeight * mBytesPerLine); +} + +VBitmap::Format VRasterBuffer::prepare(VBitmap *image) +{ + mBuffer = (uchar *)image->bits(); + mWidth = image->width(); + mHeight = image->height(); + mBytesPerPixel = 4; + mBytesPerLine = image->stride(); + + mFormat = image->format(); + //drawHelper = qDrawHelper + format; + return mFormat; +} + +void VSpanData::init(VRasterBuffer* image) +{ + mRasterBuffer = image; + mSystemClip = VRect(0,0, image->width(), image->height()); + mType = VSpanData::Type::None; + mBlendFunc = nullptr; + mUnclippedBlendFunc = nullptr; +} + +extern CompositionFunction COMP_functionForMode_C[]; +extern CompositionFunctionSolid COMP_functionForModeSolid_C[]; +static const CompositionFunction *functionForMode = COMP_functionForMode_C; +static const CompositionFunctionSolid *functionForModeSolid = COMP_functionForModeSolid_C; + +/* + * Gradient Draw routines + * + */ + +#define FIXPT_BITS 8 +#define FIXPT_SIZE (1<mGradient; + v->dx = grad->linear.x2 - grad->linear.x1; + v->dy = grad->linear.y2 - grad->linear.y1; + v->l = v->dx * v->dx + v->dy * v->dy; + v->off = 0; + if (v->l != 0) { + v->dx /= v->l; + v->dy /= v->l; + v->off = -v->dx * grad->linear.x1 - v->dy * grad->linear.y1; + } +} + +static inline int +gradientClamp(const VGradientData *grad, int ipos) +{ + int limit; + + if (grad->mSpread == VGradient::Spread::Repeat) + { + ipos = ipos % VGradient::colorTableSize; + ipos = ipos < 0 ? VGradient::colorTableSize + ipos : ipos; + } + else if (grad->mSpread == VGradient::Spread::Reflect) + { + limit = VGradient::colorTableSize * 2; + ipos = ipos % limit; + ipos = ipos < 0 ? limit + ipos : ipos; + ipos = ipos >= VGradient::colorTableSize ? limit - 1 - ipos : ipos; + } + else + { + if (ipos < 0) ipos = 0; + else if (ipos >= VGradient::colorTableSize) + ipos = VGradient::colorTableSize - 1; + } + return ipos; +} + +static uint32_t +gradientPixelFixed(const VGradientData *grad, int fixed_pos) +{ + int ipos = (fixed_pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS; + + return grad->mColorTable[gradientClamp(grad, ipos)]; +} + +static inline uint32_t +gradientPixel(const VGradientData *grad, float pos) +{ + int ipos = (int)(pos * (VGradient::colorTableSize - 1) + (float)(0.5)); + + return grad->mColorTable[gradientClamp(grad, ipos)]; +} + +void +fetch_linear_gradient(uint32_t *buffer, const Operator *op, const VSpanData *data, int y, int x, int length) +{ + float t, inc; + const VGradientData *gradient = &data->mGradient; + + bool affine = true; + float rx=0, ry=0; + if (op->linear.l == 0) { + t = inc = 0; + } else { + rx = data->m21 * (y + float(0.5)) + data->m11 * (x + float(0.5)) + data->dx; + ry = data->m22 * (y + float(0.5)) + data->m12 * (x + float(0.5)) + data->dy; + t = op->linear.dx*rx + op->linear.dy*ry + op->linear.off; + inc = op->linear.dx * data->m11 + op->linear.dy * data->m12; + affine = !data->m13 && !data->m23; + + if (affine) { + t *= (VGradient::colorTableSize - 1); + inc *= (VGradient::colorTableSize - 1); + } + } + + const uint32_t *end = buffer + length; + if (affine) { + if (inc > float(-1e-5) && inc < float(1e-5)) { + memfill32(buffer, gradientPixelFixed(gradient, int(t * FIXPT_SIZE)), length); + } else { + if (t+inc*length < float(INT_MAX >> (FIXPT_BITS + 1)) && + t+inc*length > float(INT_MIN >> (FIXPT_BITS + 1))) { + // we can use fixed point math + int t_fixed = int(t * FIXPT_SIZE); + int inc_fixed = int(inc * FIXPT_SIZE); + while (buffer < end) { + *buffer = gradientPixelFixed(gradient, t_fixed); + t_fixed += inc_fixed; + ++buffer; + } + } else { + // we have to fall back to float math + while (buffer < end) { + *buffer = gradientPixel(gradient, t/VGradient::colorTableSize); + t += inc; + ++buffer; + } + } + } + } else { // fall back to float math here as well + float rw = data->m23 * (y + float(0.5)) + data->m13 * (x + float(0.5)) + data->m33; + while (buffer < end) { + float x = rx/rw; + float y = ry/rw; + t = (op->linear.dx*x + op->linear.dy *y) + op->linear.off; + + *buffer = gradientPixel(gradient, t); + rx += data->m11; + ry += data->m12; + rw += data->m13; + if (!rw) { + rw += data->m13; + } + ++buffer; + } + } +} + + +static inline Operator getOperator(const VSpanData *data, const VRle::Span *spans, int spanCount) +{ + Operator op; + bool solidSource = false; + + switch(data->mType) { + case VSpanData::Type::Solid: + solidSource = vAlpha(data->mSolid) & 0xFF; + op.srcFetch = nullptr; + break; + case VSpanData::Type::LinearGradient: + solidSource = false; + getLinearGradientValues(&op.linear, data); + op.srcFetch = &fetch_linear_gradient; + break; + default: + break; + } + + op.mode = data->mRasterBuffer->mCompositionMode; + if (op.mode == VPainter::CompModeSrcOver && solidSource) + op.mode = VPainter::CompModeSrc; + + op.funcSolid = functionForModeSolid[op.mode]; + op.func = functionForMode[op.mode]; + + return op; +} + +static void +blendColorARGB(int count, const VRle::Span *spans, void *userData) +{ + VSpanData *data = (VSpanData *)(userData); + Operator op = getOperator(data, spans, count); + const uint color = data->mSolid; + + if (op.mode == VPainter::CompModeSrc) { + // inline for performance + while (count--) { + uint *target = ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + if (spans->coverage == 255) { + memfill32(target, color, spans->len); + } else { + uint c = BYTE_MUL(color, spans->coverage); + int ialpha = 255 - spans->coverage; + for (int i = 0; i < spans->len; ++i) + target[i] = c + BYTE_MUL(target[i], ialpha); + } + ++spans; + } + return; + } + + while (count--) { + uint *target = ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + op.funcSolid(target, spans->len, color, spans->coverage); + ++spans; + } +} + +#define BLEND_GRADIENT_BUFFER_SIZE 2048 +static void +blendGradientARGB(int count, const VRle::Span *spans, void *userData) +{ + VSpanData *data = (VSpanData *)(userData); + Operator op = getOperator(data, spans, count); + + unsigned int buffer[BLEND_GRADIENT_BUFFER_SIZE]; + + if (!op.srcFetch) + return; + + while (count--) { + uint *target = ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + int length = spans->len; + while (length) { + int l = std::min(length, BLEND_GRADIENT_BUFFER_SIZE); + op.srcFetch(buffer, &op, data, spans->y, spans->x, l); + op.func(target, buffer, l, spans->coverage); + target += l; + length -= l; + } + ++spans; + } +} + +void +VSpanData::setup(const VBrush &brush, VPainter::CompositionMode mode, int alpha) +{ + switch (brush.type()) { + case VBrush::Type::NoBrush: + mType = VSpanData::Type::None; + break; + case VBrush::Type::Solid: + mType = VSpanData::Type::Solid; + mSolid = brush.mColor.premulARGB(); + break; + case VBrush::Type::LinearGradient: { + mType = VSpanData::Type::LinearGradient; + auto cacheInfo = VGradientCacheInstance.getBuffer(*brush.mGradient); + mGradient.mColorTable = cacheInfo->buffer32; + mGradient.mColorTableAlpha = cacheInfo->alpha; + mGradient.linear.x1 = brush.mGradient->linear.x1; + mGradient.linear.y1 = brush.mGradient->linear.y1; + mGradient.linear.x2 = brush.mGradient->linear.x2; + mGradient.linear.y2 = brush.mGradient->linear.y2; + mGradient.mSpread = brush.mGradient->mSpread; + setupMatrix(brush.mGradient->mMatrix); + break; + } + case VBrush::Type::RadialGradient: { + mType = VSpanData::Type::RadialGradient; + auto cacheInfo = VGradientCacheInstance.getBuffer(*brush.mGradient); + mGradient.mColorTable = cacheInfo->buffer32; + mGradient.mColorTableAlpha = cacheInfo->alpha; + mGradient.radial.cx = brush.mGradient->radial.cx; + mGradient.radial.cy = brush.mGradient->radial.cy; + mGradient.radial.fx = brush.mGradient->radial.fx; + mGradient.radial.fy = brush.mGradient->radial.fy; + mGradient.radial.cradius = brush.mGradient->radial.cradius; + mGradient.radial.fradius = brush.mGradient->radial.fradius; + mGradient.mSpread = brush.mGradient->mSpread; + setupMatrix(brush.mGradient->mMatrix); + break; + } + default: + break; + } + updateSpanFunc(); +} + +void VSpanData::setupMatrix(const VMatrix &matrix) +{ + VMatrix inv = matrix.inverted(); + m11 = inv.m11(); + m12 = inv.m12(); + m13 = inv.m13(); + m21 = inv.m21(); + m22 = inv.m22(); + m23 = inv.m23(); + m33 = inv.m33(); + dx = inv.m31(); + dy = inv.m32(); + + //const bool affine = inv.isAffine(); +// fast_matrix = affine +// && m11 * m11 + m21 * m21 < 1e4 +// && m12 * m12 + m22 * m22 < 1e4 +// && fabs(dx) < 1e4 +// && fabs(dy) < 1e4; +} + +void +VSpanData::updateSpanFunc() +{ + switch (mType) { + case VSpanData::Type::None: + mUnclippedBlendFunc = nullptr; + break; + case VSpanData::Type::Solid: + mUnclippedBlendFunc = &blendColorARGB; + break; + case VSpanData::Type::LinearGradient: + case VSpanData::Type::RadialGradient: { + mUnclippedBlendFunc = &blendGradientARGB; + break; + } + default: + break; + } +} + +#if !defined(__SSE2__) && !defined(__ARM_NEON__) +void +memfill32(uint32_t *dest, uint32_t value, int length) +{ + int n; + + if (length <= 0) + return; + + // Cute hack to align future memcopy operation + // and do unroll the loop a bit. Not sure it is + // the most efficient, but will do for now. + n = (length + 7) / 8; + switch (length & 0x07) + { + case 0: do { *dest++ = value; + VECTOR_FALLTHROUGH; + case 7: *dest++ = value; + VECTOR_FALLTHROUGH; + case 6: *dest++ = value; + VECTOR_FALLTHROUGH; + case 5: *dest++ = value; + VECTOR_FALLTHROUGH; + case 4: *dest++ = value; + VECTOR_FALLTHROUGH; + case 3: *dest++ = value; + VECTOR_FALLTHROUGH; + case 2: *dest++ = value; + VECTOR_FALLTHROUGH; + case 1: *dest++ = value; + } while (--n > 0); + } +} +#endif + +void vInitDrawhelperFunctions() +{ + vInitBlendFunctions(); + +#if defined(__ARM_NEON__) + // update fast path for NEON + extern void comp_func_solid_SourceOver_neon(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_solid_Source_neon(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); + + COMP_functionForModeSolid_C[VPainter::CompModeSrc] = comp_func_solid_Source_neon; + COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = comp_func_solid_SourceOver_neon; +#endif + +#if defined(__SSE2__) + // update fast path for SSE2 + extern void comp_func_solid_SourceOver_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_solid_Source_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_Source_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha); + extern void comp_func_SourceOver_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha); + + COMP_functionForModeSolid_C[VPainter::CompModeSrc] = comp_func_solid_Source_sse2; + COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = comp_func_solid_SourceOver_sse2; + + COMP_functionForMode_C[VPainter::CompModeSrc] = comp_func_Source_sse2; + COMP_functionForMode_C[VPainter::CompModeSrcOver] = comp_func_SourceOver_sse2; +#endif +} + +V_CONSTRUCTOR_FUNCTION(vInitDrawhelperFunctions) + diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h new file mode 100644 index 0000000000..0826f00908 --- /dev/null +++ b/src/vector/vdrawhelper.h @@ -0,0 +1,182 @@ +#ifndef VDRAWHELPER_H +#define VDRAWHELPER_H + +#include"vrect.h" +#include"vbrush.h" +#include"vrle.h" +#include"vpainter.h" +#include"vbitmap.h" +#include"assert.h" +#include + +struct VSpanData; +struct Operator; + +typedef void (*CompositionFunctionSolid)(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); +typedef void (*CompositionFunction)(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha); +typedef void (*SourceFetchProc)(uint32_t *buffer, const Operator *o, const VSpanData *data, int y, int x, int length); +typedef void (*ProcessRleSpan)(int count, const VRle::Span *spans, void *userData); + +extern void memfill32(uint32_t *dest, uint32_t value, int count); + + +struct LinearGradientValues +{ + float dx; + float dy; + float l; + float off; +}; + +struct RadialGradientValues +{ + float dx; + float dy; + float dr; + float sqrfr; + float a; + float inv2a; + bool extended; +}; + +struct Operator +{ + VPainter::CompositionMode mode; + SourceFetchProc srcFetch; + CompositionFunctionSolid funcSolid; + CompositionFunction func; + union { + LinearGradientValues linear; + RadialGradientValues radial; + }; +}; + +class VRasterBuffer +{ +public: + VRasterBuffer(){ init();} + void init(); + VBitmap::Format prepare(VBitmap *image); + void prepare(int w, int h); + void prepareBuffer(int w, int h); + void clear(); + + void resetBuffer(int val=0); + + inline uchar *scanLine(int y) { assert(y>=0); assert(y mCachedGradient; + union { + uint32_t mSolid; + VGradientData mGradient; + }; + float m11, m12, m13, m21, m22, m23, m33, dx, dy; // inverse xform matrix +}; + +void vInitDrawhelperFunctions(); +extern void vInitBlendFunctions(); + +#define BYTE_MUL(c, a) \ + ( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \ + (((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) ) + +inline constexpr int vRed(uint32_t c) +{ return ((c >> 16) & 0xff); } + +inline constexpr int vGreen(uint32_t c) +{ return ((c >> 8) & 0xff); } + +inline constexpr int vBlue(uint32_t c) +{ return (c & 0xff); } + +inline constexpr int vAlpha(uint32_t c) +{ return c >> 24; } + +static inline uint +INTERPOLATE_PIXEL_255(uint x, uint a, uint y, uint b) +{ + uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; + t >>= 8; + t &= 0xff00ff; + x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; + x &= 0xff00ff00; + x |= t; + return x; +} + + + +#define LOOP_ALIGNED_U1_A4(DEST, LENGTH, UOP, A4OP) \ + { \ + while((uintptr_t)DEST & 0xF && LENGTH) UOP \ + \ + while(LENGTH) { \ + switch(LENGTH) { \ + case 3: \ + case 2: \ + case 1: \ + UOP \ + break; \ + default: \ + A4OP \ + break; \ + } \ + } \ + } + +#endif //QDRAWHELPER_P_H diff --git a/src/vector/vdrawhelper_neon.cpp b/src/vector/vdrawhelper_neon.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/vector/vdrawhelper_sse2.cpp b/src/vector/vdrawhelper_sse2.cpp new file mode 100644 index 0000000000..18b4acf88f --- /dev/null +++ b/src/vector/vdrawhelper_sse2.cpp @@ -0,0 +1,299 @@ +#if defined(__SSE2__) + +#include"vdrawhelper.h" + +#include /* for _mm_shuffle_pi16 and _MM_SHUFFLE */ +#include /* for SSE2 intrinsics */ + +// Each 32bits components of alphaChannel must be in the form 0x00AA00AA +inline static __m128i +v4_byte_mul_sse2(__m128i c, __m128i a) +{ + const __m128i ag_mask = _mm_set1_epi32(0xFF00FF00); + const __m128i rb_mask = _mm_set1_epi32(0x00FF00FF); + + /* for AG */ + __m128i v_ag = _mm_and_si128(ag_mask, c); + v_ag = _mm_srli_epi32(v_ag, 8); + v_ag = _mm_mullo_epi16(a, v_ag); + v_ag = _mm_and_si128(ag_mask, v_ag); + + /* for RB */ + __m128i v_rb = _mm_and_si128(rb_mask, c); + v_rb = _mm_mullo_epi16(a, v_rb); + v_rb = _mm_srli_epi32(v_rb, 8); + v_rb = _mm_and_si128(rb_mask, v_rb); + + /* combine */ + return _mm_add_epi32(v_ag, v_rb); +} + +static inline __m128i +v4_ialpha_sse2(__m128i c) +{ + __m128i a = _mm_srli_epi32(c, 24); + + return _mm_sub_epi32(_mm_set1_epi32(0xff), a); +} + +static inline __m128i +v4_interpolate_color_sse2(__m128i a, __m128i c0, __m128i c1) +{ + const __m128i rb_mask = _mm_set1_epi32(0xFF00FF00); + const __m128i zero = _mm_setzero_si128(); + + __m128i a_l = a; + __m128i a_h = a; + a_l = _mm_unpacklo_epi16(a_l, a_l); + a_h = _mm_unpackhi_epi16(a_h, a_h); + + __m128i a_t = _mm_slli_epi64(a_l, 32); + __m128i a_t0 = _mm_slli_epi64(a_h, 32); + + a_l = _mm_add_epi32(a_l, a_t); + a_h = _mm_add_epi32(a_h, a_t0); + + __m128i c0_l = c0; + __m128i c0_h = c0; + + c0_l = _mm_unpacklo_epi8(c0_l, zero); + c0_h = _mm_unpackhi_epi8(c0_h, zero); + + __m128i c1_l = c1; + __m128i c1_h = c1; + + c1_l = _mm_unpacklo_epi8(c1_l, zero); + c1_h = _mm_unpackhi_epi8(c1_h, zero); + + __m128i cl_sub = _mm_sub_epi16(c0_l, c1_l); + __m128i ch_sub = _mm_sub_epi16(c0_h, c1_h); + + cl_sub = _mm_mullo_epi16(cl_sub, a_l); + ch_sub = _mm_mullo_epi16(ch_sub, a_h); + + __m128i c1ls = _mm_slli_epi16(c1_l, 8); + __m128i c1hs = _mm_slli_epi16(c1_h, 8); + + cl_sub = _mm_add_epi16(cl_sub, c1ls); + ch_sub = _mm_add_epi16(ch_sub, c1hs); + + cl_sub = _mm_and_si128(cl_sub, rb_mask); + ch_sub = _mm_and_si128(ch_sub, rb_mask); + + cl_sub = _mm_srli_epi64(cl_sub, 8); + ch_sub = _mm_srli_epi64(ch_sub, 8); + + cl_sub = _mm_packus_epi16(cl_sub, cl_sub); + ch_sub = _mm_packus_epi16(ch_sub, ch_sub); + + return (__m128i) _mm_shuffle_ps( (__m128)cl_sub, (__m128)ch_sub, 0x44); +} + + + +// Load src and dest vector +#define V4_FETCH_SRC_DEST \ + __m128i v_src = _mm_loadu_si128((__m128i *)src); \ + __m128i v_dest = _mm_load_si128((__m128i *)dest); + +#define V4_FETCH_SRC \ + __m128i v_src = _mm_loadu_si128((__m128i *)src); + +#define V4_STORE_DEST \ + _mm_store_si128((__m128i *)dest, v_src); + +#define V4_SRC_DEST_LEN_INC \ + dest += 4; src +=4; length -= 4; + +// Multiply src color with const_alpha +#define V4_ALPHA_MULTIPLY \ + v_src = v4_byte_mul_sse2(v_src, v_alpha); + +// dest = src + dest * sia +#define V4_COMP_OP_SRC_OVER \ + __m128i v_sia = v4_ialpha_sse2(v_src); \ + v_sia = _mm_add_epi32(v_sia, _mm_slli_epi32(v_sia, 16)); \ + v_dest = v4_byte_mul_sse2(v_dest, v_sia); \ + v_src = _mm_add_epi32(v_src, v_dest); + +// dest = src + dest * sia +#define V4_COMP_OP_SRC \ + v_src = v4_interpolate_color_sse2(v_alpha, v_src, v_dest); + + +void +memfill32(uint32_t *dest, uint32_t value, int length) +{ + __m128i vector_data = _mm_set_epi32(value, value, value, value); + + // run till memory alligned to 16byte memory + while (length && ((uintptr_t)dest & 0xf)) + { + *dest++ = value; + length--; + } + + while (length >= 32) + { + _mm_store_si128 ((__m128i*)(dest), vector_data); + _mm_store_si128 ((__m128i*)(dest + 4), vector_data); + _mm_store_si128 ((__m128i*)(dest + 8), vector_data); + _mm_store_si128 ((__m128i*)(dest + 12), vector_data); + _mm_store_si128 ((__m128i*)(dest + 16), vector_data); + _mm_store_si128 ((__m128i*)(dest + 20), vector_data); + _mm_store_si128 ((__m128i*)(dest + 24), vector_data); + _mm_store_si128 ((__m128i*)(dest + 28), vector_data); + + dest += 32; + length -= 32; + } + + if (length >= 16) + { + _mm_store_si128 ((__m128i*)(dest), vector_data); + _mm_store_si128 ((__m128i*)(dest + 4), vector_data); + _mm_store_si128 ((__m128i*)(dest + 8), vector_data); + _mm_store_si128 ((__m128i*)(dest + 12), vector_data); + + dest += 16; + length -= 16; + } + + if (length >= 8) + { + _mm_store_si128 ((__m128i*)(dest), vector_data); + _mm_store_si128 ((__m128i*)(dest + 4), vector_data); + + dest += 8; + length -= 8; + } + + if (length >= 4) + { + _mm_store_si128 ((__m128i*)(dest), vector_data); + + dest += 4; + length -= 4; + } + + while (length) + { + *dest++ = value; + length--; + } +} + +// dest = color + (dest * alpha) +inline static void +comp_func_helper_sse2(uint32_t *dest, int length, uint32_t color, uint32_t alpha) +{ + const __m128i v_color = _mm_set1_epi32(color); + const __m128i v_a = _mm_set1_epi16(alpha); + + LOOP_ALIGNED_U1_A4(dest, length, + { /* UOP */ + *dest = color + BYTE_MUL(*dest, alpha); + dest++; length--; + }, + { /* A4OP */ + __m128i v_dest = _mm_load_si128((__m128i *)dest); + + v_dest = v4_byte_mul_sse2(v_dest, v_a); + v_dest = _mm_add_epi32(v_dest, v_color); + + _mm_store_si128((__m128i *)dest, v_dest); + + dest += 4; length -= 4; + }) +} + +void +comp_func_solid_Source_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +{ + if (const_alpha == 255) + { + memfill32(dest, color, length); + } + else + { + int ialpha; + + ialpha = 255 - const_alpha; + color = BYTE_MUL(color, const_alpha); + comp_func_helper_sse2(dest, length, color, ialpha); + } +} + +void +comp_func_solid_SourceOver_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +{ + int ialpha; + + if (const_alpha != 255) + color = BYTE_MUL(color, const_alpha); + ialpha = 255 - vAlpha(color); + comp_func_helper_sse2(dest, length, color, ialpha); +} + +void comp_func_Source_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +{ + int ialpha; + if (const_alpha == 255) { + memcpy(dest, src, length * sizeof(uint32_t)); + } else { + ialpha = 255 - const_alpha; + __m128i v_alpha = _mm_set1_epi32(const_alpha); + + LOOP_ALIGNED_U1_A4(dest, length, + { /* UOP */ + *dest = INTERPOLATE_PIXEL_255(*src, const_alpha, *dest, ialpha); + dest++; src++; length--; + }, + { /* A4OP */ + V4_FETCH_SRC_DEST + V4_COMP_OP_SRC + V4_STORE_DEST + V4_SRC_DEST_LEN_INC + }) + } +} + +void comp_func_SourceOver_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +{ + uint32_t s, sia; + + if (const_alpha == 255) { + LOOP_ALIGNED_U1_A4(dest, length, + { /* UOP */ + s = *src; + sia = vAlpha(~s); + *dest = s + BYTE_MUL(*dest, sia); + dest++; src++; length--; + }, + { /* A4OP */ + V4_FETCH_SRC_DEST + V4_COMP_OP_SRC_OVER + V4_STORE_DEST + V4_SRC_DEST_LEN_INC + }) + } else { + __m128i v_alpha = _mm_set1_epi32(const_alpha); + LOOP_ALIGNED_U1_A4(dest, length, + { /* UOP */ + s = BYTE_MUL(*src, const_alpha); + sia = vAlpha(~s); + *dest = s + BYTE_MUL(*dest, sia); + dest++; src++; length--; + }, + { /* A4OP */ + V4_FETCH_SRC_DEST + V4_ALPHA_MULTIPLY + V4_COMP_OP_SRC_OVER + V4_STORE_DEST + V4_SRC_DEST_LEN_INC + }) + } +} + + +#endif diff --git a/src/vector/velapsedtimer.cpp b/src/vector/velapsedtimer.cpp new file mode 100644 index 0000000000..e4d516c6fb --- /dev/null +++ b/src/vector/velapsedtimer.cpp @@ -0,0 +1,29 @@ +#include"velapsedtimer.h" + +void VElapsedTimer::start() +{ + clock = std::chrono::high_resolution_clock::now(); + m_valid = true; +} + +double VElapsedTimer::restart() +{ + double elapsedTime = elapsed(); + start(); + return elapsedTime; +} + +double VElapsedTimer::elapsed() const +{ + if (!isValid()) return 0; + return std::chrono::duration(std::chrono::high_resolution_clock::now()-clock).count(); +} + +bool VElapsedTimer::hasExpired(double time) +{ + double elapsedTime = elapsed(); + if (elapsedTime > time) + return true; + return false; +} + diff --git a/src/vector/velapsedtimer.h b/src/vector/velapsedtimer.h new file mode 100644 index 0000000000..070c7d8326 --- /dev/null +++ b/src/vector/velapsedtimer.h @@ -0,0 +1,20 @@ +#ifndef VELAPSEDTIMER_H +#define VELAPSEDTIMER_H + +#include "vglobal.h" +#include + +class VElapsedTimer +{ +public: + VElapsedTimer():m_valid(false){} + double elapsed() const; + bool hasExpired(double millsec); + void start(); + double restart(); + inline bool isValid() const {return m_valid;} +private: + std::chrono::high_resolution_clock::time_point clock; + bool m_valid; +}; +#endif // VELAPSEDTIMER_H diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h new file mode 100644 index 0000000000..b531344121 --- /dev/null +++ b/src/vector/vglobal.h @@ -0,0 +1,220 @@ +#ifndef VGLOBAL_H +#define VGLOBAL_H + +#include +#include +#include +#include +#include + +typedef uint32_t uint; +typedef uint16_t ushort; +typedef uint8_t uchar; + + +#define V_UNUSED __attribute__((__unused__)) +#define V_REQUIRED_RESULT __attribute__ ((__warn_unused_result__)) + +#define V_CONSTEXPR constexpr +#define V_NOTHROW noexcept + +#include"vdebug.h" + +#define VECTOR_FALLTHROUGH + +class RefCount +{ +public: + inline RefCount(){} + inline RefCount(int i):atomic(i){} + inline bool ref() { + int count = atomic; + if (count == 0) // !isSharable + return false; + if (count != -1) // !isStatic + atomic++; + return true; + } + inline bool deref() { + int count = atomic; + if (count == 0) // !isSharable + return false; + if (count == -1) // isStatic + return true; + return --atomic; + } + bool isShared() const + { + int count = atomic; + return (count != 1) && (count != 0); + } + bool isStatic() const + { + // Persistent object, never deleted + return atomic == -1; + } + inline int count()const{return atomic;} + void setOwned() { atomic = 1; } + void setUnsharable() { atomic = 0; } +private: + int atomic; +}; + +template +V_CONSTEXPR inline const T &vMin(const T &a, const T &b) { return (a < b) ? a : b; } +template +V_CONSTEXPR inline const T &vMax(const T &a, const T &b) { return (a < b) ? b : a; } + +static inline bool vCompare(double p1, double p2) +{ + return (std::abs(p1 - p2) * 1000000000000. <= vMin(std::abs(p1), std::abs(p2))); +} + +static inline bool vCompare(float p1, float p2) +{ + return (std::abs(p1 - p2) * 100000.f <= vMin(std::abs(p1), std::abs(p2))); +} + +static inline bool floatCmp(float p1, float p2) +{ + return (std::abs(p1 - p2) * 100000.f <= fminf(std::abs(p1), std::abs(p2))); +} + +static inline bool floatNull(float f) +{ + return std::abs(f) <= 0.00001f; +} + + +static inline bool vIsNull(double d) +{ + return std::abs(d) <= 0.000000000001; +} + +static inline bool vIsNull(float f) +{ + return std::abs(f) <= 0.00001f; +} + +class vFlagHelper +{ + int i; +public: + constexpr inline vFlagHelper(int ai) noexcept : i(ai) {} + constexpr inline operator int() const noexcept { return i; } + + constexpr inline vFlagHelper(uint ai) noexcept : i(int(ai)) {} + constexpr inline vFlagHelper(short ai) noexcept : i(int(ai)) {} + constexpr inline vFlagHelper(ushort ai) noexcept : i(int(uint(ai))) {} + constexpr inline operator uint() const noexcept { return uint(i); } +}; + +template +class vFlag +{ +public: + static_assert((sizeof(Enum) <= sizeof(int)), + "vFlag only supports int as storage so bigger type will overflow"); + static_assert((std::is_enum::value), "vFlag is only usable on enumeration types."); + + typedef typename std::conditional< + std::is_unsigned::type>::value, + unsigned int, + signed int + >::type Int; + + typedef Enum enum_type; + // compiler-generated copy/move ctor/assignment operators are fine! + + constexpr inline vFlag(Enum f) noexcept : i(Int(f)) {} + constexpr inline vFlag() noexcept : i(0) {} + constexpr inline vFlag(vFlagHelper f) noexcept : i(f) {} + + inline vFlag &operator&=(int mask) noexcept { i &= mask; return *this; } + inline vFlag &operator&=(uint mask) noexcept { i &= mask; return *this; } + inline vFlag &operator&=(Enum mask) noexcept { i &= Int(mask); return *this; } + inline vFlag &operator|=(vFlag f) noexcept { i |= f.i; return *this; } + inline vFlag &operator|=(Enum f) noexcept { i |= Int(f); return *this; } + inline vFlag &operator^=(vFlag f) noexcept { i ^= f.i; return *this; } + inline vFlag &operator^=(Enum f) noexcept { i ^= Int(f); return *this; } + + constexpr inline operator Int() const noexcept { return i; } + + constexpr inline vFlag operator|(vFlag f) const { return vFlag(vFlagHelper(i | f.i)); } + constexpr inline vFlag operator|(Enum f) const noexcept { return vFlag(vFlagHelper(i | Int(f))); } + constexpr inline vFlag operator^(vFlag f) const noexcept { return vFlag(vFlagHelper(i ^ f.i)); } + constexpr inline vFlag operator^(Enum f) const noexcept { return vFlag(vFlagHelper(i ^ Int(f))); } + constexpr inline vFlag operator&(int mask) const noexcept { return vFlag(vFlagHelper(i & mask)); } + constexpr inline vFlag operator&(uint mask) const noexcept { return vFlag(vFlagHelper(i & mask)); } + constexpr inline vFlag operator&(Enum f) const noexcept { return vFlag(vFlagHelper(i & Int(f))); } + constexpr inline vFlag operator~() const noexcept { return vFlag(vFlagHelper(~i)); } + + constexpr inline bool operator!() const noexcept { return !i; } + + constexpr inline bool testFlag(Enum f) const noexcept { return (i & Int(f)) == Int(f) && (Int(f) != 0 || i == Int(f) ); } + inline vFlag &setFlag(Enum f, bool on = true) noexcept + { + return on ? (*this |= f) : (*this &= ~f); + } + + Int i; +}; + + +class VColor +{ +public: + inline VColor() noexcept {a = r = g = b = 0;} + inline VColor(int red, int green, int blue, int alpha = 255) noexcept { r = red; g = green; b = blue; a = alpha; } + inline int red() const noexcept {return r;} + inline int green() const noexcept{return g;} + inline int blue() const noexcept{return b;} + inline int alpha() const noexcept{return a;} + inline void setRed(int red) noexcept {r = red;} + inline void setGreen(int green)noexcept {g = green;} + inline void setBlue(int blue)noexcept {b = blue;} + inline void setAlpha(int alpha)noexcept {a = alpha;} + inline bool isOpaque() const{return a == 255;} + inline bool operator==(const VColor &o) const { return ((a==o.a) && (r==o.r) && (g == o.g) && (b == o.b));} + uint premulARGB() const { + int pr= (r * a)/255; + int pg= (g * a)/255; + int pb= (b * a)/255; + return uint((a<<24) | (pr<<16) | (pg<<8) | (pb)); + } +public: + ushort a; + ushort r; + ushort g; + ushort b; +}; + +enum class FillRule { + EvenOdd, + Winding +}; + +enum class JoinStyle { + Miter, + Bevel, + Round +}; +enum class CapStyle { + Flat, + Square, + Round +}; + + +#ifndef V_CONSTRUCTOR_FUNCTION +# define V_CONSTRUCTOR_FUNCTION0(AFUNC) \ + namespace { \ + static const struct AFUNC ## _ctor_class_ { \ + inline AFUNC ## _ctor_class_() { AFUNC(); } \ + } AFUNC ## _ctor_instance_; \ + } + +# define V_CONSTRUCTOR_FUNCTION(AFUNC) V_CONSTRUCTOR_FUNCTION0(AFUNC) +#endif + +#endif //VGLOBAL_H diff --git a/src/vector/vinterpolator.cpp b/src/vector/vinterpolator.cpp new file mode 100644 index 0000000000..5c285f6420 --- /dev/null +++ b/src/vector/vinterpolator.cpp @@ -0,0 +1,130 @@ +#include"vinterpolator.h" +#include + +#define NEWTON_ITERATIONS 4 +#define NEWTON_MIN_SLOPE 0.02 +#define SUBDIVISION_PRECISION 0.0000001 +#define SUBDIVISION_MAX_ITERATIONS 10 + +const float VInterpolator::kSampleStepSize = + 1.0 / float(VInterpolator::kSplineTableSize - 1); + +void +VInterpolator::init(float aX1, float aY1, float aX2, float aY2) +{ + mX1 = aX1; + mY1 = aY1; + mX2 = aX2; + mY2 = aY2; + + if (mX1 != mY1 || mX2 != mY2) + CalcSampleValues(); +} + +/*static*/ float +VInterpolator::CalcBezier(float aT, + float aA1, + float aA2) +{ + // use Horner's scheme to evaluate the Bezier polynomial + return ((A(aA1, aA2)*aT + B(aA1, aA2))*aT + C(aA1))*aT; +} + +void +VInterpolator::CalcSampleValues() +{ + for (int i = 0; i < kSplineTableSize; ++i) { + mSampleValues[i] = CalcBezier(float(i) * kSampleStepSize, mX1, mX2); + } +} + +float +VInterpolator::GetSlope(float aT, + float aA1, + float aA2) +{ + return 3.0 * A(aA1, aA2)*aT*aT + 2.0 * B(aA1, aA2) * aT + C(aA1); +} + + +float +VInterpolator::value(float aX) const +{ + if (mX1 == mY1 && mX2 == mY2) + return aX; + + return CalcBezier(GetTForX(aX), mY1, mY2); +} + +float +VInterpolator::GetTForX(float aX) const +{ + // Find interval where t lies + float intervalStart = 0.0; + const float* currentSample = &mSampleValues[1]; + const float* const lastSample = &mSampleValues[kSplineTableSize - 1]; + for (; currentSample != lastSample && *currentSample <= aX; + ++currentSample) { + intervalStart += kSampleStepSize; + } + --currentSample; // t now lies between *currentSample and *currentSample+1 + + // Interpolate to provide an initial guess for t + float dist = (aX - *currentSample) / + (*(currentSample+1) - *currentSample); + float guessForT = intervalStart + dist * kSampleStepSize; + + // Check the slope to see what strategy to use. If the slope is too small + // Newton-Raphson iteration won't converge on a root so we use bisection + // instead. + float initialSlope = GetSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return NewtonRaphsonIterate(aX, guessForT); + } else if (initialSlope == 0.0) { + return guessForT; + } else { + return BinarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize); + } +} + +float +VInterpolator::NewtonRaphsonIterate(float aX, float aGuessT) const +{ + // Refine guess with Newton-Raphson iteration + for (int i = 0; i < NEWTON_ITERATIONS; ++i) { + // We're trying to find where f(t) = aX, + // so we're actually looking for a root for: CalcBezier(t) - aX + float currentX = CalcBezier(aGuessT, mX1, mX2) - aX; + float currentSlope = GetSlope(aGuessT, mX1, mX2); + + if (currentSlope == 0.0) + return aGuessT; + + aGuessT -= currentX / currentSlope; + } + + return aGuessT; +} + +float +VInterpolator::BinarySubdivide(float aX, float aA, float aB) const +{ + float currentX; + float currentT; + int i = 0; + + do + { + currentT = aA + (aB - aA) / 2.0; + currentX = CalcBezier(currentT, mX1, mX2) - aX; + + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (fabs(currentX) > SUBDIVISION_PRECISION + && ++i < SUBDIVISION_MAX_ITERATIONS); + + return currentT; +} diff --git a/src/vector/vinterpolator.h b/src/vector/vinterpolator.h new file mode 100644 index 0000000000..23c78e89cf --- /dev/null +++ b/src/vector/vinterpolator.h @@ -0,0 +1,79 @@ +#ifndef VINTERPOLATOR_H +#define VINTERPOLATOR_H + +#include "vpoint.h" + +class VInterpolator +{ +public: + VInterpolator() { /* caller must call Init later */ } + + VInterpolator(float aX1, float aY1, + float aX2, float aY2) + { + init(aX1, aY1, aX2, aY2); + } + + VInterpolator(VPointF pt1, VPointF pt2) + { + init(pt1.x(), pt1.y(), pt2.x(), pt2.y()); + } + + void init(float aX1, float aY1, + float aX2, float aY2); + + float value(float aX) const; + + void GetSplineDerivativeValues(float aX, float& aDX, float& aDY) const; +private: + void + CalcSampleValues(); + + /** + * Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. + */ + static float + CalcBezier(float aT, float aA1, float aA2); + + /** + * Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + */ + static float + GetSlope(float aT, float aA1, float aA2); + + float + GetTForX(float aX) const; + + float + NewtonRaphsonIterate(float aX, float aGuessT) const; + + float + BinarySubdivide(float aX, float aA, float aB) const; + + static float + A(float aA1, float aA2) + { + return 1.0 - 3.0 * aA2 + 3.0 * aA1; + } + + static float + B(float aA1, float aA2) + { + return 3.0 * aA2 - 6.0 * aA1; + } + + static float + C(float aA1) + { + return 3.0 * aA1; + } + + float mX1; + float mY1; + float mX2; + float mY2; + enum { kSplineTableSize = 11 }; + float mSampleValues[kSplineTableSize]; + static const float kSampleStepSize; +}; +#endif // VINTERPOLATOR_H diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp new file mode 100644 index 0000000000..9f47484046 --- /dev/null +++ b/src/vector/vmatrix.cpp @@ -0,0 +1,835 @@ +#include"vmatrix.h" +#include +#include +#include +#include + +/* m11 m21 mtx + * m12 m22 mty + * m13 m23 m33 + */ + +struct VMatrixData { + RefCount ref; + VMatrix::MatrixType type; + VMatrix::MatrixType dirty; + float m11, m12, m13; + float m21, m22, m23; + float mtx, mty, m33; +}; +static const struct VMatrixData shared_empty = {RefCount(-1), + VMatrix::MatrixType::None, + VMatrix::MatrixType::None, + 1, 0, 0, + 0, 1, 0, + 0, 0, 1}; +inline float VMatrix::determinant() const +{ + return d->m11*(d->m33*d->m22 - d->mty*d->m23) - + d->m21*(d->m33*d->m12 - d->mty*d->m13)+d->mtx*(d->m23*d->m12 - d->m22*d->m13); +} + +bool VMatrix::isAffine() const +{ + return type() < MatrixType::Project; +} + +bool VMatrix::isIdentity() const +{ + return type() == MatrixType::None; +} + +bool VMatrix::isInvertible() const +{ + return !vIsNull(determinant()); +} + +bool VMatrix::isScaling() const +{ + return type() >= MatrixType::Scale; +} +bool VMatrix::isRotating() const +{ + return type() >= MatrixType::Rotate; +} + +bool VMatrix::isTranslating() const +{ + return type() >= MatrixType::Translate; +} + +inline void VMatrix::cleanUp(VMatrixData *d) +{ + delete d; +} + +void VMatrix::detach() +{ + if (d->ref.isShared()) + *this = copy(); +} + +VMatrix VMatrix::copy() const +{ + VMatrix r; + + r.d = new VMatrixData; + memcpy(r.d, d, sizeof(VMatrixData)); + r.d->ref.setOwned(); + return r; +} + +VMatrix::VMatrix() + : d(const_cast(&shared_empty)) +{ +} + +VMatrix::~VMatrix() +{ + if (!d->ref.deref()) + cleanUp(d); +} + +VMatrix::VMatrix(bool init V_UNUSED) +{ + d = new VMatrixData; + memcpy(d, &shared_empty, sizeof(VMatrixData)); + d->ref.setOwned(); +} + +VMatrix::VMatrix(float h11, float h12, float h13, + float h21, float h22, float h23, + float h31, float h32, float h33) +{ + d = new VMatrixData; + d->ref.setOwned(); + d->m11 = h11; d->m12 = h12; d->m13 = h13; + d->m21 = h21; d->m22 = h22; d->m23 = h23; + d->mtx = h31; d->mty = h32; d->m33 = h33; + d->type = MatrixType::None; + d->dirty = MatrixType::Project; +} + +VMatrix::VMatrix(const VMatrix &m) +{ + d = m.d; + d->ref.ref(); +} + +VMatrix::VMatrix(VMatrix &&other): d(other.d) +{ + other.d = const_cast(&shared_empty); +} + +VMatrix &VMatrix::operator=(const VMatrix &m) +{ + m.d->ref.ref(); + if (!d->ref.deref()) + cleanUp(d); + + d = m.d; + return *this; +} + +inline VMatrix &VMatrix::operator=(VMatrix &&other) +{ + if (!d->ref.deref()) + cleanUp(d); + d = other.d; + other.d = const_cast(&shared_empty); + return *this; +} + +inline VMatrix &VMatrix::operator*=(float num) +{ + if (num == 1.) + return *this; + detach(); + d->m11 *= num; + d->m12 *= num; + d->m13 *= num; + d->m21 *= num; + d->m22 *= num; + d->m23 *= num; + d->mtx *= num; + d->mty *= num; + d->m33 *= num; + if (d->dirty < MatrixType::Scale) + d->dirty = MatrixType::Scale; + + return *this; +} + +inline VMatrix &VMatrix::operator/=(float div) +{ + if (div == 0) + return *this; + detach(); + div = 1/div; + return operator*=(div); +} + +VMatrix::MatrixType VMatrix::type() const +{ + if(d->dirty == MatrixType::None || d->dirty < d->type) + return static_cast(d->type); + + switch (static_cast(d->dirty)) { + case MatrixType::Project: + if (!vIsNull(d->m13) || !vIsNull(d->m23) || !vIsNull(d->m33 - 1)) { + d->type = MatrixType::Project; + break; + } + case MatrixType::Shear: + case MatrixType::Rotate: + if (!vIsNull(d->m12) || !vIsNull(d->m21)) { + const float dot = d->m11 * d->m12 + d->m21 * d->m22; + if (vIsNull(dot)) + d->type = MatrixType::Rotate; + else + d->type = MatrixType::Shear; + break; + } + case MatrixType::Scale: + if (!vIsNull(d->m11 - 1) || !vIsNull(d->m22 - 1)) { + d->type = MatrixType::Scale; + break; + } + case MatrixType::Translate: + if (!vIsNull(d->mtx) || !vIsNull(d->mty)) { + d->type = MatrixType::Translate; + break; + } + case MatrixType::None: + d->type = MatrixType::None; + break; + } + + d->dirty = MatrixType::None; + return static_cast(d->type); +} + + +VMatrix &VMatrix::translate(float dx, float dy) +{ + if (dx == 0 && dy == 0) + return *this; + detach(); + switch(type()) { + case MatrixType::None: + d->mtx = dx; + d->mty = dy; + break; + case MatrixType::Translate: + d->mtx += dx; + d->mty += dy; + break; + case MatrixType::Scale: + d->mtx += dx* d->m11; + d->mty += dy* d->m22; + break; + case MatrixType::Project: + d->m33 += dx * d->m13 + dy * d->m23; + case MatrixType::Shear: + case MatrixType::Rotate: + d->mtx += dx*d->m11 + dy*d->m21; + d->mty += dy*d->m22 + dx*d->m12; + break; + } + if (d->dirty < MatrixType::Translate) + d->dirty = MatrixType::Translate; + return *this; +} + +VMatrix & VMatrix::scale(float sx, float sy) +{ + if (sx == 1 && sy == 1) + return *this; + detach(); + switch(type()) { + case MatrixType::None: + case MatrixType::Translate: + d->m11 = sx; + d->m22 = sy; + break; + case MatrixType::Project: + d->m13 *= sx; + d->m23 *= sy; + case MatrixType::Rotate: + case MatrixType::Shear: + d->m12 *= sx; + d->m21 *= sy; + case MatrixType::Scale: + d->m11 *= sx; + d->m22 *= sy; + break; + } + if (d->dirty < MatrixType::Scale) + d->dirty = MatrixType::Scale; + return *this; +} + +VMatrix & VMatrix::shear(float sh, float sv) +{ + if (sh == 0 && sv == 0) + return *this; + detach(); + switch(type()) { + case MatrixType::None: + case MatrixType::Translate: + d->m12 = sv; + d->m21 = sh; + break; + case MatrixType::Scale: + d->m12 = sv*d->m22; + d->m21 = sh*d->m11; + break; + case MatrixType::Project: { + float tm13 = sv*d->m23; + float tm23 = sh*d->m13; + d->m13 += tm13; + d->m23 += tm23; + } + case MatrixType::Rotate: + case MatrixType::Shear: { + float tm11 = sv*d->m21; + float tm22 = sh*d->m12; + float tm12 = sv*d->m22; + float tm21 = sh*d->m11; + d->m11 += tm11; d->m12 += tm12; + d->m21 += tm21; d->m22 += tm22; + break; + } + } + if (d->dirty < MatrixType::Shear) + d->dirty = MatrixType::Shear; + return *this; +} + + +static const float deg2rad = float(0.017453292519943295769); // pi/180 +static const float inv_dist_to_plane = 1. / 1024.; + +VMatrix & VMatrix::rotate(float a, Axis axis) +{ + if (a == 0) + return *this; + detach(); + float sina = 0; + float cosa = 0; + if (a == 90. || a == -270.) + sina = 1.; + else if (a == 270. || a == -90.) + sina = -1.; + else if (a == 180.) + cosa = -1.; + else{ + float b = deg2rad*a; // convert to radians + sina = std::sin(b); // fast and convenient + cosa = std::cos(b); + } + + if (axis == Axis::Z) { + switch(type()) { + case MatrixType::None: + case MatrixType::Translate: + d->m11 = cosa; + d->m12 = sina; + d->m21 = -sina; + d->m22 = cosa; + break; + case MatrixType::Scale: { + float tm11 = cosa*d->m11; + float tm12 = sina*d->m22; + float tm21 = -sina*d->m11; + float tm22 = cosa*d->m22; + d->m11 = tm11; d->m12 = tm12; + d->m21 = tm21; d->m22 = tm22; + break; + } + case MatrixType::Project: { + float tm13 = cosa*d->m13 + sina*d->m23; + float tm23 = -sina*d->m13 + cosa*d->m23; + d->m13 = tm13; + d->m23 = tm23; + } + case MatrixType::Rotate: + case MatrixType::Shear: { + float tm11 = cosa*d->m11 + sina*d->m21; + float tm12 = cosa*d->m12 + sina*d->m22; + float tm21 = -sina*d->m11 + cosa*d->m21; + float tm22 = -sina*d->m12 + cosa*d->m22; + d->m11 = tm11; d->m12 = tm12; + d->m21 = tm21; d->m22 = tm22; + break; + } + } + if (d->dirty < MatrixType::Rotate) + d->dirty = MatrixType::Rotate; + } else { + VMatrix result; + if (axis == Axis::Y) { + result.d->m11 = cosa; + result.d->m13 = -sina * inv_dist_to_plane; + } else { + result.d->m22 = cosa; + result.d->m23 = -sina * inv_dist_to_plane; + } + result.d->type = MatrixType::Project; + *this = result * *this; + } + + return *this; +} + +VMatrix VMatrix::operator*(const VMatrix &m) const +{ + const MatrixType otherType = m.type(); + if (otherType == MatrixType::None) + return *this; + + const MatrixType thisType = type(); + if (thisType == MatrixType::None) + return m; + + VMatrix t(true); + MatrixType type = vMax(thisType, otherType); + switch(type) { + case MatrixType::None: + break; + case MatrixType::Translate: + t.d->mtx = d->mtx + m.d->mtx; + t.d->mty += d->mty + m.d->mty; + break; + case MatrixType::Scale: + { + float m11 = d->m11*m.d->m11; + float m22 = d->m22*m.d->m22; + + float m31 = d->mtx*m.d->m11 + m.d->mtx; + float m32 = d->mty*m.d->m22 + m.d->mty; + + t.d->m11 = m11; + t.d->m22 = m22; + t.d->mtx = m31; t.d->mty = m32; + break; + } + case MatrixType::Rotate: + case MatrixType::Shear: + { + float m11 = d->m11*m.d->m11 + d->m12*m.d->m21; + float m12 = d->m11*m.d->m12 + d->m12*m.d->m22; + + float m21 = d->m21*m.d->m11 + d->m22*m.d->m21; + float m22 = d->m21*m.d->m12 + d->m22*m.d->m22; + + float m31 = d->mtx*m.d->m11 + d->mty*m.d->m21 + m.d->mtx; + float m32 = d->mtx*m.d->m12 + d->mty*m.d->m22 + m.d->mty; + + t.d->m11 = m11; t.d->m12 = m12; + t.d->m21 = m21; t.d->m22 = m22; + t.d->mtx = m31; t.d->mty = m32; + break; + } + case MatrixType::Project: + { + float m11 = d->m11*m.d->m11 + d->m12*m.d->m21 + d->m13*m.d->mtx; + float m12 = d->m11*m.d->m12 + d->m12*m.d->m22 + d->m13*m.d->mty; + float m13 = d->m11*m.d->m13 + d->m12*m.d->m23 + d->m13*m.d->m33; + + float m21 = d->m21*m.d->m11 + d->m22*m.d->m21 + d->m23*m.d->mtx; + float m22 = d->m21*m.d->m12 + d->m22*m.d->m22 + d->m23*m.d->mty; + float m23 = d->m21*m.d->m13 + d->m22*m.d->m23 + d->m23*m.d->m33; + + float m31 = d->mtx*m.d->m11 + d->mty*m.d->m21 + d->m33*m.d->mtx; + float m32 = d->mtx*m.d->m12 + d->mty*m.d->m22 + d->m33*m.d->mty; + float m33 = d->mtx*m.d->m13 + d->mty*m.d->m23 + d->m33*m.d->m33; + + t.d->m11 = m11; t.d->m12 = m12; t.d->m13 = m13; + t.d->m21 = m21; t.d->m22 = m22; t.d->m23 = m23; + t.d->mtx = m31; t.d->mty = m32; t.d->m33 = m33; + } + } + + t.d->dirty = type; + t.d->type = type; + + return t; +} + +VMatrix & VMatrix::operator*=(const VMatrix &o) +{ + const MatrixType otherType = o.type(); + if (otherType == MatrixType::None) + return *this; + + const MatrixType thisType = type(); + if (thisType == MatrixType::None) + return operator=(o); + detach(); + MatrixType t = vMax(thisType, otherType); + switch(t) { + case MatrixType::None: + break; + case MatrixType::Translate: + d->mtx += o.d->mtx; + d->mty += o.d->mty; + break; + case MatrixType::Scale: + { + float m11 = d->m11*o.d->m11; + float m22 = d->m22*o.d->m22; + + float m31 = d->mtx*o.d->m11 + o.d->mtx; + float m32 = d->mty*o.d->m22 + o.d->mty; + + d->m11 = m11; + d->m22 = m22; + d->mtx = m31; d->mty = m32; + break; + } + case MatrixType::Rotate: + case MatrixType::Shear: + { + float m11 = d->m11*o.d->m11 + d->m12*o.d->m21; + float m12 = d->m11*o.d->m12 + d->m12*o.d->m22; + + float m21 = d->m21*o.d->m11 + d->m22*o.d->m21; + float m22 = d->m21*o.d->m12 + d->m22*o.d->m22; + + float m31 = d->mtx*o.d->m11 + d->mty*o.d->m21 + o.d->mtx; + float m32 = d->mtx*o.d->m12 + d->mty*o.d->m22 + o.d->mty; + + d->m11 = m11; d->m12 = m12; + d->m21 = m21; d->m22 = m22; + d->mtx = m31; d->mty = m32; + break; + } + case MatrixType::Project: + { + float m11 = d->m11*o.d->m11 + d->m12*o.d->m21 + d->m13*o.d->mtx; + float m12 = d->m11*o.d->m12 + d->m12*o.d->m22 + d->m13*o.d->mty; + float m13 = d->m11*o.d->m13 + d->m12*o.d->m23 + d->m13*o.d->m33; + + float m21 = d->m21*o.d->m11 + d->m22*o.d->m21 + d->m23*o.d->mtx; + float m22 = d->m21*o.d->m12 + d->m22*o.d->m22 + d->m23*o.d->mty; + float m23 = d->m21*o.d->m13 + d->m22*o.d->m23 + d->m23*o.d->m33; + + float m31 = d->mtx*o.d->m11 + d->mty*o.d->m21 + d->m33*o.d->mtx; + float m32 = d->mtx*o.d->m12 + d->mty*o.d->m22 + d->m33*o.d->mty; + float m33 = d->mtx*o.d->m13 + d->mty*o.d->m23 + d->m33*o.d->m33; + + d->m11 = m11; d->m12 = m12; d->m13 = m13; + d->m21 = m21; d->m22 = m22; d->m23 = m23; + d->mtx = m31; d->mty = m32; d->m33 = m33; + } + } + + d->dirty = t; + d->type = t; + + return *this; +} + +VMatrix VMatrix::adjoint() const +{ + float h11, h12, h13, + h21, h22, h23, + h31, h32, h33; + h11 = d->m22*d->m33 - d->m23*d->mty; + h21 = d->m23*d->mtx - d->m21*d->m33; + h31 = d->m21*d->mty - d->m22*d->mtx; + h12 = d->m13*d->mty - d->m12*d->m33; + h22 = d->m11*d->m33 - d->m13*d->mtx; + h32 = d->m12*d->mtx - d->m11*d->mty; + h13 = d->m12*d->m23 - d->m13*d->m22; + h23 = d->m13*d->m21 - d->m11*d->m23; + h33 = d->m11*d->m22 - d->m12*d->m21; + + return VMatrix(h11, h12, h13, + h21, h22, h23, + h31, h32, h33); +} + +VMatrix VMatrix::inverted(bool *invertible) const +{ + VMatrix invert(true); + bool inv = true; + + switch(type()) { + case MatrixType::None: + break; + case MatrixType::Translate: + invert.d->mtx = -d->mtx; + invert.d->mty = -d->mty; + break; + case MatrixType::Scale: + inv = !vIsNull(d->m11); + inv &= !vIsNull(d->m22); + if (inv) { + invert.d->m11 = 1. / d->m11; + invert.d->m22 = 1. / d->m22; + invert.d->mtx = -d->mtx * invert.d->m11; + invert.d->mty = -d->mty * invert.d->m22; + } + break; + default: + // general case + float det = determinant(); + inv = !vIsNull(det); + if (inv) + invert = (adjoint() /= det); + //TODO Test above line + break; + } + + if (invertible) + *invertible = inv; + + if (inv) { + // inverting doesn't change the type + invert.d->type = d->type; + invert.d->dirty = d->dirty; + } + + return invert; +} + +bool VMatrix::operator==(const VMatrix &o) const +{ + if (d == o.d) return true; + + return d->m11 == o.d->m11 && + d->m12 == o.d->m12 && + d->m13 == o.d->m13 && + d->m21 == o.d->m21 && + d->m22 == o.d->m22 && + d->m23 == o.d->m23 && + d->mtx == o.d->mtx && + d->mty == o.d->mty && + d->m33 == o.d->m33; +} + +bool VMatrix::operator!=(const VMatrix &o) const +{ + return !operator==(o); +} + +bool VMatrix::fuzzyCompare(const VMatrix& o) const +{ + if (*this == o) return true; + return vCompare(d->m11 , o.d->m11 ) + && vCompare(d->m12 , o.d->m12) + && vCompare(d->m21 , o.d->m21) + && vCompare(d->m22 , o.d->m22) + && vCompare(d->mtx , o.d->mtx) + && vCompare(d->mty , o.d->mty); +} + +#define V_NEAR_CLIP 0.000001 +#ifdef MAP +# undef MAP +#endif +#define MAP(x, y, nx, ny) \ + do { \ + float FX_ = x; \ + float FY_ = y; \ + switch(t) { \ + case MatrixType::None: \ + nx = FX_; \ + ny = FY_; \ + break; \ + case MatrixType::Translate: \ + nx = FX_ + d->mtx; \ + ny = FY_ + d->mty; \ + break; \ + case MatrixType::Scale: \ + nx = d->m11 * FX_ + d->mtx; \ + ny = d->m22 * FY_ + d->mty; \ + break; \ + case MatrixType::Rotate: \ + case MatrixType::Shear: \ + case MatrixType::Project: \ + nx = d->m11 * FX_ + d->m21 * FY_ + d->mtx; \ + ny = d->m12 * FX_ + d->m22 * FY_ + d->mty; \ + if (t == MatrixType::Project) { \ + float w = ( d->m13 * FX_ + d->m23 * FY_ + d->m33); \ + if (w < V_NEAR_CLIP) w = V_NEAR_CLIP; \ + w = 1./w; \ + nx *= w; \ + ny *= w; \ + } \ + } \ + } while (0) + +VRect VMatrix::map(const VRect &rect) const +{ + VMatrix::MatrixType t = type(); + if (t <= MatrixType::Translate) + return rect.translated(std::round(d->mtx), std::round(d->mty)); + + if (t <= MatrixType::Scale) { + int x = std::round(d->m11*rect.x() + d->mtx); + int y = std::round(d->m22*rect.y() + d->mty); + int w = std::round(d->m11*rect.width()); + int h = std::round(d->m22*rect.height()); + if (w < 0) { + w = -w; + x -= w; + } + if (h < 0) { + h = -h; + y -= h; + } + return VRect(x, y, w, h); + } else if (t < MatrixType::Project) { + // see mapToPolygon for explanations of the algorithm. + float x = 0, y = 0; + MAP(rect.left(), rect.top(), x, y); + float xmin = x; + float ymin = y; + float xmax = x; + float ymax = y; + MAP(rect.right() + 1, rect.top(), x, y); + xmin = vMin(xmin, x); + ymin = vMin(ymin, y); + xmax = vMax(xmax, x); + ymax = vMax(ymax, y); + MAP(rect.right() + 1, rect.bottom() + 1, x, y); + xmin = vMin(xmin, x); + ymin = vMin(ymin, y); + xmax = vMax(xmax, x); + ymax = vMax(ymax, y); + MAP(rect.left(), rect.bottom() + 1, x, y); + xmin = vMin(xmin, x); + ymin = vMin(ymin, y); + xmax = vMax(xmax, x); + ymax = vMax(ymax, y); + return VRect(std::round(xmin), std::round(ymin), std::round(xmax)-std::round(xmin), std::round(ymax)-std::round(ymin)); + } else { + // Not supported + assert(0); + } +} + +VRegion VMatrix::map(const VRegion &r) const +{ + VMatrix::MatrixType t = type(); + if (t == MatrixType::None) + return r; + + if (t == MatrixType::Translate) { + VRegion copy(r); + copy.translate(std::round(d->mtx), std::round(d->mty)); + return copy; + } + + if (t == MatrixType::Scale && r.rectCount() == 1) + return VRegion(map(r.boundingRect())); + // handle mapping of region properly + assert(0); + return r; +} + +VPointF VMatrix::map(const VPointF &p) const +{ + float fx = p.x(); + float fy = p.y(); + + float x = 0, y = 0; + + VMatrix::MatrixType t = type(); + switch(t) { + case MatrixType::None: + x = fx; + y = fy; + break; + case MatrixType::Translate: + x = fx + d->mtx; + y = fy + d->mty; + break; + case MatrixType::Scale: + x = d->m11 * fx + d->mtx; + y = d->m22 * fy + d->mty; + break; + case MatrixType::Rotate: + case MatrixType::Shear: + case MatrixType::Project: + x = d->m11 * fx + d->m21 * fy + d->mtx; + y = d->m12 * fx + d->m22 * fy + d->mty; + if (t == MatrixType::Project) { + float w = 1./(d->m13 * fx + d->m23 * fy + d->m33); + x *= w; + y *= w; + } + } + return VPointF(x, y); +} +static std::string type_helper(VMatrix::MatrixType t) +{ + switch(t) { + case VMatrix::MatrixType::None: + return "MatrixType::None"; + break; + case VMatrix::MatrixType::Translate: + return "MatrixType::Translate"; + break; + case VMatrix::MatrixType::Scale: + return "MatrixType::Scale"; + break; + case VMatrix::MatrixType::Rotate: + return "MatrixType::Rotate"; + break; + case VMatrix::MatrixType::Shear: + return "MatrixType::Shear"; + break; + case VMatrix::MatrixType::Project: + return "MatrixType::Project"; + break; + } + return ""; +} +std::ostream& operator<<(std::ostream& os, const VMatrix& o) +{ + os<<"[Matrix: [dptr = "<ref.count()<<"]"<<"type ="<m11<<" "<m12<<" "<m13<<" "<m21<<" "<m22<<" "<m23<<" "<mtx<<" "<mty<<" "<m33<<" "<<"]"<m11; +} +float VMatrix::m12()const +{ + return d->m12; +} +float VMatrix::m13()const +{ + return d->m13; +} +float VMatrix::m21()const +{ + return d->m21; +} +float VMatrix::m22()const +{ + return d->m22; +} +float VMatrix::m23()const +{ + return d->m23; +} +float VMatrix::m31()const +{ + return d->mtx; +} +float VMatrix::m32()const +{ + return d->mty; +} +float VMatrix::m33()const +{ + return d->m33; +} + + diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h new file mode 100644 index 0000000000..4e43b47dbd --- /dev/null +++ b/src/vector/vmatrix.h @@ -0,0 +1,92 @@ +#ifndef VMATRIX_H +#define VMATRIX_H +#include"vpoint.h" +#include "vregion.h" +#include "vglobal.h" + +struct VMatrixData; +class VMatrix +{ +public: + enum class Axis { + X, + Y, + Z + }; + enum class MatrixType { + None = 0x00, + Translate = 0x01, + Scale = 0x02, + Rotate = 0x04, + Shear = 0x08, + Project = 0x10 + }; + + VMatrix(); + ~VMatrix(); + VMatrix(const VMatrix &matrix); + VMatrix(VMatrix &&other); + VMatrix &operator=(const VMatrix &); + VMatrix &operator=(VMatrix &&other); + + bool isAffine() const; + bool isIdentity() const; + bool isInvertible() const; + bool isScaling() const; + bool isRotating() const; + bool isTranslating() const; + MatrixType type() const; + inline float determinant() const; + + VMatrix &translate(VPointF pos) { return translate(pos.x(), pos.y());}; + VMatrix &translate(float dx, float dy); + VMatrix &scale(VPointF s){ return scale(s.x(), s.y());}; + VMatrix &scale(float sx, float sy); + VMatrix &shear(float sh, float sv); + VMatrix &rotate(float a, Axis axis = VMatrix::Axis::Z); + VMatrix &rotateRadians(float a, Axis axis = VMatrix::Axis::Z); + + VPointF map(const VPointF &p) const; + inline VPointF map(float x, float y) const; + VRect map(const VRect &r) const; + VRegion map(const VRegion &r) const; + + V_REQUIRED_RESULT VMatrix inverted(bool *invertible = nullptr) const; + V_REQUIRED_RESULT VMatrix adjoint() const; + + VMatrix operator*(const VMatrix &o) const; + VMatrix &operator*=(const VMatrix &); + VMatrix &operator*=(float mul); + VMatrix &operator/=(float div); + bool operator==(const VMatrix &) const; + bool operator!=(const VMatrix &) const; + bool fuzzyCompare(const VMatrix &) const; + friend std::ostream& operator<<(std::ostream& os, const VMatrix& o); + + float m11()const; + float m12()const; + float m13()const; + float m21()const; + float m22()const; + float m23()const; + float m31()const; + float m32()const; + float m33()const; +private: + explicit VMatrix(bool init); + explicit VMatrix(float m11, float m12, float m13, + float m21, float m22, float m23, + float m31, float m32, float m33); + VMatrix copy() const; + void detach(); + void cleanUp(VMatrixData *x); + + VMatrixData *d; +}; + +inline VPointF VMatrix::map(float x, float y) const +{ + return map(VPointF(x, y)); +} + +#endif // VMATRIX_H diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp new file mode 100644 index 0000000000..5d3f4ebfab --- /dev/null +++ b/src/vector/vpainter.cpp @@ -0,0 +1,64 @@ +#include"vpainter.h" +#include"vdrawhelper.h" + +class VPainterImpl +{ +public: + void drawRle(const VPoint &pos, const VRle &rle); +public: + VRasterBuffer mBuffer; + VSpanData mSpanData; +}; + +void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle) +{ + if (rle.isEmpty()) return; + //mSpanData.updateSpanFunc(); + + if (!mSpanData.mUnclippedBlendFunc) return; + + // apply clip if any + VRle final = rle.intersected(mSpanData.mSystemClip); + + if (final.isEmpty()) return; + + mSpanData.mUnclippedBlendFunc(final.size(), final.data(), &mSpanData); +} + +VPainter::~VPainter() +{ + delete mImpl; +} + +VPainter::VPainter() +{ + mImpl = new VPainterImpl; +} + +VPainter::VPainter(VBitmap *buffer) +{ + mImpl = new VPainterImpl; + begin(buffer); +} +bool VPainter::begin(VBitmap *buffer) +{ + mImpl->mBuffer.prepare(buffer); + mImpl->mSpanData.init(&mImpl->mBuffer); + //TODO find a better api to clear the surface + mImpl->mBuffer.clear(); + return true; +} +void VPainter::end() +{ + +} + +void VPainter::setBrush(const VBrush &brush) +{ + mImpl->mSpanData.setup(brush); +} + +void VPainter::drawRle(const VPoint &pos, const VRle &rle) +{ + mImpl->drawRle(pos, rle); +} diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h new file mode 100644 index 0000000000..740f732656 --- /dev/null +++ b/src/vector/vpainter.h @@ -0,0 +1,27 @@ +#ifndef VPAINTER_H +#define VPAINTER_H + +#include"vpoint.h" +#include"vrle.h" +#include"vbrush.h" + +class VBitmap; +class VPainterImpl; +class VPainter { +public: + enum CompositionMode{ + CompModeSrc, + CompModeSrcOver + }; + ~VPainter(); + VPainter(); + VPainter(VBitmap *buffer); + bool begin(VBitmap *buffer); + void end(); + void setBrush(const VBrush &brush); + void drawRle(const VPoint &pos, const VRle &rle); +private: + VPainterImpl *mImpl; +}; + +#endif //VPAINTER_H diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp new file mode 100644 index 0000000000..60f4c92a23 --- /dev/null +++ b/src/vector/vpath.cpp @@ -0,0 +1,735 @@ +#include"vpath.h" +#include +#include +#include"vdebug.h" +#include"vbezier.h" +#include "vrect.h" + +struct VPathData +{ + void copy(VPathData *o); + void moveTo(const VPointF &pt); + void lineTo(const VPointF &pt); + void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); + void close(); + void reset(); + void checkNewSegment(); + int segments() const; + void transform(const VMatrix &m); + RefCount ref; + std::vector m_points; + std::vector m_elements; + int m_segments; + VPointF mStartPoint; + bool mNewSegment; +}; + + +void VPathData::transform(const VMatrix &m) +{ + for(auto &i : m_points) { + i = m.map(i); + } +} + +void VPathData::checkNewSegment() +{ + if (mNewSegment) { + moveTo(VPointF(0,0)); + mNewSegment = false; + } +} +void VPathData::copy(VPathData *o) +{ + m_points = o->m_points; + m_elements = o->m_elements; + m_segments = o->m_segments; + mStartPoint = o->mStartPoint; +} + +void VPathData::moveTo(const VPointF &p) +{ + mStartPoint = p; + mNewSegment = false; + m_elements.push_back(VPath::Element::MoveTo); + m_points.push_back(p); + m_segments++; +} +void VPathData::lineTo(const VPointF &p) +{ + checkNewSegment(); + m_elements.push_back(VPath::Element::LineTo); + m_points.push_back(p); +} +void VPathData::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) +{ + checkNewSegment(); + m_elements.push_back(VPath::Element::CubicTo); + m_points.push_back(c1); + m_points.push_back(c2); + m_points.push_back(e); +} + +void VPathData::close() +{ + const VPointF &lastPt = m_points.back(); + if (!fuzzyCompare(mStartPoint, lastPt)) { + lineTo(mStartPoint); + } + m_elements.push_back(VPath::Element::Close); + mNewSegment = true; +} + +void VPathData::reset() +{ + m_elements.clear(); + m_points.clear(); + m_segments = 0; +} + +int VPathData::segments() const +{ + return m_segments; +} + + +static const struct VPathData shared_empty = {RefCount(-1), + std::vector(), + std::vector(), + 0, + VPointF(), + true}; + +inline void VPath::cleanUp(VPathData *d) +{ + delete d; +} + +void VPath::detach() +{ + if (d->ref.isShared()) + *this = copy(); +} + +VPath VPath::copy() const +{ + VPath other; + + other.d = new VPathData(shared_empty); + other.d->m_points = d->m_points; + other.d->m_elements = d->m_elements; + other.d->m_segments = d->m_segments; + other.d->ref.setOwned(); + return other; +} + +VPath::~VPath() +{ + if (!d->ref.deref()) + cleanUp(d); +} + +VPath::VPath() + : d(const_cast(&shared_empty)) +{ +} + +VPath::VPath(const VPath &other) +{ + d = other.d; + d->ref.ref(); +} + +VPath::VPath(VPath &&other): d(other.d) +{ + other.d = const_cast(&shared_empty); +} + +VPath &VPath::operator=(const VPath &other) +{ + other.d->ref.ref(); + if (!d->ref.deref()) + cleanUp(d); + + d = other.d; + return *this; +} + +inline VPath &VPath::operator=(VPath &&other) +{ + if (!d->ref.deref()) + cleanUp(d); + d = other.d; + other.d = const_cast(&shared_empty); + return *this; +} + +bool VPath::isEmpty()const +{ + return d->m_elements.empty(); +} + +void VPath::close() +{ + if (isEmpty()) return; + detach(); + d->close(); +} + +void VPath::reset() +{ + if (isEmpty()) return; + detach(); + d->reset(); +} + +void VPath::moveTo(const VPointF &p) +{ + detach(); + d->moveTo(p); +} + +void VPath::lineTo(const VPointF &p) +{ + detach(); + d->lineTo(p); +} + +void VPath::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) +{ + detach(); + d->cubicTo(c1, c2, e); +} + +void VPath::reserve(int num_elm) +{ + detach(); + d->m_elements.reserve(num_elm); + d->m_points.reserve(num_elm); +} + +const std::vector &VPath::elements() const +{ + return d->m_elements; +} +const std::vector &VPath::points() const +{ + return d->m_points; +} +int VPath::segments() const +{ + return d->m_segments + 1; +} + +#define PATH_KAPPA 0.5522847498 + +static float tForArcAngle(float angle); +void findEllipseCoords(const VRectF &r, float angle, float length, + VPointF* startPoint, VPointF *endPoint) +{ + if (r.isNull()) { + if (startPoint) + *startPoint = VPointF(); + if (endPoint) + *endPoint = VPointF(); + return; + } + + float w2 = r.width() / 2; + float h2 = r.height() / 2; + + float angles[2] = { angle, angle + length }; + VPointF *points[2] = { startPoint, endPoint }; + + for (int i = 0; i < 2; ++i) { + if (!points[i]) + continue; + + float theta = angles[i] - 360 * floor(angles[i] / 360); + float t = theta / 90; + // truncate + int quadrant = int(t); + t -= quadrant; + + t = tForArcAngle(90 * t); + + // swap x and y? + if (quadrant & 1) + t = 1 - t; + + float a, b, c, d; + VBezier::coefficients(t, a, b, c, d); + VPointF p(a + b + c*PATH_KAPPA, d + c + b*PATH_KAPPA); + + // left quadrants + if (quadrant == 1 || quadrant == 2) + p.rx() = -p.x(); + + // top quadrants + if (quadrant == 0 || quadrant == 1) + p.ry() = -p.y(); + + *points[i] = r.center() + VPointF(w2 * p.x(), h2 * p.y()); + } +} + +static float +tForArcAngle(float angle) +{ + float radians, cos_angle, sin_angle, tc, ts, t; + + if (floatCmp(angle,0.f)) return 0; + if (floatCmp(angle, 90.0)) return 1; + + radians = (angle/180) * M_PI; + + cos_angle = cos(radians); + sin_angle = sin(radians); + + // initial guess + tc = angle / 90; + + // do some iterations of newton's method to approximate cos_angle + // finds the zero of the function b.pointAt(tc).x() - cos_angle + tc -= ((((2-3*PATH_KAPPA) * tc + 3*(PATH_KAPPA-1)) * tc) * tc + 1 - cos_angle) // value + / (((6-9*PATH_KAPPA) * tc + 6*(PATH_KAPPA-1)) * tc); // derivative + tc -= ((((2-3*PATH_KAPPA) * tc + 3*(PATH_KAPPA-1)) * tc) * tc + 1 - cos_angle) // value + / (((6-9*PATH_KAPPA) * tc + 6*(PATH_KAPPA-1)) * tc); // derivative + + // initial guess + ts = tc; + // do some iterations of newton's method to approximate sin_angle + // finds the zero of the function b.pointAt(tc).y() - sin_angle + ts -= ((((3*PATH_KAPPA-2) * ts - 6*PATH_KAPPA + 3) * ts + 3*PATH_KAPPA) * ts - sin_angle) + / (((9*PATH_KAPPA-6) * ts + 12*PATH_KAPPA - 6) * ts + 3*PATH_KAPPA); + ts -= ((((3*PATH_KAPPA-2) * ts - 6*PATH_KAPPA + 3) * ts + 3*PATH_KAPPA) * ts - sin_angle) + / (((9*PATH_KAPPA-6) * ts + 12*PATH_KAPPA - 6) * ts + 3*PATH_KAPPA); + + // use the average of the t that best approximates cos_angle + // and the t that best approximates sin_angle + t = 0.5 * (tc + ts); + return t; +} + + +// The return value is the starting point of the arc +static VPointF +curvesForArc(const VRectF &rect, float startAngle, float sweepLength, + VPointF *curves, int *point_count) +{ + if (rect.isNull()) { + return VPointF(); + } + + float x = rect.x(); + float y = rect.y(); + + float w = rect.width(); + float w2 = rect.width() / 2; + float w2k = w2 * PATH_KAPPA; + + float h = rect.height(); + float h2 = rect.height() / 2; + float h2k = h2 * PATH_KAPPA; + + VPointF points[16] = + { + // start point + VPointF(x + w, y + h2), + + // 0 -> 270 degrees + VPointF(x + w, y + h2 + h2k), + VPointF(x + w2 + w2k, y + h), + VPointF(x + w2, y + h), + + // 270 -> 180 degrees + VPointF(x + w2 - w2k, y + h), + VPointF(x, y + h2 + h2k), + VPointF(x, y + h2), + + // 180 -> 90 degrees + VPointF(x, y + h2 - h2k), + VPointF(x + w2 - w2k, y), + VPointF(x + w2, y), + + // 90 -> 0 degrees + VPointF(x + w2 + w2k, y), + VPointF(x + w, y + h2 - h2k), + VPointF(x + w, y + h2) + }; + + if (sweepLength > 360) sweepLength = 360; + else if (sweepLength < -360) sweepLength = -360; + + // Special case fast paths + if (startAngle == 0.0) { + if (sweepLength == 360.0) { + for (int i = 11; i >= 0; --i) + curves[(*point_count)++] = points[i]; + return points[12]; + } else if (sweepLength == -360.0) { + for (int i = 1; i <= 12; ++i) + curves[(*point_count)++] = points[i]; + return points[0]; + } + } + + int startSegment = int(floor(startAngle / 90)); + int endSegment = int(floor((startAngle + sweepLength) / 90)); + + float startT = (startAngle - startSegment * 90) / 90; + float endT = (startAngle + sweepLength - endSegment * 90) / 90; + + int delta = sweepLength > 0 ? 1 : -1; + if (delta < 0) { + startT = 1 - startT; + endT = 1 - endT; + } + + // avoid empty start segment + if (floatNull(startT - float(1))) { + startT = 0; + startSegment += delta; + } + + // avoid empty end segment + if (floatNull(endT)) { + endT = 1; + endSegment -= delta; + } + + startT = tForArcAngle(startT * 90); + endT = tForArcAngle(endT * 90); + + const bool splitAtStart = !floatNull(startT); + const bool splitAtEnd = !floatNull(endT - float(1)); + + const int end = endSegment + delta; + + // empty arc? + if (startSegment == end) { + const int quadrant = 3 - ((startSegment % 4) + 4) % 4; + const int j = 3 * quadrant; + return delta > 0 ? points[j + 3] : points[j]; + } + + VPointF startPoint, endPoint; + findEllipseCoords(rect, startAngle, sweepLength, &startPoint, &endPoint); + + for (int i = startSegment; i != end; i += delta) { + const int quadrant = 3 - ((i % 4) + 4) % 4; + const int j = 3 * quadrant; + + VBezier b; + if (delta > 0) + b = VBezier::fromPoints(points[j + 3], points[j + 2], points[j + 1], points[j]); + else + b = VBezier::fromPoints(points[j], points[j + 1], points[j + 2], points[j + 3]); + + // empty arc? + if (startSegment == endSegment && floatCmp(startT, endT)) + return startPoint; + + if (i == startSegment) { + if (i == endSegment && splitAtEnd) + b = b.onInterval(startT, endT); + else if (splitAtStart) + b = b.onInterval(startT, 1); + } else if (i == endSegment && splitAtEnd) { + b = b.onInterval(0, endT); + } + + // push control points + curves[(*point_count)++] = b.pt2(); + curves[(*point_count)++] = b.pt3(); + curves[(*point_count)++] = b.pt4(); + } + + curves[*(point_count)-1] = endPoint; + + return startPoint; +} + +void VPath::arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo) +{ + detach(); + + int point_count = 0; + VPointF pts[15]; + VPointF curve_start = curvesForArc(rect, startAngle, sweepLength, pts, &point_count); + + if (isEmpty() || forceMoveTo) { + d->moveTo(curve_start); + } else { + d->lineTo(curve_start); + } + for (int i=0; icubicTo(pts[i], pts[i+1], pts[i+2]); + } +} + +void VPath::addCircle(float cx, float cy, float radius, VPath::Direction dir) +{ + addOval(VRectF(cx-radius, cy-radius, 2*radius, 2*radius) , dir); +} + +void VPath::addOval(const VRectF &rect, VPath::Direction dir) +{ + if (rect.isNull()) return; + + detach(); + + float x = rect.x(); + float y = rect.y(); + + float w = rect.width(); + float w2 = rect.width() / 2; + float w2k = w2 * PATH_KAPPA; + + float h = rect.height(); + float h2 = rect.height() / 2; + float h2k = h2 * PATH_KAPPA; + + + if (dir == VPath::Direction::CW) { + // moveto 12 o'clock. + d->moveTo(VPointF(x+w2, y)); + // 12 -> 3 o'clock + d->cubicTo(VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), VPointF(x + w, y + h2)); + // 3 -> 6 o'clock + d->cubicTo(VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), VPointF(x + w2, y + h)); + // 6 -> 9 o'clock + d->cubicTo(VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), VPointF(x , y + h2)); + // 9 -> 12 o'clock + d->cubicTo(VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), VPointF(x + w2, y)); + } else { + // moveto 12 o'clock. + d->moveTo(VPointF(x+w2, y)); + // 12 -> 9 o'clock + d->cubicTo(VPointF(x + w2 - w2k, y), VPointF(x, y + h2 - h2k), VPointF(x , y + h2)); + // 9 -> 6 o'clock + d->cubicTo(VPointF(x, y + h2 + h2k), VPointF(x + w2 - w2k, y + h), VPointF(x + w2, y + h)); + // 6 -> 3 o'clock + d->cubicTo(VPointF(x + w2 + w2k, y + h), VPointF(x + w, y + h2 + h2k), VPointF(x + w, y + h2)); + // 3 -> 12 o'clock + d->cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), VPointF(x+w2, y)); + } +} + +void VPath::addRect(const VRectF &rect, VPath::Direction dir) +{ + if (rect.isNull()) return; + + detach(); + + float x = rect.x(); + float y = rect.y(); + float w = rect.width(); + float h = rect.height(); + + if (dir == VPath::Direction::CW) { + moveTo(VPointF(x + w, y)); + lineTo(VPointF(x + w, y + h)); + lineTo(VPointF(x , y + h)); + lineTo(VPointF(x , y)); + close(); + } else { + moveTo(VPointF(x + w, y)); + lineTo(VPointF(x , y)); + lineTo(VPointF(x , y + h)); + lineTo(VPointF(x + w, y + h)); + close(); + } +} + +void VPath::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) +{ + if (floatCmp(rx, 0.f) || floatCmp(ry, 0.f)) { + addRect(rect, dir); + return; + } + + float x = rect.x(); + float y = rect.y(); + float w = rect.width(); + float h = rect.height(); + // clamp the rx and ry radius value. + rx = 2*rx; + ry = 2*ry; + if (rx > w) rx = w; + if (ry > h) ry = h; + + if (dir == VPath::Direction::CW) { + moveTo(VPointF(x + w, y + ry/2.f)); + arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0 , -90, false); + arcTo(VRectF(x, y + h - ry, rx, ry), -90 , -90, false); + arcTo(VRectF(x, y, rx, ry), -180 , -90, false); + arcTo(VRectF(x + w - rx, y, rx, ry), -270 , -90, false); + close(); + } else { + moveTo(VPointF(x + w, y + ry/2.f)); + arcTo(VRectF(x + w - rx, y , rx, ry), 0 , 90, false); + arcTo(VRectF(x, y, rx, ry), 90 , 90, false); + arcTo(VRectF(x, y + h - ry, rx, ry), 180 , 90, false); + arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 270 , 90, false); + close(); + } +} + +void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, + float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + VPath::Direction dir) +{ + // TODO: Direction feature is missing + const static float POLYSTAR_MAGIC_NUMBER = 0.47829 / 0.28; + float currentAngle = (startAngle - 90.0) * M_PI / 180.0; + float x; + float y; + float previousX; + float previousY; + float partialPointRadius = 0; + float anglePerPoint = (float) (2.0 * M_PI / points); + float halfAnglePerPoint = anglePerPoint / 2.0; + float partialPointAmount = points - (int) points; + bool longSegment = false; + int numPoints = (int) ceil(points) * 2.0; + + innerRoundness /= 100.0; + outerRoundness /= 100.0; + + if (partialPointAmount != 0) { + currentAngle += halfAnglePerPoint * (1.0 - partialPointAmount); + } + + if (partialPointAmount != 0) { + partialPointRadius = innerRadius + partialPointAmount * (outerRadius - innerRadius); + x = (float) (partialPointRadius * cos(currentAngle)); + y = (float) (partialPointRadius * sin(currentAngle)); + currentAngle += anglePerPoint * partialPointAmount / 2.0; + } else { + x = (float) (outerRadius * cos(currentAngle)); + y = (float) (outerRadius * sin(currentAngle)); + currentAngle += halfAnglePerPoint; + } + + moveTo(VPointF(x + cx, y + cy)); + + for (int i = 0; i < numPoints; i++) { + float radius = longSegment ? outerRadius : innerRadius; + float dTheta = halfAnglePerPoint; + if (partialPointRadius != 0 && i == numPoints - 2) { + dTheta = anglePerPoint * partialPointAmount / 2.0; + } + if (partialPointRadius != 0 && i == numPoints - 1) { + radius = partialPointRadius; + } + previousX = x; + previousY = y; + x = (float) (radius * cos(currentAngle)); + y = (float) (radius * sin(currentAngle)); + + if (innerRoundness == 0 && outerRoundness == 0) { + lineTo(VPointF(x + cx, y + cy)); + } else { + float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0); + float cp1Dx = (float) cos(cp1Theta); + float cp1Dy = (float) sin(cp1Theta); + + float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0); + float cp2Dx = (float) cos(cp2Theta); + float cp2Dy = (float) sin(cp2Theta); + + float cp1Roundness = longSegment ? innerRoundness : outerRoundness; + float cp2Roundness = longSegment ? outerRoundness : innerRoundness; + float cp1Radius = longSegment ? innerRadius : outerRadius; + float cp2Radius = longSegment ? outerRadius : innerRadius; + + float cp1x = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * cp1Dx / points; + float cp1y = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * cp1Dy / points; + float cp2x = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * cp2Dx / points; + float cp2y = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * cp2Dy / points; + + if ((partialPointAmount != 0) && + ((i == 0) || (i == numPoints - 1))) { + cp1x *= partialPointAmount; + cp1y *= partialPointAmount; + cp2x *= partialPointAmount; + cp2y *= partialPointAmount; + } + + cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), + VPointF(x + cp2x + cx, y + cp2y + cy), + VPointF(x + cx, y + cy)); + } + + currentAngle += dTheta; + longSegment = !longSegment; + } + + close(); +} + +void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float points, + float radius, float roundness, + VPath::Direction dir) +{ + // TODO: Direction feature is missing + // TODO: Need to support floating point number for number of points + const static float POLYGON_MAGIC_NUMBER = 0.25; + float currentAngle = (startAngle - 90.0) * M_PI / 180.0; + float x; + float y; + float previousX; + float previousY; + float anglePerPoint = (float) (2.0 * M_PI / floor(points)); + int numPoints = (int) floor(points); + + roundness /= 100.0; + + currentAngle = (currentAngle - 90.0) * M_PI / 180.0; + x = (float) (radius * cos(currentAngle)); + y = (float) (radius * sin(currentAngle)); + currentAngle += anglePerPoint; + + moveTo(VPointF(x + cx, y + cy)); + + for (int i = 0; i < numPoints; i++) { + previousX = x; + previousY = y; + x = (float) (radius * cos(currentAngle)); + y = (float) (radius * sin(currentAngle)); + + if (roundness != 0) { + float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0); + float cp1Dx = (float) cos(cp1Theta); + float cp1Dy = (float) sin(cp1Theta); + + float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0); + float cp2Dx = (float) cos(cp2Theta); + float cp2Dy = (float) sin(cp2Theta); + + float cp1x = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dx; + float cp1y = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dy; + float cp2x = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dx; + float cp2y = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dy; + + cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), + VPointF(x + cp2x + cx, y + cp2y + cy), + VPointF(x, y)); + } else { + lineTo(VPointF(x + cx, y + cy)); + } + + currentAngle += anglePerPoint; + } + + close(); +} + +void VPath::transform(const VMatrix &m) +{ + if (isEmpty()) return; + detach(); + d->transform(m); +} diff --git a/src/vector/vpath.h b/src/vector/vpath.h new file mode 100644 index 0000000000..93c4f5316a --- /dev/null +++ b/src/vector/vpath.h @@ -0,0 +1,80 @@ +#ifndef VPATH_H +#define VPATH_H +#include "vpoint.h" +#include "vrect.h" +#include "vmatrix.h" +#include + +struct VPathData; +class VPath +{ +public: + enum class Direction { + CCW, + CW + }; + + enum class Element : uchar { + MoveTo, + LineTo, + CubicTo, + Close + }; + ~VPath(); + VPath(); + VPath(const VPath &path); + VPath(VPath &&other); + VPath &operator=(const VPath &); + VPath &operator=(VPath &&other); + bool isEmpty()const; + void moveTo(const VPointF &p); + inline void moveTo(float x, float y); + void lineTo(const VPointF &p); + inline void lineTo(float x, float y); + void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); + inline void cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey); + void arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo); + void close(); + void reset(); + void reserve(int num_elm); + + void addCircle(float cx, float cy, float radius, VPath::Direction dir = Direction::CW); + void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); + void addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir = Direction::CW); + void addRect(const VRectF &rect, VPath::Direction dir = Direction::CW); + void addPolystarStar(float startAngle, float cx, float cy, float points, + float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + VPath::Direction dir = Direction::CW); + void addPolystarPolygon(float startAngle, float cx, float cy, float points, + float radius, float roundness, + VPath::Direction dir = Direction::CW); + + void transform(const VMatrix &m); + const std::vector &elements() const; + const std::vector &points() const; +private: + friend class VRaster; + int segments() const; + VPath copy() const; + void detach(); + void cleanUp(VPathData *x); + VPathData *d; +}; + +inline void VPath::lineTo(float x, float y) +{ + lineTo(VPointF(x,y)); +} + +inline void VPath::moveTo(float x, float y) +{ + moveTo(VPointF(x,y)); +} + +inline void VPath::cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey) +{ + cubicTo(VPointF(c1x, c1y), VPointF(c2x, c2y), VPointF(ex, ey)); +} + +#endif // VPATH_H diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp new file mode 100644 index 0000000000..358721cdc5 --- /dev/null +++ b/src/vector/vpathmesure.cpp @@ -0,0 +1,6 @@ +#include"vpathmesure.h" + +class VPathMesureData +{ + VPath *path; +}; \ No newline at end of file diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h new file mode 100644 index 0000000000..98605f7b97 --- /dev/null +++ b/src/vector/vpathmesure.h @@ -0,0 +1,18 @@ +#ifndef VPATHMESURE_H +#define VPATHMESURE_H + +#include "vpath.h" + +class VPathMesureData; +class VPathMesure +{ +public: + ~VPathMesure(); + VPathMesure(); + VPathMesure(const VPath *path, bool foceClose); + int getLength() const; +private: + VPathMesureData *d; +}; + +#endif // VPATHMESURE_H diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h new file mode 100644 index 0000000000..7eb2af5f9d --- /dev/null +++ b/src/vector/vpoint.h @@ -0,0 +1,147 @@ +#ifndef VPOINT_H +#define VPOINT_H + +#include"vglobal.h" + +class VPointF +{ +public: + constexpr inline VPointF() noexcept :mx(0), my(0){} + constexpr inline VPointF(float x, float y) noexcept :mx(x), my(y){} + constexpr inline float x() const noexcept {return mx;} + constexpr inline float y() const noexcept {return my;} + inline float& rx() noexcept {return mx;} + inline float& ry() noexcept {return my;} + inline void setX(float x) {mx = x;} + inline void setY(float y) {my = y;} + inline VPointF operator-() noexcept { return VPointF(-mx, -my); } + inline VPointF &operator+=(const VPointF &p) noexcept; + inline VPointF &operator-=(const VPointF &p) noexcept; + friend const VPointF operator+(const VPointF & p1, const VPointF & p2) { + return VPointF(p1.mx + p2.mx , p1.my + p2.my); + } + inline friend const bool fuzzyCompare(const VPointF & p1, const VPointF & p2); + inline friend VDebug& operator<<(VDebug& os, const VPointF& o); + + friend inline VPointF operator-(const VPointF &p1, const VPointF &p2); + friend inline const VPointF operator*(const VPointF &, float val); + friend inline const VPointF operator*(float val, const VPointF &); + friend inline const VPointF operator/(const VPointF &, float val); + friend inline const VPointF operator/(float val, const VPointF &); +private: + float mx; + float my; +}; + +inline const bool fuzzyCompare(const VPointF & p1, const VPointF & p2) +{ + return (floatCmp(p1.mx , p2.mx) && floatCmp(p1.my , p2.my)); +} + + +inline VPointF operator-(const VPointF &p1, const VPointF &p2) +{ + return VPointF(p1.mx-p2.mx, p1.my-p2.my); +} + +inline const VPointF operator*(const VPointF &p, float c) +{ return VPointF(p.mx*c, p.my*c); } + +inline const VPointF operator*(float c, const VPointF &p) +{ return VPointF(p.mx*c, p.my*c); } + +inline const VPointF operator/(const VPointF &p, float c) +{ return VPointF(p.mx/c, p.my/c); } + +inline const VPointF operator/(float c, const VPointF &p) +{ return VPointF(p.mx/c, p.my/c); } + +inline VDebug& operator<<(VDebug& os, const VPointF& o) +{ + os<<"{P "< +#include"vdebug.h" + +struct FTOutline +{ +public: + FTOutline() = delete; + FTOutline(int points, int segments) + { + ft.points = new SW_FT_Vector[points + segments]; + ft.tags = new char[points + segments]; + ft.contours = new short[segments]; + ft.n_points = ft.n_contours = 0; + ft.flags = 0x0; + } + void moveTo(const VPointF &pt); + void lineTo(const VPointF &pt); + void cubicTo(const VPointF &ctr1, const VPointF &ctr2, const VPointF end); + void close(); + void end(); + void transform(const VMatrix &m); + ~FTOutline() + { + delete[] ft.points; + delete[] ft.tags; + delete[] ft.contours; + } + SW_FT_Outline ft; + bool closed; +}; + +#define TO_FT_COORD(x) ((x) * 64) // to freetype 26.6 coordinate. + +void FTOutline::transform(const VMatrix &m) +{ + VPointF pt; + if (m.isIdentity()) return; + for (auto i = 0; i < ft.n_points; i++) { + pt = m.map(VPointF(ft.points[i].x/64.0, ft.points[i].y/64.0)); + ft.points[i].x = TO_FT_COORD(pt.x()); + ft.points[i].y = TO_FT_COORD(pt.y()); + } +} + +void FTOutline::moveTo(const VPointF &pt) +{ + ft.points[ft.n_points].x = TO_FT_COORD(pt.x()); + ft.points[ft.n_points].y = TO_FT_COORD(pt.y()); + ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; + if (ft.n_points) { + ft.contours[ft.n_contours] = ft.n_points - 1; + ft.n_contours++; + } + ft.n_points++; + closed = false; +} + +void FTOutline::lineTo(const VPointF &pt) +{ + ft.points[ft.n_points].x = TO_FT_COORD(pt.x()); + ft.points[ft.n_points].y = TO_FT_COORD(pt.y()); + ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; + ft.n_points++; + closed = false; +} + +void FTOutline::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF ep) +{ + ft.points[ft.n_points].x = TO_FT_COORD(cp1.x()); + ft.points[ft.n_points].y = TO_FT_COORD(cp1.y()); + ft.tags[ft.n_points] = SW_FT_CURVE_TAG_CUBIC; + ft.n_points++; + + ft.points[ft.n_points].x = TO_FT_COORD(cp2.x()); + ft.points[ft.n_points].y = TO_FT_COORD(cp2.y()); + ft.tags[ft.n_points] = SW_FT_CURVE_TAG_CUBIC; + ft.n_points++; + + ft.points[ft.n_points].x = TO_FT_COORD(ep.x()); + ft.points[ft.n_points].y = TO_FT_COORD(ep.y()); + ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; + ft.n_points++; + closed = false; +} +void FTOutline::close() +{ + int index; + if (ft.n_contours) { + index = ft.contours[ft.n_contours - 1] + 1; + } else { + index = 0; + } + + // make sure atleast 1 point exists in the segment. + if (ft.n_points == index) { + closed = false; + return; + } + + ft.points[ft.n_points].x = ft.points[index].x; + ft.points[ft.n_points].y = ft.points[index].y; + ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; + ft.n_points++; + closed = true; +} + +void FTOutline::end() +{ + if (ft.n_points) { + ft.contours[ft.n_contours] = ft.n_points - 1; + ft.n_contours++; + } +} + +struct VRasterPrivate +{ +public: + VRle generateFillInfoAsync(const SW_FT_Outline *outline); + VRle generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT_Stroker_LineCap cap, + SW_FT_Stroker_LineJoin join, + int width, int meterLimit, + SW_FT_Bool closed); + + std::mutex m_rasterAcess; + std::mutex m_strokerAcess; + SW_FT_Raster m_raster; + SW_FT_Stroker m_stroker; +}; + +struct SpanInfo +{ + VRle::Span *spans; + int size; +}; + +static void +rleGenerationCb( int count, const SW_FT_Span* spans,void *user) +{ + VRle *rle = (VRle *) user; + VRle::Span *rleSpan = (VRle::Span *)spans; + rle->addSpan(rleSpan, count); +} + +VRle VRasterPrivate::generateFillInfoAsync(const SW_FT_Outline *outline) +{ + m_rasterAcess.lock(); + VRle rle; + SW_FT_Raster_Params params; + + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.gray_spans = &rleGenerationCb; + params.user = &rle; + params.source = outline; + + sw_ft_grays_raster.raster_render(m_raster, ¶ms); + + m_rasterAcess.unlock(); + + return rle; +} + +VRle VRasterPrivate::generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT_Stroker_LineCap cap, + SW_FT_Stroker_LineJoin join, + int width, int meterLimit, + SW_FT_Bool closed) +{ + m_strokerAcess.lock(); + uint points,contors; + SW_FT_Outline strokeOutline = { 0, 0, nullptr, nullptr, nullptr, SW_FT_OUTLINE_NONE }; + + SW_FT_Stroker_Set(m_stroker, width, cap, join, meterLimit); + SW_FT_Stroker_ParseOutline(m_stroker, outline, !closed); + SW_FT_Stroker_GetCounts(m_stroker,&points, &contors); + + strokeOutline.points = (SW_FT_Vector *) calloc(points, sizeof(SW_FT_Vector)); + strokeOutline.tags = (char *) calloc(points, sizeof(char)); + strokeOutline.contours = (short *) calloc(contors, sizeof(short)); + + SW_FT_Stroker_Export(m_stroker, &strokeOutline); + + m_strokerAcess.unlock(); + + VRle rle = generateFillInfoAsync(&strokeOutline); + + // cleanup the outline data. + free(strokeOutline.points); + free(strokeOutline.tags); + free(strokeOutline.contours); + + return rle; +} + + +VRaster::VRaster() +{ + d = new VRasterPrivate; + sw_ft_grays_raster.raster_new(&d->m_raster); + SW_FT_Stroker_New(&d->m_stroker); + SW_FT_Stroker_Set(d->m_stroker, 1 << 6, + SW_FT_STROKER_LINECAP_BUTT, SW_FT_STROKER_LINEJOIN_MITER, 0); +} + +VRaster::~VRaster() +{ + sw_ft_grays_raster.raster_done(d->m_raster); + SW_FT_Stroker_Done(d->m_stroker); +} + +void VRaster::deleteFTOutline(FTOutline *outline) +{ + delete outline; +} + +FTOutline *VRaster::toFTOutline(const VPath &path) +{ + if (path.isEmpty()) + return nullptr; + + const std::vector &elements = path.elements(); + const std::vector &points = path.points(); + + FTOutline *outline = new FTOutline(points.size(), path.segments()); + + int index = 0; + for(auto element : elements) { + switch (element){ + case VPath::Element::MoveTo: + outline->moveTo(points[index]); + index++; + break; + case VPath::Element::LineTo: + outline->lineTo(points[index]); + index++; + break; + case VPath::Element::CubicTo: + outline->cubicTo(points[index], points[index+1], points[index+2]); + index = index+3; + break; + case VPath::Element::Close: + outline->close(); + break; + default: + break; + } + } + outline->end(); + return outline; +} + +VRle VRaster::generateFillInfo(const FTOutline *outline, FillRule fillRule) +{ + int fillRuleFlag = SW_FT_OUTLINE_NONE; + switch (fillRule) { + case FillRule::EvenOdd: + fillRuleFlag = SW_FT_OUTLINE_EVEN_ODD_FILL; + break; + default: + fillRuleFlag = SW_FT_OUTLINE_NONE; + break; + } + FTOutline *outlineRef = const_cast(outline); + outlineRef->ft.flags = fillRuleFlag; + return d->generateFillInfoAsync(&outlineRef->ft); +} + +VRle VRaster::generateStrokeInfo(const FTOutline *outline, CapStyle cap, JoinStyle join, + float width, float meterLimit) +{ + SW_FT_Stroker_LineCap ftCap; + SW_FT_Stroker_LineJoin ftJoin; + int ftWidth; + int ftMeterLimit; + SW_FT_Bool ftbool = (SW_FT_Bool) outline->closed; + + // map strokeWidth to freetype. It uses as the radius of the pen not the diameter + width = width/2.0; + // convert to freetype co-ordinate + ftWidth = int(width * 64); + ftMeterLimit = int(meterLimit * 64); + + // map to freetype capstyle + switch (cap) + { + case CapStyle::Square: + ftCap = SW_FT_STROKER_LINECAP_SQUARE; + break; + case CapStyle::Round: + ftCap = SW_FT_STROKER_LINECAP_ROUND; + break; + default: + ftCap = SW_FT_STROKER_LINECAP_BUTT; + break; + } + switch (join) + { + case JoinStyle::Bevel: + ftJoin = SW_FT_STROKER_LINEJOIN_BEVEL; + break; + case JoinStyle::Round: + ftJoin = SW_FT_STROKER_LINEJOIN_ROUND; + break; + default: + ftJoin = SW_FT_STROKER_LINEJOIN_MITER; + break; + } + + return d->generateStrokeInfoAsync(&outline->ft, ftCap, ftJoin, + ftWidth, ftMeterLimit, ftbool); +} diff --git a/src/vector/vraster.h b/src/vector/vraster.h new file mode 100644 index 0000000000..7beda50e87 --- /dev/null +++ b/src/vector/vraster.h @@ -0,0 +1,33 @@ +#ifndef VRASTER_H +#define VRASTER_H +#include"vrle.h" +#include + +struct FTOutline; +class VPath; + +struct VRasterPrivate; +class VRaster +{ +public: + ~VRaster(); + static VRaster &instance() + { + static VRaster Singleton; + return Singleton; + } + VRaster(const VRaster &other) = delete; + VRaster(VRaster&&) = delete; + VRaster& operator=(VRaster const&) = delete; + VRaster& operator=(VRaster &&) = delete; + + static FTOutline *toFTOutline(const VPath &path); + static void deleteFTOutline(FTOutline *); + VRle generateFillInfo(const FTOutline *, FillRule fillRule = FillRule::Winding); + VRle generateStrokeInfo(const FTOutline *, CapStyle cap, JoinStyle join, + float width, float meterLimit); +private: + VRaster(); + VRasterPrivate *d; +}; +#endif // VRASTER_H diff --git a/src/vector/vrect.cpp b/src/vector/vrect.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/vector/vrect.h b/src/vector/vrect.h new file mode 100644 index 0000000000..0f002dfd55 --- /dev/null +++ b/src/vector/vrect.h @@ -0,0 +1,184 @@ +#ifndef VRECT_H +#define VRECT_H +#include"vglobal.h" +#include"vpoint.h" + +class VRect +{ +public: + V_CONSTEXPR VRect(): x1(0), y1(0), x2(-1), y2(-1) {} + V_CONSTEXPR VRect(int left, int top, int width, int height); + V_CONSTEXPR inline bool isEmpty() const; + V_CONSTEXPR inline bool isNull() const; + + V_CONSTEXPR inline int left() const ; + V_CONSTEXPR inline int top() const ; + V_CONSTEXPR inline int right() const ; + V_CONSTEXPR inline int bottom() const ; + V_CONSTEXPR inline int width() const ; + V_CONSTEXPR inline int height() const ; + V_CONSTEXPR inline int x() const ; + V_CONSTEXPR inline int y() const ; + inline void setLeft(int l) {x1 = l;} + inline void setTop(int t) {y1 = t;} + inline void setRight(int r) {x2 = r;} + inline void setBottom(int b) {y2 = b;} + inline void setWidth(int w) {x2 = x1 + w;} + inline void setHeight(int h) {y2 = y1 + h;} + inline VRect translated(int dx, int dy) const ; + inline void translate(int dx, int dy); + inline bool contains(const VRect &r, bool proper = false) const; + inline bool intersects(const VRect &r); + friend V_CONSTEXPR inline bool operator==(const VRect &, const VRect &) noexcept; + friend V_CONSTEXPR inline bool operator!=(const VRect &, const VRect &) noexcept; + friend VDebug& operator<<(VDebug& os, const VRect& o); +private: + int x1; + int y1; + int x2; + int y2; +}; + +inline bool VRect::intersects(const VRect &r) +{ + return (right() > r.left() && left() < r.right() && + bottom() > r.top() && top() < r.bottom()); +} + +inline VDebug& operator<<(VDebug& os, const VRect& o) +{ + os<<"{R "< x2 || y1 > y2; } + +V_CONSTEXPR inline bool VRect::isNull() const +{ return (((x2-x1) == 0) || ((y2 - y1) == 0)); } + +V_CONSTEXPR inline int VRect::x() const +{ return x1; } + +V_CONSTEXPR inline int VRect::y() const +{ return y1; } + +V_CONSTEXPR inline int VRect::left() const +{ return x1; } + +V_CONSTEXPR inline int VRect::top() const +{ return y1; } + +V_CONSTEXPR inline int VRect::right() const +{ return x2; } + +V_CONSTEXPR inline int VRect::bottom() const +{ return y2; } +V_CONSTEXPR inline int VRect::width() const +{ return x2 - x1; } +V_CONSTEXPR inline int VRect::height() const +{ return y2 - y1; } + +inline VRect VRect::translated(int dx, int dy) const +{ return VRect(x1+dx, y1+dy, x2-x1, y2-y1); } + +inline void VRect::translate(int dx, int dy) +{ + x1 += dx; + y1 += dy; + x2 += dx; + y2 += dy; +} +inline bool VRect::contains(const VRect &r, bool proper) const +{ + if (!proper) { + if ((x1 <= r.x1) && + (x2 >= r.x2) && + (y1 <= r.y1) && + (y2 >= r.y2)) + return true; + return false; + }else { + if ((x1 < r.x1) && + (x2 > r.x2) && + (y1 < r.y1) && + (y2 > r.y2)) + return true; + return false; + } + +} +V_CONSTEXPR inline VRect::VRect(int left, int top, int width, int height): + x1(left), y1(top), x2(width + left), y2(height + top){} + +class VRectF +{ +public: + V_CONSTEXPR VRectF(): x1(0), y1(0), x2(-1), y2(-1) {} + VRectF(float left, float top, float width, float height){ + x1 = left; y1 = top; x2 = x1 + width; y2 = y1 + height; + } + + V_CONSTEXPR inline bool isEmpty() const; + V_CONSTEXPR inline bool isNull() const; + V_CONSTEXPR inline float left() const ; + V_CONSTEXPR inline float top() const ; + V_CONSTEXPR inline float right() const ; + V_CONSTEXPR inline float bottom() const ; + V_CONSTEXPR inline float width() const ; + V_CONSTEXPR inline float height() const ; + V_CONSTEXPR inline float x() const ; + V_CONSTEXPR inline float y() const ; + V_CONSTEXPR inline VPointF center() const {return VPointF(x1 + (x2-x1)/2.f , y1 + (y2-y1)/2.f);} + inline void setLeft(float l) {x1 = l;} + inline void setTop(float t) {y1 = t;} + inline void setRight(float r) {x2 = r;} + inline void setBottom(float b) {y2 = b;} + inline void setWidth(float w) {x2 = x1 + w;} + inline void setHeight(float h) {y2 = y1 + h;} + inline void translate(float dx, float dy) {x1 -= dx; x2 -= dx; y1 -= dx; y2 -= dx;} +private: + float x1; + float y1; + float x2; + float y2; +}; + +V_CONSTEXPR inline bool VRectF::isEmpty() const +{ return x1 > x2 || y1 > y2; } + +V_CONSTEXPR inline bool VRectF::isNull() const +{ return (((x2-x1) == 0) || ((y2 - y1) == 0)); } + +V_CONSTEXPR inline float VRectF::x() const +{ return x1; } + +V_CONSTEXPR inline float VRectF::y() const +{ return y1; } + +V_CONSTEXPR inline float VRectF::left() const +{ return x1; } + +V_CONSTEXPR inline float VRectF::top() const +{ return y1; } + +V_CONSTEXPR inline float VRectF::right() const +{ return x2; } + +V_CONSTEXPR inline float VRectF::bottom() const +{ return y2; } +V_CONSTEXPR inline float VRectF::width() const +{ return x2 - x1; } +V_CONSTEXPR inline float VRectF::height() const +{ return y2 - y1; } + +#endif // VRECT_H diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp new file mode 100644 index 0000000000..3db9ad28f7 --- /dev/null +++ b/src/vector/vregion.cpp @@ -0,0 +1,2368 @@ +/* + * Copyright 1987, 1988, 1989, 1998 The Open Group + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of The Open Group shall not be + * used in advertising or otherwise to promote the sale, use or other dealings + * in this Software without prior written authorization from The Open Group. + * + * Copyright 1987, 1988, 1989 by + * Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Copyright © 1998 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + + +#define critical_if_fail assert +#define PIXMAN_EXPORT static +#define FALSE 0 +#define TRUE 1 +#define FUNC "" +#define MIN(a, b) (a) < (b) ? (a) : (b) +#define MAX(a, b) (a) > (b) ? (a) : (b) + +typedef int pixman_bool_t; + +typedef struct pixman_rectangle pixman_rectangle_t; + +typedef struct pixman_box box_type_t; +typedef struct pixman_region_data region_data_type_t; +typedef struct pixman_region region_type_t; +typedef int64_t overflow_int_t; + +#define PREFIX(x) pixman_region##x + +#define PIXMAN_REGION_MAX INT32_MAX +#define PIXMAN_REGION_MIN INT32_MIN + + +typedef struct { + int x, y; +} point_type_t; + +struct pixman_region_data { + long size; + long numRects; +/* box_type_t rects[size]; in memory but not explicitly declared */ +}; + +struct pixman_rectangle +{ + int32_t x, y; + uint32_t width, height; +}; + +struct pixman_box +{ + int32_t x1, y1, x2, y2; +}; + +struct pixman_region +{ + box_type_t extents; + region_data_type_t *data; +}; + +typedef enum +{ + PIXMAN_REGION_OUT, + PIXMAN_REGION_IN, + PIXMAN_REGION_PART +} pixman_region_overlap_t; + +static void +_pixman_log_error (const char *function, const char *message) +{ + fprintf (stderr, + "*** BUG ***\n" + "In %s: %s\n" + "Set a breakpoint on '_pixman_log_error' to debug\n\n", + function, message); +} + + + +#define PIXREGION_NIL(reg) ((reg)->data && !(reg)->data->numRects) +/* not a region */ +#define PIXREGION_NAR(reg) ((reg)->data == pixman_broken_data) +#define PIXREGION_NUMRECTS(reg) ((reg)->data ? (reg)->data->numRects : 1) +#define PIXREGION_SIZE(reg) ((reg)->data ? (reg)->data->size : 0) +#define PIXREGION_RECTS(reg) \ + ((reg)->data ? (box_type_t *)((reg)->data + 1) \ + : &(reg)->extents) +#define PIXREGION_BOXPTR(reg) ((box_type_t *)((reg)->data + 1)) +#define PIXREGION_BOX(reg, i) (&PIXREGION_BOXPTR (reg)[i]) +#define PIXREGION_TOP(reg) PIXREGION_BOX (reg, (reg)->data->numRects) +#define PIXREGION_END(reg) PIXREGION_BOX (reg, (reg)->data->numRects - 1) + +#define GOOD_RECT(rect) ((rect)->x1 < (rect)->x2 && (rect)->y1 < (rect)->y2) +#define BAD_RECT(rect) ((rect)->x1 > (rect)->x2 || (rect)->y1 > (rect)->y2) + +#ifdef DEBUG + +#define GOOD(reg) \ + do \ + { \ + if (!PREFIX (_selfcheck (reg))) \ + _pixman_log_error (FUNC, "Malformed region " # reg); \ + } while (0) + +#else + +#define GOOD(reg) + +#endif + +static const box_type_t PREFIX (_empty_box_) = { 0, 0, 0, 0 }; +static const region_data_type_t PREFIX (_empty_data_) = { 0, 0 }; +#if defined (__llvm__) && !defined (__clang__) +static const volatile region_data_type_t PREFIX (_broken_data_) = { 0, 0 }; +#else +static const region_data_type_t PREFIX (_broken_data_) = { 0, 0 }; +#endif + +static box_type_t *pixman_region_empty_box = + (box_type_t *)&PREFIX (_empty_box_); +static region_data_type_t *pixman_region_empty_data = + (region_data_type_t *)&PREFIX (_empty_data_); +static region_data_type_t *pixman_broken_data = + (region_data_type_t *)&PREFIX (_broken_data_); + +static pixman_bool_t +pixman_break (region_type_t *region); + +/* + * The functions in this file implement the Region abstraction used extensively + * throughout the X11 sample server. A Region is simply a set of disjoint + * (non-overlapping) rectangles, plus an "extent" rectangle which is the + * smallest single rectangle that contains all the non-overlapping rectangles. + * + * A Region is implemented as a "y-x-banded" array of rectangles. This array + * imposes two degrees of order. First, all rectangles are sorted by top side + * y coordinate first (y1), and then by left side x coordinate (x1). + * + * Furthermore, the rectangles are grouped into "bands". Each rectangle in a + * band has the same top y coordinate (y1), and each has the same bottom y + * coordinate (y2). Thus all rectangles in a band differ only in their left + * and right side (x1 and x2). Bands are implicit in the array of rectangles: + * there is no separate list of band start pointers. + * + * The y-x band representation does not minimize rectangles. In particular, + * if a rectangle vertically crosses a band (the rectangle has scanlines in + * the y1 to y2 area spanned by the band), then the rectangle may be broken + * down into two or more smaller rectangles stacked one atop the other. + * + * ----------- ----------- + * | | | | band 0 + * | | -------- ----------- -------- + * | | | | in y-x banded | | | | band 1 + * | | | | form is | | | | + * ----------- | | ----------- -------- + * | | | | band 2 + * -------- -------- + * + * An added constraint on the rectangles is that they must cover as much + * horizontal area as possible: no two rectangles within a band are allowed + * to touch. + * + * Whenever possible, bands will be merged together to cover a greater vertical + * distance (and thus reduce the number of rectangles). Two bands can be merged + * only if the bottom of one touches the top of the other and they have + * rectangles in the same places (of the same width, of course). + * + * Adam de Boor wrote most of the original region code. Joel McCormack + * substantially modified or rewrote most of the core arithmetic routines, and + * added pixman_region_validate in order to support several speed improvements + * to pixman_region_validate_tree. Bob Scheifler changed the representation + * to be more compact when empty or a single rectangle, and did a bunch of + * gratuitous reformatting. Carl Worth did further gratuitous reformatting + * while re-merging the server and client region code into libpixregion. + * Soren Sandmann did even more gratuitous reformatting. + */ + +/* true iff two Boxes overlap */ +#define EXTENTCHECK(r1, r2) \ + (!( ((r1)->x2 <= (r2)->x1) || \ + ((r1)->x1 >= (r2)->x2) || \ + ((r1)->y2 <= (r2)->y1) || \ + ((r1)->y1 >= (r2)->y2) ) ) + +/* true iff (x,y) is in Box */ +#define INBOX(r, x, y) \ + ( ((r)->x2 > x) && \ + ((r)->x1 <= x) && \ + ((r)->y2 > y) && \ + ((r)->y1 <= y) ) + +/* true iff Box r1 contains Box r2 */ +#define SUBSUMES(r1, r2) \ + ( ((r1)->x1 <= (r2)->x1) && \ + ((r1)->x2 >= (r2)->x2) && \ + ((r1)->y1 <= (r2)->y1) && \ + ((r1)->y2 >= (r2)->y2) ) + +static size_t +PIXREGION_SZOF (size_t n) +{ + size_t size = n * sizeof(box_type_t); + + if (n > UINT32_MAX / sizeof(box_type_t)) + return 0; + + if (sizeof(region_data_type_t) > UINT32_MAX - size) + return 0; + + return size + sizeof(region_data_type_t); +} + +static region_data_type_t * +alloc_data (size_t n) +{ + size_t sz = PIXREGION_SZOF (n); + + if (!sz) + return NULL; + + return (region_data_type_t *)malloc (sz); +} + +#define FREE_DATA(reg) if ((reg)->data && (reg)->data->size) free ((reg)->data) + +#define RECTALLOC_BAIL(region, n, bail) \ + do \ + { \ + if (!(region)->data || \ + (((region)->data->numRects + (n)) > (region)->data->size)) \ + { \ + if (!pixman_rect_alloc (region, n)) \ + goto bail; \ + } \ + } while (0) + +#define RECTALLOC(region, n) \ + do \ + { \ + if (!(region)->data || \ + (((region)->data->numRects + (n)) > (region)->data->size)) \ + { \ + if (!pixman_rect_alloc (region, n)) { \ + return FALSE; \ + } \ + } \ + } while (0) + +#define ADDRECT(next_rect, nx1, ny1, nx2, ny2) \ + do \ + { \ + next_rect->x1 = nx1; \ + next_rect->y1 = ny1; \ + next_rect->x2 = nx2; \ + next_rect->y2 = ny2; \ + next_rect++; \ + } \ + while (0) + +#define NEWRECT(region, next_rect, nx1, ny1, nx2, ny2) \ + do \ + { \ + if (!(region)->data || \ + ((region)->data->numRects == (region)->data->size)) \ + { \ + if (!pixman_rect_alloc (region, 1)) \ + return FALSE; \ + next_rect = PIXREGION_TOP (region); \ + } \ + ADDRECT (next_rect, nx1, ny1, nx2, ny2); \ + region->data->numRects++; \ + critical_if_fail (region->data->numRects <= region->data->size); \ + } while (0) + +#define DOWNSIZE(reg, numRects) \ + do \ + { \ + if (((numRects) < ((reg)->data->size >> 1)) && \ + ((reg)->data->size > 50)) \ + { \ + region_data_type_t * new_data; \ + size_t data_size = PIXREGION_SZOF (numRects); \ + \ + if (!data_size) \ + { \ + new_data = NULL; \ + } \ + else \ + { \ + new_data = (region_data_type_t *) \ + realloc ((reg)->data, data_size); \ + } \ + \ + if (new_data) \ + { \ + new_data->size = (numRects); \ + (reg)->data = new_data; \ + } \ + } \ + } while (0) + +PIXMAN_EXPORT pixman_bool_t +PREFIX (_equal) (region_type_t *reg1, region_type_t *reg2) +{ + int i; + box_type_t *rects1; + box_type_t *rects2; + + if (reg1->extents.x1 != reg2->extents.x1) + return FALSE; + + if (reg1->extents.x2 != reg2->extents.x2) + return FALSE; + + if (reg1->extents.y1 != reg2->extents.y1) + return FALSE; + + if (reg1->extents.y2 != reg2->extents.y2) + return FALSE; + + if (PIXREGION_NUMRECTS (reg1) != PIXREGION_NUMRECTS (reg2)) + return FALSE; + + rects1 = PIXREGION_RECTS (reg1); + rects2 = PIXREGION_RECTS (reg2); + + for (i = 0; i != PIXREGION_NUMRECTS (reg1); i++) + { + if (rects1[i].x1 != rects2[i].x1) + return FALSE; + + if (rects1[i].x2 != rects2[i].x2) + return FALSE; + + if (rects1[i].y1 != rects2[i].y1) + return FALSE; + + if (rects1[i].y2 != rects2[i].y2) + return FALSE; + } + + return TRUE; +} + +// returns true if both region intersects +PIXMAN_EXPORT pixman_bool_t +PREFIX (_intersects) (region_type_t *reg1, region_type_t *reg2) +{ + box_type_t *rects1 = PIXREGION_RECTS (reg1); + box_type_t *rects2 = PIXREGION_RECTS (reg2); + for (int i = 0; i != PIXREGION_NUMRECTS (reg1); i++) + { + for(int j = 0; j != PIXREGION_NUMRECTS (reg2); j++) + { + if (EXTENTCHECK(rects1 + i, rects2 + j)) + return TRUE; + } + } + return FALSE; +} + +int +PREFIX (_print) (region_type_t *rgn) +{ + int num, size; + int i; + box_type_t * rects; + + num = PIXREGION_NUMRECTS (rgn); + size = PIXREGION_SIZE (rgn); + rects = PIXREGION_RECTS (rgn); + + fprintf (stderr, "num: %d size: %d\n", num, size); + fprintf (stderr, "extents: %d %d %d %d\n", + rgn->extents.x1, + rgn->extents.y1, + rgn->extents.x2, + rgn->extents.y2); + + for (i = 0; i < num; i++) + { + fprintf (stderr, "%d %d %d %d \n", + rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2); + } + + fprintf (stderr, "\n"); + + return(num); +} + + +PIXMAN_EXPORT void +PREFIX (_init) (region_type_t *region) +{ + region->extents = *pixman_region_empty_box; + region->data = pixman_region_empty_data; +} + +PIXMAN_EXPORT pixman_bool_t +PREFIX (_union_rect) (region_type_t *dest, + region_type_t *source, + int x, + int y, + unsigned int width, + unsigned int height); +PIXMAN_EXPORT void +PREFIX (_init_rect) (region_type_t * region, + int x, + int y, + unsigned int width, + unsigned int height) +{ + PREFIX (_init) (region); + PREFIX (_union_rect)(region, region, x, y, width, height); +} + +PIXMAN_EXPORT void +PREFIX (_fini) (region_type_t *region) +{ + GOOD (region); + FREE_DATA (region); +} + +PIXMAN_EXPORT int +PREFIX (_n_rects) (region_type_t *region) +{ + return PIXREGION_NUMRECTS (region); +} + +static pixman_bool_t +pixman_break (region_type_t *region) +{ + FREE_DATA (region); + + region->extents = *pixman_region_empty_box; + region->data = pixman_broken_data; + + return FALSE; +} + +static pixman_bool_t +pixman_rect_alloc (region_type_t * region, + int n) +{ + region_data_type_t *data; + + if (!region->data) + { + n++; + region->data = alloc_data (n); + + if (!region->data) + return pixman_break (region); + + region->data->numRects = 1; + *PIXREGION_BOXPTR (region) = region->extents; + } + else if (!region->data->size) + { + region->data = alloc_data (n); + + if (!region->data) + return pixman_break (region); + + region->data->numRects = 0; + } + else + { + size_t data_size; + + if (n == 1) + { + n = region->data->numRects; + if (n > 500) /* XXX pick numbers out of a hat */ + n = 250; + } + + n += region->data->numRects; + data_size = PIXREGION_SZOF (n); + + if (!data_size) + { + data = NULL; + } + else + { + data = (region_data_type_t *) + realloc (region->data, PIXREGION_SZOF (n)); + } + + if (!data) + return pixman_break (region); + + region->data = data; + } + + region->data->size = n; + + return TRUE; +} + +PIXMAN_EXPORT pixman_bool_t +PREFIX (_copy) (region_type_t *dst, region_type_t *src) +{ + GOOD (dst); + GOOD (src); + + if (dst == src) + return TRUE; + + dst->extents = src->extents; + + if (!src->data || !src->data->size) + { + FREE_DATA (dst); + dst->data = src->data; + return TRUE; + } + + if (!dst->data || (dst->data->size < src->data->numRects)) + { + FREE_DATA (dst); + + dst->data = alloc_data (src->data->numRects); + + if (!dst->data) + return pixman_break (dst); + + dst->data->size = src->data->numRects; + } + + dst->data->numRects = src->data->numRects; + + memmove ((char *)PIXREGION_BOXPTR (dst), (char *)PIXREGION_BOXPTR (src), + dst->data->numRects * sizeof(box_type_t)); + + return TRUE; +} + +/*====================================================================== + * Generic Region Operator + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * pixman_coalesce -- + * Attempt to merge the boxes in the current band with those in the + * previous one. We are guaranteed that the current band extends to + * the end of the rects array. Used only by pixman_op. + * + * Results: + * The new index for the previous band. + * + * Side Effects: + * If coalescing takes place: + * - rectangles in the previous band will have their y2 fields + * altered. + * - region->data->numRects will be decreased. + * + *----------------------------------------------------------------------- + */ +static inline int +pixman_coalesce (region_type_t * region, /* Region to coalesce */ + int prev_start, /* Index of start of previous band */ + int cur_start) /* Index of start of current band */ +{ + box_type_t *prev_box; /* Current box in previous band */ + box_type_t *cur_box; /* Current box in current band */ + int numRects; /* Number rectangles in both bands */ + int y2; /* Bottom of current band */ + + /* + * Figure out how many rectangles are in the band. + */ + numRects = cur_start - prev_start; + critical_if_fail (numRects == region->data->numRects - cur_start); + + if (!numRects) return cur_start; + + /* + * The bands may only be coalesced if the bottom of the previous + * matches the top scanline of the current. + */ + prev_box = PIXREGION_BOX (region, prev_start); + cur_box = PIXREGION_BOX (region, cur_start); + if (prev_box->y2 != cur_box->y1) return cur_start; + + /* + * Make sure the bands have boxes in the same places. This + * assumes that boxes have been added in such a way that they + * cover the most area possible. I.e. two boxes in a band must + * have some horizontal space between them. + */ + y2 = cur_box->y2; + + do + { + if ((prev_box->x1 != cur_box->x1) || (prev_box->x2 != cur_box->x2)) + return (cur_start); + + prev_box++; + cur_box++; + numRects--; + } + while (numRects); + + /* + * The bands may be merged, so set the bottom y of each box + * in the previous band to the bottom y of the current band. + */ + numRects = cur_start - prev_start; + region->data->numRects -= numRects; + + do + { + prev_box--; + prev_box->y2 = y2; + numRects--; + } + while (numRects); + + return prev_start; +} + +/* Quicky macro to avoid trivial reject procedure calls to pixman_coalesce */ + +#define COALESCE(new_reg, prev_band, cur_band) \ + do \ + { \ + if (cur_band - prev_band == new_reg->data->numRects - cur_band) \ + prev_band = pixman_coalesce (new_reg, prev_band, cur_band); \ + else \ + prev_band = cur_band; \ + } while (0) + +/*- + *----------------------------------------------------------------------- + * pixman_region_append_non_o -- + * Handle a non-overlapping band for the union and subtract operations. + * Just adds the (top/bottom-clipped) rectangles into the region. + * Doesn't have to check for subsumption or anything. + * + * Results: + * None. + * + * Side Effects: + * region->data->numRects is incremented and the rectangles overwritten + * with the rectangles we're passed. + * + *----------------------------------------------------------------------- + */ +static inline pixman_bool_t +pixman_region_append_non_o (region_type_t * region, + box_type_t * r, + box_type_t * r_end, + int y1, + int y2) +{ + box_type_t *next_rect; + int new_rects; + + new_rects = r_end - r; + + critical_if_fail (y1 < y2); + critical_if_fail (new_rects != 0); + + /* Make sure we have enough space for all rectangles to be added */ + RECTALLOC (region, new_rects); + next_rect = PIXREGION_TOP (region); + region->data->numRects += new_rects; + + do + { + critical_if_fail (r->x1 < r->x2); + ADDRECT (next_rect, r->x1, y1, r->x2, y2); + r++; + } + while (r != r_end); + + return TRUE; +} + +#define FIND_BAND(r, r_band_end, r_end, ry1) \ + do \ + { \ + ry1 = r->y1; \ + r_band_end = r + 1; \ + while ((r_band_end != r_end) && (r_band_end->y1 == ry1)) { \ + r_band_end++; \ + } \ + } while (0) + +#define APPEND_REGIONS(new_reg, r, r_end) \ + do \ + { \ + int new_rects; \ + if ((new_rects = r_end - r)) { \ + RECTALLOC_BAIL (new_reg, new_rects, bail); \ + memmove ((char *)PIXREGION_TOP (new_reg), (char *)r, \ + new_rects * sizeof(box_type_t)); \ + new_reg->data->numRects += new_rects; \ + } \ + } while (0) + +/*- + *----------------------------------------------------------------------- + * pixman_op -- + * Apply an operation to two regions. Called by pixman_region_union, pixman_region_inverse, + * pixman_region_subtract, pixman_region_intersect.... Both regions MUST have at least one + * rectangle, and cannot be the same object. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * The new region is overwritten. + * overlap set to TRUE if overlap_func ever returns TRUE. + * + * Notes: + * The idea behind this function is to view the two regions as sets. + * Together they cover a rectangle of area that this function divides + * into horizontal bands where points are covered only by one region + * or by both. For the first case, the non_overlap_func is called with + * each the band and the band's upper and lower extents. For the + * second, the overlap_func is called to process the entire band. It + * is responsible for clipping the rectangles in the band, though + * this function provides the boundaries. + * At the end of each band, the new region is coalesced, if possible, + * to reduce the number of rectangles in the region. + * + *----------------------------------------------------------------------- + */ + +typedef pixman_bool_t (*overlap_proc_ptr) (region_type_t *region, + box_type_t * r1, + box_type_t * r1_end, + box_type_t * r2, + box_type_t * r2_end, + int y1, + int y2); + +static pixman_bool_t +pixman_op (region_type_t * new_reg, /* Place to store result */ + region_type_t * reg1, /* First region in operation */ + region_type_t * reg2, /* 2d region in operation */ + overlap_proc_ptr overlap_func, /* Function to call for over- + * lapping bands */ + int append_non1, /* Append non-overlapping bands + * in region 1 ? + */ + int append_non2 /* Append non-overlapping bands + * in region 2 ? + */ + ) +{ + box_type_t *r1; /* Pointer into first region */ + box_type_t *r2; /* Pointer into 2d region */ + box_type_t *r1_end; /* End of 1st region */ + box_type_t *r2_end; /* End of 2d region */ + int ybot; /* Bottom of intersection */ + int ytop; /* Top of intersection */ + region_data_type_t *old_data; /* Old data for new_reg */ + int prev_band; /* Index of start of + * previous band in new_reg */ + int cur_band; /* Index of start of current + * band in new_reg */ + box_type_t * r1_band_end; /* End of current band in r1 */ + box_type_t * r2_band_end; /* End of current band in r2 */ + int top; /* Top of non-overlapping band */ + int bot; /* Bottom of non-overlapping band*/ + int r1y1; /* Temps for r1->y1 and r2->y1 */ + int r2y1; + int new_size; + int numRects; + + /* + * Break any region computed from a broken region + */ + if (PIXREGION_NAR (reg1) || PIXREGION_NAR (reg2)) + return pixman_break (new_reg); + + /* + * Initialization: + * set r1, r2, r1_end and r2_end appropriately, save the rectangles + * of the destination region until the end in case it's one of + * the two source regions, then mark the "new" region empty, allocating + * another array of rectangles for it to use. + */ + + r1 = PIXREGION_RECTS (reg1); + new_size = PIXREGION_NUMRECTS (reg1); + r1_end = r1 + new_size; + + numRects = PIXREGION_NUMRECTS (reg2); + r2 = PIXREGION_RECTS (reg2); + r2_end = r2 + numRects; + + critical_if_fail (r1 != r1_end); + critical_if_fail (r2 != r2_end); + + old_data = (region_data_type_t *)NULL; + + if (((new_reg == reg1) && (new_size > 1)) || + ((new_reg == reg2) && (numRects > 1))) + { + old_data = new_reg->data; + new_reg->data = pixman_region_empty_data; + } + + /* guess at new size */ + if (numRects > new_size) + new_size = numRects; + + new_size <<= 1; + + if (!new_reg->data) + new_reg->data = pixman_region_empty_data; + else if (new_reg->data->size) + new_reg->data->numRects = 0; + + if (new_size > new_reg->data->size) + { + if (!pixman_rect_alloc (new_reg, new_size)) + { + free (old_data); + return FALSE; + } + } + + /* + * Initialize ybot. + * In the upcoming loop, ybot and ytop serve different functions depending + * on whether the band being handled is an overlapping or non-overlapping + * band. + * In the case of a non-overlapping band (only one of the regions + * has points in the band), ybot is the bottom of the most recent + * intersection and thus clips the top of the rectangles in that band. + * ytop is the top of the next intersection between the two regions and + * serves to clip the bottom of the rectangles in the current band. + * For an overlapping band (where the two regions intersect), ytop clips + * the top of the rectangles of both regions and ybot clips the bottoms. + */ + + ybot = MIN (r1->y1, r2->y1); + + /* + * prev_band serves to mark the start of the previous band so rectangles + * can be coalesced into larger rectangles. qv. pixman_coalesce, above. + * In the beginning, there is no previous band, so prev_band == cur_band + * (cur_band is set later on, of course, but the first band will always + * start at index 0). prev_band and cur_band must be indices because of + * the possible expansion, and resultant moving, of the new region's + * array of rectangles. + */ + prev_band = 0; + + do + { + /* + * This algorithm proceeds one source-band (as opposed to a + * destination band, which is determined by where the two regions + * intersect) at a time. r1_band_end and r2_band_end serve to mark the + * rectangle after the last one in the current band for their + * respective regions. + */ + critical_if_fail (r1 != r1_end); + critical_if_fail (r2 != r2_end); + + FIND_BAND (r1, r1_band_end, r1_end, r1y1); + FIND_BAND (r2, r2_band_end, r2_end, r2y1); + + /* + * First handle the band that doesn't intersect, if any. + * + * Note that attention is restricted to one band in the + * non-intersecting region at once, so if a region has n + * bands between the current position and the next place it overlaps + * the other, this entire loop will be passed through n times. + */ + if (r1y1 < r2y1) + { + if (append_non1) + { + top = MAX (r1y1, ybot); + bot = MIN (r1->y2, r2y1); + if (top != bot) + { + cur_band = new_reg->data->numRects; + if (!pixman_region_append_non_o (new_reg, r1, r1_band_end, top, bot)) + goto bail; + COALESCE (new_reg, prev_band, cur_band); + } + } + ytop = r2y1; + } + else if (r2y1 < r1y1) + { + if (append_non2) + { + top = MAX (r2y1, ybot); + bot = MIN (r2->y2, r1y1); + + if (top != bot) + { + cur_band = new_reg->data->numRects; + + if (!pixman_region_append_non_o (new_reg, r2, r2_band_end, top, bot)) + goto bail; + + COALESCE (new_reg, prev_band, cur_band); + } + } + ytop = r1y1; + } + else + { + ytop = r1y1; + } + + /* + * Now see if we've hit an intersecting band. The two bands only + * intersect if ybot > ytop + */ + ybot = MIN (r1->y2, r2->y2); + if (ybot > ytop) + { + cur_band = new_reg->data->numRects; + + if (!(*overlap_func)(new_reg, + r1, r1_band_end, + r2, r2_band_end, + ytop, ybot)) + { + goto bail; + } + + COALESCE (new_reg, prev_band, cur_band); + } + + /* + * If we've finished with a band (y2 == ybot) we skip forward + * in the region to the next band. + */ + if (r1->y2 == ybot) + r1 = r1_band_end; + + if (r2->y2 == ybot) + r2 = r2_band_end; + + } + while (r1 != r1_end && r2 != r2_end); + + /* + * Deal with whichever region (if any) still has rectangles left. + * + * We only need to worry about banding and coalescing for the very first + * band left. After that, we can just group all remaining boxes, + * regardless of how many bands, into one final append to the list. + */ + + if ((r1 != r1_end) && append_non1) + { + /* Do first non_overlap1Func call, which may be able to coalesce */ + FIND_BAND (r1, r1_band_end, r1_end, r1y1); + + cur_band = new_reg->data->numRects; + + if (!pixman_region_append_non_o (new_reg, + r1, r1_band_end, + MAX (r1y1, ybot), r1->y2)) + { + goto bail; + } + + COALESCE (new_reg, prev_band, cur_band); + + /* Just append the rest of the boxes */ + APPEND_REGIONS (new_reg, r1_band_end, r1_end); + } + else if ((r2 != r2_end) && append_non2) + { + /* Do first non_overlap2Func call, which may be able to coalesce */ + FIND_BAND (r2, r2_band_end, r2_end, r2y1); + + cur_band = new_reg->data->numRects; + + if (!pixman_region_append_non_o (new_reg, + r2, r2_band_end, + MAX (r2y1, ybot), r2->y2)) + { + goto bail; + } + + COALESCE (new_reg, prev_band, cur_band); + + /* Append rest of boxes */ + APPEND_REGIONS (new_reg, r2_band_end, r2_end); + } + + free (old_data); + + if (!(numRects = new_reg->data->numRects)) + { + FREE_DATA (new_reg); + new_reg->data = pixman_region_empty_data; + } + else if (numRects == 1) + { + new_reg->extents = *PIXREGION_BOXPTR (new_reg); + FREE_DATA (new_reg); + new_reg->data = (region_data_type_t *)NULL; + } + else + { + DOWNSIZE (new_reg, numRects); + } + + return TRUE; + +bail: + free (old_data); + + return pixman_break (new_reg); +} + +/*- + *----------------------------------------------------------------------- + * pixman_set_extents -- + * Reset the extents of a region to what they should be. Called by + * pixman_region_subtract and pixman_region_intersect as they can't + * figure it out along the way or do so easily, as pixman_region_union can. + * + * Results: + * None. + * + * Side Effects: + * The region's 'extents' structure is overwritten. + * + *----------------------------------------------------------------------- + */ +static void +pixman_set_extents (region_type_t *region) +{ + box_type_t *box, *box_end; + + if (!region->data) + return; + + if (!region->data->size) + { + region->extents.x2 = region->extents.x1; + region->extents.y2 = region->extents.y1; + return; + } + + box = PIXREGION_BOXPTR (region); + box_end = PIXREGION_END (region); + + /* + * Since box is the first rectangle in the region, it must have the + * smallest y1 and since box_end is the last rectangle in the region, + * it must have the largest y2, because of banding. Initialize x1 and + * x2 from box and box_end, resp., as good things to initialize them + * to... + */ + region->extents.x1 = box->x1; + region->extents.y1 = box->y1; + region->extents.x2 = box_end->x2; + region->extents.y2 = box_end->y2; + + critical_if_fail (region->extents.y1 < region->extents.y2); + + while (box <= box_end) + { + if (box->x1 < region->extents.x1) + region->extents.x1 = box->x1; + if (box->x2 > region->extents.x2) + region->extents.x2 = box->x2; + box++; + } + + critical_if_fail (region->extents.x1 < region->extents.x2); +} + +/*====================================================================== + * Region Intersection + *====================================================================*/ +/*- + *----------------------------------------------------------------------- + * pixman_region_intersect_o -- + * Handle an overlapping band for pixman_region_intersect. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * Rectangles may be added to the region. + * + *----------------------------------------------------------------------- + */ +/*ARGSUSED*/ +static pixman_bool_t +pixman_region_intersect_o (region_type_t *region, + box_type_t * r1, + box_type_t * r1_end, + box_type_t * r2, + box_type_t * r2_end, + int y1, + int y2) +{ + int x1; + int x2; + box_type_t * next_rect; + + next_rect = PIXREGION_TOP (region); + + critical_if_fail (y1 < y2); + critical_if_fail (r1 != r1_end && r2 != r2_end); + + do + { + x1 = MAX (r1->x1, r2->x1); + x2 = MIN (r1->x2, r2->x2); + + /* + * If there's any overlap between the two rectangles, add that + * overlap to the new region. + */ + if (x1 < x2) + NEWRECT (region, next_rect, x1, y1, x2, y2); + + /* + * Advance the pointer(s) with the leftmost right side, since the next + * rectangle on that list may still overlap the other region's + * current rectangle. + */ + if (r1->x2 == x2) + { + r1++; + } + if (r2->x2 == x2) + { + r2++; + } + } + while ((r1 != r1_end) && (r2 != r2_end)); + + return TRUE; +} + +PIXMAN_EXPORT pixman_bool_t +PREFIX (_intersect) (region_type_t * new_reg, + region_type_t * reg1, + region_type_t * reg2) +{ + GOOD (reg1); + GOOD (reg2); + GOOD (new_reg); + + /* check for trivial reject */ + if (PIXREGION_NIL (reg1) || PIXREGION_NIL (reg2) || + !EXTENTCHECK (®1->extents, ®2->extents)) + { + /* Covers about 20% of all cases */ + FREE_DATA (new_reg); + new_reg->extents.x2 = new_reg->extents.x1; + new_reg->extents.y2 = new_reg->extents.y1; + if (PIXREGION_NAR (reg1) || PIXREGION_NAR (reg2)) + { + new_reg->data = pixman_broken_data; + return FALSE; + } + else + { + new_reg->data = pixman_region_empty_data; + } + } + else if (!reg1->data && !reg2->data) + { + /* Covers about 80% of cases that aren't trivially rejected */ + new_reg->extents.x1 = MAX (reg1->extents.x1, reg2->extents.x1); + new_reg->extents.y1 = MAX (reg1->extents.y1, reg2->extents.y1); + new_reg->extents.x2 = MIN (reg1->extents.x2, reg2->extents.x2); + new_reg->extents.y2 = MIN (reg1->extents.y2, reg2->extents.y2); + + FREE_DATA (new_reg); + + new_reg->data = (region_data_type_t *)NULL; + } + else if (!reg2->data && SUBSUMES (®2->extents, ®1->extents)) + { + return PREFIX (_copy) (new_reg, reg1); + } + else if (!reg1->data && SUBSUMES (®1->extents, ®2->extents)) + { + return PREFIX (_copy) (new_reg, reg2); + } + else if (reg1 == reg2) + { + return PREFIX (_copy) (new_reg, reg1); + } + else + { + /* General purpose intersection */ + + if (!pixman_op (new_reg, reg1, reg2, pixman_region_intersect_o, FALSE, FALSE)) + return FALSE; + + pixman_set_extents (new_reg); + } + + GOOD (new_reg); + return(TRUE); +} + +#define MERGERECT(r) \ + do \ + { \ + if (r->x1 <= x2) \ + { \ + /* Merge with current rectangle */ \ + if (x2 < r->x2) \ + x2 = r->x2; \ + } \ + else \ + { \ + /* Add current rectangle, start new one */ \ + NEWRECT (region, next_rect, x1, y1, x2, y2); \ + x1 = r->x1; \ + x2 = r->x2; \ + } \ + r++; \ + } while (0) + +/*====================================================================== + * Region Union + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * pixman_region_union_o -- + * Handle an overlapping band for the union operation. Picks the + * left-most rectangle each time and merges it into the region. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * region is overwritten. + * overlap is set to TRUE if any boxes overlap. + * + *----------------------------------------------------------------------- + */ +static pixman_bool_t +pixman_region_union_o (region_type_t *region, + box_type_t * r1, + box_type_t * r1_end, + box_type_t * r2, + box_type_t * r2_end, + int y1, + int y2) +{ + box_type_t *next_rect; + int x1; /* left and right side of current union */ + int x2; + + critical_if_fail (y1 < y2); + critical_if_fail (r1 != r1_end && r2 != r2_end); + + next_rect = PIXREGION_TOP (region); + + /* Start off current rectangle */ + if (r1->x1 < r2->x1) + { + x1 = r1->x1; + x2 = r1->x2; + r1++; + } + else + { + x1 = r2->x1; + x2 = r2->x2; + r2++; + } + while (r1 != r1_end && r2 != r2_end) + { + if (r1->x1 < r2->x1) + MERGERECT (r1); + else + MERGERECT (r2); + } + + /* Finish off whoever (if any) is left */ + if (r1 != r1_end) + { + do + { + MERGERECT (r1); + } + while (r1 != r1_end); + } + else if (r2 != r2_end) + { + do + { + MERGERECT (r2); + } + while (r2 != r2_end); + } + + /* Add current rectangle */ + NEWRECT (region, next_rect, x1, y1, x2, y2); + + return TRUE; +} + +PIXMAN_EXPORT pixman_bool_t +PREFIX(_intersect_rect) (region_type_t *dest, + region_type_t *source, + int x, int y, + unsigned int width, + unsigned int height) +{ + region_type_t region; + + region.data = NULL; + region.extents.x1 = x; + region.extents.y1 = y; + region.extents.x2 = x + width; + region.extents.y2 = y + height; + + return PREFIX(_intersect) (dest, source, ®ion); +} + +PIXMAN_EXPORT pixman_bool_t +PREFIX (_union) (region_type_t *new_reg, + region_type_t *reg1, + region_type_t *reg2); + +/* Convenience function for performing union of region with a + * single rectangle + */ +PIXMAN_EXPORT pixman_bool_t +PREFIX (_union_rect) (region_type_t *dest, + region_type_t *source, + int x, + int y, + unsigned int width, + unsigned int height) +{ + region_type_t region; + + region.extents.x1 = x; + region.extents.y1 = y; + region.extents.x2 = x + width; + region.extents.y2 = y + height; + + if (!GOOD_RECT (®ion.extents)) + { + if (BAD_RECT (®ion.extents)) + _pixman_log_error (FUNC, "Invalid rectangle passed"); + return PREFIX (_copy) (dest, source); + } + + region.data = NULL; + + return PREFIX (_union) (dest, source, ®ion); +} + +PIXMAN_EXPORT pixman_bool_t +PREFIX (_union) (region_type_t *new_reg, + region_type_t *reg1, + region_type_t *reg2) +{ + /* Return TRUE if some overlap + * between reg1, reg2 + */ + GOOD (reg1); + GOOD (reg2); + GOOD (new_reg); + + /* checks all the simple cases */ + + /* + * Region 1 and 2 are the same + */ + if (reg1 == reg2) + return PREFIX (_copy) (new_reg, reg1); + + /* + * Region 1 is empty + */ + if (PIXREGION_NIL (reg1)) + { + if (PIXREGION_NAR (reg1)) + return pixman_break (new_reg); + + if (new_reg != reg2) + return PREFIX (_copy) (new_reg, reg2); + + return TRUE; + } + + /* + * Region 2 is empty + */ + if (PIXREGION_NIL (reg2)) + { + if (PIXREGION_NAR (reg2)) + return pixman_break (new_reg); + + if (new_reg != reg1) + return PREFIX (_copy) (new_reg, reg1); + + return TRUE; + } + + /* + * Region 1 completely subsumes region 2 + */ + if (!reg1->data && SUBSUMES (®1->extents, ®2->extents)) + { + if (new_reg != reg1) + return PREFIX (_copy) (new_reg, reg1); + + return TRUE; + } + + /* + * Region 2 completely subsumes region 1 + */ + if (!reg2->data && SUBSUMES (®2->extents, ®1->extents)) + { + if (new_reg != reg2) + return PREFIX (_copy) (new_reg, reg2); + + return TRUE; + } + + if (!pixman_op (new_reg, reg1, reg2, pixman_region_union_o, TRUE, TRUE)) + return FALSE; + + new_reg->extents.x1 = MIN (reg1->extents.x1, reg2->extents.x1); + new_reg->extents.y1 = MIN (reg1->extents.y1, reg2->extents.y1); + new_reg->extents.x2 = MAX (reg1->extents.x2, reg2->extents.x2); + new_reg->extents.y2 = MAX (reg1->extents.y2, reg2->extents.y2); + + GOOD (new_reg); + + return TRUE; +} + +/*====================================================================== + * Region Subtraction + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * pixman_region_subtract_o -- + * Overlapping band subtraction. x1 is the left-most point not yet + * checked. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * region may have rectangles added to it. + * + *----------------------------------------------------------------------- + */ +/*ARGSUSED*/ +static pixman_bool_t +pixman_region_subtract_o (region_type_t * region, + box_type_t * r1, + box_type_t * r1_end, + box_type_t * r2, + box_type_t * r2_end, + int y1, + int y2) +{ + box_type_t * next_rect; + int x1; + + x1 = r1->x1; + + critical_if_fail (y1 < y2); + critical_if_fail (r1 != r1_end && r2 != r2_end); + + next_rect = PIXREGION_TOP (region); + + do + { + if (r2->x2 <= x1) + { + /* + * Subtrahend entirely to left of minuend: go to next subtrahend. + */ + r2++; + } + else if (r2->x1 <= x1) + { + /* + * Subtrahend precedes minuend: nuke left edge of minuend. + */ + x1 = r2->x2; + if (x1 >= r1->x2) + { + /* + * Minuend completely covered: advance to next minuend and + * reset left fence to edge of new minuend. + */ + r1++; + if (r1 != r1_end) + x1 = r1->x1; + } + else + { + /* + * Subtrahend now used up since it doesn't extend beyond + * minuend + */ + r2++; + } + } + else if (r2->x1 < r1->x2) + { + /* + * Left part of subtrahend covers part of minuend: add uncovered + * part of minuend to region and skip to next subtrahend. + */ + critical_if_fail (x1 < r2->x1); + NEWRECT (region, next_rect, x1, y1, r2->x1, y2); + + x1 = r2->x2; + if (x1 >= r1->x2) + { + /* + * Minuend used up: advance to new... + */ + r1++; + if (r1 != r1_end) + x1 = r1->x1; + } + else + { + /* + * Subtrahend used up + */ + r2++; + } + } + else + { + /* + * Minuend used up: add any remaining piece before advancing. + */ + if (r1->x2 > x1) + NEWRECT (region, next_rect, x1, y1, r1->x2, y2); + + r1++; + + if (r1 != r1_end) + x1 = r1->x1; + } + } + while ((r1 != r1_end) && (r2 != r2_end)); + + /* + * Add remaining minuend rectangles to region. + */ + while (r1 != r1_end) + { + critical_if_fail (x1 < r1->x2); + + NEWRECT (region, next_rect, x1, y1, r1->x2, y2); + + r1++; + if (r1 != r1_end) + x1 = r1->x1; + } + return TRUE; +} + +/*- + *----------------------------------------------------------------------- + * pixman_region_subtract -- + * Subtract reg_s from reg_m and leave the result in reg_d. + * S stands for subtrahend, M for minuend and D for difference. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * reg_d is overwritten. + * + *----------------------------------------------------------------------- + */ +PIXMAN_EXPORT pixman_bool_t +PREFIX (_subtract) (region_type_t *reg_d, + region_type_t *reg_m, + region_type_t *reg_s) +{ + GOOD (reg_m); + GOOD (reg_s); + GOOD (reg_d); + + /* check for trivial rejects */ + if (PIXREGION_NIL (reg_m) || PIXREGION_NIL (reg_s) || + !EXTENTCHECK (®_m->extents, ®_s->extents)) + { + if (PIXREGION_NAR (reg_s)) + return pixman_break (reg_d); + + return PREFIX (_copy) (reg_d, reg_m); + } + else if (reg_m == reg_s) + { + FREE_DATA (reg_d); + reg_d->extents.x2 = reg_d->extents.x1; + reg_d->extents.y2 = reg_d->extents.y1; + reg_d->data = pixman_region_empty_data; + + return TRUE; + } + + /* Add those rectangles in region 1 that aren't in region 2, + do yucky subtraction for overlaps, and + just throw away rectangles in region 2 that aren't in region 1 */ + if (!pixman_op (reg_d, reg_m, reg_s, pixman_region_subtract_o, TRUE, FALSE)) + return FALSE; + + /* + * Can't alter reg_d's extents before we call pixman_op because + * it might be one of the source regions and pixman_op depends + * on the extents of those regions being unaltered. Besides, this + * way there's no checking against rectangles that will be nuked + * due to coalescing, so we have to examine fewer rectangles. + */ + pixman_set_extents (reg_d); + GOOD (reg_d); + return TRUE; +} +#if 0 +/*====================================================================== + * Region Inversion + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * pixman_region_inverse -- + * Take a region and a box and return a region that is everything + * in the box but not in the region. The careful reader will note + * that this is the same as subtracting the region from the box... + * + * Results: + * TRUE. + * + * Side Effects: + * new_reg is overwritten. + * + *----------------------------------------------------------------------- + */ +PIXMAN_EXPORT pixman_bool_t +PREFIX (_inverse) (region_type_t *new_reg, /* Destination region */ + region_type_t *reg1, /* Region to invert */ + box_type_t * inv_rect) /* Bounding box for inversion */ +{ + region_type_t inv_reg; /* Quick and dirty region made from the + * bounding box */ + GOOD (reg1); + GOOD (new_reg); + + /* check for trivial rejects */ + if (PIXREGION_NIL (reg1) || !EXTENTCHECK (inv_rect, ®1->extents)) + { + if (PIXREGION_NAR (reg1)) + return pixman_break (new_reg); + + new_reg->extents = *inv_rect; + FREE_DATA (new_reg); + new_reg->data = (region_data_type_t *)NULL; + + return TRUE; + } + + /* Add those rectangles in region 1 that aren't in region 2, + * do yucky subtraction for overlaps, and + * just throw away rectangles in region 2 that aren't in region 1 + */ + inv_reg.extents = *inv_rect; + inv_reg.data = (region_data_type_t *)NULL; + if (!pixman_op (new_reg, &inv_reg, reg1, pixman_region_subtract_o, TRUE, FALSE)) + return FALSE; + + /* + * Can't alter new_reg's extents before we call pixman_op because + * it might be one of the source regions and pixman_op depends + * on the extents of those regions being unaltered. Besides, this + * way there's no checking against rectangles that will be nuked + * due to coalescing, so we have to examine fewer rectangles. + */ + pixman_set_extents (new_reg); + GOOD (new_reg); + return TRUE; +} +#endif +/* In time O(log n), locate the first box whose y2 is greater than y. + * Return @end if no such box exists. + */ +static box_type_t * +find_box_for_y (box_type_t *begin, box_type_t *end, int y) +{ + box_type_t *mid; + + if (end == begin) + return end; + + if (end - begin == 1) + { + if (begin->y2 > y) + return begin; + else + return end; + } + + mid = begin + (end - begin) / 2; + if (mid->y2 > y) + { + /* If no box is found in [begin, mid], the function + * will return @mid, which is then known to be the + * correct answer. + */ + return find_box_for_y (begin, mid, y); + } + else + { + return find_box_for_y (mid, end, y); + } +} + +/* + * rect_in(region, rect) + * This routine takes a pointer to a region and a pointer to a box + * and determines if the box is outside/inside/partly inside the region. + * + * The idea is to travel through the list of rectangles trying to cover the + * passed box with them. Anytime a piece of the rectangle isn't covered + * by a band of rectangles, part_out is set TRUE. Any time a rectangle in + * the region covers part of the box, part_in is set TRUE. The process ends + * when either the box has been completely covered (we reached a band that + * doesn't overlap the box, part_in is TRUE and part_out is false), the + * box has been partially covered (part_in == part_out == TRUE -- because of + * the banding, the first time this is true we know the box is only + * partially in the region) or is outside the region (we reached a band + * that doesn't overlap the box at all and part_in is false) + */ +PIXMAN_EXPORT pixman_region_overlap_t +PREFIX (_contains_rectangle) (region_type_t * region, + box_type_t * prect) +{ + box_type_t * pbox; + box_type_t * pbox_end; + int part_in, part_out; + int numRects; + int x, y; + + GOOD (region); + + numRects = PIXREGION_NUMRECTS (region); + + /* useful optimization */ + if (!numRects || !EXTENTCHECK (®ion->extents, prect)) + return(PIXMAN_REGION_OUT); + + if (numRects == 1) + { + /* We know that it must be PIXMAN_REGION_IN or PIXMAN_REGION_PART */ + if (SUBSUMES (®ion->extents, prect)) + return(PIXMAN_REGION_IN); + else + return(PIXMAN_REGION_PART); + } + + part_out = FALSE; + part_in = FALSE; + + /* (x,y) starts at upper left of rect, moving to the right and down */ + x = prect->x1; + y = prect->y1; + + /* can stop when both part_out and part_in are TRUE, or we reach prect->y2 */ + for (pbox = PIXREGION_BOXPTR (region), pbox_end = pbox + numRects; + pbox != pbox_end; + pbox++) + { + /* getting up to speed or skipping remainder of band */ + if (pbox->y2 <= y) + { + if ((pbox = find_box_for_y (pbox, pbox_end, y)) == pbox_end) + break; + } + + if (pbox->y1 > y) + { + part_out = TRUE; /* missed part of rectangle above */ + if (part_in || (pbox->y1 >= prect->y2)) + break; + y = pbox->y1; /* x guaranteed to be == prect->x1 */ + } + + if (pbox->x2 <= x) + continue; /* not far enough over yet */ + + if (pbox->x1 > x) + { + part_out = TRUE; /* missed part of rectangle to left */ + if (part_in) + break; + } + + if (pbox->x1 < prect->x2) + { + part_in = TRUE; /* definitely overlap */ + if (part_out) + break; + } + + if (pbox->x2 >= prect->x2) + { + y = pbox->y2; /* finished with this band */ + if (y >= prect->y2) + break; + x = prect->x1; /* reset x out to left again */ + } + else + { + /* + * Because boxes in a band are maximal width, if the first box + * to overlap the rectangle doesn't completely cover it in that + * band, the rectangle must be partially out, since some of it + * will be uncovered in that band. part_in will have been set true + * by now... + */ + part_out = TRUE; + break; + } + } + + if (part_in) + { + if (y < prect->y2) + return PIXMAN_REGION_PART; + else + return PIXMAN_REGION_IN; + } + else + { + return PIXMAN_REGION_OUT; + } +} + +/* PREFIX(_translate) (region, x, y) + * translates in place + */ + +PIXMAN_EXPORT void +PREFIX (_translate) (region_type_t *region, int x, int y) +{ + overflow_int_t x1, x2, y1, y2; + int nbox; + box_type_t * pbox; + + GOOD (region); + region->extents.x1 = x1 = region->extents.x1 + x; + region->extents.y1 = y1 = region->extents.y1 + y; + region->extents.x2 = x2 = region->extents.x2 + x; + region->extents.y2 = y2 = region->extents.y2 + y; + + if (((x1 - PIXMAN_REGION_MIN) | (y1 - PIXMAN_REGION_MIN) | (PIXMAN_REGION_MAX - x2) | (PIXMAN_REGION_MAX - y2)) >= 0) + { + if (region->data && (nbox = region->data->numRects)) + { + for (pbox = PIXREGION_BOXPTR (region); nbox--; pbox++) + { + pbox->x1 += x; + pbox->y1 += y; + pbox->x2 += x; + pbox->y2 += y; + } + } + return; + } + + if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) + { + region->extents.x2 = region->extents.x1; + region->extents.y2 = region->extents.y1; + FREE_DATA (region); + region->data = pixman_region_empty_data; + return; + } + + if (x1 < PIXMAN_REGION_MIN) + region->extents.x1 = PIXMAN_REGION_MIN; + else if (x2 > PIXMAN_REGION_MAX) + region->extents.x2 = PIXMAN_REGION_MAX; + + if (y1 < PIXMAN_REGION_MIN) + region->extents.y1 = PIXMAN_REGION_MIN; + else if (y2 > PIXMAN_REGION_MAX) + region->extents.y2 = PIXMAN_REGION_MAX; + + if (region->data && (nbox = region->data->numRects)) + { + box_type_t * pbox_out; + + for (pbox_out = pbox = PIXREGION_BOXPTR (region); nbox--; pbox++) + { + pbox_out->x1 = x1 = pbox->x1 + x; + pbox_out->y1 = y1 = pbox->y1 + y; + pbox_out->x2 = x2 = pbox->x2 + x; + pbox_out->y2 = y2 = pbox->y2 + y; + + if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | + (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) + { + region->data->numRects--; + continue; + } + + if (x1 < PIXMAN_REGION_MIN) + pbox_out->x1 = PIXMAN_REGION_MIN; + else if (x2 > PIXMAN_REGION_MAX) + pbox_out->x2 = PIXMAN_REGION_MAX; + + if (y1 < PIXMAN_REGION_MIN) + pbox_out->y1 = PIXMAN_REGION_MIN; + else if (y2 > PIXMAN_REGION_MAX) + pbox_out->y2 = PIXMAN_REGION_MAX; + + pbox_out++; + } + + if (pbox_out != pbox) + { + if (region->data->numRects == 1) + { + region->extents = *PIXREGION_BOXPTR (region); + FREE_DATA (region); + region->data = (region_data_type_t *)NULL; + } + else + { + pixman_set_extents (region); + } + } + } + + GOOD (region); +} + +PIXMAN_EXPORT int +PREFIX (_not_empty) (region_type_t * region) +{ + GOOD (region); + + return(!PIXREGION_NIL (region)); +} + +PIXMAN_EXPORT box_type_t * +PREFIX (_extents) (region_type_t * region) +{ + GOOD (region); + + return(®ion->extents); +} + +typedef region_type_t VRegionPrivate; + +#include "vregion.h" + +static VRegionPrivate regionPrivate = {{0,0,0,0}, NULL}; +const VRegion::VRegionData VRegion::shared_empty = {RefCount(-1), ®ionPrivate}; + +inline VRect box_to_rect(box_type_t *box) +{ + return VRect(box->x1, box->y1, box->x2 - box->x1, box->y2 - box->y1); +} + +void VRegion::cleanUp(VRegion::VRegionData *x) +{ + if (x->rgn) { + PREFIX(_fini)(x->rgn); + delete x->rgn; + } + delete x; +} + +void VRegion::detach() +{ + if (d->ref.isShared()) + *this = copy(); +} + +VRegion VRegion::copy() const +{ + VRegion r; + + r.d = new VRegionData; + r.d->rgn = new VRegionPrivate; + r.d->ref.setOwned(); + PREFIX (_init) (r.d->rgn); + if (d != &shared_empty) + PREFIX(_copy)(r.d->rgn, d->rgn); + return r; +} + +VRegion::VRegion() + : d(const_cast(&shared_empty)) +{ +} + +VRegion::VRegion(int x, int y, int w, int h) +{ + VRegion tmp(VRect(x, y, w, h)); + tmp.d->ref.ref(); + d = tmp.d; +} + +VRegion::VRegion(const VRect &r) +{ + if (r.isEmpty()) { + d = const_cast(&shared_empty); + } else { + d = new VRegionData; + d->rgn = new VRegionPrivate; + d->ref.setOwned(); + PREFIX(_init_rect)(d->rgn, r.left(), r.top(), r.width(), r.height()); + } +} + +VRegion::VRegion(const VRegion &r) +{ + d = r.d; + d->ref.ref(); +} + +VRegion &VRegion::operator=(const VRegion &r) +{ + r.d->ref.ref(); + if (!d->ref.deref()) + cleanUp(d); + + d = r.d; + return *this; +} + +inline VRegion &VRegion::operator=(VRegion &&other) +{ + if (!d->ref.deref()) + cleanUp(d); + d = other.d; + other.d = const_cast(&shared_empty); + return *this; +} + +VRegion::~VRegion() +{ + if (!d->ref.deref()) + cleanUp(d); +} + +bool VRegion::isEmpty() const +{ + return d == &shared_empty || !PREFIX(_not_empty)(d->rgn); +} + +void VRegion::translate(const VPoint &p) +{ + if (p == VPoint() || isEmpty()) + return; + + detach(); + PREFIX(_translate)(d->rgn, p.x(), p.y()); +} + +VRegion VRegion::translated(const VPoint &p) const +{ + VRegion ret(*this); + ret.translate(p); + return ret; +} + +/* + * Returns \c true if this region is guaranteed to be fully contained in r. + */ +bool VRegion::within(const VRect &r1) const +{ + box_type_t *r2 = PREFIX(_extents)(d->rgn); + + return r2->x1 >= r1.left() && r2->x2 <= r1.right() + && r2->y1 >= r1.top() && r2->y2 <= r1.bottom(); +} + +bool VRegion::contains(const VRect &r) const +{ + box_type_t box = {r.left(), r.top(), r.right(), r.bottom()}; + + pixman_region_overlap_t res = PREFIX (_contains_rectangle)(d->rgn, &box); + if (res == PIXMAN_REGION_IN) + return true; + return false; +} + +VRegion VRegion::united(const VRect &r) const +{ + if (isEmpty()) + return r; + + if (contains(r)) { + return *this; + } else if (within(r)) { + return r; + } else { + VRegion result; + result.detach(); + PREFIX(_union_rect)(result.d->rgn, d->rgn, + r.left(), r.top(), + r.width(), r.height()); + return result; + } +} + +VRegion VRegion::united(const VRegion &r) const +{ + if (isEmpty()) + return r; + if (r.isEmpty()) + return *this; + if (d == r.d || + PREFIX(_equal)(d->rgn, r.d->rgn)) + return *this; + VRegion result; + result.detach(); + PREFIX(_union)(result.d->rgn, d->rgn, r.d->rgn); + return result; +} + +VRegion VRegion::intersected(const VRect &r) const +{ + if (isEmpty() || r.isEmpty()) + return VRegion(); + + /* this is fully contained in r */ + if (within(r)) + return *this; + + /* r is fully contained in this */ + if (contains(r)) + return r; + + VRegion result; + result.detach(); + PREFIX(_intersect_rect)(result.d->rgn, d->rgn, + r.left(), r.top(), + r.width(), r.height()); + return result; +} + +VRegion VRegion::intersected(const VRegion &r) const +{ + if (isEmpty() || r.isEmpty()) + return VRegion(); + + VRegion result; + result.detach(); + PREFIX(_intersect)(result.d->rgn, d->rgn, r.d->rgn); + + return result; +} + +VRegion VRegion::subtracted(const VRegion &r) const +{ + if (isEmpty() || r.isEmpty()) + return *this; + if (d == r.d || + PREFIX(_equal)(d->rgn, r.d->rgn)) + return VRegion(); + + VRegion result; + result.detach(); + PREFIX(_subtract)(result.d->rgn, d->rgn, r.d->rgn); + return result; +} + +int VRegion::rectCount() const +{ + if (isEmpty()) return 0; + return PREFIX(_n_rects)(d->rgn); +} + +VRect VRegion::rectAt(int index) const +{ + VRegionPrivate *reg = d->rgn; + if (!reg) + return VRect(); + + box_type_t *box = PIXREGION_RECTS(reg) + index; + + return box_to_rect(box); +} + +VRegion VRegion::operator+(const VRect &r) const +{ return united(r); } + +VRegion VRegion::operator+(const VRegion &r) const +{ return united(r); } + +VRegion VRegion::operator-(const VRegion &r) const +{ return subtracted(r); } + +VRegion& VRegion::operator+=(const VRect &r) +{ + if (isEmpty()) + return *this = r; + if (r.isEmpty()) + return *this; + + if (contains(r)) { + return *this; + } else if (within(r)) { + return *this = r; + } else { + detach(); + PREFIX(_union_rect)(d->rgn, d->rgn, + r.left(), r.top(), + r.width(), r.height()); + return *this; + } +} + +VRegion& VRegion::operator+=(const VRegion &r) +{ + if (isEmpty()) + return *this = r; + if (r.isEmpty()) + return *this; + if (d == r.d || + PREFIX(_equal)(d->rgn, r.d->rgn)) + return *this; + + detach(); + PREFIX(_union)(d->rgn, d->rgn, r.d->rgn); + return *this; +} + +VRegion& VRegion::operator-=(const VRegion &r) +{ return *this = *this - r; } + +bool VRegion::operator==(const VRegion &r) const +{ + if (isEmpty()) + return r.isEmpty(); + if (r.isEmpty()) + return isEmpty(); + + if (d == r.d) + return true; + else + return PREFIX(_equal)(d->rgn, r.d->rgn); +} + +VRect VRegion::boundingRect() const noexcept +{ + if (isEmpty()) + return VRect(); + return box_to_rect(&d->rgn->extents); +} + +inline bool rect_intersects(const VRect &r1, const VRect &r2) +{ + return (r1.right() >= r2.left() && r1.left() <= r2.right() && + r1.bottom() >= r2.top() && r1.top() <= r2.bottom()); +} + +bool VRegion::intersects(const VRegion &r) const +{ + if (isEmpty() || r.isEmpty()) + return false; + + return PREFIX(_intersects)(d->rgn, r.d->rgn); +} + +VDebug& operator<<(VDebug& os, const VRegion& o) +{ + os<<"[REGION: "<<"[bbox = "< +#include +#include +#include + +typedef struct pixman_region region_type_t; +typedef region_type_t VRegionPrivate; + +class VRegion +{ +public: + VRegion(); + VRegion(int x, int y, int w, int h); + VRegion(const VRect &r); + VRegion(const VRegion ®ion); + VRegion(VRegion &&other): d(other.d) { other.d = const_cast(&shared_empty); } + ~VRegion(); + VRegion &operator=(const VRegion &); + VRegion &operator=(VRegion &&); + bool isEmpty() const; + bool contains(const VRect &r) const; + VRegion united(const VRect &r) const; + VRegion united(const VRegion &r) const; + VRegion intersected(const VRect &r) const; + VRegion intersected(const VRegion &r) const; + VRegion subtracted(const VRegion &r) const; + void translate(const VPoint &p); + inline void translate(int dx, int dy); + VRegion translated(const VPoint &p) const; + inline VRegion translated(int dx, int dy) const; + int rectCount() const; + VRect rectAt(int index) const; + + VRegion operator+(const VRect &r) const; + VRegion operator+(const VRegion &r) const; + VRegion operator-(const VRegion &r) const; + VRegion& operator+=(const VRect &r); + VRegion& operator+=(const VRegion &r); + VRegion& operator-=(const VRegion &r); + + VRect boundingRect() const noexcept; + bool intersects(const VRegion ®ion) const; + + bool operator==(const VRegion &r) const; + inline bool operator!=(const VRegion &r) const { return !(operator==(r)); } + friend VDebug& operator<<(VDebug& os, const VRegion& o); +private: + bool within(const VRect &r) const; + VRegion copy() const; + void detach(); + + struct VRegionData { + RefCount ref; + VRegionPrivate *rgn; + }; + + struct VRegionData *d; + static const struct VRegionData shared_empty; + static void cleanUp(VRegionData *x); +}; +inline void VRegion::translate(int dx, int dy) +{ + translate(VPoint(dx,dy)); +} + +inline VRegion VRegion::translated(int dx, int dy) const +{ + return translated(VPoint(dx,dy)); +} +#endif //VREGION_H diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp new file mode 100644 index 0000000000..a7a70dece1 --- /dev/null +++ b/src/vector/vrle.cpp @@ -0,0 +1,810 @@ +#include "vrle.h" +#include"vglobal.h" +#include +#include +#include +#include +#include +#include"vdebug.h" +#include"vregion.h" + +struct VRleHelper +{ + ushort alloc; + ushort size; + VRle::Span *spans; +}; + +#define VMIN(a,b) ((a) < (b) ? (a) : (b)) +#define VMAX(a,b) ((a) > (b) ? (a) : (b)) + +static inline uchar +divBy255(int x) { return (x + (x>>8) + 0x80) >> 8; } + +/* + * This function will clip a rle list with another rle object + * tmp_clip : The rle list that will be use to clip the rle + * tmp_obj : holds the list of spans that has to be clipped + * result : will hold the result after the processing + * NOTE: if the algorithm runs out of the result buffer list + * it will stop and update the tmp_obj with the span list + * that are yet to be processed as well as the tpm_clip object + * with the unprocessed clip spans. + */ +static void +rleIntersectWithRle(VRleHelper *tmp_clip, + int clip_offset_x, + int clip_offset_y, + VRleHelper *tmp_obj, + VRleHelper *result) +{ + VRle::Span *out = result->spans; + int available = result->alloc; + VRle::Span *spans = tmp_obj->spans; + VRle::Span *end = tmp_obj->spans + tmp_obj->size; + VRle::Span *clipSpans = tmp_clip->spans; + VRle::Span *clipEnd = tmp_clip->spans + tmp_clip->size; + int sx1, sx2, cx1, cx2, x, len; + + + while (available && spans < end ) + { + if (clipSpans >= clipEnd) + { + spans = end; + break; + } + if ((clipSpans->y + clip_offset_y) > spans->y) + { + ++spans; + continue; + } + if (spans->y != (clipSpans->y + clip_offset_y)) + { + ++clipSpans; + continue; + } + //assert(spans->y == (clipSpans->y + clip_offset_y)); + sx1 = spans->x; + sx2 = sx1 + spans->len; + cx1 = (clipSpans->x + clip_offset_x); + cx2 = cx1 + clipSpans->len; + + if (cx1 < sx1 && cx2 < sx1) + { + ++clipSpans; + continue; + } + else if (sx1 < cx1 && sx2 < cx1) + { + ++spans; + continue; + } + x = VMAX(sx1, cx1); + len = VMIN(sx2, cx2) - x; + if (len) + { + out->x = VMAX(sx1, cx1); + out->len = ( VMIN(sx2, cx2) - out->x); + out->y = spans->y; + out->coverage = divBy255(spans->coverage * clipSpans->coverage); + ++out; + --available; + } + if (sx2 < cx2) + { + ++spans; + } + else + { + ++clipSpans; + } + } + + // update the span list that yet to be processed + tmp_obj->spans = spans; + tmp_obj->size = end - spans; + + // update the clip list that yet to be processed + tmp_clip->spans = clipSpans; + tmp_clip->size = clipEnd - clipSpans; + + // update the result + result->size = result->alloc - available; +} + +/* + * This function will clip a rle list with a given rect + * clip : The clip rect that will be use to clip the rle + * tmp_obj : holds the list of spans that has to be clipped + * result : will hold the result after the processing + * NOTE: if the algorithm runs out of the result buffer list + * it will stop and update the tmp_obj with the span list + * that are yet to be processed + */ +static void +rleIntersectWithRect(const VRect &clip, + VRleHelper *tmp_obj, + VRleHelper *result) +{ + VRle::Span *out = result->spans; + int available = result->alloc; + VRle::Span *spans = tmp_obj->spans; + VRle::Span *end = tmp_obj->spans + tmp_obj->size; + short minx, miny, maxx, maxy; + + minx = clip.left(); + miny = clip.top(); + maxx = clip.right() - 1; + maxy = clip.bottom() - 1; + + while (available && spans < end ) + { + if (spans->y > maxy) + { + spans = end;// update spans so that we can breakout + break; + } + if (spans->y < miny + || spans->x > maxx + || spans->x + spans->len <= minx) + { + ++spans; + continue; + } + if (spans->x < minx) + { + out->len = VMIN(spans->len - (minx - spans->x), maxx - minx + 1); + out->x = minx; + } + else + { + out->x = spans->x; + out->len = VMIN(spans->len, (maxx - spans->x + 1)); + } + if (out->len != 0) + { + out->y = spans->y; + out->coverage = spans->coverage; + ++out; + } + ++spans; + --available; + } + + // update the span list that yet to be processed + tmp_obj->spans = spans; + tmp_obj->size = end - spans; + + // update the result + result->size = result->alloc - available; +} + +void drawSpanlineMul(VRle::Span *spans, int count, uchar *buffer, int offsetX) +{ + uchar *ptr; + while (count--) { + int x = spans->x + offsetX; + int l = spans->len; + ptr = buffer + x; + while (l--) { + uchar cov = *ptr; + *ptr++ = divBy255(spans->coverage * cov); + } + spans++; + } +} + +void drawSpanline(VRle::Span *spans, int count, uchar *buffer, int offsetX) +{ + uchar *ptr; + while (count--) { + int x = spans->x + offsetX; + int l = spans->len; + ptr = buffer + x; + while (l--) { + *ptr++ = spans->coverage; + } + spans++; + } +} + +int bufferToRle(uchar *buffer, int size, int offsetX, int y, VRle::Span *out) +{ + int count = 0; + uchar value = buffer[0]; + int curIndex = 0; + for (int i = 0; i < size ; i++) { + uchar curValue = buffer[0]; + if (value != curValue) { + out->y = y; + out->x = offsetX + curIndex; + out->len = i - curIndex; + out->coverage = value; + out++; + curIndex = i; + value = curValue; + count++; + } + buffer++; + } + out->y = y; + out->x = offsetX + curIndex; + out->len = size - curIndex; + out->coverage = value; + count++; + return count; +} + +static void +rleAddWithRle1(VRleHelper *tmp_clip, + VRleHelper *tmp_obj, + VRleHelper *result) +{ + std::array rleHolder; + VRle::Span *out = result->spans; + int available = result->alloc; + VRle::Span *spans = tmp_obj->spans; + VRle::Span *end = tmp_obj->spans + tmp_obj->size; + VRle::Span *clipSpans = tmp_clip->spans; + VRle::Span *clipEnd = tmp_clip->spans + tmp_clip->size; + + while (available && spans < end && clipSpans < clipEnd) { + if (spans->y < clipSpans->y) { + *out++ = *spans++; + available--; + } else if (clipSpans->y < spans->y) { + *out++ = *clipSpans++; + available--; + } else { // same y + int y = spans->y; + VRle::Span *spanPtr = spans; + VRle::Span *clipPtr = clipSpans; + + while (spanPtr < end && spanPtr->y == y) spanPtr++; + while (clipPtr < clipEnd && clipPtr->y == y) clipPtr++; + + int spanLength = (spanPtr-1)->x + (spanPtr-1)->len - spans->x; + int clipLength = (clipPtr-1)->x + (clipPtr-1)->len - clipSpans->x; + int offsetX = VMIN(spans->x, clipSpans->x); + std::array array = {0}; + drawSpanline(spans, (spanPtr - spans), array.data(), -offsetX); + drawSpanlineMul(clipSpans, (clipPtr - clipSpans), array.data(), -offsetX); + VRle::Span *rleHolderPtr = rleHolder.data(); + int size = bufferToRle(array.data(), VMAX(spanLength, clipLength), + offsetX, y, rleHolderPtr); + if (available >= size) { + while(size--) { + *out++ = *rleHolderPtr++; + available--; + } + } else { + break; + } + spans = spanPtr; + clipSpans = clipPtr; + } + } + // update the span list that yet to be processed + tmp_obj->spans = spans; + tmp_obj->size = end - spans; + + // update the clip list that yet to be processed + tmp_clip->spans = clipSpans; + tmp_clip->size = clipEnd - clipSpans; + + // update the result + result->size = result->alloc - available; +} + + +class VRleImpl +{ +public: + inline VRleImpl():m_bbox(),m_spans(), mOffset(), mBboxDirty(true){} + VRleImpl &operator=(const VRleImpl &); + void addSpan(const VRle::Span *span, int count); + void updateBbox(); + bool operator ==(const VRleImpl &) const; + void intersected(const VRect &r, VRleImpl &result); + void intersected(const VRleImpl &clip, VRleImpl &result); + friend VDebug& operator<<(VDebug& os, const VRleImpl& object); + void invert(); + void alphaMul(int alpha); + void translate(const VPoint &pt); + void opAdd(const VRleImpl &other, VRleImpl &res); + VRect bbox(); +public: + VRect m_bbox; + std::vector m_spans;// array of Spanlines. + VPoint mOffset; + bool mBboxDirty; +}; + +inline static void +copyArrayToVector(const VRle::Span *span, int count, std::vector &v) +{ + // make sure enough memory available + v.reserve(v.size() + count); + std::copy(span, span + count, back_inserter(v)); +} + +VDebug& operator<<(VDebug& os, const VRleImpl& o) +{ + os<<"[bbox="<< o.m_bbox<<"]"<<"[offset="< array; + + //setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup tmp object + tmp_obj.size = m_spans.size(); + tmp_obj.spans = m_spans.data(); + + // run till all the spans are processed + while (tmp_obj.size) + { + rleIntersectWithRect(clip, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, result.m_spans); + } + tresult.size = 0; + } + result.updateBbox(); +} + +void VRleImpl::intersected(const VRleImpl &clip, VRleImpl &result) +{ + VRleHelper tresult, tmp_obj, tmp_clip; + std::array array; + + //setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup tmp object + tmp_obj.size = m_spans.size(); + tmp_obj.spans = m_spans.data(); + + //setup tmp clip object + tmp_clip.size = clip.m_spans.size(); + tmp_clip.spans = const_cast(clip.m_spans.data()); + + // run till all the spans are processed + while (tmp_obj.size) + { + rleIntersectWithRle(&tmp_clip, 0, 0, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, result.m_spans); + } + tresult.size = 0; + } + result.updateBbox(); +} + +void VRleImpl::opAdd(const VRleImpl &other, VRleImpl &result) +{ + // reserve some space for the result vector. + result.m_spans.reserve(m_spans.size() + other.m_spans.size()); + // if two rle are disjoint + if (!m_bbox.intersects(other.m_bbox)) { + result.m_spans = m_spans; + copyArrayToVector(other.m_spans.data(), other.m_spans.size(), result.m_spans); + } else { + VRle::Span *ptr = m_spans.data(); + int otherY = other.m_bbox.top(); + // 1. forward till both y intersect + while (ptr->y < otherY) ptr++; + int spanToCopy = ptr - m_spans.data(); + copyArrayToVector(m_spans.data(), spanToCopy, result.m_spans); + + // 2. calculate the intersect region + VRleHelper tresult, tmp_obj, tmp_other; + std::array array; + + //setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup tmp object + tmp_obj.size = m_spans.size() - spanToCopy; + tmp_obj.spans = ptr; + + //setup tmp clip object + tmp_other.size = other.m_spans.size(); + tmp_other.spans = const_cast(other.m_spans.data()); + + // run till all the spans are processed + while (tmp_obj.size && tmp_other.size) + { + rleAddWithRle1(&tmp_other, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, result.m_spans); + } + tresult.size = 0; + } + //3. copy the rest + if (tmp_other.size) { + copyArrayToVector(tmp_other.spans, tmp_other.size, result.m_spans); + } + if (tmp_obj.size) { + copyArrayToVector(tmp_obj.spans, tmp_obj.size, result.m_spans); + } + } + + // update result bounding box + VRegion reg(m_bbox); + reg += other.m_bbox; + result.m_bbox = reg.boundingRect(); + result.mBboxDirty = false; +} + + +VRleImpl &VRleImpl::operator=(const VRleImpl &other) +{ + m_spans = other.m_spans; + m_bbox = other.m_bbox; + mOffset = other.mOffset; + return *this; +} + +bool VRleImpl::operator ==(const VRleImpl &other) const +{ + if (m_spans.size() != other.m_spans.size()) + return false; + const VRle::Span *spans = m_spans.data(); + const VRle::Span *o_spans = other.m_spans.data(); + int sz = m_spans.size(); + + for (int i = 0; i < sz; i++) { + if (spans[i].x != o_spans[i].x || + spans[i].y != o_spans[i].y || + spans[i].len != o_spans[i].len || + spans[i].coverage != o_spans[i].coverage) + return false; + } + return true; +} + + +void VRleImpl::updateBbox() +{ + if (!mBboxDirty) return; + + mBboxDirty = false; + + int i, l = 0, t = 0, r = 0, b = 0, sz; + l = std::numeric_limits::max(); + const VRle::Span *span = m_spans.data(); + + m_bbox = VRect(); + sz = m_spans.size(); + if (sz) + { + t = span[0].y; + b = span[sz-1].y; + for (i = 0; i < sz; i++) + { + if (span[i].x < l) l = span[i].x; + if (span[i].x + span[i].len > r) r = span[i].x + span[i].len; + } + m_bbox = VRect(l, t, r - l, b - t + 1); + } +} + +void VRleImpl::addSpan(const VRle::Span *span, int count) +{ + copyArrayToVector(span, count, m_spans); + mBboxDirty = true; +} + +struct VRleData +{ + RefCount ref; + VRleImpl impl; +}; + +static const struct VRleData shared_empty = {RefCount(-1), + VRleImpl()}; + +inline void VRle::cleanUp(VRleData *d) +{ + delete d; +} + +void VRle::detach() +{ + if (d->ref.isShared()) + *this = copy(); +} + +VRle VRle::copy() const +{ + VRle other; + + other.d = new VRleData; + other.d->impl = d->impl; + other.d->ref.setOwned(); + return other; +} + +VRle::~VRle() +{ + if (!d->ref.deref()) + cleanUp(d); +} + +VRle::VRle() + : d(const_cast(&shared_empty)) +{ +} + +VRle::VRle(const VRle &other) +{ + d = other.d; + d->ref.ref(); +} + +VRle::VRle(VRle &&other): d(other.d) +{ + other.d = const_cast(&shared_empty); +} + +VRle &VRle::operator=(const VRle &other) +{ + other.d->ref.ref(); + if (!d->ref.deref()) + cleanUp(d); + + d = other.d; + return *this; +} + +inline VRle &VRle::operator=(VRle &&other) +{ + if (!d->ref.deref()) + cleanUp(d); + d = other.d; + other.d = const_cast(&shared_empty); + return *this; +} + +bool VRle::isEmpty()const +{ + return (d == &shared_empty || d->impl.m_spans.empty()); +} + +void VRle::addSpan(const VRle::Span *span, int count) +{ + detach(); + d->impl.addSpan(span, count); +} + +VRect VRle::boundingRect() const +{ + if(isEmpty()) + return VRect(); + return d->impl.bbox(); +} + +bool VRle::operator ==(const VRle &other) const +{ + if (isEmpty()) + return other.isEmpty(); + if (other.isEmpty()) + return isEmpty(); + + if (d == other.d) + return true; + else + return d->impl == other.d->impl; +} + +void VRle::translate(const VPoint &p) +{ + if (isEmpty()) return; + + if (d->impl.mOffset == p) return; + + detach(); + d->impl.translate(p); +} + +VRle VRle::intersected(const VRect &r) const +{ + if (isEmpty() || r.isEmpty()) + return VRle(); + + // check if the bounding rect is contain inside r + if (r.contains(boundingRect(), true)) + return *this; + + VRle result; + result.detach(); + d->impl.intersected(r, result.d->impl); + return result; +} + +VRle VRle::intersected(const VRle &other) const +{ + if (isEmpty() || other.isEmpty()) + return VRle(); + // check if the bounding rect are not intersecting + VRle result; + result.detach(); + d->impl.intersected(other.d->impl, result.d->impl); + return result; +} + +VRle VRle::operator~() const +{ + if (isEmpty()) return VRle(); + + VRle result = *this; + result.detach(); + result.d->impl.invert(); + return result; +} + +VRle VRle::operator+(const VRle &other) const +{ + if (isEmpty()) return other; + + if (other.isEmpty()) return *this; + + VRle result; + result.detach(); + if (boundingRect().top() < other.boundingRect().top()) + d->impl.opAdd(other.d->impl, result.d->impl); + else + other.d->impl.opAdd(d->impl, result.d->impl); + return result; +} + +VRle VRle::operator-(const VRle &other) const +{ + if (isEmpty()) return ~other; + + if (other.isEmpty()) return *this; + + VRle temp = ~other; + return *this + temp; +} + +VRle VRle::operator&(const VRle &o) const +{ + if (isEmpty() || o.isEmpty()) return VRle(); + + if (!boundingRect().intersects(o.boundingRect())) return VRle(); + + VRle result; + result.detach(); + d->impl.intersected(o.d->impl, result.d->impl); + return result; +} + + + +void VRle::intersected(const VRect &r, VRleSpanCb cb, void *userData) +{ + //TODO Implement +} + + +VRle &VRle::intersect(const VRect &r) +{ + if (isEmpty() || r.isEmpty()) + return *this = VRle(); + + VRle result; + result.detach(); + d->impl.intersected(r, result.d->impl); + return *this = result; +} + +VRle operator*(const VRle &obj, int alpha) +{ + if (obj.isEmpty()) return obj; + + VRle result = obj; + result.detach(); + result.d->impl.alphaMul(alpha); + return result; +} + + +int VRle::size() const +{ + if (isEmpty()) return 0; + return d->impl.m_spans.size(); +} + +const VRle::Span* VRle::data() const +{ + if (isEmpty()) return nullptr; + return d->impl.m_spans.data(); +} + +VRle VRle::toRle(const VRectF &rect) +{ + VRle result; + result.detach(); + int x = rect.left(); + int y = rect.top(); + int width = rect.width(); + int height = rect.height(); + result.d->impl.m_spans.reserve(height); + VRle::Span span; + for(int i=0; i < height ; i++) { + span.x = x; + span.y = y + i; + span.len = width; + span.coverage = 255; + result.d->impl.m_spans.push_back(span); + } + return result; +} + +VDebug& operator<<(VDebug& os, const VRle& o) +{ + os<<"[RLE: [dptr = "<<"o.d"<<"]"<<"[ref = "<ref.count()<<"]"<impl<<"]"; + return os; +} + + + + + diff --git a/src/vector/vrle.h b/src/vector/vrle.h new file mode 100644 index 0000000000..4697b1f0d9 --- /dev/null +++ b/src/vector/vrle.h @@ -0,0 +1,62 @@ +#ifndef VRLE_H +#define VRLE_H +#include +#include +#include + +struct VRleData; +class VRle +{ +public: + struct Span + { + short x; + short y; + ushort len; + uchar coverage; + }; + typedef void (*VRleSpanCb)(int count, const VRle::Span *spans, void *userData); + ~VRle(); + VRle(); + VRle(const VRle &other); + VRle(VRle &&other); + VRle &operator=(const VRle &); + VRle &operator=(VRle &&other); + bool isEmpty()const; + VRect boundingRect() const; + void addSpan(const VRle::Span *span, int count); + bool operator ==(const VRle &other) const; + void translate(const VPoint &p); + void translate(int x, int y); + VRle intersected(const VRect &r) const; + VRle intersected(const VRle &other) const; + void intersected(const VRect &r, VRleSpanCb cb, void *userData); + VRle &intersect(const VRect &r); + int size() const; + const VRle::Span* data() const; + VRle operator~() const; + VRle operator+(const VRle &o) const; + VRle operator-(const VRle &o) const; + VRle operator&(const VRle &o) const; + static VRle toRle(const VRectF &rect); + friend VRle operator*(const VRle &, int alpha); + inline friend VRle operator*(int alpha, const VRle &); + friend VDebug& operator<<(VDebug& os, const VRle& object); +private: + VRle copy() const; + void detach(); + void cleanUp(VRleData *x); + VRleData *d; +}; + +inline void VRle::translate(int x, int y) +{ + translate(VPoint(x,y)); +} + +inline VRle operator*(int alpha, const VRle &rle) +{ + return (rle * alpha); +} + +#endif // VRLE_H diff --git a/test/meson.build b/test/meson.build new file mode 100644 index 0000000000..73887404ef --- /dev/null +++ b/test/meson.build @@ -0,0 +1,20 @@ + +test_sources_util = ['ssgtestsuite.cpp', + 'testsgregion.cpp' + ] +test_sources_ftraster = ['testftraster.cpp' + ] + +test_sources =[] +test_sources += test_sources_util +test_sources += test_sources_ftraster + +test_dep = dependency('gtest') + +ssg_utest = executable('testexe', + test_sources, + include_directories : inc, + link_with : lottie_player_lib_version, + dependencies : test_dep) + +test('ssgsuite test', ssg_utest) diff --git a/test/ssgtestsuite.cpp b/test/ssgtestsuite.cpp new file mode 100644 index 0000000000..5fa62d3f3e --- /dev/null +++ b/test/ssgtestsuite.cpp @@ -0,0 +1,8 @@ +#include +#include"vdebug.h" + +int main(int argc, char **argv) { + initialize(GuaranteedLogger(), "/tmp/", "ssglog", 1); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/testftraster.cpp b/test/testftraster.cpp new file mode 100644 index 0000000000..4743b15257 --- /dev/null +++ b/test/testftraster.cpp @@ -0,0 +1,30 @@ +#include +#include "vpath.h" +#include "vraster.h" + +class VRasterTest : public ::testing::Test { +public: + void SetUp() + { + path.moveTo(VPointF(0,0)); + path.lineTo(VPointF(10,0)); + path.lineTo(VPointF(10,10)); + path.lineTo(VPointF(0,10)); + path.close(); + pathRect = VRect(0,0,10,10); + } + void TearDown() + { + + } +public: + VPath path; + VRect pathRect; +}; + + +TEST_F(VRasterTest, constructor) { + FTOutline *outline = VRaster::toFTOutline(path); + ASSERT_TRUE(outline != nullptr); + VRaster::deleteFTOutline(outline); +} diff --git a/test/testsgregion.cpp b/test/testsgregion.cpp new file mode 100644 index 0000000000..ecaae0f65a --- /dev/null +++ b/test/testsgregion.cpp @@ -0,0 +1,120 @@ +#include +#include"vregion.h" +#include"vdebug.h" +#include"vpoint.h" +class VRegionTest : public ::testing::Test { +public: + VRegionTest():rgn1(-10, -10, 20, 20) + { + } + void SetUp() + { + rect1 = VRect(-10, -10, 20, 20); + rect2 = VRect(-15, 5, 10, 10); + rgn2 += rect2; + rgn3 = rgn1; + } + void TearDown() + { + + } +public: + VRegion emptyRgn; + VRegion rgn1; + VRegion rgn2; + VRegion rgn3; + VRect rect1; + VRect rect2; + VRect rect3; + +}; + +TEST_F(VRegionTest, constructor) { + ASSERT_EQ(rgn1.rectCount() , 1); + ASSERT_TRUE(rgn1.rectAt(0) == rect1); + ASSERT_TRUE(rgn1==rgn3); + ASSERT_TRUE(rgn1!=rgn2); +} + +TEST_F(VRegionTest, moveSemantics) { + // move assignment + + rgn1 = rect1; + VRegion tmp; + tmp = std::move(rgn1); + ASSERT_TRUE(rgn1.isEmpty()); + + // move construction + rgn1 = rect1; + VRegion mvrgn = std::move(rgn1); + ASSERT_TRUE(rgn1.isEmpty()); + ASSERT_TRUE(mvrgn == rect1); +} +TEST_F(VRegionTest, isEmpty) { + ASSERT_TRUE(emptyRgn.isEmpty()); + ASSERT_TRUE(emptyRgn == VRegion()); + ASSERT_TRUE(emptyRgn.rectCount() == 0); + ASSERT_TRUE(emptyRgn.boundingRect() == VRect()); +} + +TEST_F(VRegionTest, boundingRect) { + { + VRect rect; + VRegion region(rect); + ASSERT_TRUE(region.boundingRect() == rect); + } + { + VRect rect(10, -20, 30, 40); + VRegion region(rect); + ASSERT_TRUE(region.boundingRect() == rect); + } + { + VRect rect(15,25,10,10); + VRegion region(rect); + ASSERT_TRUE(region.boundingRect() == rect); + } +} + +TEST_F(VRegionTest, swap) { + VRegion r1(VRect(0, 0,10,10)); + VRegion r2(VRect(10,10,10,10)); + std::swap(r1 ,r2); + ASSERT_TRUE(r1.rectAt(0) == VRect(10,10,10,10)); + ASSERT_TRUE(r2.rectAt(0) == VRect(0, 0,10,10)); +} + +TEST_F(VRegionTest, substracted) { + VRegion r1(VRect(0, 0,20,20)); + VRegion r2 = r1.subtracted(VRect(5,5,5,5)); + VRegion expected; + expected += VRect(0,0,20,5); + expected += VRect(0,5,5,5); + expected += VRect(10,5,10,5); + expected += VRect(0,10,20,10); + ASSERT_TRUE(r2.rectCount() == expected.rectCount()); + ASSERT_TRUE(r2 == expected); + r2 += VRect(5,5,5,5); + ASSERT_TRUE(r2 == r1); +} + +TEST_F(VRegionTest, translate) { + VRegion r1(VRect(0, 0,20,20)); + VPoint offset(10,10); + VRegion r2 = r1.translated(offset); + r1.translate(offset); + ASSERT_TRUE(r2 == r2); +} + +TEST_F(VRegionTest, intersects) { + VRegion r1(VRect(0, 0,20,20)); + VRegion r2(VRect(20, 20,10,10)); + ASSERT_FALSE(r1.intersects(r2)); + r2 += VRect(5, 0,20,20); + ASSERT_TRUE(r1.intersects(r2)); +} + +TEST_F(VRegionTest, contains) { + VRegion r1(VRect(0, 0,20,20)); + ASSERT_TRUE(r1.contains(VRect(5,5,10,10))); + ASSERT_FALSE(r1.contains(VRect(11,5,10,10))); +} From e7726056b3fb75805238c9ce0f2c19e0fb0fded9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 13 Jul 2018 11:26:17 +0900 Subject: [PATCH 003/672] lottie/model: Fixed hold interpolation issue. Change-Id: I0db56ec46a9f6fec04311d9c96dcea680e29ab5b --- src/lottie/lottiemodel.h | 14 +++----------- src/lottie/lottieparser.cpp | 8 ++------ 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 7ae6b81e8b..9265dda0b0 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -241,28 +241,20 @@ template class LOTAnimInfo { public: - bool hasKeyFrame(int frameNo) { - if (frameNo >= mStartFrame && frameNo <= mEndFrame) - return true; - else - return false; - } T value(int frameNo) const { - if (mStartFrame >= frameNo) + if (mKeyFrames.front().mStartFrame >= frameNo) return mKeyFrames.front().mStartValue; - if(mEndFrame <= frameNo) + if(mKeyFrames.back().mEndFrame <= frameNo) return mKeyFrames.back().mEndValue; for(auto keyFrame : mKeyFrames) { - if (frameNo >= keyFrame.mStartFrame && frameNo <= keyFrame.mEndFrame) + if (frameNo >= keyFrame.mStartFrame && frameNo < keyFrame.mEndFrame) return keyFrame.value(frameNo); } return T(); } public: std::vector> mKeyFrames; - int mStartFrame; - int mEndFrame; }; template diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 68b9314683..5ff34517fe 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1649,6 +1649,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) inTangent = VPointF(); outTangent = VPointF(); keyframe.mEndValue = keyframe.mStartValue; + keyframe.mEndFrame = keyframe.mStartFrame; } // Try to find the interpolator from cache @@ -1660,13 +1661,8 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) keyframe.mInterpolator = std::make_shared(VInterpolator(inTangent, outTangent)); compRef->mInterpolatorCache[interpolatorKey] = keyframe.mInterpolator; } - } else { - /* this is the last key frame. update the first and last frame of this property */ - obj.mStartFrame = obj.mKeyFrames.front().mStartFrame; - obj.mEndFrame = keyframe.mStartFrame; - return; + obj.mKeyFrames.push_back(keyframe); } - obj.mKeyFrames.push_back(keyframe); } From 90270aa5af54e5526d8a59abbcbb2a0e0dc79552 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 13 Jul 2018 16:30:44 +0900 Subject: [PATCH 004/672] lottie/parser : Fixed proper parsing of opacity stops for gradient. Change-Id: I91a2a8f99c253fa0478ec8e8ffc76d5313fafa97 --- src/lottie/lottiemodel.cpp | 87 +++++++++++++++++++++++++++++++++---- src/lottie/lottiemodel.h | 10 +++-- src/lottie/lottieparser.cpp | 4 +- 3 files changed, 88 insertions(+), 13 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index e843008c39..29156e689e 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -230,6 +230,83 @@ int LOTGStrokeData::getDashInfo(int frameNo, float *array) const } } +/** + * Both the color stops and opacity stops are in the same array. + * There are {@link #colorPoints} colors sequentially as: + * [ + * ..., + * position, + * red, + * green, + * blue, + * ... + * ] + * + * The remainder of the array is the opacity stops sequentially as: + * [ + * ..., + * position, + * opacity, + * ... + * ] + */ +void LOTGradient::populate(VGradientStops &stops, int frameNo) +{ + LottieGradient gradData = mGradient.value(frameNo); + int size = gradData.mGradient.size(); + float *ptr = gradData.mGradient.data(); + int colorPoints = mColorPoints; + if (colorPoints == -1 ) { // for legacy bodymovin (ref: lottie-android) + colorPoints = size / 4; + } + int opacityArraySize = size - colorPoints * 4; + float *opacityPtr = ptr + (colorPoints * 4); + stops.clear(); + int j = 0; + for (int i = 0; i < colorPoints ; i++) { + float colorStop = ptr[0]; + LottieColor color = LottieColor(ptr[1], ptr[2], ptr[3]); + if (opacityArraySize) { + if (j == opacityArraySize) { + // already reached the end + float stop1 = opacityPtr[j-4]; + float op1 = opacityPtr[j-3]; + float stop2 = opacityPtr[j-2]; + float op2 = opacityPtr[j-1]; + if (colorStop > stop2) { + stops.push_back(std::make_pair(colorStop, color.toColor(op2))); + } else { + float progress = (colorStop - stop1) / (stop2 - stop1); + float opacity = op1 + progress * (op2 - op1); + stops.push_back(std::make_pair(colorStop, color.toColor(opacity))); + } + continue; + } + for (; j < opacityArraySize ; j += 2) { + float opacityStop = opacityPtr[j]; + if (opacityStop < colorStop) { + // add a color using opacity stop + stops.push_back(std::make_pair(opacityStop, color.toColor(opacityPtr[j+1]))); + continue; + } + // add a color using color stop + if (j == 0) { + stops.push_back(std::make_pair(colorStop, color.toColor(opacityPtr[j+1]))); + } else { + float progress = (colorStop - opacityPtr[j-2]) / (opacityPtr[j] - opacityPtr[j-2]); + float opacity = opacityPtr[j-1] + progress * (opacityPtr[j+1] - opacityPtr[j-1]); + stops.push_back(std::make_pair(colorStop, color.toColor(opacity))); + } + j += 2; + break; + } + } else { + stops.push_back(std::make_pair(colorStop, color.toColor())); + } + ptr += 4; + } +} + void LOTGradient::update(std::unique_ptr &grad, int frameNo) { bool init = false; @@ -243,15 +320,7 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) } if (!mGradient.isStatic() || init) { - LottieGradient gradData = mGradient.value(frameNo); - int size = gradData.mGradient.size(); - float *ptr = gradData.mGradient.data(); - grad->mStops.clear(); - for (int i = 0; i < size ; i += 4) { - float stop = ptr[i]; - LottieColor color = LottieColor(ptr[i+1], ptr[i+2], ptr[i+3]); - grad->mStops.push_back(std::make_pair(stop, color.toColor())); - } + populate(grad->mStops, frameNo); } if (mGradientType == 1) { //linear gradient diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 9265dda0b0..80cca54872 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -555,17 +555,21 @@ inline LottieGradient operator*(float m, const LottieGradient &g) class LOTGradient : public LOTData { public: - LOTGradient(LOTData::Type type):LOTData(type){} + LOTGradient(LOTData::Type type):LOTData(type), mColorPoints(-1){} inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} void update(std::unique_ptr &grad, int frameNo); + +private: + void populate(VGradientStops &stops, int frameNo); public: int mGradientType; /* "t" Linear=1 , Radial = 2*/ - LOTAnimatable mStartPoint; /* "s" */ - LOTAnimatable mEndPoint; /* "e" */ + LOTAnimatable mStartPoint; /* "s" */ + LOTAnimatable mEndPoint; /* "e" */ LOTAnimatable mHighlightLength; /* "h" */ LOTAnimatable mHighlightAngle; /* "a" */ LOTAnimatable mOpacity; /* "o" */ LOTAnimatable mGradient; /* "g" */ + int mColorPoints; bool mEnabled = true; /* "fillEnabled" */ }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 5ff34517fe..8905d502fa 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1274,7 +1274,9 @@ LottieParserImpl::parseGradientProperty(LOTGradient *obj, const char *key) while (const char* key = NextObjectKey()) { if (0 == strcmp(key, "k")) { parseProperty(obj->mGradient); - } else { + } else if (0 == strcmp(key, "p")) { + obj->mColorPoints = GetInt(); + } else { Skip(nullptr); } } From ea434398c7d064e408c4d79391372469dfd4ff03 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 12 Jul 2018 21:43:39 +0900 Subject: [PATCH 005/672] lottieloader: file path for debug info. Change-Id: I551ef127032ac2a2dda36bb14b0bd5ffa2f5762e --- src/lottie/lottieloader.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index e91849039c..3d42195d4c 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -4,6 +4,8 @@ #include #include +using namespace std; + class LottieFileCache { public: @@ -62,7 +64,7 @@ bool LottieLoader::load(std::string &path) f.open(path); if (!f.is_open()) { - printf("failed to open \n"); + cout << "failed to open file = " << path.c_str() << endl; return false; } else { std::stringstream buf; From 79aa9abfa5bbdb245463df1300c49f9256e4813a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 13 Jul 2018 21:11:03 +0900 Subject: [PATCH 006/672] lottieplayer: remove framerate function. One of unnecesary functionalities. Please add this when it really needs. Change-Id: I1fed313df10c15ea4aca2faa3b15c51154b07f17 --- src/lottie/lottieplayer.cpp | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 2356b9547a..52a6158460 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -14,8 +14,6 @@ public: bool setFilePath(std::string path); void setSize(const VSize &sz); void size(int &w, int &h) const; - void setFrameRate(int frameRate); - int frameRate() const; float playTime() const; bool seek(float pos); const std::vector& renderList()const; @@ -25,7 +23,6 @@ public: std::shared_ptr mModel; std::unique_ptr mCompItem; VSize mSize; - int mFrameRate; }; void LOTPlayerPrivate::setSize(const VSize &sz) @@ -45,26 +42,11 @@ const std::vector& LOTPlayerPrivate::renderList() const { return mCompItem->renderList(); } -int LOTPlayerPrivate::frameRate() const -{ - if (mFrameRate) - return mFrameRate; - else - return mModel->frameRate(); -} - -void LOTPlayerPrivate::setFrameRate(int frameRate) -{ - mFrameRate = frameRate; -} float LOTPlayerPrivate::playTime() const { if (mModel->isStatic()) return 0; - - float fr = frameRate(); - float fd = mModel->frameDuration(); - return fd/fr; + return mModel->frameDuration() / mModel->frameRate(); } bool LOTPlayerPrivate::seek(float pos) @@ -91,7 +73,7 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) } -LOTPlayerPrivate::LOTPlayerPrivate():mFrameRate(0) +LOTPlayerPrivate::LOTPlayerPrivate() { } @@ -150,16 +132,6 @@ float LOTPlayer::playTime() const return d->playTime(); } -int LOTPlayer::frameRate() const -{ - return d->frameRate(); -} - -void LOTPlayer::setFrameRate(int frameRate) -{ - d->setFrameRate(frameRate); -} - void LOTPlayer::seek(float pos) { d->seek(pos); From cb52a637aa8748d395280bc62aeb478b13325e3b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 13 Jul 2018 21:13:03 +0900 Subject: [PATCH 007/672] lottieplayer: add exceptions Change-Id: I03de73851867e78de3231131ac92154ca39c3dec --- src/lottie/lottieplayer.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 52a6158460..e4f02b00a7 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -27,19 +27,33 @@ public: void LOTPlayerPrivate::setSize(const VSize &sz) { + if (!mCompItem.get()) { + vWarning << "Set file first!"; + return; + } + mCompItem->resize(sz); } void LOTPlayerPrivate::size(int &w, int &h) const { + if (!mCompItem.get()) { + w = 0; + h = 0; + return; + } + VSize size = mCompItem->size(); w = size.width(); h = size.height(); } - const std::vector& LOTPlayerPrivate::renderList() const { + if (!mCompItem.get()) { + //FIXME: Reference is not good... + } + return mCompItem->renderList(); } @@ -72,7 +86,6 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) } } - LOTPlayerPrivate::LOTPlayerPrivate() { @@ -90,7 +103,6 @@ LOTPlayerPrivate::setFilePath(std::string path) return false; } - LOTPlayer::LOTPlayer():d(new LOTPlayerPrivate()) { From ed69eed653422f972d7e41cec9384db414cc377d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 16 Jul 2018 12:22:12 +0900 Subject: [PATCH 008/672] lottie/player: fixed the regression in playtime() api. Change-Id: I1ce8fc84cb75dbb6a929d9720adc5c57366f35fa --- src/lottie/lottieplayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index e4f02b00a7..b71ffdbdaa 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -60,7 +60,7 @@ const std::vector& LOTPlayerPrivate::renderList() const float LOTPlayerPrivate::playTime() const { if (mModel->isStatic()) return 0; - return mModel->frameDuration() / mModel->frameRate(); + return float(mModel->frameDuration()) / float(mModel->frameRate()); } bool LOTPlayerPrivate::seek(float pos) From d0cea18a71fcf1b5884a0037ea258a72b86c9994 Mon Sep 17 00:00:00 2001 From: subhransu sekhar mohanty Date: Fri, 13 Jul 2018 23:20:15 +0900 Subject: [PATCH 009/672] lottie/example: disable default building of example to enable use meson -Dexample=true build while configuring meson. or meson configure -Dexample=true in the build directory. Change-Id: If267e6883fb866a741bf18dbfedd2a7782e21df5 --- README.txt | 13 ++++++++----- meson.build | 4 +++- meson_options.txt | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/README.txt b/README.txt index c079df89ef..9e308c73ea 100644 --- a/README.txt +++ b/README.txt @@ -2,10 +2,13 @@ BUILD INSTRUCTION ================= 1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) 2. install ninja build tool (https://ninja-build.org/) -3. make a build directory in ssg/ flder -4. run meson build/ +4. invoke meson build/ or meson -Dexample=true build/ +5. invoke ninja inside the build folder. -RUN INSTRUCTION +NOTE: run meson configure to see all the build options + +BUILD EXAMPLE =============== -1. run ninja inside build/ folder -2. to run example invoke ./build/example/ssgdemo +1. meson configure -Dexample=true +2. ninja +3. to run example invoke ./build/example/demo diff --git a/meson.build b/meson.build index ba33397744..c6a2f2afba 100644 --- a/meson.build +++ b/meson.build @@ -20,7 +20,9 @@ inc = include_directories('inc') subdir('inc') subdir('src') -subdir('example') +if get_option('example') == true + subdir('example') +endif if get_option('test') == true subdir('test') diff --git a/meson_options.txt b/meson_options.txt index d8e58902a5..4f55605cc1 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -5,7 +5,7 @@ option('test', option('example', type: 'boolean', - value: true, + value: false, description: 'enable example') option('text', From 5c771a708f0f5265858b9a4f19705478d76dc18a Mon Sep 17 00:00:00 2001 From: subhransu sekhar mohanty Date: Sat, 14 Jul 2018 15:48:14 +0900 Subject: [PATCH 010/672] vector: convert radial gradient parameter from lottie space to vector space. Change-Id: I1894dd03eb0ccd0266fa098eaaae4aa4bf1e1d57 --- src/lottie/lottiemodel.cpp | 8 ++++++-- src/vector/vglobal.h | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 29156e689e..1a7e3b8328 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -335,8 +335,12 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) VPointF end = mEndPoint.value(frameNo); grad->radial.cx = start.x(); grad->radial.cy = start.y(); - grad->radial.fx = end.x(); - grad->radial.fy = end.y(); + grad->radial.cradius = vLineLength(start.x(), start.y(), end.x(), end.y()); + + //TODO update focal radius and focal point + grad->radial.fx = grad->radial.cx; + grad->radial.fy = grad->radial.cy; + grad->radial.fradius = 0; } } diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index b531344121..fb96f304cf 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -96,6 +96,21 @@ static inline bool vIsNull(float f) return std::abs(f) <= 0.00001f; } +// Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. +// This uses alpha = 1, beta = 3/8, which results in a maximum error of less +// than 7% compared to the correct value. +static inline float +vLineLength(float x1, float y1, float x2, float y2) +{ + float x = x2 - x1; + float y = y2 - y1; + + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; + + return (x > y ? x + 0.375 * y : y + 0.375 * x); +} + class vFlagHelper { int i; From a4710cb3590880851548f39c1ad27ca187ac3470 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 16 Jul 2018 14:32:44 +0900 Subject: [PATCH 011/672] lottie/vector: fixed typo issue. Change-Id: I6e5d811b3f216daff1dbf5ab73d3c2fb97872e56 --- src/vector/vbrush.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index 300afbcef1..aa8ba96b70 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -71,7 +71,7 @@ VBrush::VBrush(const VGradient *gradient):mType(VBrush::Type::NoBrush) if (gradient->mType == VGradient::Type::Linear) { mType = VBrush::Type::LinearGradient; - } else if (gradient->mType == VGradient::Type::Linear) { + } else if (gradient->mType == VGradient::Type::Radial) { mType = VBrush::Type::RadialGradient; } } From 13ab97b2a0564f3276dcc98101d6cc1f4fec5ab0 Mon Sep 17 00:00:00 2001 From: subhransu sekhar mohanty Date: Sun, 15 Jul 2018 11:59:30 +0900 Subject: [PATCH 012/672] lottie/vector: move all vector objects to its own namesapce Change-Id: I1f7ebc743b45d2ae0857f5d645ca1495e382b3c3 --- src/lottie/lottieitem.h | 2 ++ src/lottie/lottiemodel.h | 1 + src/vector/vbezier.cpp | 4 +++- src/vector/vbezier.h | 3 +++ src/vector/vbitmap.cpp | 3 +++ src/vector/vbitmap.h | 4 ++++ src/vector/vbrush.cpp | 4 ++++ src/vector/vbrush.h | 4 ++++ src/vector/vdasher.cpp | 3 +++ src/vector/vdasher.h | 6 ++++++ src/vector/vdrawhelper.h | 2 ++ src/vector/vglobal.h | 14 ++++++++++++++ src/vector/vinterpolator.cpp | 4 ++++ src/vector/vinterpolator.h | 5 +++++ src/vector/vmatrix.cpp | 3 +++ src/vector/vmatrix.h | 4 ++++ src/vector/vpainter.cpp | 4 ++++ src/vector/vpainter.h | 4 ++++ src/vector/vpath.cpp | 4 ++++ src/vector/vpath.h | 4 ++++ src/vector/vpathmesure.cpp | 6 +++++- src/vector/vpathmesure.h | 4 ++++ src/vector/vpoint.h | 4 ++++ src/vector/vraster.cpp | 4 ++++ src/vector/vraster.h | 5 +++++ src/vector/vrect.h | 4 ++++ src/vector/vregion.cpp | 4 ++++ src/vector/vregion.h | 5 +++++ src/vector/vrle.cpp | 3 +++ src/vector/vrle.h | 4 ++++ 30 files changed, 123 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 829ac07caa..d6e9261180 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -12,6 +12,8 @@ #include"vbrush.h" #include"vpainter.h" +V_USE_NAMESPACE + enum class DirtyFlagBit { None = 0x0001, diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 80cca54872..e6c5d9d275 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -12,6 +12,7 @@ #include"vbrush.h" #include"vpath.h" +V_USE_NAMESPACE class LOTCompositionData; class LOTLayerData; diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index 3ae1e1dc64..34e5093838 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -2,6 +2,8 @@ #include +V_BEGIN_NAMESPACE + // Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. // This uses alpha = 1, beta = 3/8, which results in a maximum error of less // than 7% compared to the correct value. @@ -112,5 +114,5 @@ VBezier::splitAtLength(float len, VBezier *left, VBezier *right) right->parameterSplitLeft(t, left); } - +V_END_NAMESPACE diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index 92f4418329..dd3f4cf869 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -3,6 +3,8 @@ #include +V_BEGIN_NAMESPACE + class VBezier { public: @@ -106,5 +108,6 @@ inline void VBezier::split(VBezier *firstHalf, VBezier *secondHalf) const firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2)*.5; } +V_END_NAMESPACE #endif //VBEZIER_H diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 4746df9cd0..a8edd233c5 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -2,6 +2,8 @@ #include "vglobal.h" #include +V_BEGIN_NAMESPACE + struct VBitmapData { ~VBitmapData(); @@ -280,3 +282,4 @@ void VBitmap::fill(uint pixel) return; } +V_END_NAMESPACE diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index 5017063ba3..ca3f2a1ef2 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -3,6 +3,8 @@ #include "vrect.h" +V_BEGIN_NAMESPACE + struct VBitmapData; typedef void (*VBitmapCleanupFunction)(void *); class VBitmap @@ -44,4 +46,6 @@ private: VBitmapData *d; }; +V_END_NAMESPACE + #endif // VBITMAP_H diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index aa8ba96b70..55b015dff0 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -1,5 +1,7 @@ #include"vbrush.h" +V_BEGIN_NAMESPACE + VGradient::VGradient(VGradient::Type type):mType(type), mSpread(VGradient::Spread::Pad), mMode(VGradient::Mode::Absolute) { @@ -75,3 +77,5 @@ VBrush::VBrush(const VGradient *gradient):mType(VBrush::Type::NoBrush) mType = VBrush::Type::RadialGradient; } } + +V_END_NAMESPACE diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index e93c9b1e0b..772019f40c 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -6,6 +6,8 @@ #include"vmatrix.h" #include +V_BEGIN_NAMESPACE + typedef std::pair VGradientStop; typedef std::vector VGradientStops; class VGradient @@ -79,4 +81,6 @@ public: const VGradient *mGradient; }; +V_END_NAMESPACE + #endif // VBRUSH_H diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index f819bf9427..8c9f7382de 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -1,6 +1,8 @@ #include"vdasher.h" #include"vbezier.h" +V_BEGIN_NAMESPACE + class VLine { public: @@ -238,3 +240,4 @@ VPath VDasher::dashed(const VPath &path) return mDashedPath; } +V_END_NAMESPACE diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index ed975585e3..5b5c66d565 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -1,6 +1,9 @@ #ifndef VDASHER_H #define VDASHER_H #include "vpath.h" + +V_BEGIN_NAMESPACE + class VDasher { public: @@ -26,4 +29,7 @@ private: float mDashOffset; VPath mDashedPath; }; + +V_END_NAMESPACE + #endif // VDASHER_H diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 0826f00908..b480705921 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -9,6 +9,8 @@ #include"assert.h" #include +V_USE_NAMESPACE + struct VSpanData; struct Operator; diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index fb96f304cf..aa9e617bad 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -12,6 +12,20 @@ typedef uint16_t ushort; typedef uint8_t uchar; +#if !defined(V_NAMESPACE) + +# define V_USE_NAMESPACE +# define V_BEGIN_NAMESPACE +# define V_END_NAMESPACE + +#else /* user namespace */ + +# define V_USE_NAMESPACE using namespace ::V_NAMESPACE; +# define V_BEGIN_NAMESPACE namespace V_NAMESPACE { +# define V_END_NAMESPACE } + +#endif + #define V_UNUSED __attribute__((__unused__)) #define V_REQUIRED_RESULT __attribute__ ((__warn_unused_result__)) diff --git a/src/vector/vinterpolator.cpp b/src/vector/vinterpolator.cpp index 5c285f6420..90f0936264 100644 --- a/src/vector/vinterpolator.cpp +++ b/src/vector/vinterpolator.cpp @@ -1,6 +1,8 @@ #include"vinterpolator.h" #include +V_BEGIN_NAMESPACE + #define NEWTON_ITERATIONS 4 #define NEWTON_MIN_SLOPE 0.02 #define SUBDIVISION_PRECISION 0.0000001 @@ -128,3 +130,5 @@ VInterpolator::BinarySubdivide(float aX, float aA, float aB) const return currentT; } + +V_END_NAMESPACE diff --git a/src/vector/vinterpolator.h b/src/vector/vinterpolator.h index 23c78e89cf..f609d0ce4d 100644 --- a/src/vector/vinterpolator.h +++ b/src/vector/vinterpolator.h @@ -3,6 +3,8 @@ #include "vpoint.h" +V_BEGIN_NAMESPACE + class VInterpolator { public: @@ -76,4 +78,7 @@ private: float mSampleValues[kSplineTableSize]; static const float kSampleStepSize; }; + +V_END_NAMESPACE + #endif // VINTERPOLATOR_H diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 9f47484046..ad5192d246 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -4,6 +4,8 @@ #include #include +V_BEGIN_NAMESPACE + /* m11 m21 mtx * m12 m22 mty * m13 m23 m33 @@ -832,4 +834,5 @@ float VMatrix::m33()const return d->m33; } +V_END_NAMESPACE diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 4e43b47dbd..10c632a3bd 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -4,6 +4,8 @@ #include "vregion.h" #include "vglobal.h" +V_BEGIN_NAMESPACE + struct VMatrixData; class VMatrix { @@ -89,4 +91,6 @@ inline VPointF VMatrix::map(float x, float y) const return map(VPointF(x, y)); } +V_END_NAMESPACE + #endif // VMATRIX_H diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 5d3f4ebfab..56fbf411e5 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -1,6 +1,8 @@ #include"vpainter.h" #include"vdrawhelper.h" +V_BEGIN_NAMESPACE + class VPainterImpl { public: @@ -62,3 +64,5 @@ void VPainter::drawRle(const VPoint &pos, const VRle &rle) { mImpl->drawRle(pos, rle); } + +V_END_NAMESPACE diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index 740f732656..d7977fbc40 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -5,6 +5,8 @@ #include"vrle.h" #include"vbrush.h" +V_BEGIN_NAMESPACE + class VBitmap; class VPainterImpl; class VPainter { @@ -24,4 +26,6 @@ private: VPainterImpl *mImpl; }; +V_END_NAMESPACE + #endif //VPAINTER_H diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 60f4c92a23..4df2918482 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -5,6 +5,8 @@ #include"vbezier.h" #include "vrect.h" +V_BEGIN_NAMESPACE + struct VPathData { void copy(VPathData *o); @@ -733,3 +735,5 @@ void VPath::transform(const VMatrix &m) detach(); d->transform(m); } + +V_END_NAMESPACE diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 93c4f5316a..2fe0b9de48 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -5,6 +5,8 @@ #include "vmatrix.h" #include +V_BEGIN_NAMESPACE + struct VPathData; class VPath { @@ -77,4 +79,6 @@ inline void VPath::cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, cubicTo(VPointF(c1x, c1y), VPointF(c2x, c2y), VPointF(ex, ey)); } +V_END_NAMESPACE + #endif // VPATH_H diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 358721cdc5..cabbe42d1e 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,6 +1,10 @@ #include"vpathmesure.h" +V_BEGIN_NAMESPACE + class VPathMesureData { VPath *path; -}; \ No newline at end of file +}; + +V_END_NAMESPACE diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 98605f7b97..0a97fc13db 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -3,6 +3,8 @@ #include "vpath.h" +V_BEGIN_NAMESPACE + class VPathMesureData; class VPathMesure { @@ -15,4 +17,6 @@ private: VPathMesureData *d; }; +V_END_NAMESPACE + #endif // VPATHMESURE_H diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 7eb2af5f9d..9206856238 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -3,6 +3,8 @@ #include"vglobal.h" +V_BEGIN_NAMESPACE + class VPointF { public: @@ -144,4 +146,6 @@ inline VSize &VSize::operator+=(const VSize &p) noexcept inline VSize &VSize::operator-=(const VSize &p) noexcept { mw-=p.mw; mh-=p.mh; return *this; } +V_END_NAMESPACE + #endif // VPOINT_H diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 0bd3a2c623..3328977a51 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -6,6 +6,8 @@ #include #include"vdebug.h" +V_BEGIN_NAMESPACE + struct FTOutline { public: @@ -312,3 +314,5 @@ VRle VRaster::generateStrokeInfo(const FTOutline *outline, CapStyle cap, JoinSty return d->generateStrokeInfoAsync(&outline->ft, ftCap, ftJoin, ftWidth, ftMeterLimit, ftbool); } + +V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 7beda50e87..5b8d0ad299 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -3,6 +3,8 @@ #include"vrle.h" #include +V_BEGIN_NAMESPACE + struct FTOutline; class VPath; @@ -30,4 +32,7 @@ private: VRaster(); VRasterPrivate *d; }; + +V_END_NAMESPACE + #endif // VRASTER_H diff --git a/src/vector/vrect.h b/src/vector/vrect.h index 0f002dfd55..c16ecab96b 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -3,6 +3,8 @@ #include"vglobal.h" #include"vpoint.h" +V_BEGIN_NAMESPACE + class VRect { public: @@ -181,4 +183,6 @@ V_CONSTEXPR inline float VRectF::width() const V_CONSTEXPR inline float VRectF::height() const { return y2 - y1; } +V_END_NAMESPACE + #endif // VRECT_H diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index 3db9ad28f7..a0cd00e1bd 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -2041,6 +2041,8 @@ typedef region_type_t VRegionPrivate; #include "vregion.h" +V_BEGIN_NAMESPACE + static VRegionPrivate regionPrivate = {{0,0,0,0}, NULL}; const VRegion::VRegionData VRegion::shared_empty = {RefCount(-1), ®ionPrivate}; @@ -2366,3 +2368,5 @@ VDebug& operator<<(VDebug& os, const VRegion& o) } +V_END_NAMESPACE + diff --git a/src/vector/vregion.h b/src/vector/vregion.h index 75e7c388f3..e5986af035 100644 --- a/src/vector/vregion.h +++ b/src/vector/vregion.h @@ -6,6 +6,8 @@ #include #include +V_BEGIN_NAMESPACE + typedef struct pixman_region region_type_t; typedef region_type_t VRegionPrivate; @@ -70,4 +72,7 @@ inline VRegion VRegion::translated(int dx, int dy) const { return translated(VPoint(dx,dy)); } + +V_END_NAMESPACE + #endif //VREGION_H diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index a7a70dece1..df0f24ee27 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -8,6 +8,8 @@ #include"vdebug.h" #include"vregion.h" +V_BEGIN_NAMESPACE + struct VRleHelper { ushort alloc; @@ -804,6 +806,7 @@ VDebug& operator<<(VDebug& os, const VRle& o) return os; } +V_END_NAMESPACE diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 4697b1f0d9..0fe3bcfb49 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -4,6 +4,8 @@ #include #include +V_BEGIN_NAMESPACE + struct VRleData; class VRle { @@ -59,4 +61,6 @@ inline VRle operator*(int alpha, const VRle &rle) return (rle * alpha); } +V_END_NAMESPACE + #endif // VRLE_H From 9824bafdf325bba7e286bf7ce4fb5d1655eea3c6 Mon Sep 17 00:00:00 2001 From: subhransu sekhar mohanty Date: Sat, 14 Jul 2018 15:51:47 +0900 Subject: [PATCH 013/672] vector: port radial drawing implementation from ector library. Change-Id: I0885d2493a19f71bc82ecf9d03268539a2c98bec --- src/vector/vdrawhelper.cpp | 144 +++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 641d3d677d..a2c89328d9 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -196,6 +196,22 @@ getLinearGradientValues(LinearGradientValues *v, const VSpanData *data) } } +static inline void +getRadialGradientValues(RadialGradientValues *v, const VSpanData *data) +{ + const VGradientData &gradient = data->mGradient; + v->dx = gradient.radial.cx - gradient.radial.fx; + v->dy = gradient.radial.cy - gradient.radial.fy; + + v->dr = gradient.radial.cradius - gradient.radial.fradius; + v->sqrfr = gradient.radial.fradius * gradient.radial.fradius; + + v->a = v->dr * v->dr - v->dx*v->dx - v->dy*v->dy; + v->inv2a = 1 / (2 * v->a); + + v->extended = !vIsNull(gradient.radial.fradius) || v->a <= 0; +} + static inline int gradientClamp(const VGradientData *grad, int ipos) { @@ -304,6 +320,129 @@ fetch_linear_gradient(uint32_t *buffer, const Operator *op, const VSpanData *dat } } +static inline float radialDeterminant(float a, float b, float c) +{ + return (b * b) - (4 * a * c); +} + +static void fetch(uint32_t *buffer, uint32_t *end, + const Operator *op, const VSpanData *data, float det, + float delta_det, float delta_delta_det, float b, float delta_b) +{ + if (op->radial.extended) { + while (buffer < end) { + uint32_t result = 0; + if (det >= 0) { + float w = std::sqrt(det) - b; + if (data->mGradient.radial.fradius + op->radial.dr * w >= 0) + result = gradientPixel(&data->mGradient, w); + } + + *buffer = result; + + det += delta_det; + delta_det += delta_delta_det; + b += delta_b; + + ++buffer; + } + } else { + while (buffer < end) { + *buffer++ = gradientPixel(&data->mGradient, std::sqrt(det) - b); + + det += delta_det; + delta_det += delta_delta_det; + b += delta_b; + } + } +} + +void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData *data, int y, int x, int length) +{ + // avoid division by zero + if (vIsNull(op->radial.a)) { + memfill32(buffer, 0, length); + return; + } + + float rx = data->m21 * (y + float(0.5)) + + data->dx + data->m11 * (x + float(0.5)); + float ry = data->m22 * (y + float(0.5)) + + data->dy + data->m12 * (x + float(0.5)); + bool affine = !data->m13 && !data->m23; + + uint32_t *end = buffer + length; + if (affine) { + rx -= data->mGradient.radial.fx; + ry -= data->mGradient.radial.fy; + + float inv_a = 1 / float(2 * op->radial.a); + + const float delta_rx = data->m11; + const float delta_ry = data->m12; + + float b = 2*(op->radial.dr*data->mGradient.radial.fradius + rx * op->radial.dx + ry * op->radial.dy); + float delta_b = 2*(delta_rx * op->radial.dx + delta_ry * op->radial.dy); + const float b_delta_b = 2 * b * delta_b; + const float delta_b_delta_b = 2 * delta_b * delta_b; + + const float bb = b * b; + const float delta_bb = delta_b * delta_b; + + b *= inv_a; + delta_b *= inv_a; + + const float rxrxryry = rx * rx + ry * ry; + const float delta_rxrxryry = delta_rx * delta_rx + delta_ry * delta_ry; + const float rx_plus_ry = 2*(rx * delta_rx + ry * delta_ry); + const float delta_rx_plus_ry = 2 * delta_rxrxryry; + + inv_a *= inv_a; + + float det = (bb - 4 * op->radial.a * (op->radial.sqrfr - rxrxryry)) * inv_a; + float delta_det = (b_delta_b + delta_bb + 4 * op->radial.a * (rx_plus_ry + delta_rxrxryry)) * inv_a; + const float delta_delta_det = (delta_b_delta_b + 4 * op->radial.a * delta_rx_plus_ry) * inv_a; + + fetch(buffer, end, op, data, det, delta_det, delta_delta_det, b, delta_b); + } else { + float rw = data->m23 * (y + float(0.5)) + + data->m33 + data->m13 * (x + float(0.5)); + + while (buffer < end) { + if (rw == 0) { + *buffer = 0; + } else { + float invRw = 1 / rw; + float gx = rx * invRw - data->mGradient.radial.fx; + float gy = ry * invRw - data->mGradient.radial.fy; + float b = 2*(op->radial.dr*data->mGradient.radial.fradius + gx*op->radial.dx + gy*op->radial.dy); + float det = radialDeterminant(op->radial.a, b, op->radial.sqrfr - (gx*gx + gy*gy)); + + uint32_t result = 0; + if (det >= 0) { + float detSqrt = std::sqrt(det); + + float s0 = (-b - detSqrt) * op->radial.inv2a; + float s1 = (-b + detSqrt) * op->radial.inv2a; + + float s = vMax(s0, s1); + + if (data->mGradient.radial.fradius + op->radial.dr * s >= 0) + result = gradientPixel(&data->mGradient, s); + } + + *buffer = result; + } + + rx += data->m11; + ry += data->m12; + rw += data->m13; + + ++buffer; + } + } +} + static inline Operator getOperator(const VSpanData *data, const VRle::Span *spans, int spanCount) { @@ -320,6 +459,11 @@ static inline Operator getOperator(const VSpanData *data, const VRle::Span *span getLinearGradientValues(&op.linear, data); op.srcFetch = &fetch_linear_gradient; break; + case VSpanData::Type::RadialGradient: + solidSource = false; + getRadialGradientValues(&op.radial, data); + op.srcFetch = &fetch_radial_gradient; + break; default: break; } From 893e2ab5e5f218235db189b33951845d50a5d490 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 16 Jul 2018 15:48:03 +0900 Subject: [PATCH 014/672] lottie: fix issue of layer static property updation. Layer can have a parent as well as can be part of the precomp layer. so take both layers static property into consideration while updating the static property. Change-Id: I59db01a596977896ab1e9c131ee3ff28e694ff0b --- src/lottie/lottieitem.cpp | 16 +++++++++++++--- src/lottie/lottieitem.h | 5 ++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 6b4b2a7bef..62e46c6523 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -410,6 +410,7 @@ VRle LOTLayerItem::maskRle() LOTLayerItem::LOTLayerItem(LOTLayerData *layerData):mLayerData(layerData), mParentLayer(nullptr), + mPrecompLayer(nullptr), mFrameNo(-1), mDirtyFlag(DirtyFlagBit::All) { @@ -425,7 +426,9 @@ void LOTLayerItem::updateStaticProperty() if (mParentLayer) mParentLayer->updateStaticProperty(); - mStatic = mParentLayer ? (mLayerData->isStatic() & mParentLayer->isStatic()) : mLayerData->isStatic(); + mStatic = mLayerData->isStatic(); + mStatic = mParentLayer ? (mStatic & mParentLayer->isStatic()) : mStatic; + mStatic = mPrecompLayer ? (mStatic & mPrecompLayer->isStatic()) : mStatic; } void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha) @@ -519,10 +522,17 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel):LOTLayerItem(layerM i->setParentLayer(parentLayer); } } + i->setPrecompLayer(this); } - for(auto i : mLayers) { +} + +void LOTCompLayerItem::updateStaticProperty() +{ + LOTLayerItem::updateStaticProperty(); + + for(auto i : mLayers) { i->updateStaticProperty(); - } + } } LOTCompLayerItem::~LOTCompLayerItem() diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index d6e9261180..6fd6f329d7 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -59,10 +59,11 @@ public: int id() const {return mLayerData->id();} int parentId() const {return mLayerData->parentId();} void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;} + void setPrecompLayer(LOTLayerItem *precomp){mPrecompLayer = precomp;} virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha); VMatrix matrix(int frameNo) const; virtual void renderList(std::vector &list){} - void updateStaticProperty(); + virtual void updateStaticProperty(); void render(VPainter *painter); protected: virtual void updateContent() = 0; @@ -79,6 +80,7 @@ protected: std::vector> mMasks; LOTLayerData *mLayerData; LOTLayerItem *mParentLayer; + LOTLayerItem *mPrecompLayer; VMatrix mCombinedMatrix; float mCombinedAlpha; int mFrameNo; @@ -93,6 +95,7 @@ public: ~LOTCompLayerItem(); LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; + void updateStaticProperty() final; protected: void updateContent() final; private: From c0c5621b53d0198f5abb07c6ddb7b506662666f5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 16 Jul 2018 15:53:54 +0900 Subject: [PATCH 015/672] lottie/optimization: update the layer item only when it has change. Change-Id: If62c796f18ebea949fe598f0f5890f09bd8a42b8 --- src/lottie/lottieitem.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 62e46c6523..cd30aa8a7a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -448,24 +448,18 @@ void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, float parent } // 3. update the dirty flag based on the change - if (flag() & DirtyFlagBit::All) { - mCombinedMatrix = m; - mCombinedAlpha = alpha; - } else { - if (!mCombinedMatrix.fuzzyCompare(m)) { - mDirtyFlag |= DirtyFlagBit::Matrix; - mCombinedMatrix = m; - } - if (!vCompare(mCombinedAlpha, alpha)) { - mDirtyFlag |= DirtyFlagBit::Alpha; - mCombinedAlpha = alpha; - } + if (!mCombinedMatrix.fuzzyCompare(m)) { + mDirtyFlag |= DirtyFlagBit::Matrix; } + if (!vCompare(mCombinedAlpha, alpha)) { + mDirtyFlag |= DirtyFlagBit::Alpha; + } + mCombinedMatrix = m; + mCombinedAlpha = alpha; // 4. if no parent property change and layer is static then nothing to do. - //@TODO fix this regression -// if ((flag() & DirtyFlagBit::None) && isStatic()) -// return; + if ((flag() & DirtyFlagBit::None) && isStatic()) + return; //5. update the content of the layer updateContent(); From a798a8429f7df10a7194605e5ba8f3172ba537ff Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 16 Jul 2018 15:56:38 +0900 Subject: [PATCH 016/672] lottie/example: fixed layout issue. Change-Id: Id8795b63d13cca081d383f4e1303b990bdb723be --- example/lottieviewtest.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 169da1e27b..f11e280d7a 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -51,11 +51,10 @@ public: if (mResource.empty()) return; int count = mResource.size(); - int colums = sqrt(count); - int rows = (count % colums) ? colums+1 : colums; + int colums = (int) ceil(sqrt(count)); int offset = 3; int vw = (mApp->width() - (2 * offset * colums))/colums; - int vh = (mApp->height() - (2 * offset * rows))/rows; + int vh = vw; int posx = offset; int posy = offset; for(auto i : mResource) { From 6113953d7d0a5c18d2c520793db6293690deb437 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 10:12:26 +0900 Subject: [PATCH 017/672] lottie/mask: refactored mask drawing to take care of nested layer. Change-Id: I287d27bcdebb6eda43243e6514bc1167b1e86dbf --- src/lottie/lottieitem.cpp | 33 +++++++++++++++++++++++++++++---- src/lottie/lottieitem.h | 4 +++- src/vector/vrle.cpp | 2 ++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index cd30aa8a7a..12ccec0926 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -289,9 +289,10 @@ bool LOTCompItem::render(const LOTBuffer &buffer) buffer.bytesPerLine, VBitmap::Format::ARGB32_Premultiplied, nullptr, nullptr); VPainter painter(&bitmap); + VRle mask; for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { LOTLayerItem *layer = *i; - layer->render(&painter); + layer->render(&painter, mask); } // for(auto i : mRenderList) { @@ -367,16 +368,22 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, } } -void LOTLayerItem::render(VPainter *painter) +void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) { std::vector list; renderList(list); - VRle mask = maskRle(); + VRle mask = inheritMask; + if (hasMask()) { + if (mask.isEmpty()) + mask = maskRle(); + else + mask = mask & inheritMask; + } for(auto i : list) { i->preprocess(); painter->setBrush(i->mBrush); if (!mask.isEmpty()) { - VRle rle = i->mRle + mask; + VRle rle = i->mRle & mask; painter->drawRle(VPoint(), rle); } else { painter->drawRle(VPoint(), i->mRle); @@ -394,6 +401,8 @@ VRle LOTLayerItem::maskRle() break; } case LOTMaskData::Mode::Substarct: { + if (rle.isEmpty() && !mBoundingRect.isEmpty()) + rle = VRle::toRle(mBoundingRect); rle = rle - i->mRle; break; } @@ -529,6 +538,22 @@ void LOTCompLayerItem::updateStaticProperty() } } +void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) +{ + VRle mask = inheritMask; + + if (hasMask()) { + if (mask.isEmpty()) + mask = maskRle(); + else + mask = mask & inheritMask; + } + + for(auto i : mLayers) { + i->render(painter, mask); + } +} + LOTCompLayerItem::~LOTCompLayerItem() { for(auto i : mLayers) { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 6fd6f329d7..58f302d200 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -64,7 +64,7 @@ public: VMatrix matrix(int frameNo) const; virtual void renderList(std::vector &list){} virtual void updateStaticProperty(); - void render(VPainter *painter); + virtual void render(VPainter *painter, const VRle &mask); protected: virtual void updateContent() = 0; inline VMatrix combinedMatrix() const {return mCombinedMatrix;} @@ -85,6 +85,7 @@ protected: float mCombinedAlpha; int mFrameNo; DirtyFlag mDirtyFlag; + VRectF mBoundingRect; bool mVisible; bool mStatic; }; @@ -96,6 +97,7 @@ public: LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; void updateStaticProperty() final; + void render(VPainter *painter, const VRle &mask) final; protected: void updateContent() final; private: diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index df0f24ee27..4435e8e969 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -782,6 +782,8 @@ const VRle::Span* VRle::data() const VRle VRle::toRle(const VRectF &rect) { + if (rect.isEmpty()) return VRle(); + VRle result; result.detach(); int x = rect.left(); From 4f0d525e481ac163416cca62c6b0a13d6e19464b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 10:18:58 +0900 Subject: [PATCH 018/672] lottie: removed dead code. Change-Id: I3be0e0d9e1d52d76d7be1ce40e7e901d26c8d772 --- src/lottie/lottieitem.cpp | 43 --------------------------------------- 1 file changed, 43 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 12ccec0926..72744051a6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -295,49 +295,6 @@ bool LOTCompItem::render(const LOTBuffer &buffer) layer->render(&painter, mask); } -// for(auto i : mRenderList) { -// if (i->mType == LOTNode::TypeFill) { -// if (i->mFlag & ChangeFlagPath) { -// FTOutline *outline = VRaster::toFTOutline(i->mFinalPath); -// i->mRleInfo = VRaster::instance().generateFillInfo(outline); -// VRaster::deleteFTOutline(outline); -// i->mFlag = ChangeFlagNone; -// } -// VBrush brush(i->mColor.r, i->mColor.g, i->mColor.b, i->mColor.a); -// painter.setBrush(brush); -// if (!i->mMaskRle.isEmpty()) { -// VRle rle = i->mRleInfo + i->mMaskRle; -// painter.drawRle(VPoint(), rle); -// } else { -// painter.drawRle(VPoint(), i->mRleInfo); -// } -// } else if(i->mType == LOTNode::TypeStroke) { -// if (i->mFlag & ChangeFlagPath) { -// VPath final = i->mFinalPath; -// if (i->mStroke.dashArraySize) { -// VDasher dasher(i->mStroke.dashArray, i->mStroke.dashArraySize); -// final = dasher.dashed(i->mFinalPath); -// } -// FTOutline *outline = VRaster::toFTOutline(final); -// i->mRleInfo = VRaster::instance().generateStrokeInfo(outline, CapStyle::Round, JoinStyle::Round, i->mStroke.width); -// VRaster::deleteFTOutline(outline); -// i->mFlag = ChangeFlagNone; -// } -// VBrush brush(i->mColor.r, i->mColor.g, i->mColor.b, i->mColor.a); -// painter.setBrush(brush); -// painter.drawRle(VPoint(), i->mRleInfo); -// } else if (i->mType == LOTNode::Type::TypeGFill) { -// if (i->mFlag & ChangeFlagPath) { -// FTOutline *outline = VRaster::toFTOutline(i->mFinalPath); -// i->mRleInfo = VRaster::instance().generateFillInfo(outline); -// VRaster::deleteFTOutline(outline); -// i->mFlag = ChangeFlagNone; -// } -// painter.setBrush(i->mBrush); -// painter.drawRle(VPoint(), i->mRleInfo); - -// } -// } return true; } From 8966564ec8c4473e22327b041484b6001931224a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 11:23:59 +0900 Subject: [PATCH 019/672] lottie: Added default coding style file of clang-format. We can modify this file according to tizen coding guideline and then run the clang-format tool on the source tree which will do auto formatting. clang-format -style=file -i filename Change-Id: I396e3da778264e822602ab72b7a06039c6fca0a3 --- .clang-format | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000..3a5940ef65 --- /dev/null +++ b/.clang-format @@ -0,0 +1,90 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IndentCaseLabels: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... + From 0347a9677f2b371c312c4563fe18ea0ac8d123a4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 13:58:17 +0900 Subject: [PATCH 020/672] lottie/example: updated evasapp to handle keyevent propagation. Change-Id: Iecc3479ef011e64e113a50f3914676e0a6341f49 --- example/demo.cpp | 2 +- example/evasapp.cpp | 17 +++++++++++++++-- example/evasapp.h | 6 +++++- example/lottieviewtest.cpp | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/example/demo.cpp b/example/demo.cpp index fcf544b17f..e56e395136 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -5,7 +5,7 @@ using namespace std; static void -onExitCb(void *data) +onExitCb(void *data, void *extra) { LottieView *view = (LottieView *)data; delete view; diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 4f4762e57c..1463a6160e 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -8,7 +8,7 @@ _on_resize(Ecore_Evas *ee) ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); app->resize(w, h); if (app->mResizeCb) - app->mResizeCb(app->mResizeData); + app->mResizeCb(app->mResizeData, nullptr); } static void @@ -16,12 +16,24 @@ _on_delete(Ecore_Evas *ee) { EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app"); if (app->mExitCb) - app->mExitCb(app->mExitData); + app->mExitCb(app->mExitData, nullptr); ecore_main_loop_quit(); ecore_evas_free(ee); } +static Eina_Bool +on_key_down(void *data, int type, void *event) +{ + Ecore_Event_Key *keyData = (Ecore_Event_Key *)event; + + EvasApp *app = (EvasApp *) data; + if (app && app->mKeyCb) + app->mKeyCb(app->mKeyData, (void *)keyData->key); + + return false; +} + EvasApp::EvasApp(int w, int h) { if (!ecore_evas_init()) @@ -39,6 +51,7 @@ EvasApp::setup() ecore_evas_data_set(mEcoreEvas, "app", this); ecore_evas_callback_resize_set(mEcoreEvas, _on_resize); ecore_evas_callback_delete_request_set(mEcoreEvas, _on_delete); + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, on_key_down, this); ecore_evas_show(mEcoreEvas); mEvas = ecore_evas_get(mEcoreEvas); diff --git a/example/evasapp.h b/example/evasapp.h index c7d18cfd40..ddb9615c04 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -14,8 +14,9 @@ #include #include #include +#include -typedef void (*appCb)(void *userData); +typedef void (*appCb)(void *userData, void *extra); class EvasApp { public: @@ -30,6 +31,7 @@ public: Efl_VG * root() const {return mRoot;} void addExitCb(appCb exitcb, void *data) {mExitCb = exitcb; mExitData = data;} void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;} + void addKeyCb(appCb keycb, void *data) {mKeyCb = keycb; mKeyData = data;} public: int mw; int mh; @@ -42,5 +44,7 @@ public: void *mResizeData; appCb mExitCb; void *mExitData; + appCb mKeyCb; + void *mKeyData; }; #endif //EVASAPP_H diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index f11e280d7a..6fc6e9467e 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -88,7 +88,7 @@ public: }; static void -onExitCb(void *data) +onExitCb(void *data, void *extra) { LottieViewTest *view = (LottieViewTest *)data; delete view; From ad76a433c7c3ca313681bab1caa71422fe9a4242 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 17:17:43 +0900 Subject: [PATCH 021/672] lottie/example: move resourcelist generation to evasapp class for reuse. Change-Id: If96683fe079a6484195b87c2fdd96c385114af12 --- example/evasapp.cpp | 25 ++++++++++++++++++++++++ example/evasapp.h | 4 ++++ example/lottieviewtest.cpp | 39 ++++++-------------------------------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 1463a6160e..2a1552f000 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -1,4 +1,5 @@ #include "evasapp.h" +#include static void _on_resize(Ecore_Evas *ee) @@ -81,3 +82,27 @@ void EvasApp::run() ecore_main_loop_begin(); ecore_evas_shutdown(); } + +static bool isJsonFile(const char *filename) { + const char *dot = strrchr(filename, '.'); + if(!dot || dot == filename) return false; + return !strcmp(dot + 1, "json"); +} + +std::vector +EvasApp::jsonFiles(const std::string &dirName, bool recurse) +{ + DIR *d; + struct dirent *dir; + std::vector result; + d = opendir(dirName.c_str()); + if (d) { + while ((dir = readdir(d)) != NULL) { + if (isJsonFile(dir->d_name)) + result.push_back(dirName + dir->d_name); + } + closedir(d); + } + return result; +} + diff --git a/example/evasapp.h b/example/evasapp.h index ddb9615c04..9ae027eba9 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -15,6 +15,9 @@ #include #include #include +#include +#include + typedef void (*appCb)(void *userData, void *extra); class EvasApp @@ -32,6 +35,7 @@ public: void addExitCb(appCb exitcb, void *data) {mExitCb = exitcb; mExitData = data;} void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;} void addKeyCb(appCb keycb, void *data) {mKeyCb = keycb; mKeyData = data;} + static std::vector jsonFiles(const std::string &dir, bool recurse=false); public: int mw; int mh; diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 6fc6e9467e..6c27f40177 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -22,46 +22,21 @@ public: mRenderMode = renderMode; } - bool isJsonFile(const char *filename) { - const char *dot = strrchr(filename, '.'); - if(!dot || dot == filename) return false; - return !strcmp(dot + 1, "json"); - } - - void buildResourceList() { - DIR *d; - struct dirent *dir; - d = opendir(DEMO_DIR); - if (d) { - while ((dir = readdir(d)) != NULL) { - if (isJsonFile(dir->d_name)) - mResource.push_back(dir->d_name); - } - closedir(d); - } - } - void displayResourceList() { - for(auto i : mResource) { - std::string filePath = DEMO_DIR; - filePath +=i; - } - } - void show() { - if (mResource.empty()) return; + auto resource = EvasApp::jsonFiles(std::string(DEMO_DIR)); - int count = mResource.size(); + if (resource.empty()) return; + + int count = resource.size(); int colums = (int) ceil(sqrt(count)); int offset = 3; int vw = (mApp->width() - (2 * offset * colums))/colums; int vh = vw; int posx = offset; int posy = offset; - for(auto i : mResource) { - std::string filePath = DEMO_DIR; - filePath +=i; + for(auto filePath : resource) { - std::unique_ptr view(new LottieView(mApp->evas(), mRenderMode)); + std::unique_ptr view(new LottieView(mApp->evas(), mRenderMode)); view->setFilePath(filePath.c_str()); view->setPos(posx, posy); view->setSize(vw, vh); @@ -84,7 +59,6 @@ public: EvasApp *mApp; bool mRenderMode = false; std::vector> mViews; - std::vector mResource; }; static void @@ -106,7 +80,6 @@ main(int argc, char **argv) renderMode = false; } LottieViewTest *view = new LottieViewTest(app, renderMode); - view->buildResourceList(); view->show(); app->addExitCb(onExitCb, view); From aa3008c3fcb30735e090ea0671113a173f834e47 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 16 Jul 2018 21:08:26 +0900 Subject: [PATCH 022/672] player: remove constructor that accepts functional arguments. it's not good usage than explicitly function call by users, if the function is possibly failed. Change-Id: I0e008093f6627ff24e8bc1d2e9ce0979dcca57bd --- inc/lottieplayer.h | 2 -- src/lottie/lottieplayer.cpp | 4 ---- 2 files changed, 6 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index dfda1520a7..49904b4f16 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -44,8 +44,6 @@ public: ~LOTPlayer(); LOTPlayer(); - LOTPlayer(const char *filePath); - bool setFilePath(const char *filePath); void setSize(int width, int height); diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index b71ffdbdaa..b68e0f4b0e 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -113,10 +113,6 @@ LOTPlayer::~LOTPlayer() delete d; } -LOTPlayer::LOTPlayer(const char *filePath):d(new LOTPlayerPrivate()) -{ - d->setFilePath(filePath); -} /** * \breif Brief abput the Api. From 3ee7184b9d850f95ef39aa257b4408083928a24d Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 16 Jul 2018 21:35:25 +0900 Subject: [PATCH 023/672] player: remove missing member functions. Change-Id: I805e8cfcb99f972019faa88b082948357865a74e --- inc/lottieplayer.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 49904b4f16..c2277991f6 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -46,19 +46,15 @@ public: bool setFilePath(const char *filePath); - void setSize(int width, int height); - void size(int &width, int &height) const; - - int frameRate() const; - - void setFrameRate(int frameRate); - float playTime() const; void seek(float pos); const std::vector& renderList() const; + //TODO: Consider correct position... + void setSize(int width, int height); + void size(int &width, int &height) const; std::future render(float pos, const LOTBuffer &buffer); bool renderSync(float pos, const LOTBuffer &buffer); From 2ed97dc0dc85b540cf088f8470d2766c3e9592e9 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 16 Jul 2018 21:47:57 +0900 Subject: [PATCH 024/672] player: return as soon as possible. We need to take account of user side, not internal ones. Change-Id: Ic7bccc343c771870d10b25fc7dec01217a1d4e35 --- src/lottie/lottieloader.cpp | 2 -- src/lottie/lottieplayer.cpp | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index 3d42195d4c..b6323dee91 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -52,8 +52,6 @@ LottieLoader::LottieLoader() bool LottieLoader::load(std::string &path) { - if (path.empty()) return false; - LottieFileCache &fileCache = LottieFileCache::get(); mModel = fileCache.find(path); diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index b68e0f4b0e..bda32137ab 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -94,6 +94,11 @@ LOTPlayerPrivate::LOTPlayerPrivate() bool LOTPlayerPrivate::setFilePath(std::string path) { + if (path.empty()) { + vWarning << "File path is empty"; + return false; + } + LottieLoader loader; if (loader.load(path)) { mModel = loader.model(); From 4961f33105a895606dd76ef9986cdaace0397adf Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 16 Jul 2018 21:49:12 +0900 Subject: [PATCH 025/672] loader: replace to logging system. Change-Id: I3c81a2c27a0df1e68b1281b0a79d827ada4f11a1 --- src/lottie/lottieloader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index b6323dee91..122dbe2094 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -62,7 +62,7 @@ bool LottieLoader::load(std::string &path) f.open(path); if (!f.is_open()) { - cout << "failed to open file = " << path.c_str() << endl; + vCritical << "failed to open file = " << path.c_str(); return false; } else { std::stringstream buf; From 8c4ed8b5e2af9372d749f78514de8b888a86325c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 18:48:41 +0900 Subject: [PATCH 026/672] lottie/example: remove the evas object when lottivew gets destroyed. Change-Id: Ic14ab134b42377200f439b9a7c50cb654221e7e4 --- example/lottieview.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index de145ef647..da757d6549 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -80,7 +80,7 @@ void LottieView::update(const std::vector &renderList) evas_object_vg_root_node_set(mVg, root); } -LottieView::LottieView(Evas *evas, bool renderMode) +LottieView::LottieView(Evas *evas, bool renderMode):mVg(nullptr), mImage(nullptr) { mPalying = false; mReverse = false; @@ -105,6 +105,8 @@ LottieView::LottieView(Evas *evas, bool renderMode) LottieView::~LottieView() { ecore_animator_del(mAnimator); + if (mVg) evas_object_del(mVg); + if (mImage) evas_object_del(mImage); delete mPlayer; } From ce0d4af58b464bf239cf3d400fa3f7eb2369d450 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 17 Jul 2018 18:50:34 +0900 Subject: [PATCH 027/672] lottie/example: added a new example to test ux sample images Change-Id: Ife2496e90c56e1facb6b83b7bc03b25445c6a018 --- example/meson.build | 9 ++ .../A Shapes_All_01_1920x1080.json | 1 + .../B Fills_All_01_1920x1080.json | 1 + .../C Strokes_All_01_1920x1080.json | 1 + .../D Transforms_All_01_1920x1080.json | 1 + .../E Interpolation_All_01_1920x1080.json | 1 + .../F Masks_All_02_1920x1080.json | 1 + example/uxsampletest.cpp | 101 ++++++++++++++++++ 8 files changed, 116 insertions(+) create mode 100755 example/resource/UXSample_1920x1080/A Shapes_All_01_1920x1080.json create mode 100755 example/resource/UXSample_1920x1080/B Fills_All_01_1920x1080.json create mode 100755 example/resource/UXSample_1920x1080/C Strokes_All_01_1920x1080.json create mode 100755 example/resource/UXSample_1920x1080/D Transforms_All_01_1920x1080.json create mode 100755 example/resource/UXSample_1920x1080/E Interpolation_All_01_1920x1080.json create mode 100755 example/resource/UXSample_1920x1080/F Masks_All_02_1920x1080.json create mode 100644 example/uxsampletest.cpp diff --git a/example/meson.build b/example/meson.build index 6c49d93cfa..79db2c115f 100644 --- a/example/meson.build +++ b/example/meson.build @@ -23,3 +23,12 @@ executable('lottieviewTest', include_directories : inc, link_with : lottie_player_lib, dependencies : demo_dep) + +uxsample_test_src = files('uxsampletest.cpp') +uxsample_test_src += common_source + +executable('uxsampleTest', + uxsample_test_src, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) diff --git a/example/resource/UXSample_1920x1080/A Shapes_All_01_1920x1080.json b/example/resource/UXSample_1920x1080/A Shapes_All_01_1920x1080.json new file mode 100755 index 0000000000..5691c1ff37 --- /dev/null +++ b/example/resource/UXSample_1920x1080/A Shapes_All_01_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":36,"w":1920,"h":1080,"nm":"A Shapes_All_01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[483.75,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[964,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1444.25,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ellipse Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,77.324],[77.324,0],[0,-77.324],[-77.324,0]],"o":[[0,-77.324],[-77.324,0],[0,77.324],[77.324,0]],"v":[[140.007,0],[0,-140.007],[-140.007,0],[0,140.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rounded Rectangle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.6,0],[0,0],[0,-6.6],[0,0],[-6.6,0],[0,0],[0,6.6],[0,0]],"o":[[0,0],[-6.6,0],[0,0],[0,6.6],[0,0],[6.6,0],[0,0],[0,-6.6]],"v":[[128.333,-140.333],[-128.333,-140.333],[-140.333,-128.333],[-140.333,128.333],[-128.333,140.333],[128.333,140.333],[140.333,128.333],[140.333,-128.333]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Polystar Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-75.095,130],[-150.191,0],[-75.095,-130],[75.095,-130],[150.192,0],[75.095,130]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_6","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"merge Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[338.188,258.876,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[143.993,-143.993],[-143.993,-143.993],[-143.993,143.993],[143.993,143.993]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[942.053,592.591],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,103.879],[103.879,0],[0,-103.879],[-103.88,0]],"o":[[0,-103.879],[-103.88,0],[0,103.879],[103.879,0]],"v":[[188.091,0],[0,-188.09],[-188.09,0],[0,188.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1081.098,472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_7","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"merge Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[338.188,258.876,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[143.993,-143.993],[-143.993,-143.993],[-143.993,143.993],[143.993,143.993]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[942.053,592.591],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,103.879],[103.879,0],[0,-103.879],[-103.88,0]],"o":[[0,-103.879],[-103.88,0],[0,103.879],[103.879,0]],"v":[[188.091,0],[0,-188.09],[-188.09,0],[0,188.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1081.098,472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"t":30}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":40,"s":[100],"e":[0]},{"t":70}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":2,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_8","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"merge Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[338.188,258.876,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[143.993,-143.993],[-143.993,-143.993],[-143.993,143.993],[143.993,143.993]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[942.053,592.591],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,103.879],[103.879,0],[0,-103.879],[-103.88,0]],"o":[[0,-103.879],[-103.88,0],[0,103.879],[103.879,0]],"v":[[188.091,0],[0,-188.09],[-188.09,0],[0,188.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1081.098,472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"t":30}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":40,"s":[100],"e":[0]},{"t":70}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"SamsungOne-500","fFamily":"SamsungOne","fStyle":"500","ascent":70.9991455078125}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"A Shapes_01 Shape","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_01 Shape","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"A Shapes_02 Ellipse","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[519.5,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_02 Ellipse","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"A Shapes_03 Rectangle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_03 Rectangle","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"A Shapes_04 Rounded Rectangle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1480.5,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_04 Rounded Rectangle","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"A Shapes_05 Polystar","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_05 Polystar","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":5,"nm":"A Shapes_06 Group","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[519.5,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_06 Group","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":5,"nm":"A Shapes_07 Trim Path (individually)","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_07 Trim Path (individually)","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":5,"nm":"A Shapes_08 Trim Path (simultaneously)","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1480.5,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"A Shapes_08 Trim Path \r(simultaneously)","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"A Shapes_01 Shape","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"A Shapes_02 Ellipse","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[726,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"A Shapes_03 Rectangle","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1204,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"A Shapes_04 Rounded Rectangle","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1678,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"A Shapes_05 Polystar","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"A Shapes_06 Group","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[732,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"A Shapes_07 Trim Path (individually)","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1198,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"A Shapes_08 Trim Path (simultaneously)","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1678,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":37,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"A","size":150,"style":"500","w":61.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7,-21.35],[49.951,0],[59.317,0],[36.154,-67.877],[25.58,-67.877],[2.518,0],[11.581,0],[18.631,-21.35]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.007,4.028],[0,0],[-1.511,-4.431],[0,0]],"o":[[0,0],[1.309,-4.129],[0,0],[1.007,3.928],[0,0],[0,0]],"v":[[20.444,-28.198],[27.09,-47.836],[30.515,-60.123],[30.716,-60.123],[34.241,-47.736],[40.887,-28.198]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"A","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":" ","size":150,"style":"500","w":21.2,"data":{},"fFamily":"SamsungOne"},{"ch":"S","size":150,"style":"500","w":49.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.546,0],[0,10.474],[11.481,4.431],[0,6.345],[-9.265,0],[-2.216,-1.208],[0,0],[6.949,0],[0,-10.574],[-11.078,-3.928],[0,-6.345],[8.963,0],[3.928,2.417]],"o":[[3.625,2.417],[16.013,0],[0,-9.97],[-9.366,-3.625],[0,-4.633],[6.143,0],[0,0],[-3.021,-1.712],[-13.193,0],[0,9.567],[9.164,3.525],[0,6.848],[-6.042,0],[0,0]],"v":[[4.23,-3.323],[21.552,1.007],[45.319,-18.53],[27.997,-38.47],[14.502,-51.562],[27.292,-61.734],[40.182,-58.511],[42.599,-65.662],[27.594,-68.985],[5.64,-50.555],[23.566,-31.32],[36.356,-17.825],[22.156,-6.244],[6.445,-10.675]],"c":true},"ix":2},"nm":"S","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"S","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"h","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.208],[-5.74,0],[0,-7.855],[0,0],[0,0],[0,0],[6.546,0],[2.618,-1.511],[1.41,-2.518],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-1.712],[1.611,-4.834],[8.359,0],[0,0],[0,0],[0,0],[0,-16.818],[-3.323,0],[-2.719,1.511],[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.407],[16.818,-33.636],[28.702,-42.499],[39.981,-27.997],[39.981,0],[48.843,0],[48.843,-29.004],[31.824,-49.85],[22.76,-47.333],[16.415,-41.089],[16.214,-41.089],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"h","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"h","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"a","size":150,"style":"500","w":48.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.23],[0,0],[14.905,0],[4.028,-2.618],[0,0],[-4.532,0],[0,-4.028],[0,0],[0,-11.783],[-9.869,0],[-2.719,3.827],[0,0],[0,0]],"o":[[-0.604,-3.323],[0,0],[0,-9.769],[-6.143,0],[0,0],[3.424,-2.216],[9.97,0],[0,0],[-18.832,-0.101],[0,7.05],[6.949,0],[0,0],[0,0],[0,0]],"v":[[42.398,0],[41.592,-11.682],[41.592,-29.91],[23.062,-49.85],[7.05,-45.52],[9.064,-39.679],[21.753,-43.304],[32.831,-32.025],[32.831,-31.018],[3.525,-12.891],[18.43,1.108],[33.334,-6.143],[33.636,-6.143],[34.341,0]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-0.906],[6.345,0],[0,5.74],[-9.668,-0.201]],"o":[[0,0.906],[-1.41,4.129],[-4.532,0],[0,-9.467],[0,0]],"v":[[33.032,-16.415],[32.529,-13.596],[20.746,-5.438],[12.387,-13.898],[33.032,-24.875]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"a","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"p","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.445,0],[0,17.523],[11.783,0],[3.625,-5.942],[0,0],[0,0],[0,0],[0,-6.244]],"o":[[0,0],[0,0],[0,0],[2.921,4.834],[11.481,0],[0,-14.804],[-7.956,0],[0,0],[0,0],[0,0],[0.201,4.633],[0,0]],"v":[[7.352,19.94],[16.113,19.94],[16.113,-6.546],[16.315,-6.546],[31.32,1.108],[53.476,-25.076],[32.831,-49.85],[15.509,-40.384],[15.308,-40.384],[14.905,-48.743],[6.949,-48.743],[7.352,-32.831]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.302,1.108],[-6.042,0],[0,-9.769],[9.366,0],[1.611,6.143],[0,1.309]],"o":[[0,-1.208],[1.712,-6.647],[9.366,0],[0,11.179],[-6.345,0],[-0.201,-1.108],[0,0]],"v":[[16.113,-28.198],[16.718,-31.824],[30.112,-42.801],[44.614,-24.673],[29.81,-5.841],[16.516,-16.214],[16.113,-19.839]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"p","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"e","size":150,"style":"500","w":50.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.813],[15.912,0],[0,-14.703],[-15.005,0],[-3.122,1.41],[0,0],[6.345,0],[0.201,11.984]],"o":[[0.101,-0.906],[0,-8.963],[-14.2,0],[0,14.703],[7.755,0],[0,0],[-3.323,1.41],[-8.862,0],[0,0]],"v":[[46.527,-22.76],[46.829,-26.889],[26.688,-49.85],[3.827,-23.566],[27.795,1.007],[44.009,-2.014],[42.499,-8.359],[29.004,-5.841],[12.286,-22.76]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-8.963,0],[0.101,-5.64]],"o":[[0.705,-6.143],[9.97,0],[0,0]],"v":[[12.387,-29.105],[25.983,-43.506],[38.269,-29.105]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"s","size":150,"style":"500","w":39.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.338,0],[0,8.56],[8.459,3.223],[0,4.028],[-5.237,0],[-1.913,-1.208],[0,0],[4.935,0],[0,-7.855],[-8.762,-3.122],[0,-4.23],[6.445,0],[2.618,1.712]],"o":[[3.424,2.014],[11.581,0],[0,-7.251],[-6.345,-2.417],[0,-3.625],[4.532,0],[0,0],[-2.719,-1.611],[-10.474,0],[0,5.841],[6.546,2.417],[0,4.028],[-4.431,0],[0,0]],"v":[[3.928,-2.316],[17.624,1.007],[35.852,-13.596],[23.062,-28.299],[13.797,-36.557],[21.954,-43.204],[31.924,-40.384],[34.14,-46.829],[22.156,-49.85],[5.338,-35.55],[18.228,-21.753],[27.292,-12.79],[17.825,-5.539],[6.143,-9.064]],"c":true},"ix":2},"nm":"s","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"s","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"_","size":150,"style":"500","w":50,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,7.553],[0,12.589],[50.354,12.589],[50.354,7.553]],"c":true},"ix":2},"nm":"_","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"_","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"0","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.797,0],[0,-21.954],[-12.79,0],[0,22.256]],"o":[[-13.293,0],[0.201,21.652],[14.502,0],[0,-20.847]],"v":[[26.385,-66.568],[3.625,-32.529],[25.278,1.108],[48.038,-33.435]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.755,0],[0,-16.113],[9.064,0],[0,17.02]],"o":[[9.164,0],[0,16.718],[-8.057,0],[0,-17.825]],"v":[[25.882,-59.72],[39.175,-33.032],[25.781,-5.74],[12.488,-32.428]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"0","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"8","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.696,0],[0,11.38],[8.157,3.223],[0,0],[0,5.539],[12.689,0],[0,-10.373],[-7.251,-3.424],[0,0],[0,-8.258]],"o":[[12.488,0],[0,-7.956],[0,0],[8.057,-3.827],[0,-8.157],[-11.481,0],[0,5.64],[0,0],[-8.057,3.424],[0,9.567]],"v":[[25.681,1.108],[47.937,-17.926],[34.744,-34.845],[34.744,-35.147],[45.52,-50.455],[26.486,-66.568],[6.244,-49.146],[16.617,-34.442],[16.718,-34.14],[3.726,-16.617]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.956,0],[-0.302,6.647],[-7.654,2.216],[0,-7.956]],"o":[[-8.359,0],[0,-6.244],[8.862,2.518],[0,6.747]],"v":[[25.882,-5.338],[12.79,-17.825],[24.573,-31.32],[38.974,-17.02]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-7.352,0],[0,-5.237],[5.64,-1.913],[0,6.546]],"o":[[7.956,0],[0,5.942],[-7.553,-2.014],[0,-5.64]],"v":[[25.983,-60.223],[37.061,-49.548],[27.09,-37.665],[14.603,-49.75]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"8","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"T","size":150,"style":"500","w":53.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.544,0],[29.407,0],[29.407,-60.425],[50.153,-60.425],[50.153,-67.877],[-0.101,-67.877],[-0.101,-60.425],[20.544,-60.425]],"c":true},"ix":2},"nm":"T","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"T","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"r","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.201,1.208],[-6.244,0],[-0.906,-0.201],[0,0],[1.007,0],[2.216,-6.546],[0,0],[0,0],[0,0],[0,-5.74]],"o":[[0,0],[0,0],[0,-1.511],[1.208,-6.647],[1.208,0],[0,0],[-0.806,-0.201],[-5.942,0],[0,0],[0,0],[0,0],[0.302,4.532],[0,0]],"v":[[7.352,0],[16.113,0],[16.113,-25.983],[16.516,-30.112],[28.4,-41.492],[31.421,-41.19],[31.421,-49.548],[28.903,-49.85],[15.408,-39.175],[15.005,-39.175],[14.703,-48.743],[6.949,-48.743],[7.352,-33.536]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"i","size":150,"style":"500","w":23.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.214,0],[16.214,-48.743],[7.352,-48.743],[7.352,0]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.323,0],[0,-3.122],[-3.122,0],[0.101,3.021]],"o":[[-3.223,0],[0,3.021],[3.525,0],[0,-3.122]],"v":[[11.783,-67.978],[6.244,-62.439],[11.581,-57.001],[17.221,-62.439]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"i","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"m","size":150,"style":"500","w":83.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.309],[-5.539,0],[0,-7.755],[0,0],[0,0],[0,0],[-0.403,1.208],[-5.035,0],[0,-9.366],[0,0],[0,0],[0,0],[6.445,0],[2.921,-2.216],[1.511,-2.719],[0,0],[6.647,0],[2.719,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.41,-4.431],[6.747,0],[0,0],[0,0],[0,0],[0,-1.611],[1.511,-4.33],[7.15,0],[0,0],[0,0],[0,0],[0,-16.919],[-4.633,0],[-2.014,1.511],[0,0],[-2.115,-5.74],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.013,0],[16.013,-29.407],[16.718,-33.737],[27.695,-42.599],[37.866,-29.205],[37.866,0],[46.527,0],[46.527,-30.112],[47.232,-34.543],[57.706,-42.599],[68.28,-27.594],[68.28,0],[76.941,0],[76.941,-28.702],[60.928,-49.85],[50.153,-46.426],[44.714,-40.082],[44.513,-40.082],[30.716,-49.85],[15.408,-40.887],[15.106,-40.887],[14.703,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"m","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"m","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"P","size":150,"style":"500","w":53.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.618,0],[-4.633,4.935],[0,6.143],[3.726,3.223],[8.661,0],[4.23,-0.705]],"o":[[0,0],[0,0],[2.014,0.504],[8.56,0],[3.424,-3.525],[0,-6.042],[-4.028,-3.625],[-7.05,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-27.191],[23.465,-26.587],[44.211,-34.039],[49.448,-48.541],[43.506,-62.741],[24.472,-68.381],[7.654,-67.072]],"c":true},"ix":2},"nm":"P","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-3.827,0],[0,-8.963],[10.574,0],[1.913,0.504]],"o":[[1.511,-0.403],[9.668,0],[0,9.366],[-2.921,0],[0,0]],"v":[[16.415,-60.727],[24.673,-61.432],[40.686,-48.138],[23.666,-33.636],[16.415,-34.341]],"c":true},"ix":2},"nm":"P","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"P","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"t","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.518,-2.618],[-4.129,0],[-1.712,0.705],[0,0],[2.316,0],[0,6.042],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.74],[2.115,2.417],[3.424,0],[0,0],[-1.108,0.302],[-4.935,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.366,-60.425],[9.366,-48.743],[1.813,-48.743],[1.813,-41.995],[9.366,-41.995],[9.366,-15.408],[12.79,-2.719],[22.357,1.007],[30.212,-0.201],[29.81,-6.848],[24.673,-6.244],[18.027,-15.71],[18.027,-41.995],[30.716,-41.995],[30.716,-48.743],[18.027,-48.743],[18.027,-62.741]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"\r","size":150,"style":"500","w":0,"fFamily":"SamsungOne"},{"ch":"(","size":150,"style":"500","w":28.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.101,-19.839],[-6.345,-8.359],[0,0],[0,17.926],[-7.352,9.869]],"o":[[-6.345,8.459],[0,19.638],[0,0],[-7.15,-10.071],[0,-18.228],[0,0]],"v":[[19.638,-69.891],[6.445,-28.702],[19.638,12.186],[26.587,12.186],[13.898,-28.702],[26.587,-69.891]],"c":true},"ix":2},"nm":"(","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"(","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"u","size":150,"style":"500","w":55.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.504,-1.309],[5.942,0],[0,9.265],[0,0],[0,0],[0,0],[-7.654,0],[-2.316,3.928],[0,0],[0,0],[0,0],[0,5.035]],"o":[[0,0],[0,0],[0,1.611],[-1.611,3.928],[-8.057,0],[0,0],[0,0],[0,0],[0,17.12],[8.661,0],[0,0],[0,0],[0,0],[-0.302,-3.827],[0,0]],"v":[[48.138,-48.743],[39.276,-48.743],[39.276,-18.832],[38.47,-14.301],[26.788,-6.244],[15.912,-21.753],[15.912,-48.743],[7.05,-48.743],[7.05,-20.242],[23.868,1.108],[39.981,-7.956],[40.182,-7.956],[40.686,0],[48.541,0],[48.138,-13.293]],"c":true},"ix":2},"nm":"u","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"u","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"l","size":150,"style":"500","w":23.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"l","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"l","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"n","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.403,1.108],[-5.841,0],[0,-7.855],[0,0],[0,0],[0,0],[6.747,0],[2.417,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.511,-4.935],[8.359,0],[0,0],[0,0],[0,0],[0,-16.718],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.306],[16.818,-33.435],[28.702,-42.499],[39.981,-28.098],[39.981,0],[48.843,0],[48.843,-29.105],[31.622,-49.85],[15.509,-40.686],[15.308,-40.686],[14.804,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"n","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"n","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"o","size":150,"style":"500","w":54.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.998,0],[0,-16.315],[-13.193,0],[0,18.027]],"o":[[-13.495,0],[0,15.408],[11.783,0],[0,-14.905]],"v":[[27.997,-49.85],[3.827,-23.969],[27.191,1.108],[51.462,-24.774]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-10.474,0],[0,-8.258],[8.459,0],[0,10.675]],"o":[[10.474,0],[0,10.977],[-8.661,0],[0,-9.265]],"v":[[27.795,-43.204],[42.398,-24.472],[27.594,-5.539],[12.79,-24.271]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"y","size":150,"style":"500","w":48.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.504],[0.403,-0.906],[2.417,-1.913],[2.216,-0.705],[0,0],[-4.33,3.827],[-6.345,16.718],[0,0],[0,0],[0,0],[0.906,-2.921],[0,0],[1.108,3.223],[0,0]],"o":[[0,0],[0.403,1.108],[0,0.504],[-2.014,4.532],[-2.618,2.216],[0,0],[2.216,-0.403],[6.042,-5.237],[0,0],[0,0],[0,0],[-1.208,3.525],[0,0],[-0.806,-2.921],[0,0],[0,0]],"v":[[0.906,-48.743],[18.933,-3.827],[19.537,-1.511],[18.832,0.604],[11.38,10.474],[3.625,14.804],[5.841,22.256],[16.718,16.516],[33.435,-13.998],[46.729,-48.743],[37.363,-48.743],[27.695,-20.142],[24.573,-9.97],[24.371,-9.97],[21.249,-19.94],[10.574,-48.743]],"c":true},"ix":2},"nm":"y","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"y","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":")","size":150,"style":"500","w":28.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,19.739],[6.445,8.258],[0,0],[0,-18.027],[7.15,-9.97]],"o":[[6.445,-8.56],[0,-19.839],[0,0],[7.251,9.97],[0,18.127],[0,0]],"v":[[8.862,12.186],[22.055,-28.903],[8.862,-69.891],[2.014,-69.891],[14.703,-29.004],[2.014,12.186]],"c":true},"ix":2},"nm":")","mn":"ADBE Vector Shape - Group","hd":false}],"nm":")","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"7","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.74,-65.46],[5.74,-58.109],[37.766,-58.109],[37.766,-57.907],[9.366,0],[18.53,0],[47.031,-59.619],[47.031,-65.46]],"c":true},"ix":2},"nm":"7","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"7","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"d","size":150,"style":"500","w":56.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[7.452,0],[-0.101,-16.214],[-11.783,0],[-2.719,5.438],[0,0],[0,0],[0,0],[0,4.33],[0,0]],"o":[[0,0],[0,0],[-2.216,-3.928],[-11.884,0],[0,14.804],[7.956,0],[0,0],[0,0],[0,0],[-0.302,-3.323],[0,0],[0,0]],"v":[[40.585,-71.503],[40.585,-42.398],[40.384,-42.398],[25.681,-49.85],[3.827,-23.666],[24.673,1.108],[41.29,-8.459],[41.492,-8.459],[41.895,0],[49.85,0],[49.448,-12.589],[49.448,-71.503]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-1.208],[5.942,0],[0,9.869],[-9.164,0],[-1.309,-5.64],[0,-1.108]],"o":[[0,1.41],[-1.611,6.647],[-9.567,0],[0,-10.776],[6.647,0],[0.302,1.108],[0,0]],"v":[[40.585,-20.444],[40.182,-16.617],[27.191,-6.042],[12.79,-24.069],[27.393,-42.902],[40.182,-32.629],[40.585,-28.903]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"d","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"v","size":150,"style":"500","w":49.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.108,-4.028],[0,0],[1.611,4.431],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-1.611,4.431],[0,0],[-1.007,-4.028],[0,0],[0,0]],"v":[[1.309,-48.743],[19.839,0],[28.299,0],[47.433,-48.743],[38.168,-48.743],[28.702,-21.35],[24.573,-8.862],[24.271,-8.862],[20.343,-21.35],[10.776,-48.743]],"c":true},"ix":2},"nm":"v","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"v","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"6","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.618,-0.403],[5.438,-5.338],[0,-12.891],[-13.998,0],[0,11.984],[11.581,0],[3.122,-4.129],[0,0],[-13.898,2.316],[-1.813,-0.101]],"o":[[-1.611,0],[-8.258,1.007],[-6.445,6.445],[0,17.02],[13.596,0],[0,-12.79],[-7.251,0],[0,0],[1.511,-10.776],[2.518,-0.403],[0,0]],"v":[[41.895,-66.467],[35.449,-65.964],[14.502,-56.296],[3.424,-26.788],[26.587,1.108],[48.34,-21.954],[28.601,-43.103],[12.79,-35.55],[12.488,-35.55],[35.248,-58.813],[41.895,-59.216]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.654,0],[0.201,10.776],[-0.604,1.007],[-5.338,0],[0,-9.366]],"o":[[-9.265,0],[0,-1.611],[2.417,-4.733],[8.157,0],[0,9.366]],"v":[[26.587,-5.74],[12.186,-24.472],[13.193,-28.4],[25.882,-36.456],[39.377,-21.451]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"6","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"G","size":150,"style":"500","w":64.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[5.74,0],[0,17.221],[-16.516,0],[-3.625,-1.611],[0,0],[7.855,0],[0.101,-20.242],[-5.841,-5.64],[-10.272,0],[-3.928,1.41]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.014,1.007],[-15.811,0],[0,-17.02],[6.848,0],[0,0],[-2.921,-1.41],[-22.76,0],[0,10.574],[6.647,6.345],[9.164,0],[0,0]],"v":[[59.317,-35.651],[36.96,-35.651],[36.96,-28.601],[50.757,-28.601],[50.757,-8.359],[39.075,-6.546],[12.891,-33.939],[40.182,-61.23],[55.188,-58.31],[57.303,-65.46],[40.384,-68.582],[3.625,-33.536],[13.092,-8.258],[38.47,0.705],[59.317,-3.021]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"G","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"5","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.726,0],[-0.101,-8.459],[8.359,0],[2.719,1.611],[0,0],[-7.15,0],[0,12.79],[5.136,2.921],[5.035,0],[1.511,-0.201],[0,0],[0,0]],"o":[[0,0],[0,0],[2.417,-0.302],[13.092,0],[0,8.762],[-5.942,0],[0,0],[3.122,2.014],[14.2,0],[0,-8.258],[-4.028,-2.417],[-2.417,0],[0,0],[0,0],[0,0]],"v":[[43.607,-65.46],[12.286,-65.46],[8.057,-34.039],[17.12,-34.744],[35.953,-20.242],[20.444,-6.042],[6.445,-9.668],[4.23,-2.921],[20.544,1.108],[44.916,-21.249],[35.55,-38.068],[21.451,-41.592],[16.113,-41.19],[18.631,-58.008],[43.607,-58.008]],"c":true},"ix":2},"nm":"5","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"4","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.283,0],[40.283,-17.825],[49.448,-17.825],[49.448,-24.774],[40.283,-24.774],[40.283,-65.46],[30.716,-65.46],[1.511,-23.666],[1.511,-17.825],[31.924,-17.825],[31.924,0]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.014,3.827],[0,0],[0,-3.424],[0,0]],"o":[[0,0],[0,0],[1.813,-3.021],[0,0],[-0.201,3.424],[0,0],[0,0]],"v":[[10.474,-24.774],[10.474,-24.976],[26.486,-47.232],[31.924,-56.9],[32.227,-56.9],[31.924,-46.628],[31.924,-24.774]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"4","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"R","size":150,"style":"500","w":53.8,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.014,-9.366],[-1.108,-1.913],[0,0],[2.216,9.467],[5.237,1.813],[0,0],[0,8.963],[3.424,3.021],[9.366,0],[4.431,-0.906]],"o":[[0,0],[0,0],[0,0],[7.956,0.302],[1.913,8.459],[0,0],[-1.41,-2.618],[-1.611,-7.05],[0,0],[7.15,-2.417],[0,-5.237],[-4.23,-3.827],[-6.042,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-29.407],[24.673,-29.407],[38.269,-16.214],[42.801,0],[51.865,0],[46.628,-18.631],[36.658,-32.327],[36.658,-32.629],[49.448,-49.951],[44.11,-62.842],[24.472,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.23,0],[0,-8.762],[9.366,0],[0,0]],"o":[[1.41,-0.403],[9.265,0.101],[0,7.755],[0,0],[0,0]],"v":[[16.415,-60.828],[25.076,-61.633],[40.686,-48.944],[25.378,-36.053],[16.415,-36.053]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"R","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"c","size":150,"style":"500","w":44.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.035,0],[0,11.279],[-11.179,0],[-2.115,-1.208],[0,0],[5.237,0],[0,-15.005],[-14.703,0],[-2.316,1.208]],"o":[[-2.518,1.108],[-9.668,0],[0,-10.172],[4.834,0],[0,0],[-2.417,-1.208],[-15.912,0],[0,14.905],[6.546,0],[0,0]],"v":[[40.585,-8.459],[29.709,-6.042],[12.79,-24.271],[30.011,-42.7],[40.283,-40.384],[42.297,-47.232],[30.011,-49.75],[3.827,-23.868],[28.098,1.007],[42.096,-1.813]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"g","size":150,"style":"500","w":55.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[8.459,0],[0,-16.516],[-12.085,0],[-2.719,4.532],[0,0],[0,0],[9.064,0],[3.223,2.014],[0,0],[-5.841,0],[-4.733,4.431],[0,11.179],[0,0],[-0.201,3.525]],"o":[[0,0],[0,0],[-2.115,-4.028],[-11.179,0],[0,13.495],[7.553,0],[0,0],[0,0],[0,12.286],[-6.042,0],[0,0],[3.928,2.618],[6.143,0],[4.733,-4.23],[0,0],[0,-5.942],[0,0]],"v":[[41.592,-48.743],[41.19,-41.391],[40.988,-41.391],[25.781,-49.85],[3.827,-23.969],[24.573,-0.201],[40.082,-8.359],[40.283,-8.359],[40.283,-2.921],[24.573,14.099],[10.272,10.272],[8.057,17.02],[24.271,21.048],[41.995,15.207],[48.944,-7.05],[48.944,-35.349],[49.347,-48.743]],"c":true},"ix":2},"nm":"g","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.504,-1.511],[5.438,0],[0,9.567],[-8.459,0],[-1.611,-5.136],[0,-1.511]],"o":[[0,1.511],[-1.913,5.64],[-9.567,0],[0,-11.279],[6.445,0],[0.403,1.208],[0,0]],"v":[[40.182,-20.746],[39.478,-16.013],[27.191,-6.949],[12.79,-24.472],[27.292,-42.902],[39.679,-33.536],[40.182,-29.507]],"c":true},"ix":2},"nm":"g","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"g","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"3","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.352,0],[0,10.474],[8.057,1.611],[0,0],[0,6.747],[12.891,0],[3.424,-2.518],[0,0],[-5.237,0],[0,-5.237],[6.445,0],[0,0],[0,0],[0,0],[-0.101,-9.164],[11.38,0],[2.518,1.611]],"o":[[3.223,2.115],[15.71,0],[0,-9.164],[0,0],[8.057,-2.921],[0,-7.956],[-7.05,0],[0,0],[2.82,-2.014],[8.157,0],[0,7.755],[0,0],[0,0],[0,0],[8.56,0],[0.101,5.438],[-6.143,0],[0,0]],"v":[[4.23,-3.323],[21.249,1.108],[45.117,-18.53],[30.515,-35.349],[30.515,-35.55],[42.599,-50.958],[23.868,-66.568],[6.747,-61.533],[9.064,-55.087],[22.156,-59.418],[33.636,-49.548],[19.034,-38.47],[14.099,-38.47],[14.099,-31.824],[19.034,-31.824],[35.953,-18.732],[21.149,-6.042],[6.647,-10.172]],"c":true},"ix":2},"nm":"3","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"2","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.085],[14.099,0],[4.532,-3.827],[0,0],[-5.942,0],[0,-6.647],[16.718,-15.912],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[13.797,-13.293],[0,-9.366],[-7.553,0],[0,0],[3.021,-2.518],[9.769,0],[-0.101,9.869],[0,0],[0,0],[0,0]],"v":[[46.326,0],[46.326,-7.352],[16.919,-7.352],[16.919,-7.553],[22.156,-12.387],[44.714,-47.534],[24.673,-66.568],[6.143,-59.921],[8.963,-53.677],[22.861,-59.216],[35.852,-46.426],[11.481,-12.186],[4.532,-5.438],[4.532,0]],"c":true},"ix":2},"nm":"2","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"E","size":150,"style":"500","w":49.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.801,-39.075],[16.415,-39.075],[16.415,-60.526],[44.312,-60.526],[44.312,-67.877],[7.654,-67.877],[7.654,0],[45.822,0],[45.822,-7.352],[16.415,-7.352],[16.415,-31.824],[42.801,-31.824]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"E","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"1","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.767,0],[32.327,0],[32.327,-65.46],[24.774,-65.46],[10.474,-57.806],[12.186,-51.059],[23.566,-57.202],[23.767,-57.202]],"c":true},"ix":2},"nm":"1","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"}]} \ No newline at end of file diff --git a/example/resource/UXSample_1920x1080/B Fills_All_01_1920x1080.json b/example/resource/UXSample_1920x1080/B Fills_All_01_1920x1080.json new file mode 100755 index 0000000000..1e6d4b1b88 --- /dev/null +++ b/example/resource/UXSample_1920x1080/B Fills_All_01_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":114,"w":1920,"h":1080,"nm":"B Fills_All_01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[643.833,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1284.167,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.901960790157,0.712618291378,0.054901961237,1],"e":[0.054901961237,0.631372570992,0.901960790157,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0.054901961237,0.631372570992,0.901960790157,1],"e":[0.901960790157,0.713725507259,0.054901961237,1]},{"t":30}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0],"e":[100]},{"t":30}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Fill rlue Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[391.686,274.164,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[11.387,51.452],[-75.913,0],[20.243,-42.174],[-1.265,20.244],[-66.213,-5.061],[-0.421,-16.448],[57.356,-14.761],[-5.905,26.992],[-28.256,-32.474],[27.835,-38.378],[38.378,33.317],[-33.739,0],[49.344,-58.201],[0.844,65.37],[-10.122,3.374],[-3.795,-24.461],[29.522,0.843],[5.483,60.309],[-19.821,0],[-25.726,-13.496],[7.169,-10.965]],"o":[[0,0],[-11.387,-51.452],[75.913,0],[-20.244,42.174],[1.265,-20.243],[66.213,5.061],[0.422,16.448],[-57.357,14.761],[5.904,-26.991],[28.257,32.474],[-27.835,38.379],[-38.379,-33.318],[33.739,0],[-49.343,58.2],[-0.843,-65.369],[10.122,-3.374],[3.796,24.461],[-29.522,-0.843],[-5.483,-60.309],[19.822,0],[25.726,13.495],[-7.17,10.965]],"v":[[-27.834,-41.963],[-73.383,-69.798],[5.904,-198.429],[77.601,-61.363],[21.088,-63.472],[115.979,-114.502],[190.204,-37.324],[121.883,44.915],[50.188,17.502],[117.244,19.189],[135.8,135.589],[10.123,139.807],[0.844,48.289],[-0.422,140.229],[-140.018,98.476],[-80.13,-6.537],[-46.391,13.285],[-83.083,50.398],[-185.143,-36.902],[-121.039,-115.768],[-40.909,-101.428],[-16.026,-54.615]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":2,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[924.302,493.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,313.5,0],"ix":2},"a":{"a":0,"k":[962,643,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88,"s":[100],"e":[0]},{"t":108}],"ix":10},"r":1,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[0,0.055,0.631,0.902,0.592,0.478,0.673,0.478,1,0.902,0.714,0.055],"e":[0,0.902,0.055,0.173,0.592,0.902,0.384,0.114,1,0.902,0.714,0.055]},{"t":67}],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,0],"e":[0,426],"to":[0,71],"ti":[0,-71]},{"t":20}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[1,0],"e":[2,-140],"to":[0.16666667163372,-23.3333339691162],"ti":[-0.16666667163372,23.3333339691162]},{"t":40}],"ix":6},"t":2,"h":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78,"s":[0],"e":[100]},{"t":88}],"ix":7},"a":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[0],"e":[360]},{"t":67}],"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[100],"e":[0]},{"t":60}],"ix":10},"r":1,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[0,0.055,0.631,0.902,0.592,0.478,0.673,0.478,1,0.902,0.714,0.055,0,0.6,0.5,0.8,1,1],"e":[0,0.902,0.055,0.173,0.592,0.902,0.384,0.114,1,0.902,0.714,0.055,0,0.6,0.5,0.8,1,1]},{"t":40}],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-235,0],"e":[0,0],"to":[39.1666679382324,0],"ti":[-39.1666679382324,0]},{"t":20}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[0,140],"e":[0,13],"to":[0,-21.1666660308838],"ti":[0,21.1666660308838]},{"t":40}],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"SamsungOne-500","fFamily":"SamsungOne","fStyle":"500","ascent":70.9991455078125}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"B Fills_01 Color","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"B Fills_01 Color","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":115,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"B Fills_02 Opacity","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[679.25,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"B Fills_02 Opacity","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":115,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"B Fills_03 Fill Rule","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1320,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"B Fills_03 Fill Rule","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":115,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"B Fills_04 Radial Gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"B Fills_04 Radial Gradient","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":115,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"B Fills_05 Linear Gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[679.25,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"B Fills_05 Linear Gradient","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":115,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"B Fills_01 Color","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"B Fills_02 Opacity","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"B Fills_03 Fill Rule","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1597.5,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"B Fills_04 Radial Gradient","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"B Fills_05 Linear Gradient","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"B","size":150,"style":"500","w":54.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.042,0],[-4.733,4.33],[0,5.841],[6.445,1.611],[0,0],[0,6.546],[3.525,2.618],[8.762,0],[3.827,-0.806]],"o":[[2.921,0.403],[11.078,0],[3.424,-3.323],[0,-10.071],[0,0],[7.15,-2.618],[0,-5.338],[-4.23,-3.424],[-6.143,0],[0,0]],"v":[[7.654,-0.201],[21.249,0.604],[44.714,-5.74],[50.455,-19.336],[36.456,-36.356],[36.456,-36.557],[47.937,-51.462],[42.297,-63.446],[23.666,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"B","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.028,0],[0,-7.956],[9.265,0],[0,0]],"o":[[1.41,-0.302],[8.862,0],[0,6.546],[0,0],[0,0]],"v":[[16.415,-61.029],[24.17,-61.633],[39.075,-50.555],[24.371,-39.175],[16.415,-39.175]],"c":true},"ix":2},"nm":"B","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-9.265],[9.064,0],[1.712,0.302]],"o":[[0,0],[9.567,0],[0,9.869],[-3.122,0],[0,0]],"v":[[16.415,-32.529],[23.666,-32.529],[41.19,-19.437],[23.767,-6.244],[16.415,-6.647]],"c":true},"ix":2},"nm":"B","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"B","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":" ","size":150,"style":"500","w":21.2,"data":{},"fFamily":"SamsungOne"},{"ch":"F","size":150,"style":"500","w":48.7,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-30.716],[42.096,-30.716],[42.096,-37.967],[16.415,-37.967],[16.415,-60.526],[44.211,-60.526],[44.211,-67.877],[7.654,-67.877]],"c":true},"ix":2},"nm":"F","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"F","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"i","size":150,"style":"500","w":23.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.214,0],[16.214,-48.743],[7.352,-48.743],[7.352,0]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.323,0],[0,-3.122],[-3.122,0],[0.101,3.021]],"o":[[-3.223,0],[0,3.021],[3.525,0],[0,-3.122]],"v":[[11.783,-67.978],[6.244,-62.439],[11.581,-57.001],[17.221,-62.439]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"i","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"l","size":150,"style":"500","w":23.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"l","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"l","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"s","size":150,"style":"500","w":39.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.338,0],[0,8.56],[8.459,3.223],[0,4.028],[-5.237,0],[-1.913,-1.208],[0,0],[4.935,0],[0,-7.855],[-8.762,-3.122],[0,-4.23],[6.445,0],[2.618,1.712]],"o":[[3.424,2.014],[11.581,0],[0,-7.251],[-6.345,-2.417],[0,-3.625],[4.532,0],[0,0],[-2.719,-1.611],[-10.474,0],[0,5.841],[6.546,2.417],[0,4.028],[-4.431,0],[0,0]],"v":[[3.928,-2.316],[17.624,1.007],[35.852,-13.596],[23.062,-28.299],[13.797,-36.557],[21.954,-43.204],[31.924,-40.384],[34.14,-46.829],[22.156,-49.85],[5.338,-35.55],[18.228,-21.753],[27.292,-12.79],[17.825,-5.539],[6.143,-9.064]],"c":true},"ix":2},"nm":"s","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"s","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"_","size":150,"style":"500","w":50,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,7.553],[0,12.589],[50.354,12.589],[50.354,7.553]],"c":true},"ix":2},"nm":"_","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"_","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"0","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.797,0],[0,-21.954],[-12.79,0],[0,22.256]],"o":[[-13.293,0],[0.201,21.652],[14.502,0],[0,-20.847]],"v":[[26.385,-66.568],[3.625,-32.529],[25.278,1.108],[48.038,-33.435]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.755,0],[0,-16.113],[9.064,0],[0,17.02]],"o":[[9.164,0],[0,16.718],[-8.057,0],[0,-17.825]],"v":[[25.882,-59.72],[39.175,-33.032],[25.781,-5.74],[12.488,-32.428]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"0","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"5","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.726,0],[-0.101,-8.459],[8.359,0],[2.719,1.611],[0,0],[-7.15,0],[0,12.79],[5.136,2.921],[5.035,0],[1.511,-0.201],[0,0],[0,0]],"o":[[0,0],[0,0],[2.417,-0.302],[13.092,0],[0,8.762],[-5.942,0],[0,0],[3.122,2.014],[14.2,0],[0,-8.258],[-4.028,-2.417],[-2.417,0],[0,0],[0,0],[0,0]],"v":[[43.607,-65.46],[12.286,-65.46],[8.057,-34.039],[17.12,-34.744],[35.953,-20.242],[20.444,-6.042],[6.445,-9.668],[4.23,-2.921],[20.544,1.108],[44.916,-21.249],[35.55,-38.068],[21.451,-41.592],[16.113,-41.19],[18.631,-58.008],[43.607,-58.008]],"c":true},"ix":2},"nm":"5","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"L","size":150,"style":"500","w":47.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,0],[45.419,0],[45.419,-7.352],[16.415,-7.352],[16.415,-67.877],[7.654,-67.877]],"c":true},"ix":2},"nm":"L","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"L","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"n","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.403,1.108],[-5.841,0],[0,-7.855],[0,0],[0,0],[0,0],[6.747,0],[2.417,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.511,-4.935],[8.359,0],[0,0],[0,0],[0,0],[0,-16.718],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.306],[16.818,-33.435],[28.702,-42.499],[39.981,-28.098],[39.981,0],[48.843,0],[48.843,-29.105],[31.622,-49.85],[15.509,-40.686],[15.308,-40.686],[14.804,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"n","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"n","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"e","size":150,"style":"500","w":50.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.813],[15.912,0],[0,-14.703],[-15.005,0],[-3.122,1.41],[0,0],[6.345,0],[0.201,11.984]],"o":[[0.101,-0.906],[0,-8.963],[-14.2,0],[0,14.703],[7.755,0],[0,0],[-3.323,1.41],[-8.862,0],[0,0]],"v":[[46.527,-22.76],[46.829,-26.889],[26.688,-49.85],[3.827,-23.566],[27.795,1.007],[44.009,-2.014],[42.499,-8.359],[29.004,-5.841],[12.286,-22.76]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-8.963,0],[0.101,-5.64]],"o":[[0.705,-6.143],[9.97,0],[0,0]],"v":[[12.387,-29.105],[25.983,-43.506],[38.269,-29.105]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"a","size":150,"style":"500","w":48.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.23],[0,0],[14.905,0],[4.028,-2.618],[0,0],[-4.532,0],[0,-4.028],[0,0],[0,-11.783],[-9.869,0],[-2.719,3.827],[0,0],[0,0]],"o":[[-0.604,-3.323],[0,0],[0,-9.769],[-6.143,0],[0,0],[3.424,-2.216],[9.97,0],[0,0],[-18.832,-0.101],[0,7.05],[6.949,0],[0,0],[0,0],[0,0]],"v":[[42.398,0],[41.592,-11.682],[41.592,-29.91],[23.062,-49.85],[7.05,-45.52],[9.064,-39.679],[21.753,-43.304],[32.831,-32.025],[32.831,-31.018],[3.525,-12.891],[18.43,1.108],[33.334,-6.143],[33.636,-6.143],[34.341,0]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-0.906],[6.345,0],[0,5.74],[-9.668,-0.201]],"o":[[0,0.906],[-1.41,4.129],[-4.532,0],[0,-9.467],[0,0]],"v":[[33.032,-16.415],[32.529,-13.596],[20.746,-5.438],[12.387,-13.898],[33.032,-24.875]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"a","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"r","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.201,1.208],[-6.244,0],[-0.906,-0.201],[0,0],[1.007,0],[2.216,-6.546],[0,0],[0,0],[0,0],[0,-5.74]],"o":[[0,0],[0,0],[0,-1.511],[1.208,-6.647],[1.208,0],[0,0],[-0.806,-0.201],[-5.942,0],[0,0],[0,0],[0,0],[0.302,4.532],[0,0]],"v":[[7.352,0],[16.113,0],[16.113,-25.983],[16.516,-30.112],[28.4,-41.492],[31.421,-41.19],[31.421,-49.548],[28.903,-49.85],[15.408,-39.175],[15.005,-39.175],[14.703,-48.743],[6.949,-48.743],[7.352,-33.536]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"G","size":150,"style":"500","w":64.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[5.74,0],[0,17.221],[-16.516,0],[-3.625,-1.611],[0,0],[7.855,0],[0.101,-20.242],[-5.841,-5.64],[-10.272,0],[-3.928,1.41]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.014,1.007],[-15.811,0],[0,-17.02],[6.848,0],[0,0],[-2.921,-1.41],[-22.76,0],[0,10.574],[6.647,6.345],[9.164,0],[0,0]],"v":[[59.317,-35.651],[36.96,-35.651],[36.96,-28.601],[50.757,-28.601],[50.757,-8.359],[39.075,-6.546],[12.891,-33.939],[40.182,-61.23],[55.188,-58.31],[57.303,-65.46],[40.384,-68.582],[3.625,-33.536],[13.092,-8.258],[38.47,0.705],[59.317,-3.021]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"G","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"d","size":150,"style":"500","w":56.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[7.452,0],[-0.101,-16.214],[-11.783,0],[-2.719,5.438],[0,0],[0,0],[0,0],[0,4.33],[0,0]],"o":[[0,0],[0,0],[-2.216,-3.928],[-11.884,0],[0,14.804],[7.956,0],[0,0],[0,0],[0,0],[-0.302,-3.323],[0,0],[0,0]],"v":[[40.585,-71.503],[40.585,-42.398],[40.384,-42.398],[25.681,-49.85],[3.827,-23.666],[24.673,1.108],[41.29,-8.459],[41.492,-8.459],[41.895,0],[49.85,0],[49.448,-12.589],[49.448,-71.503]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-1.208],[5.942,0],[0,9.869],[-9.164,0],[-1.309,-5.64],[0,-1.108]],"o":[[0,1.41],[-1.611,6.647],[-9.567,0],[0,-10.776],[6.647,0],[0.302,1.108],[0,0]],"v":[[40.585,-20.444],[40.182,-16.617],[27.191,-6.042],[12.79,-24.069],[27.393,-42.902],[40.182,-32.629],[40.585,-28.903]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"d","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"t","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.518,-2.618],[-4.129,0],[-1.712,0.705],[0,0],[2.316,0],[0,6.042],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.74],[2.115,2.417],[3.424,0],[0,0],[-1.108,0.302],[-4.935,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.366,-60.425],[9.366,-48.743],[1.813,-48.743],[1.813,-41.995],[9.366,-41.995],[9.366,-15.408],[12.79,-2.719],[22.357,1.007],[30.212,-0.201],[29.81,-6.848],[24.673,-6.244],[18.027,-15.71],[18.027,-41.995],[30.716,-41.995],[30.716,-48.743],[18.027,-48.743],[18.027,-62.741]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"4","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.283,0],[40.283,-17.825],[49.448,-17.825],[49.448,-24.774],[40.283,-24.774],[40.283,-65.46],[30.716,-65.46],[1.511,-23.666],[1.511,-17.825],[31.924,-17.825],[31.924,0]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.014,3.827],[0,0],[0,-3.424],[0,0]],"o":[[0,0],[0,0],[1.813,-3.021],[0,0],[-0.201,3.424],[0,0],[0,0]],"v":[[10.474,-24.774],[10.474,-24.976],[26.486,-47.232],[31.924,-56.9],[32.227,-56.9],[31.924,-46.628],[31.924,-24.774]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"4","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"R","size":150,"style":"500","w":53.8,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.014,-9.366],[-1.108,-1.913],[0,0],[2.216,9.467],[5.237,1.813],[0,0],[0,8.963],[3.424,3.021],[9.366,0],[4.431,-0.906]],"o":[[0,0],[0,0],[0,0],[7.956,0.302],[1.913,8.459],[0,0],[-1.41,-2.618],[-1.611,-7.05],[0,0],[7.15,-2.417],[0,-5.237],[-4.23,-3.827],[-6.042,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-29.407],[24.673,-29.407],[38.269,-16.214],[42.801,0],[51.865,0],[46.628,-18.631],[36.658,-32.327],[36.658,-32.629],[49.448,-49.951],[44.11,-62.842],[24.472,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.23,0],[0,-8.762],[9.366,0],[0,0]],"o":[[1.41,-0.403],[9.265,0.101],[0,7.755],[0,0],[0,0]],"v":[[16.415,-60.828],[25.076,-61.633],[40.686,-48.944],[25.378,-36.053],[16.415,-36.053]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"R","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"3","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.352,0],[0,10.474],[8.057,1.611],[0,0],[0,6.747],[12.891,0],[3.424,-2.518],[0,0],[-5.237,0],[0,-5.237],[6.445,0],[0,0],[0,0],[0,0],[-0.101,-9.164],[11.38,0],[2.518,1.611]],"o":[[3.223,2.115],[15.71,0],[0,-9.164],[0,0],[8.057,-2.921],[0,-7.956],[-7.05,0],[0,0],[2.82,-2.014],[8.157,0],[0,7.755],[0,0],[0,0],[0,0],[8.56,0],[0.101,5.438],[-6.143,0],[0,0]],"v":[[4.23,-3.323],[21.249,1.108],[45.117,-18.53],[30.515,-35.349],[30.515,-35.55],[42.599,-50.958],[23.868,-66.568],[6.747,-61.533],[9.064,-55.087],[22.156,-59.418],[33.636,-49.548],[19.034,-38.47],[14.099,-38.47],[14.099,-31.824],[19.034,-31.824],[35.953,-18.732],[21.149,-6.042],[6.647,-10.172]],"c":true},"ix":2},"nm":"3","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"u","size":150,"style":"500","w":55.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.504,-1.309],[5.942,0],[0,9.265],[0,0],[0,0],[0,0],[-7.654,0],[-2.316,3.928],[0,0],[0,0],[0,0],[0,5.035]],"o":[[0,0],[0,0],[0,1.611],[-1.611,3.928],[-8.057,0],[0,0],[0,0],[0,0],[0,17.12],[8.661,0],[0,0],[0,0],[0,0],[-0.302,-3.827],[0,0]],"v":[[48.138,-48.743],[39.276,-48.743],[39.276,-18.832],[38.47,-14.301],[26.788,-6.244],[15.912,-21.753],[15.912,-48.743],[7.05,-48.743],[7.05,-20.242],[23.868,1.108],[39.981,-7.956],[40.182,-7.956],[40.686,0],[48.541,0],[48.138,-13.293]],"c":true},"ix":2},"nm":"u","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"u","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"2","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.085],[14.099,0],[4.532,-3.827],[0,0],[-5.942,0],[0,-6.647],[16.718,-15.912],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[13.797,-13.293],[0,-9.366],[-7.553,0],[0,0],[3.021,-2.518],[9.769,0],[-0.101,9.869],[0,0],[0,0],[0,0]],"v":[[46.326,0],[46.326,-7.352],[16.919,-7.352],[16.919,-7.553],[22.156,-12.387],[44.714,-47.534],[24.673,-66.568],[6.143,-59.921],[8.963,-53.677],[22.861,-59.216],[35.852,-46.426],[11.481,-12.186],[4.532,-5.438],[4.532,0]],"c":true},"ix":2},"nm":"2","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"O","size":150,"style":"500","w":68.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.53,0],[0,-21.552],[-17.926,0],[0,23.364]],"o":[[-18.127,0],[0,20.544],[17.322,0],[0,-20.142]],"v":[[35.147,-68.985],[3.625,-33.334],[34.14,1.108],[65.662,-34.644]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-14.502,0],[0,-13.495],[13.898,0],[0,14.502]],"o":[[14.603,0],[0,15.408],[-13.797,0],[0,-14.905]],"v":[[34.744,-61.835],[56.396,-34.241],[34.644,-6.042],[12.991,-33.536]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"O","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"p","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.445,0],[0,17.523],[11.783,0],[3.625,-5.942],[0,0],[0,0],[0,0],[0,-6.244]],"o":[[0,0],[0,0],[0,0],[2.921,4.834],[11.481,0],[0,-14.804],[-7.956,0],[0,0],[0,0],[0,0],[0.201,4.633],[0,0]],"v":[[7.352,19.94],[16.113,19.94],[16.113,-6.546],[16.315,-6.546],[31.32,1.108],[53.476,-25.076],[32.831,-49.85],[15.509,-40.384],[15.308,-40.384],[14.905,-48.743],[6.949,-48.743],[7.352,-32.831]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.302,1.108],[-6.042,0],[0,-9.769],[9.366,0],[1.611,6.143],[0,1.309]],"o":[[0,-1.208],[1.712,-6.647],[9.366,0],[0,11.179],[-6.345,0],[-0.201,-1.108],[0,0]],"v":[[16.113,-28.198],[16.718,-31.824],[30.112,-42.801],[44.614,-24.673],[29.81,-5.841],[16.516,-16.214],[16.113,-19.839]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"p","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"c","size":150,"style":"500","w":44.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.035,0],[0,11.279],[-11.179,0],[-2.115,-1.208],[0,0],[5.237,0],[0,-15.005],[-14.703,0],[-2.316,1.208]],"o":[[-2.518,1.108],[-9.668,0],[0,-10.172],[4.834,0],[0,0],[-2.417,-1.208],[-15.912,0],[0,14.905],[6.546,0],[0,0]],"v":[[40.585,-8.459],[29.709,-6.042],[12.79,-24.271],[30.011,-42.7],[40.283,-40.384],[42.297,-47.232],[30.011,-49.75],[3.827,-23.868],[28.098,1.007],[42.096,-1.813]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"y","size":150,"style":"500","w":48.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.504],[0.403,-0.906],[2.417,-1.913],[2.216,-0.705],[0,0],[-4.33,3.827],[-6.345,16.718],[0,0],[0,0],[0,0],[0.906,-2.921],[0,0],[1.108,3.223],[0,0]],"o":[[0,0],[0.403,1.108],[0,0.504],[-2.014,4.532],[-2.618,2.216],[0,0],[2.216,-0.403],[6.042,-5.237],[0,0],[0,0],[0,0],[-1.208,3.525],[0,0],[-0.806,-2.921],[0,0],[0,0]],"v":[[0.906,-48.743],[18.933,-3.827],[19.537,-1.511],[18.832,0.604],[11.38,10.474],[3.625,14.804],[5.841,22.256],[16.718,16.516],[33.435,-13.998],[46.729,-48.743],[37.363,-48.743],[27.695,-20.142],[24.573,-9.97],[24.371,-9.97],[21.249,-19.94],[10.574,-48.743]],"c":true},"ix":2},"nm":"y","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"y","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"1","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.767,0],[32.327,0],[32.327,-65.46],[24.774,-65.46],[10.474,-57.806],[12.186,-51.059],[23.566,-57.202],[23.767,-57.202]],"c":true},"ix":2},"nm":"1","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"C","size":150,"style":"500","w":55.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.338,0],[0,16.617],[-15.912,0],[-3.323,-1.611],[0,0],[8.459,0],[0,-21.249],[-19.135,0],[-3.223,1.611]],"o":[[-3.525,1.712],[-16.516,0],[0,-17.825],[5.64,0],[0,0],[-2.316,-1.208],[-21.048,0],[0,22.256],[8.258,0],[0,0]],"v":[[53.275,-9.164],[38.974,-6.345],[12.891,-33.636],[39.377,-61.633],[53.073,-58.813],[55.188,-65.964],[39.075,-68.985],[3.625,-33.334],[37.161,1.007],[55.087,-2.216]],"c":true},"ix":2},"nm":"C","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"C","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"o","size":150,"style":"500","w":54.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.998,0],[0,-16.315],[-13.193,0],[0,18.027]],"o":[[-13.495,0],[0,15.408],[11.783,0],[0,-14.905]],"v":[[27.997,-49.85],[3.827,-23.969],[27.191,1.108],[51.462,-24.774]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-10.474,0],[0,-8.258],[8.459,0],[0,10.675]],"o":[[10.474,0],[0,10.977],[-8.661,0],[0,-9.265]],"v":[[27.795,-43.204],[42.398,-24.472],[27.594,-5.539],[12.79,-24.271]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"}]} \ No newline at end of file diff --git a/example/resource/UXSample_1920x1080/C Strokes_All_01_1920x1080.json b/example/resource/UXSample_1920x1080/C Strokes_All_01_1920x1080.json new file mode 100755 index 0000000000..a8984437b7 --- /dev/null +++ b/example/resource/UXSample_1920x1080/C Strokes_All_01_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":36,"w":1920,"h":1080,"nm":"C Strokes_All_01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[483.75,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[964,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1444.25,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.901960790157,0.713725507259,0.054901961237,1],"e":[0.054901961237,0.631372570992,0.901960790157,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0.054901961237,0.631372570992,0.901960790157,1],"e":[0.901960790157,0.713725507259,0.054901961237,1]},{"t":30}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901961237,0.631372570992,0.901960790157,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0],"e":[100]},{"t":30}],"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[15],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[40],"e":[15]},{"t":30}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"line Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375.125,243.75,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-194.25,95.5],[-194.25,-96],[19.75,-96],[19.75,96],[194.25,96]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[959.75,540.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_6","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":1,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_7","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":1,"lj":1,"ml":4,"d":[{"n":"d","nm":"dash","v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[10],"e":[73]},{"t":30}],"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_8","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":15,"ix":10},"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[0,0.055,0.631,0.902,0.5,0.478,0.673,0.478,1,0.902,0.714,0.055],"e":[0,0.902,0.055,0.174,0.5,0.902,0.384,0.115,1,0.902,0.714,0.055]},{"t":50}],"ix":8}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[0,143],"e":[130,601],"to":[21.6666660308838,76.3333358764648],"ti":[-21.6666660308838,-76.3333358764648]},{"t":40}],"ix":4},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-76,0],"e":[184,0],"to":[43.3333320617676,0],"ti":[-43.3333320617676,0]},{"t":20}],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"SamsungOne-500","fFamily":"SamsungOne","fStyle":"500","ascent":70.9991455078125}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"C Strokes_01 Color","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_01 Color","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"C Strokes_02 Opacity","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[519.5,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_02 Opacity","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"C Strokes_03 Width","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_03 Width","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"C Strokes_04 Line Cap","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1480.5,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_04 Line Cap","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"C Strokes_05 Line Join","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_05 Line Join","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":5,"nm":"C Strokes_06 Miter Limit","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[519.5,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_06 Miter Limit","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":5,"nm":"C Strokes_07 Dashes","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_07 Dashes","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":5,"nm":"C Strokes_08 Gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1480.5,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"C Strokes_08 Gradient","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"C Strokes_01 Color","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"C Strokes_02 Opacity","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[726,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"C Strokes_03 Width","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1204,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"C Strokes_04 Line Cap","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1678,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"C Strokes_05 Line Join","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"C Strokes_06 Miter Limit","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[732,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"C Strokes_07 Dashes","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1198,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"C Strokes_08 Gradient","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1678,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"C","size":150,"style":"500","w":55.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.338,0],[0,16.617],[-15.912,0],[-3.323,-1.611],[0,0],[8.459,0],[0,-21.249],[-19.135,0],[-3.223,1.611]],"o":[[-3.525,1.712],[-16.516,0],[0,-17.825],[5.64,0],[0,0],[-2.316,-1.208],[-21.048,0],[0,22.256],[8.258,0],[0,0]],"v":[[53.275,-9.164],[38.974,-6.345],[12.891,-33.636],[39.377,-61.633],[53.073,-58.813],[55.188,-65.964],[39.075,-68.985],[3.625,-33.334],[37.161,1.007],[55.087,-2.216]],"c":true},"ix":2},"nm":"C","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"C","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":" ","size":150,"style":"500","w":21.2,"data":{},"fFamily":"SamsungOne"},{"ch":"S","size":150,"style":"500","w":49.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.546,0],[0,10.474],[11.481,4.431],[0,6.345],[-9.265,0],[-2.216,-1.208],[0,0],[6.949,0],[0,-10.574],[-11.078,-3.928],[0,-6.345],[8.963,0],[3.928,2.417]],"o":[[3.625,2.417],[16.013,0],[0,-9.97],[-9.366,-3.625],[0,-4.633],[6.143,0],[0,0],[-3.021,-1.712],[-13.193,0],[0,9.567],[9.164,3.525],[0,6.848],[-6.042,0],[0,0]],"v":[[4.23,-3.323],[21.552,1.007],[45.319,-18.53],[27.997,-38.47],[14.502,-51.562],[27.292,-61.734],[40.182,-58.511],[42.599,-65.662],[27.594,-68.985],[5.64,-50.555],[23.566,-31.32],[36.356,-17.825],[22.156,-6.244],[6.445,-10.675]],"c":true},"ix":2},"nm":"S","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"S","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"t","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.518,-2.618],[-4.129,0],[-1.712,0.705],[0,0],[2.316,0],[0,6.042],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.74],[2.115,2.417],[3.424,0],[0,0],[-1.108,0.302],[-4.935,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.366,-60.425],[9.366,-48.743],[1.813,-48.743],[1.813,-41.995],[9.366,-41.995],[9.366,-15.408],[12.79,-2.719],[22.357,1.007],[30.212,-0.201],[29.81,-6.848],[24.673,-6.244],[18.027,-15.71],[18.027,-41.995],[30.716,-41.995],[30.716,-48.743],[18.027,-48.743],[18.027,-62.741]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"r","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.201,1.208],[-6.244,0],[-0.906,-0.201],[0,0],[1.007,0],[2.216,-6.546],[0,0],[0,0],[0,0],[0,-5.74]],"o":[[0,0],[0,0],[0,-1.511],[1.208,-6.647],[1.208,0],[0,0],[-0.806,-0.201],[-5.942,0],[0,0],[0,0],[0,0],[0.302,4.532],[0,0]],"v":[[7.352,0],[16.113,0],[16.113,-25.983],[16.516,-30.112],[28.4,-41.492],[31.421,-41.19],[31.421,-49.548],[28.903,-49.85],[15.408,-39.175],[15.005,-39.175],[14.703,-48.743],[6.949,-48.743],[7.352,-33.536]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"o","size":150,"style":"500","w":54.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.998,0],[0,-16.315],[-13.193,0],[0,18.027]],"o":[[-13.495,0],[0,15.408],[11.783,0],[0,-14.905]],"v":[[27.997,-49.85],[3.827,-23.969],[27.191,1.108],[51.462,-24.774]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-10.474,0],[0,-8.258],[8.459,0],[0,10.675]],"o":[[10.474,0],[0,10.977],[-8.661,0],[0,-9.265]],"v":[[27.795,-43.204],[42.398,-24.472],[27.594,-5.539],[12.79,-24.271]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"k","size":150,"style":"500","w":48.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.208,-1.712],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.41,1.712],[0,0],[0,0]],"v":[[16.113,-71.503],[7.352,-71.503],[7.352,0],[16.113,0],[16.113,-18.329],[20.645,-23.364],[37.463,0],[48.239,0],[26.788,-28.702],[45.621,-48.743],[34.946,-48.743],[20.645,-31.924],[16.315,-26.385],[16.113,-26.385]],"c":true},"ix":2},"nm":"k","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"k","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"e","size":150,"style":"500","w":50.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.813],[15.912,0],[0,-14.703],[-15.005,0],[-3.122,1.41],[0,0],[6.345,0],[0.201,11.984]],"o":[[0.101,-0.906],[0,-8.963],[-14.2,0],[0,14.703],[7.755,0],[0,0],[-3.323,1.41],[-8.862,0],[0,0]],"v":[[46.527,-22.76],[46.829,-26.889],[26.688,-49.85],[3.827,-23.566],[27.795,1.007],[44.009,-2.014],[42.499,-8.359],[29.004,-5.841],[12.286,-22.76]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-8.963,0],[0.101,-5.64]],"o":[[0.705,-6.143],[9.97,0],[0,0]],"v":[[12.387,-29.105],[25.983,-43.506],[38.269,-29.105]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"s","size":150,"style":"500","w":39.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.338,0],[0,8.56],[8.459,3.223],[0,4.028],[-5.237,0],[-1.913,-1.208],[0,0],[4.935,0],[0,-7.855],[-8.762,-3.122],[0,-4.23],[6.445,0],[2.618,1.712]],"o":[[3.424,2.014],[11.581,0],[0,-7.251],[-6.345,-2.417],[0,-3.625],[4.532,0],[0,0],[-2.719,-1.611],[-10.474,0],[0,5.841],[6.546,2.417],[0,4.028],[-4.431,0],[0,0]],"v":[[3.928,-2.316],[17.624,1.007],[35.852,-13.596],[23.062,-28.299],[13.797,-36.557],[21.954,-43.204],[31.924,-40.384],[34.14,-46.829],[22.156,-49.85],[5.338,-35.55],[18.228,-21.753],[27.292,-12.79],[17.825,-5.539],[6.143,-9.064]],"c":true},"ix":2},"nm":"s","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"s","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"_","size":150,"style":"500","w":50,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,7.553],[0,12.589],[50.354,12.589],[50.354,7.553]],"c":true},"ix":2},"nm":"_","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"_","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"0","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.797,0],[0,-21.954],[-12.79,0],[0,22.256]],"o":[[-13.293,0],[0.201,21.652],[14.502,0],[0,-20.847]],"v":[[26.385,-66.568],[3.625,-32.529],[25.278,1.108],[48.038,-33.435]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.755,0],[0,-16.113],[9.064,0],[0,17.02]],"o":[[9.164,0],[0,16.718],[-8.057,0],[0,-17.825]],"v":[[25.882,-59.72],[39.175,-33.032],[25.781,-5.74],[12.488,-32.428]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"0","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"8","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.696,0],[0,11.38],[8.157,3.223],[0,0],[0,5.539],[12.689,0],[0,-10.373],[-7.251,-3.424],[0,0],[0,-8.258]],"o":[[12.488,0],[0,-7.956],[0,0],[8.057,-3.827],[0,-8.157],[-11.481,0],[0,5.64],[0,0],[-8.057,3.424],[0,9.567]],"v":[[25.681,1.108],[47.937,-17.926],[34.744,-34.845],[34.744,-35.147],[45.52,-50.455],[26.486,-66.568],[6.244,-49.146],[16.617,-34.442],[16.718,-34.14],[3.726,-16.617]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.956,0],[-0.302,6.647],[-7.654,2.216],[0,-7.956]],"o":[[-8.359,0],[0,-6.244],[8.862,2.518],[0,6.747]],"v":[[25.882,-5.338],[12.79,-17.825],[24.573,-31.32],[38.974,-17.02]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-7.352,0],[0,-5.237],[5.64,-1.913],[0,6.546]],"o":[[7.956,0],[0,5.942],[-7.553,-2.014],[0,-5.64]],"v":[[25.983,-60.223],[37.061,-49.548],[27.09,-37.665],[14.603,-49.75]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"8","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"G","size":150,"style":"500","w":64.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[5.74,0],[0,17.221],[-16.516,0],[-3.625,-1.611],[0,0],[7.855,0],[0.101,-20.242],[-5.841,-5.64],[-10.272,0],[-3.928,1.41]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.014,1.007],[-15.811,0],[0,-17.02],[6.848,0],[0,0],[-2.921,-1.41],[-22.76,0],[0,10.574],[6.647,6.345],[9.164,0],[0,0]],"v":[[59.317,-35.651],[36.96,-35.651],[36.96,-28.601],[50.757,-28.601],[50.757,-8.359],[39.075,-6.546],[12.891,-33.939],[40.182,-61.23],[55.188,-58.31],[57.303,-65.46],[40.384,-68.582],[3.625,-33.536],[13.092,-8.258],[38.47,0.705],[59.317,-3.021]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"G","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"a","size":150,"style":"500","w":48.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.23],[0,0],[14.905,0],[4.028,-2.618],[0,0],[-4.532,0],[0,-4.028],[0,0],[0,-11.783],[-9.869,0],[-2.719,3.827],[0,0],[0,0]],"o":[[-0.604,-3.323],[0,0],[0,-9.769],[-6.143,0],[0,0],[3.424,-2.216],[9.97,0],[0,0],[-18.832,-0.101],[0,7.05],[6.949,0],[0,0],[0,0],[0,0]],"v":[[42.398,0],[41.592,-11.682],[41.592,-29.91],[23.062,-49.85],[7.05,-45.52],[9.064,-39.679],[21.753,-43.304],[32.831,-32.025],[32.831,-31.018],[3.525,-12.891],[18.43,1.108],[33.334,-6.143],[33.636,-6.143],[34.341,0]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-0.906],[6.345,0],[0,5.74],[-9.668,-0.201]],"o":[[0,0.906],[-1.41,4.129],[-4.532,0],[0,-9.467],[0,0]],"v":[[33.032,-16.415],[32.529,-13.596],[20.746,-5.438],[12.387,-13.898],[33.032,-24.875]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"a","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"d","size":150,"style":"500","w":56.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[7.452,0],[-0.101,-16.214],[-11.783,0],[-2.719,5.438],[0,0],[0,0],[0,0],[0,4.33],[0,0]],"o":[[0,0],[0,0],[-2.216,-3.928],[-11.884,0],[0,14.804],[7.956,0],[0,0],[0,0],[0,0],[-0.302,-3.323],[0,0],[0,0]],"v":[[40.585,-71.503],[40.585,-42.398],[40.384,-42.398],[25.681,-49.85],[3.827,-23.666],[24.673,1.108],[41.29,-8.459],[41.492,-8.459],[41.895,0],[49.85,0],[49.448,-12.589],[49.448,-71.503]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-1.208],[5.942,0],[0,9.869],[-9.164,0],[-1.309,-5.64],[0,-1.108]],"o":[[0,1.41],[-1.611,6.647],[-9.567,0],[0,-10.776],[6.647,0],[0.302,1.108],[0,0]],"v":[[40.585,-20.444],[40.182,-16.617],[27.191,-6.042],[12.79,-24.069],[27.393,-42.902],[40.182,-32.629],[40.585,-28.903]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"d","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"i","size":150,"style":"500","w":23.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.214,0],[16.214,-48.743],[7.352,-48.743],[7.352,0]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.323,0],[0,-3.122],[-3.122,0],[0.101,3.021]],"o":[[-3.223,0],[0,3.021],[3.525,0],[0,-3.122]],"v":[[11.783,-67.978],[6.244,-62.439],[11.581,-57.001],[17.221,-62.439]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"i","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"n","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.403,1.108],[-5.841,0],[0,-7.855],[0,0],[0,0],[0,0],[6.747,0],[2.417,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.511,-4.935],[8.359,0],[0,0],[0,0],[0,0],[0,-16.718],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.306],[16.818,-33.435],[28.702,-42.499],[39.981,-28.098],[39.981,0],[48.843,0],[48.843,-29.105],[31.622,-49.85],[15.509,-40.686],[15.308,-40.686],[14.804,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"n","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"n","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"7","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.74,-65.46],[5.74,-58.109],[37.766,-58.109],[37.766,-57.907],[9.366,0],[18.53,0],[47.031,-59.619],[47.031,-65.46]],"c":true},"ix":2},"nm":"7","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"7","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"D","size":150,"style":"500","w":66.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.244,0],[-6.345,6.345],[0,11.078],[6.042,5.539],[12.589,0],[5.338,-0.806]],"o":[[4.431,0.504],[13.193,0],[6.345,-6.244],[0,-10.977],[-5.942,-5.539],[-6.949,0],[0,0]],"v":[[7.654,-0.201],[23.566,0.604],[53.577,-9.164],[63.345,-35.55],[53.778,-59.921],[26.285,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.532,0],[0.101,-16.013],[18.732,0],[2.216,0.403]],"o":[[2.316,-0.504],[18.53,0],[0,18.329],[-3.424,0],[0,0]],"v":[[16.415,-60.526],[26.688,-61.432],[54.181,-35.248],[25.278,-6.445],[16.415,-6.949]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"D","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"h","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.208],[-5.74,0],[0,-7.855],[0,0],[0,0],[0,0],[6.546,0],[2.618,-1.511],[1.41,-2.518],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-1.712],[1.611,-4.834],[8.359,0],[0,0],[0,0],[0,0],[0,-16.818],[-3.323,0],[-2.719,1.511],[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.407],[16.818,-33.636],[28.702,-42.499],[39.981,-27.997],[39.981,0],[48.843,0],[48.843,-29.004],[31.824,-49.85],[22.76,-47.333],[16.415,-41.089],[16.214,-41.089],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"h","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"h","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"6","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.618,-0.403],[5.438,-5.338],[0,-12.891],[-13.998,0],[0,11.984],[11.581,0],[3.122,-4.129],[0,0],[-13.898,2.316],[-1.813,-0.101]],"o":[[-1.611,0],[-8.258,1.007],[-6.445,6.445],[0,17.02],[13.596,0],[0,-12.79],[-7.251,0],[0,0],[1.511,-10.776],[2.518,-0.403],[0,0]],"v":[[41.895,-66.467],[35.449,-65.964],[14.502,-56.296],[3.424,-26.788],[26.587,1.108],[48.34,-21.954],[28.601,-43.103],[12.79,-35.55],[12.488,-35.55],[35.248,-58.813],[41.895,-59.216]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.654,0],[0.201,10.776],[-0.604,1.007],[-5.338,0],[0,-9.366]],"o":[[-9.265,0],[0,-1.611],[2.417,-4.733],[8.157,0],[0,9.366]],"v":[[26.587,-5.74],[12.186,-24.472],[13.193,-28.4],[25.882,-36.456],[39.377,-21.451]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"6","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"M","size":150,"style":"500","w":80.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.712,-6.848],[0,0],[2.82,8.359],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.201,8.459],[0,0],[-3.223,-9.567],[0,0],[0,0],[0,0],[-2.316,7.956],[0,0],[-0.504,-9.467]],"o":[[0,0],[0,0],[0,0],[0,0],[-3.021,8.56],[0,0],[-1.712,-7.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0.604,-10.172],[0,0],[1.913,8.057],[0,0],[0,0],[0,0],[3.424,-9.366],[0,0],[-0.101,8.459],[0,0]],"v":[[66.568,0],[75.128,0],[70.898,-67.877],[59.72,-67.877],[47.635,-35.046],[40.485,-12.186],[40.182,-12.186],[33.334,-35.046],[21.753,-67.877],[10.574,-67.877],[5.841,0],[14.2,0],[16.013,-29.105],[17.322,-59.116],[17.523,-59.116],[25.378,-32.73],[36.356,-0.403],[43.002,-0.403],[54.987,-33.334],[63.547,-59.116],[63.849,-59.116],[64.856,-29.81]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"M","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"L","size":150,"style":"500","w":47.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,0],[45.419,0],[45.419,-7.352],[16.415,-7.352],[16.415,-67.877],[7.654,-67.877]],"c":true},"ix":2},"nm":"L","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"L","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"m","size":150,"style":"500","w":83.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.309],[-5.539,0],[0,-7.755],[0,0],[0,0],[0,0],[-0.403,1.208],[-5.035,0],[0,-9.366],[0,0],[0,0],[0,0],[6.445,0],[2.921,-2.216],[1.511,-2.719],[0,0],[6.647,0],[2.719,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.41,-4.431],[6.747,0],[0,0],[0,0],[0,0],[0,-1.611],[1.511,-4.33],[7.15,0],[0,0],[0,0],[0,0],[0,-16.919],[-4.633,0],[-2.014,1.511],[0,0],[-2.115,-5.74],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.013,0],[16.013,-29.407],[16.718,-33.737],[27.695,-42.599],[37.866,-29.205],[37.866,0],[46.527,0],[46.527,-30.112],[47.232,-34.543],[57.706,-42.599],[68.28,-27.594],[68.28,0],[76.941,0],[76.941,-28.702],[60.928,-49.85],[50.153,-46.426],[44.714,-40.082],[44.513,-40.082],[30.716,-49.85],[15.408,-40.887],[15.106,-40.887],[14.703,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"m","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"m","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"5","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.726,0],[-0.101,-8.459],[8.359,0],[2.719,1.611],[0,0],[-7.15,0],[0,12.79],[5.136,2.921],[5.035,0],[1.511,-0.201],[0,0],[0,0]],"o":[[0,0],[0,0],[2.417,-0.302],[13.092,0],[0,8.762],[-5.942,0],[0,0],[3.122,2.014],[14.2,0],[0,-8.258],[-4.028,-2.417],[-2.417,0],[0,0],[0,0],[0,0]],"v":[[43.607,-65.46],[12.286,-65.46],[8.057,-34.039],[17.12,-34.744],[35.953,-20.242],[20.444,-6.042],[6.445,-9.668],[4.23,-2.921],[20.544,1.108],[44.916,-21.249],[35.55,-38.068],[21.451,-41.592],[16.113,-41.19],[18.631,-58.008],[43.607,-58.008]],"c":true},"ix":2},"nm":"5","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"J","size":150,"style":"500","w":37,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.855,0],[1.813,0.705],[0,0],[-3.223,0],[0,18.027],[0,0],[0,0]],"o":[[0,13.293],[-2.921,0],[0,0],[2.216,0.906],[11.682,0],[0,0],[0,0],[0,0]],"v":[[21.552,-23.163],[9.064,-6.345],[1.712,-7.654],[0.403,-0.504],[9.769,1.108],[30.313,-22.458],[30.313,-67.877],[21.552,-67.877]],"c":true},"ix":2},"nm":"J","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"J","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"4","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.283,0],[40.283,-17.825],[49.448,-17.825],[49.448,-24.774],[40.283,-24.774],[40.283,-65.46],[30.716,-65.46],[1.511,-23.666],[1.511,-17.825],[31.924,-17.825],[31.924,0]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.014,3.827],[0,0],[0,-3.424],[0,0]],"o":[[0,0],[0,0],[1.813,-3.021],[0,0],[-0.201,3.424],[0,0],[0,0]],"v":[[10.474,-24.774],[10.474,-24.976],[26.486,-47.232],[31.924,-56.9],[32.227,-56.9],[31.924,-46.628],[31.924,-24.774]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"4","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"p","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.445,0],[0,17.523],[11.783,0],[3.625,-5.942],[0,0],[0,0],[0,0],[0,-6.244]],"o":[[0,0],[0,0],[0,0],[2.921,4.834],[11.481,0],[0,-14.804],[-7.956,0],[0,0],[0,0],[0,0],[0.201,4.633],[0,0]],"v":[[7.352,19.94],[16.113,19.94],[16.113,-6.546],[16.315,-6.546],[31.32,1.108],[53.476,-25.076],[32.831,-49.85],[15.509,-40.384],[15.308,-40.384],[14.905,-48.743],[6.949,-48.743],[7.352,-32.831]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.302,1.108],[-6.042,0],[0,-9.769],[9.366,0],[1.611,6.143],[0,1.309]],"o":[[0,-1.208],[1.712,-6.647],[9.366,0],[0,11.179],[-6.345,0],[-0.201,-1.108],[0,0]],"v":[[16.113,-28.198],[16.718,-31.824],[30.112,-42.801],[44.614,-24.673],[29.81,-5.841],[16.516,-16.214],[16.113,-19.839]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"p","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"3","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.352,0],[0,10.474],[8.057,1.611],[0,0],[0,6.747],[12.891,0],[3.424,-2.518],[0,0],[-5.237,0],[0,-5.237],[6.445,0],[0,0],[0,0],[0,0],[-0.101,-9.164],[11.38,0],[2.518,1.611]],"o":[[3.223,2.115],[15.71,0],[0,-9.164],[0,0],[8.057,-2.921],[0,-7.956],[-7.05,0],[0,0],[2.82,-2.014],[8.157,0],[0,7.755],[0,0],[0,0],[0,0],[8.56,0],[0.101,5.438],[-6.143,0],[0,0]],"v":[[4.23,-3.323],[21.249,1.108],[45.117,-18.53],[30.515,-35.349],[30.515,-35.55],[42.599,-50.958],[23.868,-66.568],[6.747,-61.533],[9.064,-55.087],[22.156,-59.418],[33.636,-49.548],[19.034,-38.47],[14.099,-38.47],[14.099,-31.824],[19.034,-31.824],[35.953,-18.732],[21.149,-6.042],[6.647,-10.172]],"c":true},"ix":2},"nm":"3","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"W","size":150,"style":"500","w":86.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.208,6.747],[0,0],[-2.115,-8.661],[0,0],[0,0],[0,0],[0,0],[0,0],[1.41,-7.452],[0,0],[1.913,8.057],[0,0],[0,0],[0,0],[1.108,-6.747],[0,0],[2.014,8.459],[0,0],[0,0],[0,0]],"o":[[0,0],[2.518,-8.762],[0,0],[0.906,6.848],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.115,8.459],[0,0],[-1.007,-7.15],[0,0],[0,0],[0,0],[-2.316,8.762],[0,0],[-1.208,-6.546],[0,0],[0,0],[0,0],[0,0]],"v":[[27.896,0],[37.564,-35.349],[42.801,-57.504],[43.002,-57.504],[47.433,-35.349],[55.994,0],[65.158,0],[84.393,-67.877],[75.43,-67.877],[66.467,-33.636],[61.029,-10.172],[60.828,-10.172],[56.094,-33.435],[47.836,-67.877],[38.672,-67.877],[29.608,-33.636],[24.069,-10.071],[23.868,-10.071],[18.832,-33.536],[10.776,-67.877],[1.511,-67.877],[18.732,0]],"c":true},"ix":2},"nm":"W","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"W","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"2","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.085],[14.099,0],[4.532,-3.827],[0,0],[-5.942,0],[0,-6.647],[16.718,-15.912],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[13.797,-13.293],[0,-9.366],[-7.553,0],[0,0],[3.021,-2.518],[9.769,0],[-0.101,9.869],[0,0],[0,0],[0,0]],"v":[[46.326,0],[46.326,-7.352],[16.919,-7.352],[16.919,-7.553],[22.156,-12.387],[44.714,-47.534],[24.673,-66.568],[6.143,-59.921],[8.963,-53.677],[22.861,-59.216],[35.852,-46.426],[11.481,-12.186],[4.532,-5.438],[4.532,0]],"c":true},"ix":2},"nm":"2","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"O","size":150,"style":"500","w":68.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.53,0],[0,-21.552],[-17.926,0],[0,23.364]],"o":[[-18.127,0],[0,20.544],[17.322,0],[0,-20.142]],"v":[[35.147,-68.985],[3.625,-33.334],[34.14,1.108],[65.662,-34.644]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-14.502,0],[0,-13.495],[13.898,0],[0,14.502]],"o":[[14.603,0],[0,15.408],[-13.797,0],[0,-14.905]],"v":[[34.744,-61.835],[56.396,-34.241],[34.644,-6.042],[12.991,-33.536]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"O","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"c","size":150,"style":"500","w":44.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.035,0],[0,11.279],[-11.179,0],[-2.115,-1.208],[0,0],[5.237,0],[0,-15.005],[-14.703,0],[-2.316,1.208]],"o":[[-2.518,1.108],[-9.668,0],[0,-10.172],[4.834,0],[0,0],[-2.417,-1.208],[-15.912,0],[0,14.905],[6.546,0],[0,0]],"v":[[40.585,-8.459],[29.709,-6.042],[12.79,-24.271],[30.011,-42.7],[40.283,-40.384],[42.297,-47.232],[30.011,-49.75],[3.827,-23.868],[28.098,1.007],[42.096,-1.813]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"y","size":150,"style":"500","w":48.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.504],[0.403,-0.906],[2.417,-1.913],[2.216,-0.705],[0,0],[-4.33,3.827],[-6.345,16.718],[0,0],[0,0],[0,0],[0.906,-2.921],[0,0],[1.108,3.223],[0,0]],"o":[[0,0],[0.403,1.108],[0,0.504],[-2.014,4.532],[-2.618,2.216],[0,0],[2.216,-0.403],[6.042,-5.237],[0,0],[0,0],[0,0],[-1.208,3.525],[0,0],[-0.806,-2.921],[0,0],[0,0]],"v":[[0.906,-48.743],[18.933,-3.827],[19.537,-1.511],[18.832,0.604],[11.38,10.474],[3.625,14.804],[5.841,22.256],[16.718,16.516],[33.435,-13.998],[46.729,-48.743],[37.363,-48.743],[27.695,-20.142],[24.573,-9.97],[24.371,-9.97],[21.249,-19.94],[10.574,-48.743]],"c":true},"ix":2},"nm":"y","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"y","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"1","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.767,0],[32.327,0],[32.327,-65.46],[24.774,-65.46],[10.474,-57.806],[12.186,-51.059],[23.566,-57.202],[23.767,-57.202]],"c":true},"ix":2},"nm":"1","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"l","size":150,"style":"500","w":23.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"l","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"l","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"}]} \ No newline at end of file diff --git a/example/resource/UXSample_1920x1080/D Transforms_All_01_1920x1080.json b/example/resource/UXSample_1920x1080/D Transforms_All_01_1920x1080.json new file mode 100755 index 0000000000..b1078dbe7d --- /dev/null +++ b/example/resource/UXSample_1920x1080/D Transforms_All_01_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":66,"w":1920,"h":1080,"nm":"D Transforms_All_01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[483.75,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[964,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1444.25,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[174.5,244,0],"e":[296.34,182,0],"to":[23.0368061065674,0,0],"ti":[-55.0616836547852,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":20,"s":[296.34,182,0],"e":[430.132,294.129,0],"to":[41.3462142944336,0,0],"ti":[-41.2537689208984,-13.1089372634888,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":40,"s":[430.132,294.129,0],"e":[575,244,0],"to":[54.448616027832,17.301778793335,0],"ti":[-22.8313579559326,0,0]},{"t":60}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[174.5],"e":[368.34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":20,"s":[368.34],"e":[368.34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":40,"s":[368.34],"e":[575]},{"t":60}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":20,"s":[185],"e":[265.5]},{"t":40}],"ix":4}},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.246,0.246,0.667],"y":[1,1,1]},"o":{"x":[0.421,0.421,0.167],"y":[0.125,0.125,0]},"n":["0p246_1_0p421_0p125","0p246_1_0p421_0p125","0p667_1_0p167_0"],"t":0,"s":[50,50,100],"e":[75,75,100]},{"i":{"x":[0.441,0.441,0.667],"y":[1,1,1]},"o":{"x":[0.651,0.651,0.167],"y":[0,0,0]},"n":["0p441_1_0p651_0","0p441_1_0p651_0","0p667_1_0p167_0"],"t":20,"s":[75,75,100],"e":[35,35,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.487,0.487,0.167],"y":[0,0,0]},"n":["0_1_0p487_0","0_1_0p487_0","0p667_1_0p167_0"],"t":40,"s":[35,35,100],"e":[50,50,100]},{"t":60}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.363],"y":[1]},"o":{"x":[0.717],"y":[0.463]},"n":["0p363_1_0p717_0p463"],"t":0,"s":[0],"e":[720]},{"t":60}],"ix":10},"p":{"a":0,"k":[375,241,0],"ix":2},"a":{"a":0,"k":[962,728,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[962,504,0],"e":[724,701,0],"to":[-39.6666679382324,32.8333320617676,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[724,701,0],"e":[962,504,0],"to":[0,0,0],"ti":[-78,50.8333320617676,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[962,504,0],"e":[1192,396,0],"to":[78,-50.8333320617676,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[1192,396,0],"e":[962,504,0],"to":[0,0,0],"ti":[38.3333320617676,-18,0]},{"t":60}],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_6","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0],"e":[100]},{"t":30}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_7","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.363],"y":[1]},"o":{"x":[0.717],"y":[0.463]},"n":["0p363_1_0p717_0p463"],"t":0,"s":[0],"e":[720]},{"t":60}],"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectantgle Outlines 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[730,278,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_8","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[139.2,378.1,0],"e":[585.6,82,0],"to":[-0.95211333036423,-289.677154541016,0],"ti":[2.61271214485168,258.688842773438,0]},{"t":60}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[45,45,100],"ix":6}},"ao":1,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"SamsungOne-500","fFamily":"SamsungOne","fStyle":"500","ascent":70.9991455078125}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"D Transforms_01 Position","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_01 Position","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"D Transforms_02 Position","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[519.5,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_02 Position","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"D Transforms_03 Scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_03 Scale","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"D Transforms_04 Rotation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1480.5,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_04 Rotation","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"D Transforms_05 Anchor Point","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_05 Anchor Point","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":5,"nm":"D Transforms_06 Opacity","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[519.5,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_06 Opacity","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":5,"nm":"D Transforms_07 Parenting","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_07 Parenting","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":5,"nm":"D Transforms_08 Auto Orient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1480.5,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"D Transforms_08 Auto Orient","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":67,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"D Transforms_01 Position","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"D Transforms_02 Position (separated X,Y)","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[726,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"D Transforms_03 Scale","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1204,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"D Transforms_04 Rotation","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1678,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"D Transforms_05 Anchor Point","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[248,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"D Transforms_06 Opacity","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[732,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"D Transforms_07 Parenting","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1198,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"D Transforms_08 Auto Orient","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1678,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"D","size":150,"style":"500","w":66.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.244,0],[-6.345,6.345],[0,11.078],[6.042,5.539],[12.589,0],[5.338,-0.806]],"o":[[4.431,0.504],[13.193,0],[6.345,-6.244],[0,-10.977],[-5.942,-5.539],[-6.949,0],[0,0]],"v":[[7.654,-0.201],[23.566,0.604],[53.577,-9.164],[63.345,-35.55],[53.778,-59.921],[26.285,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.532,0],[0.101,-16.013],[18.732,0],[2.216,0.403]],"o":[[2.316,-0.504],[18.53,0],[0,18.329],[-3.424,0],[0,0]],"v":[[16.415,-60.526],[26.688,-61.432],[54.181,-35.248],[25.278,-6.445],[16.415,-6.949]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"D","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":" ","size":150,"style":"500","w":21.2,"data":{},"fFamily":"SamsungOne"},{"ch":"T","size":150,"style":"500","w":53.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.544,0],[29.407,0],[29.407,-60.425],[50.153,-60.425],[50.153,-67.877],[-0.101,-67.877],[-0.101,-60.425],[20.544,-60.425]],"c":true},"ix":2},"nm":"T","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"T","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"r","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.201,1.208],[-6.244,0],[-0.906,-0.201],[0,0],[1.007,0],[2.216,-6.546],[0,0],[0,0],[0,0],[0,-5.74]],"o":[[0,0],[0,0],[0,-1.511],[1.208,-6.647],[1.208,0],[0,0],[-0.806,-0.201],[-5.942,0],[0,0],[0,0],[0,0],[0.302,4.532],[0,0]],"v":[[7.352,0],[16.113,0],[16.113,-25.983],[16.516,-30.112],[28.4,-41.492],[31.421,-41.19],[31.421,-49.548],[28.903,-49.85],[15.408,-39.175],[15.005,-39.175],[14.703,-48.743],[6.949,-48.743],[7.352,-33.536]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"a","size":150,"style":"500","w":48.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.23],[0,0],[14.905,0],[4.028,-2.618],[0,0],[-4.532,0],[0,-4.028],[0,0],[0,-11.783],[-9.869,0],[-2.719,3.827],[0,0],[0,0]],"o":[[-0.604,-3.323],[0,0],[0,-9.769],[-6.143,0],[0,0],[3.424,-2.216],[9.97,0],[0,0],[-18.832,-0.101],[0,7.05],[6.949,0],[0,0],[0,0],[0,0]],"v":[[42.398,0],[41.592,-11.682],[41.592,-29.91],[23.062,-49.85],[7.05,-45.52],[9.064,-39.679],[21.753,-43.304],[32.831,-32.025],[32.831,-31.018],[3.525,-12.891],[18.43,1.108],[33.334,-6.143],[33.636,-6.143],[34.341,0]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-0.906],[6.345,0],[0,5.74],[-9.668,-0.201]],"o":[[0,0.906],[-1.41,4.129],[-4.532,0],[0,-9.467],[0,0]],"v":[[33.032,-16.415],[32.529,-13.596],[20.746,-5.438],[12.387,-13.898],[33.032,-24.875]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"a","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"n","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.403,1.108],[-5.841,0],[0,-7.855],[0,0],[0,0],[0,0],[6.747,0],[2.417,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.511,-4.935],[8.359,0],[0,0],[0,0],[0,0],[0,-16.718],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.306],[16.818,-33.435],[28.702,-42.499],[39.981,-28.098],[39.981,0],[48.843,0],[48.843,-29.105],[31.622,-49.85],[15.509,-40.686],[15.308,-40.686],[14.804,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"n","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"n","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"s","size":150,"style":"500","w":39.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.338,0],[0,8.56],[8.459,3.223],[0,4.028],[-5.237,0],[-1.913,-1.208],[0,0],[4.935,0],[0,-7.855],[-8.762,-3.122],[0,-4.23],[6.445,0],[2.618,1.712]],"o":[[3.424,2.014],[11.581,0],[0,-7.251],[-6.345,-2.417],[0,-3.625],[4.532,0],[0,0],[-2.719,-1.611],[-10.474,0],[0,5.841],[6.546,2.417],[0,4.028],[-4.431,0],[0,0]],"v":[[3.928,-2.316],[17.624,1.007],[35.852,-13.596],[23.062,-28.299],[13.797,-36.557],[21.954,-43.204],[31.924,-40.384],[34.14,-46.829],[22.156,-49.85],[5.338,-35.55],[18.228,-21.753],[27.292,-12.79],[17.825,-5.539],[6.143,-9.064]],"c":true},"ix":2},"nm":"s","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"s","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"f","size":150,"style":"500","w":29.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.553,0],[-1.309,-0.604],[0,0],[3.122,0],[3.323,-3.223],[0,-6.848],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,-7.452],[2.518,0],[0,0],[-1.712,-0.705],[-4.129,0],[-4.129,3.928],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[17.02,0],[17.02,-41.995],[28.802,-41.995],[28.802,-48.743],[17.02,-48.743],[17.02,-51.361],[26.486,-65.46],[32.126,-64.352],[33.334,-71.201],[25.781,-72.61],[13.898,-68.079],[8.258,-51.059],[8.258,-48.743],[1.41,-48.743],[1.41,-41.995],[8.258,-41.995],[8.258,0]],"c":true},"ix":2},"nm":"f","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"f","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"o","size":150,"style":"500","w":54.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.998,0],[0,-16.315],[-13.193,0],[0,18.027]],"o":[[-13.495,0],[0,15.408],[11.783,0],[0,-14.905]],"v":[[27.997,-49.85],[3.827,-23.969],[27.191,1.108],[51.462,-24.774]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-10.474,0],[0,-8.258],[8.459,0],[0,10.675]],"o":[[10.474,0],[0,10.977],[-8.661,0],[0,-9.265]],"v":[[27.795,-43.204],[42.398,-24.472],[27.594,-5.539],[12.79,-24.271]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"m","size":150,"style":"500","w":83.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.309],[-5.539,0],[0,-7.755],[0,0],[0,0],[0,0],[-0.403,1.208],[-5.035,0],[0,-9.366],[0,0],[0,0],[0,0],[6.445,0],[2.921,-2.216],[1.511,-2.719],[0,0],[6.647,0],[2.719,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.41,-4.431],[6.747,0],[0,0],[0,0],[0,0],[0,-1.611],[1.511,-4.33],[7.15,0],[0,0],[0,0],[0,0],[0,-16.919],[-4.633,0],[-2.014,1.511],[0,0],[-2.115,-5.74],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.013,0],[16.013,-29.407],[16.718,-33.737],[27.695,-42.599],[37.866,-29.205],[37.866,0],[46.527,0],[46.527,-30.112],[47.232,-34.543],[57.706,-42.599],[68.28,-27.594],[68.28,0],[76.941,0],[76.941,-28.702],[60.928,-49.85],[50.153,-46.426],[44.714,-40.082],[44.513,-40.082],[30.716,-49.85],[15.408,-40.887],[15.106,-40.887],[14.703,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"m","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"m","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"_","size":150,"style":"500","w":50,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,7.553],[0,12.589],[50.354,12.589],[50.354,7.553]],"c":true},"ix":2},"nm":"_","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"_","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"0","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.797,0],[0,-21.954],[-12.79,0],[0,22.256]],"o":[[-13.293,0],[0.201,21.652],[14.502,0],[0,-20.847]],"v":[[26.385,-66.568],[3.625,-32.529],[25.278,1.108],[48.038,-33.435]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.755,0],[0,-16.113],[9.064,0],[0,17.02]],"o":[[9.164,0],[0,16.718],[-8.057,0],[0,-17.825]],"v":[[25.882,-59.72],[39.175,-33.032],[25.781,-5.74],[12.488,-32.428]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"0","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"8","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.696,0],[0,11.38],[8.157,3.223],[0,0],[0,5.539],[12.689,0],[0,-10.373],[-7.251,-3.424],[0,0],[0,-8.258]],"o":[[12.488,0],[0,-7.956],[0,0],[8.057,-3.827],[0,-8.157],[-11.481,0],[0,5.64],[0,0],[-8.057,3.424],[0,9.567]],"v":[[25.681,1.108],[47.937,-17.926],[34.744,-34.845],[34.744,-35.147],[45.52,-50.455],[26.486,-66.568],[6.244,-49.146],[16.617,-34.442],[16.718,-34.14],[3.726,-16.617]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.956,0],[-0.302,6.647],[-7.654,2.216],[0,-7.956]],"o":[[-8.359,0],[0,-6.244],[8.862,2.518],[0,6.747]],"v":[[25.882,-5.338],[12.79,-17.825],[24.573,-31.32],[38.974,-17.02]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-7.352,0],[0,-5.237],[5.64,-1.913],[0,6.546]],"o":[[7.956,0],[0,5.942],[-7.553,-2.014],[0,-5.64]],"v":[[25.983,-60.223],[37.061,-49.548],[27.09,-37.665],[14.603,-49.75]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"8","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"A","size":150,"style":"500","w":61.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7,-21.35],[49.951,0],[59.317,0],[36.154,-67.877],[25.58,-67.877],[2.518,0],[11.581,0],[18.631,-21.35]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.007,4.028],[0,0],[-1.511,-4.431],[0,0]],"o":[[0,0],[1.309,-4.129],[0,0],[1.007,3.928],[0,0],[0,0]],"v":[[20.444,-28.198],[27.09,-47.836],[30.515,-60.123],[30.716,-60.123],[34.241,-47.736],[40.887,-28.198]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"A","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"u","size":150,"style":"500","w":55.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.504,-1.309],[5.942,0],[0,9.265],[0,0],[0,0],[0,0],[-7.654,0],[-2.316,3.928],[0,0],[0,0],[0,0],[0,5.035]],"o":[[0,0],[0,0],[0,1.611],[-1.611,3.928],[-8.057,0],[0,0],[0,0],[0,0],[0,17.12],[8.661,0],[0,0],[0,0],[0,0],[-0.302,-3.827],[0,0]],"v":[[48.138,-48.743],[39.276,-48.743],[39.276,-18.832],[38.47,-14.301],[26.788,-6.244],[15.912,-21.753],[15.912,-48.743],[7.05,-48.743],[7.05,-20.242],[23.868,1.108],[39.981,-7.956],[40.182,-7.956],[40.686,0],[48.541,0],[48.138,-13.293]],"c":true},"ix":2},"nm":"u","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"u","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"t","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.518,-2.618],[-4.129,0],[-1.712,0.705],[0,0],[2.316,0],[0,6.042],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.74],[2.115,2.417],[3.424,0],[0,0],[-1.108,0.302],[-4.935,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.366,-60.425],[9.366,-48.743],[1.813,-48.743],[1.813,-41.995],[9.366,-41.995],[9.366,-15.408],[12.79,-2.719],[22.357,1.007],[30.212,-0.201],[29.81,-6.848],[24.673,-6.244],[18.027,-15.71],[18.027,-41.995],[30.716,-41.995],[30.716,-48.743],[18.027,-48.743],[18.027,-62.741]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"O","size":150,"style":"500","w":68.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.53,0],[0,-21.552],[-17.926,0],[0,23.364]],"o":[[-18.127,0],[0,20.544],[17.322,0],[0,-20.142]],"v":[[35.147,-68.985],[3.625,-33.334],[34.14,1.108],[65.662,-34.644]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-14.502,0],[0,-13.495],[13.898,0],[0,14.502]],"o":[[14.603,0],[0,15.408],[-13.797,0],[0,-14.905]],"v":[[34.744,-61.835],[56.396,-34.241],[34.644,-6.042],[12.991,-33.536]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"O","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"i","size":150,"style":"500","w":23.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.214,0],[16.214,-48.743],[7.352,-48.743],[7.352,0]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.323,0],[0,-3.122],[-3.122,0],[0.101,3.021]],"o":[[-3.223,0],[0,3.021],[3.525,0],[0,-3.122]],"v":[[11.783,-67.978],[6.244,-62.439],[11.581,-57.001],[17.221,-62.439]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"i","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"e","size":150,"style":"500","w":50.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.813],[15.912,0],[0,-14.703],[-15.005,0],[-3.122,1.41],[0,0],[6.345,0],[0.201,11.984]],"o":[[0.101,-0.906],[0,-8.963],[-14.2,0],[0,14.703],[7.755,0],[0,0],[-3.323,1.41],[-8.862,0],[0,0]],"v":[[46.527,-22.76],[46.829,-26.889],[26.688,-49.85],[3.827,-23.566],[27.795,1.007],[44.009,-2.014],[42.499,-8.359],[29.004,-5.841],[12.286,-22.76]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-8.963,0],[0.101,-5.64]],"o":[[0.705,-6.143],[9.97,0],[0,0]],"v":[[12.387,-29.105],[25.983,-43.506],[38.269,-29.105]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"7","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.74,-65.46],[5.74,-58.109],[37.766,-58.109],[37.766,-57.907],[9.366,0],[18.53,0],[47.031,-59.619],[47.031,-65.46]],"c":true},"ix":2},"nm":"7","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"7","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"P","size":150,"style":"500","w":53.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.618,0],[-4.633,4.935],[0,6.143],[3.726,3.223],[8.661,0],[4.23,-0.705]],"o":[[0,0],[0,0],[2.014,0.504],[8.56,0],[3.424,-3.525],[0,-6.042],[-4.028,-3.625],[-7.05,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-27.191],[23.465,-26.587],[44.211,-34.039],[49.448,-48.541],[43.506,-62.741],[24.472,-68.381],[7.654,-67.072]],"c":true},"ix":2},"nm":"P","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-3.827,0],[0,-8.963],[10.574,0],[1.913,0.504]],"o":[[1.511,-0.403],[9.668,0],[0,9.366],[-2.921,0],[0,0]],"v":[[16.415,-60.727],[24.673,-61.432],[40.686,-48.138],[23.666,-33.636],[16.415,-34.341]],"c":true},"ix":2},"nm":"P","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"P","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"g","size":150,"style":"500","w":55.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[8.459,0],[0,-16.516],[-12.085,0],[-2.719,4.532],[0,0],[0,0],[9.064,0],[3.223,2.014],[0,0],[-5.841,0],[-4.733,4.431],[0,11.179],[0,0],[-0.201,3.525]],"o":[[0,0],[0,0],[-2.115,-4.028],[-11.179,0],[0,13.495],[7.553,0],[0,0],[0,0],[0,12.286],[-6.042,0],[0,0],[3.928,2.618],[6.143,0],[4.733,-4.23],[0,0],[0,-5.942],[0,0]],"v":[[41.592,-48.743],[41.19,-41.391],[40.988,-41.391],[25.781,-49.85],[3.827,-23.969],[24.573,-0.201],[40.082,-8.359],[40.283,-8.359],[40.283,-2.921],[24.573,14.099],[10.272,10.272],[8.057,17.02],[24.271,21.048],[41.995,15.207],[48.944,-7.05],[48.944,-35.349],[49.347,-48.743]],"c":true},"ix":2},"nm":"g","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.504,-1.511],[5.438,0],[0,9.567],[-8.459,0],[-1.611,-5.136],[0,-1.511]],"o":[[0,1.511],[-1.913,5.64],[-9.567,0],[0,-11.279],[6.445,0],[0.403,1.208],[0,0]],"v":[[40.182,-20.746],[39.478,-16.013],[27.191,-6.949],[12.79,-24.472],[27.292,-42.902],[39.679,-33.536],[40.182,-29.507]],"c":true},"ix":2},"nm":"g","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"g","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"6","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.618,-0.403],[5.438,-5.338],[0,-12.891],[-13.998,0],[0,11.984],[11.581,0],[3.122,-4.129],[0,0],[-13.898,2.316],[-1.813,-0.101]],"o":[[-1.611,0],[-8.258,1.007],[-6.445,6.445],[0,17.02],[13.596,0],[0,-12.79],[-7.251,0],[0,0],[1.511,-10.776],[2.518,-0.403],[0,0]],"v":[[41.895,-66.467],[35.449,-65.964],[14.502,-56.296],[3.424,-26.788],[26.587,1.108],[48.34,-21.954],[28.601,-43.103],[12.79,-35.55],[12.488,-35.55],[35.248,-58.813],[41.895,-59.216]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.654,0],[0.201,10.776],[-0.604,1.007],[-5.338,0],[0,-9.366]],"o":[[-9.265,0],[0,-1.611],[2.417,-4.733],[8.157,0],[0,9.366]],"v":[[26.587,-5.74],[12.186,-24.472],[13.193,-28.4],[25.882,-36.456],[39.377,-21.451]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"6","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"p","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.445,0],[0,17.523],[11.783,0],[3.625,-5.942],[0,0],[0,0],[0,0],[0,-6.244]],"o":[[0,0],[0,0],[0,0],[2.921,4.834],[11.481,0],[0,-14.804],[-7.956,0],[0,0],[0,0],[0,0],[0.201,4.633],[0,0]],"v":[[7.352,19.94],[16.113,19.94],[16.113,-6.546],[16.315,-6.546],[31.32,1.108],[53.476,-25.076],[32.831,-49.85],[15.509,-40.384],[15.308,-40.384],[14.905,-48.743],[6.949,-48.743],[7.352,-32.831]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.302,1.108],[-6.042,0],[0,-9.769],[9.366,0],[1.611,6.143],[0,1.309]],"o":[[0,-1.208],[1.712,-6.647],[9.366,0],[0,11.179],[-6.345,0],[-0.201,-1.108],[0,0]],"v":[[16.113,-28.198],[16.718,-31.824],[30.112,-42.801],[44.614,-24.673],[29.81,-5.841],[16.516,-16.214],[16.113,-19.839]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"p","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"c","size":150,"style":"500","w":44.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.035,0],[0,11.279],[-11.179,0],[-2.115,-1.208],[0,0],[5.237,0],[0,-15.005],[-14.703,0],[-2.316,1.208]],"o":[[-2.518,1.108],[-9.668,0],[0,-10.172],[4.834,0],[0,0],[-2.417,-1.208],[-15.912,0],[0,14.905],[6.546,0],[0,0]],"v":[[40.585,-8.459],[29.709,-6.042],[12.79,-24.271],[30.011,-42.7],[40.283,-40.384],[42.297,-47.232],[30.011,-49.75],[3.827,-23.868],[28.098,1.007],[42.096,-1.813]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"y","size":150,"style":"500","w":48.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.504],[0.403,-0.906],[2.417,-1.913],[2.216,-0.705],[0,0],[-4.33,3.827],[-6.345,16.718],[0,0],[0,0],[0,0],[0.906,-2.921],[0,0],[1.108,3.223],[0,0]],"o":[[0,0],[0.403,1.108],[0,0.504],[-2.014,4.532],[-2.618,2.216],[0,0],[2.216,-0.403],[6.042,-5.237],[0,0],[0,0],[0,0],[-1.208,3.525],[0,0],[-0.806,-2.921],[0,0],[0,0]],"v":[[0.906,-48.743],[18.933,-3.827],[19.537,-1.511],[18.832,0.604],[11.38,10.474],[3.625,14.804],[5.841,22.256],[16.718,16.516],[33.435,-13.998],[46.729,-48.743],[37.363,-48.743],[27.695,-20.142],[24.573,-9.97],[24.371,-9.97],[21.249,-19.94],[10.574,-48.743]],"c":true},"ix":2},"nm":"y","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"y","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"5","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.726,0],[-0.101,-8.459],[8.359,0],[2.719,1.611],[0,0],[-7.15,0],[0,12.79],[5.136,2.921],[5.035,0],[1.511,-0.201],[0,0],[0,0]],"o":[[0,0],[0,0],[2.417,-0.302],[13.092,0],[0,8.762],[-5.942,0],[0,0],[3.122,2.014],[14.2,0],[0,-8.258],[-4.028,-2.417],[-2.417,0],[0,0],[0,0],[0,0]],"v":[[43.607,-65.46],[12.286,-65.46],[8.057,-34.039],[17.12,-34.744],[35.953,-20.242],[20.444,-6.042],[6.445,-9.668],[4.23,-2.921],[20.544,1.108],[44.916,-21.249],[35.55,-38.068],[21.451,-41.592],[16.113,-41.19],[18.631,-58.008],[43.607,-58.008]],"c":true},"ix":2},"nm":"5","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"h","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.208],[-5.74,0],[0,-7.855],[0,0],[0,0],[0,0],[6.546,0],[2.618,-1.511],[1.41,-2.518],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-1.712],[1.611,-4.834],[8.359,0],[0,0],[0,0],[0,0],[0,-16.818],[-3.323,0],[-2.719,1.511],[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.407],[16.818,-33.636],[28.702,-42.499],[39.981,-27.997],[39.981,0],[48.843,0],[48.843,-29.004],[31.824,-49.85],[22.76,-47.333],[16.415,-41.089],[16.214,-41.089],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"h","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"h","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"4","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.283,0],[40.283,-17.825],[49.448,-17.825],[49.448,-24.774],[40.283,-24.774],[40.283,-65.46],[30.716,-65.46],[1.511,-23.666],[1.511,-17.825],[31.924,-17.825],[31.924,0]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.014,3.827],[0,0],[0,-3.424],[0,0]],"o":[[0,0],[0,0],[1.813,-3.021],[0,0],[-0.201,3.424],[0,0],[0,0]],"v":[[10.474,-24.774],[10.474,-24.976],[26.486,-47.232],[31.924,-56.9],[32.227,-56.9],[31.924,-46.628],[31.924,-24.774]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"4","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"R","size":150,"style":"500","w":53.8,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.014,-9.366],[-1.108,-1.913],[0,0],[2.216,9.467],[5.237,1.813],[0,0],[0,8.963],[3.424,3.021],[9.366,0],[4.431,-0.906]],"o":[[0,0],[0,0],[0,0],[7.956,0.302],[1.913,8.459],[0,0],[-1.41,-2.618],[-1.611,-7.05],[0,0],[7.15,-2.417],[0,-5.237],[-4.23,-3.827],[-6.042,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-29.407],[24.673,-29.407],[38.269,-16.214],[42.801,0],[51.865,0],[46.628,-18.631],[36.658,-32.327],[36.658,-32.629],[49.448,-49.951],[44.11,-62.842],[24.472,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.23,0],[0,-8.762],[9.366,0],[0,0]],"o":[[1.41,-0.403],[9.265,0.101],[0,7.755],[0,0],[0,0]],"v":[[16.415,-60.828],[25.076,-61.633],[40.686,-48.944],[25.378,-36.053],[16.415,-36.053]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"R","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"3","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.352,0],[0,10.474],[8.057,1.611],[0,0],[0,6.747],[12.891,0],[3.424,-2.518],[0,0],[-5.237,0],[0,-5.237],[6.445,0],[0,0],[0,0],[0,0],[-0.101,-9.164],[11.38,0],[2.518,1.611]],"o":[[3.223,2.115],[15.71,0],[0,-9.164],[0,0],[8.057,-2.921],[0,-7.956],[-7.05,0],[0,0],[2.82,-2.014],[8.157,0],[0,7.755],[0,0],[0,0],[0,0],[8.56,0],[0.101,5.438],[-6.143,0],[0,0]],"v":[[4.23,-3.323],[21.249,1.108],[45.117,-18.53],[30.515,-35.349],[30.515,-35.55],[42.599,-50.958],[23.868,-66.568],[6.747,-61.533],[9.064,-55.087],[22.156,-59.418],[33.636,-49.548],[19.034,-38.47],[14.099,-38.47],[14.099,-31.824],[19.034,-31.824],[35.953,-18.732],[21.149,-6.042],[6.647,-10.172]],"c":true},"ix":2},"nm":"3","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"S","size":150,"style":"500","w":49.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.546,0],[0,10.474],[11.481,4.431],[0,6.345],[-9.265,0],[-2.216,-1.208],[0,0],[6.949,0],[0,-10.574],[-11.078,-3.928],[0,-6.345],[8.963,0],[3.928,2.417]],"o":[[3.625,2.417],[16.013,0],[0,-9.97],[-9.366,-3.625],[0,-4.633],[6.143,0],[0,0],[-3.021,-1.712],[-13.193,0],[0,9.567],[9.164,3.525],[0,6.848],[-6.042,0],[0,0]],"v":[[4.23,-3.323],[21.552,1.007],[45.319,-18.53],[27.997,-38.47],[14.502,-51.562],[27.292,-61.734],[40.182,-58.511],[42.599,-65.662],[27.594,-68.985],[5.64,-50.555],[23.566,-31.32],[36.356,-17.825],[22.156,-6.244],[6.445,-10.675]],"c":true},"ix":2},"nm":"S","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"S","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"l","size":150,"style":"500","w":23.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"l","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"l","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"2","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.085],[14.099,0],[4.532,-3.827],[0,0],[-5.942,0],[0,-6.647],[16.718,-15.912],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[13.797,-13.293],[0,-9.366],[-7.553,0],[0,0],[3.021,-2.518],[9.769,0],[-0.101,9.869],[0,0],[0,0],[0,0]],"v":[[46.326,0],[46.326,-7.352],[16.919,-7.352],[16.919,-7.553],[22.156,-12.387],[44.714,-47.534],[24.673,-66.568],[6.143,-59.921],[8.963,-53.677],[22.861,-59.216],[35.852,-46.426],[11.481,-12.186],[4.532,-5.438],[4.532,0]],"c":true},"ix":2},"nm":"2","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"1","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.767,0],[32.327,0],[32.327,-65.46],[24.774,-65.46],[10.474,-57.806],[12.186,-51.059],[23.566,-57.202],[23.767,-57.202]],"c":true},"ix":2},"nm":"1","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"}]} \ No newline at end of file diff --git a/example/resource/UXSample_1920x1080/E Interpolation_All_01_1920x1080.json b/example/resource/UXSample_1920x1080/E Interpolation_All_01_1920x1080.json new file mode 100755 index 0000000000..46cabbe11f --- /dev/null +++ b/example/resource/UXSample_1920x1080/E Interpolation_All_01_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":41,"w":1920,"h":1080,"nm":"E Interpolation_All_01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[643.833,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1284.167,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"01 Linear Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[111,244,0],"e":[639,244,0],"to":[88,0,0],"ti":[-88,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"02 Bezier Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.119,"y":1},"o":{"x":0.341,"y":0.896},"n":"0p119_1_0p341_0p896","t":0,"s":[111,244,0],"e":[639,244,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"03 Hold Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"t":0,"s":[111,244,0],"h":1},{"t":35,"s":[639,244,0],"h":1}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"04 Spatial Bezier Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.119,"y":1},"o":{"x":0.341,"y":0.888},"n":"0p119_1_0p341_0p888","t":0,"s":[111,244,0],"e":[639,244,0],"to":[87.1999969482422,-42.4000015258789,0],"ti":[-118.400001525879,55.2000007629395,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"05 Rove Across Time","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.395,"y":0.334},"o":{"x":0.501,"y":0.701},"n":"0p395_0p334_0p501_0p701","t":0,"s":[111,244,0],"e":[572.148,244,0],"to":[72.73828125,0,0],"ti":[-135.300979614258,0,0]},{"i":{"x":0.532,"y":1},"o":{"x":0.115,"y":1},"n":"0p532_1_0p115_1","t":16.283,"s":[572.148,244,0],"e":[639,244,0],"to":[28.3884334564209,0,0],"ti":[-15.2617216110229,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[2448.799,1789]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.054901998183,0.631372967888,0.901961023667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"E Interpolation_01 Linear Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[324.499,163.512,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[72.458,72.458,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.739,-5.006],[0.381,-5.753],[-1.668,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.913,8.036],[-5.913,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.084,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1124.737,391.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.693,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.693,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.693,-1.035],[-1.366,0],[-0.693,1.034],[0,2.011],[0.692,1.024],[1.347,0]],"v":[[3.06,4.552],[4.099,0],[3.06,-4.537],[0.03,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[0,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.109,0],[-1.133,-1.396],[0,-2.693],[1.131,-1.405],[2.108,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.142,-1.396],[2.088,0],[1.131,1.395],[0,2.675],[-1.133,1.405],[-2.108,0]],"v":[[-4.86,6.134],[-6.557,0],[-4.845,-6.133],[0.03,-8.227],[4.86,-6.133],[6.557,0],[4.86,6.119],[0,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1106.702,392.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.172,-4.831],[1.2,-4.831],[1.2,10.861],[-1.172,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.284,0.293],[0,0.527],[-0.283,0.293],[-0.526,0],[-0.283,-0.293],[0,-0.507],[0.282,-0.293],[0.528,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.284,-0.293],[0.528,0],[0.282,0.293],[0,0.547],[-0.283,0.293],[-0.526,0]],"v":[[-1.216,-7.963],[-1.639,-9.193],[-1.216,-10.422],[-0.001,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[-0.001,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1093.321,389.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.075,-10.262],[0.075,-5.637],[4.758,-5.637],[4.758,-3.616],[0.075,-3.616],[0.075,4.728],[0.777,7.304],[2.944,8.124],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1082.384,389.887],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.087],[-1.816,0.762],[-3.528,3.337],[-2.752,5.373],[-0.454,6.061]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.923],[5.9,-3.191],[5.9,7.876],[3.733,7.876],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.9,3.514],[-3.616,-0.614],[3.557,-1.962],[3.557,-2.986],[2.635,-5.21],[-0.073,-5.973],[-3.762,-5.152],[-4.377,-7.114],[0.219,-8.197]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1067.159,392.067],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.409,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.253,0.245],[0.352,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.088,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1054.993,388.759],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1040.265,392.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.995],[0,1.971],[0.684,1.025],[1.347,0],[0.594,-0.293],[0.546,-0.625],[0,0],[-0.674,-0.302],[-0.741,0]],"o":[[0.654,-0.996],[0,-1.991],[-0.683,-1.024],[-0.723,0],[-0.596,0.293],[0,0],[0.488,0.546],[0.673,0.303],[1.289,0]],"v":[[2.854,1.727],[3.835,-2.723],[2.81,-7.247],[-0.234,-8.783],[-2.21,-8.344],[-3.923,-6.967],[-3.923,1.493],[-2.181,2.766],[-0.059,3.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.952,0],[0.693,0.312],[0.488,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.956,0]],"o":[[1.034,1.464],[0,2.557],[-1.083,1.434],[-0.82,0],[-0.693,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.527,-0.8],[0.761,-0.41],[1.854,0]],"v":[[4.743,-8.871],[6.294,-2.751],[4.669,3.236],[0.117,5.387],[-2.152,4.918],[-3.923,3.601],[-3.923,11.066],[-6.294,11.066],[-6.294,-10.686],[-4.099,-10.686],[-4.099,-8.637],[-2.167,-10.452],[0.41,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1022.932,394.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.585,-0.253],[0,0],[0.605,0],[0.555,-0.312],[0.448,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.743,-0.214],[-0.742,0],[-0.557,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.113,-1.678],[0.703,0]],"v":[[4.187,-7.627],[3.661,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.99,-7.686],[-1.99,-5.49],[2.255,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1007.823,391.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.703,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.702,-0.849],[-2.401,0]],"v":[[-3.967,-1.245],[4.024,-1.245],[2.942,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.811,-0.888],[-1.484,0],[-1.211,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.809,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.226,0],[-1.239,-1.444],[0,-2.596],[1.143,-1.445],[1.992,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.693,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[991.823,392.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.298,5.079],[-2.298,-3.616],[-4.963,-3.616],[-4.963,-5.637],[-2.298,-5.637],[-2.298,-10.262],[0.074,-10.262],[0.074,-5.637],[4.757,-5.637],[4.757,-3.616],[0.074,-3.616],[0.074,4.728],[0.776,7.304],[2.943,8.124],[4.553,7.861],[4.962,9.91],[2.562,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[976.83,389.887],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.738,-5.006],[0.381,-5.753],[-1.669,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[961.532,391.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[947.581,389.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[929.411,391.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.303],[-0.566,0.625],[0,0],[1.143,-0.547],[0,-1.171],[-0.518,-0.458],[-1.015,0]],"o":[[0.653,-0.302],[0,0],[-2.44,0.02],[-1.142,0.547],[0,0.898],[0.516,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.087],[-1.816,0.762],[-3.528,3.337],[-2.752,5.373],[-0.454,6.061]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.034,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.127,0],[0.86,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.615,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.016,1.542],[-1.562,0],[-0.858,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.614,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.718,0]],"v":[[4.347,-6.923],[5.899,-3.191],[5.899,7.876],[3.733,7.876],[3.733,5.884],[-0.981,8.197],[-4.612,6.967],[-5.9,3.514],[-3.616,-0.614],[3.557,-1.962],[3.557,-2.986],[2.634,-5.21],[-0.074,-5.973],[-3.762,-5.152],[-4.377,-7.114],[0.219,-8.197]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[912.883,392.067],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[896.603,392.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.739,-5.006],[0.381,-5.753],[-1.668,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.913,8.036],[-5.913,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.084,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[878.903,391.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.2,-4.831],[1.2,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.282,0.293],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.282,-0.293],[0.527,0],[0.283,0.293],[0,0.547],[-0.283,0.293],[-0.527,0]],"v":[[-1.215,-7.963],[-1.64,-9.193],[-1.215,-10.422],[0,-10.861],[1.215,-10.422],[1.64,-9.222],[1.215,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[865.084,389.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.899,8.373],[5.899,10.598],[-5.899,10.598],[-5.899,-10.598],[-3.469,-10.598],[-3.469,8.373]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[853.093,389.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.01,-10.598],[4.01,10.598],[1.61,10.598],[1.61,-7.963],[-3.309,-6.265],[-4.011,-8.314],[1.96,-10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[826.99,389.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.742,1.425],[0,3.025],[0.741,1.425],[1.581,0],[0.741,-1.425],[0,-3.025],[-0.743,-1.425],[-1.581,0]],"o":[[0.741,-1.425],[0,-3.025],[-0.742,-1.425],[-1.562,0],[-0.743,1.425],[0,3.025],[0.741,1.425],[1.561,0]],"v":[[3.47,6.675],[4.582,0],[3.47,-6.674],[-0.014,-8.812],[-3.469,-6.674],[-4.581,0],[-3.469,6.675],[0.015,8.813]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.171,1.786],[0,3.747],[-1.161,1.786],[-2.381,0],[-1.172,-1.786],[0,-3.748],[1.161,-1.786],[2.381,0]],"o":[[-1.171,-1.786],[0,-3.748],[1.161,-1.786],[2.38,0],[1.171,1.786],[0,3.747],[-1.162,1.786],[-2.381,0]],"v":[[-5.313,8.3],[-7.07,0],[-5.328,-8.299],[-0.014,-10.979],[5.315,-8.299],[7.07,0],[5.328,8.3],[0.015,10.979]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[811.516,389.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.958,-1.112],[5.958,-1.112],[5.958,1.112],[-5.958,1.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[792.338,403.193],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.913,-3.031],[5.913,8.036],[3.542,8.036],[3.542,-2.826],[2.738,-5.006],[0.38,-5.753],[-1.669,-5.388],[-3.543,-4.26],[-3.543,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.718,-7.656],[-3.718,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[773.848,391.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[755.812,392.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.293],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.283,0.293],[0,0.547],[-0.283,0.293],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[742.431,389.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.469,-0.547],[-0.976,0],[-0.547,0.176],[0,0],[0.879,0]],"o":[[-0.819,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.468,0.546],[0.527,0],[0,0],[-0.722,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.963,-3.616],[-4.963,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.073,-10.262],[0.073,-5.637],[4.758,-5.637],[4.758,-3.616],[0.073,-3.616],[0.073,4.728],[0.776,7.304],[2.943,8.124],[4.552,7.861],[4.962,9.91],[2.561,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[731.494,389.887],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.087],[-1.815,0.762],[-3.528,3.337],[-2.752,5.373],[-0.454,6.061]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.923],[5.9,-3.191],[5.9,7.876],[3.733,7.876],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.899,3.514],[-3.616,-0.614],[3.557,-1.962],[3.557,-2.986],[2.635,-5.21],[-0.073,-5.973],[-3.762,-5.152],[-4.377,-7.114],[0.22,-8.197]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[716.27,392.067],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.087,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[704.103,388.759],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[689.376,392.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":4,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.727],[3.835,-2.723],[2.811,-7.247],[-0.234,-8.783],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.493],[-2.181,2.766],[-0.058,3.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.871],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.918],[-3.922,3.601],[-3.922,11.066],[-6.294,11.066],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.637],[-2.166,-10.452],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[672.041,394.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":4,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[656.934,391.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[640.932,392.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":4,"cix":2,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.075,-10.262],[0.075,-5.637],[4.758,-5.637],[4.758,-3.616],[0.075,-3.616],[0.075,4.728],[0.777,7.304],[2.944,8.124],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[625.94,389.887],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.738,-5.006],[0.381,-5.753],[-1.669,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[610.642,391.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[596.692,389.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.383,8.402],[6.383,10.598],[-6.383,10.598],[-6.383,-10.598],[6.03,-10.598],[6.03,-8.403],[-3.952,-8.403],[-3.952,-1.347],[3.513,-1.347],[3.513,0.878],[-3.952,0.878],[-3.952,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[575.681,389.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"ix":36,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"E Interpolation_02 Bezier Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[964.374,113.924,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[72.458,72.458,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.739,-5.006],[0.381,-5.753],[-1.668,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.913,8.036],[-5.913,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.084,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1127.343,460.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.693,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.693,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.693,-1.035],[-1.366,0],[-0.693,1.034],[0,2.011],[0.692,1.024],[1.347,0]],"v":[[3.06,4.552],[4.099,0],[3.06,-4.537],[0.03,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[0,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.109,0],[-1.133,-1.396],[0,-2.693],[1.131,-1.405],[2.108,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.142,-1.396],[2.088,0],[1.131,1.395],[0,2.675],[-1.133,1.405],[-2.108,0]],"v":[[-4.86,6.134],[-6.557,0],[-4.845,-6.133],[0.03,-8.227],[4.86,-6.133],[6.557,0],[4.86,6.119],[0,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1109.308,460.347],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.293],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.284,-0.293],[0,-0.507],[0.282,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.282,0.293],[0,0.547],[-0.284,0.293],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.216,-10.422],[1.639,-9.222],[1.216,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1095.926,457.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.075,-10.262],[0.075,-5.637],[4.758,-5.637],[4.758,-3.616],[0.075,-3.616],[0.075,4.728],[0.777,7.304],[2.944,8.124],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1084.989,458.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.303],[-0.566,0.625],[0,0],[1.143,-0.547],[0,-1.171],[-0.518,-0.458],[-1.015,0]],"o":[[0.653,-0.302],[0,0],[-2.44,0.02],[-1.142,0.547],[0,0.898],[0.516,0.459],[0.8,0]],"v":[[1.728,5.606],[3.557,4.215],[3.557,-0.087],[-1.816,0.762],[-3.527,3.337],[-2.751,5.373],[-0.453,6.061]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.034,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.127,0],[0.86,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.615,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.016,1.542],[-1.562,0],[-0.858,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.614,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.718,0]],"v":[[4.348,-6.923],[5.9,-3.191],[5.9,7.876],[3.734,7.876],[3.734,5.884],[-0.98,8.197],[-4.612,6.967],[-5.9,3.514],[-3.615,-0.614],[3.557,-1.962],[3.557,-2.986],[2.635,-5.21],[-0.073,-5.973],[-3.761,-5.152],[-4.376,-7.114],[0.219,-8.197]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1069.765,460.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.409,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.253,0.245],[0.352,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.088,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1057.599,457.009],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1042.871,460.347],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.995],[0,1.971],[0.684,1.025],[1.347,0],[0.594,-0.293],[0.546,-0.625],[0,0],[-0.674,-0.302],[-0.741,0]],"o":[[0.654,-0.996],[0,-1.991],[-0.683,-1.024],[-0.723,0],[-0.596,0.293],[0,0],[0.488,0.546],[0.673,0.303],[1.289,0]],"v":[[2.854,1.727],[3.835,-2.723],[2.81,-7.247],[-0.234,-8.783],[-2.21,-8.344],[-3.923,-6.967],[-3.923,1.493],[-2.181,2.766],[-0.059,3.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.952,0],[0.693,0.312],[0.488,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.956,0]],"o":[[1.034,1.464],[0,2.557],[-1.083,1.434],[-0.82,0],[-0.693,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.527,-0.8],[0.761,-0.41],[1.854,0]],"v":[[4.743,-8.871],[6.294,-2.751],[4.669,3.236],[0.117,5.387],[-2.152,4.918],[-3.923,3.601],[-3.923,11.066],[-6.294,11.066],[-6.294,-10.686],[-4.099,-10.686],[-4.099,-8.637],[-2.167,-10.452],[0.41,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1025.538,463.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.585,-0.253],[0,0],[0.605,0],[0.555,-0.312],[0.448,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.743,-0.214],[-0.742,0],[-0.557,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.113,-1.678],[0.703,0]],"v":[[4.187,-7.627],[3.661,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.99,-7.686],[-1.99,-5.49],[2.255,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1010.429,460.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.703,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.702,-0.849],[-2.401,0]],"v":[[-3.967,-1.245],[4.024,-1.245],[2.942,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.811,-0.888],[-1.484,0],[-1.211,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.809,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.226,0],[-1.239,-1.444],[0,-2.596],[1.143,-1.445],[1.992,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.693,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[994.428,460.332],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.075,-10.262],[0.075,-5.637],[4.758,-5.637],[4.758,-3.616],[0.075,-3.616],[0.075,4.728],[0.777,7.304],[2.944,8.124],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[979.436,458.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.738,-5.006],[0.381,-5.753],[-1.669,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[964.137,460.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[950.187,457.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[932.017,460.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[916.015,460.332],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.172,-4.831],[1.2,-4.831],[1.2,10.861],[-1.172,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.284,0.293],[0,0.527],[-0.283,0.293],[-0.526,0],[-0.283,-0.293],[0,-0.507],[0.282,-0.293],[0.528,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.284,-0.293],[0.528,0],[0.282,0.293],[0,0.547],[-0.283,0.293],[-0.526,0]],"v":[[-1.216,-7.963],[-1.639,-9.193],[-1.216,-10.422],[-0.001,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[-0.001,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[902.825,457.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.549,5.826],[5.549,7.846],[-5.549,7.846],[-5.549,5.826],[2.737,-5.826],[-5.314,-5.826],[-5.314,-7.846],[5.432,-7.846],[5.432,-5.826],[-2.826,5.826]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[890.805,460.347],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[874.877,460.332],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.644,0.645],[0,1.269],[0.664,0.634],[1.288,0],[0,0],[0,0],[0,0]],"o":[[0.645,-0.644],[0,-1.249],[-0.663,-0.634],[0,0],[0,0],[0,0],[1.249,0]],"v":[[3.776,7.436],[4.743,4.567],[3.747,1.742],[0.82,0.79],[-4.86,0.79],[-4.86,8.402],[0.936,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.643,0.576],[0,1.132],[0.663,0.615],[1.288,0]],"o":[[0,0],[0,0],[1.249,0],[0.645,-0.576],[0,-1.19],[-0.663,-0.615],[0,0]],"v":[[-4.86,-8.402],[-4.86,-1.347],[-0.235,-1.347],[2.605,-2.21],[3.572,-4.772],[2.576,-7.48],[-0.352,-8.402]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,-2.752],[1.141,-1.063],[2.029,0],[0,0],[0,0],[0,0],[-1.113,-1.014],[0,-1.835],[0.459,-0.712],[0.897,-0.273]],"o":[[0,1.893],[-1.142,1.064],[0,0],[0,0],[0,0],[1.991,0],[1.112,1.015],[0,1.112],[-0.459,0.713],[2.615,0.683]],"v":[[7.29,4.567],[5.577,9.002],[0.82,10.598],[-7.29,10.598],[-7.29,-10.598],[-0.235,-10.598],[4.421,-9.076],[6.089,-4.801],[5.401,-2.064],[3.367,-0.585]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[856.797,457.595],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":5,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.361,0.712],[0,0.703],[0.674,0.605],[1.191,0],[0.859,-0.283],[0.722,-0.508],[0,0],[-1.152,0.361],[-1.094,0],[-1.113,-0.986],[0,-1.62],[0.459,-0.985],[1.093,-1.327],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0.898,-1.113],[0.36,-0.713],[0,-1.034],[-0.673,-0.605],[-0.839,0],[-0.859,0.283],[0,0],[0.742,-0.586],[1.151,-0.361],[1.834,0],[1.112,0.985],[0,0.957],[-0.459,0.986],[0,0],[0,0]],"v":[[6.266,8.68],[6.266,10.789],[-6.208,10.789],[-6.208,8.651],[1.17,-0.307],[3.059,-3.044],[3.6,-5.167],[2.59,-7.626],[-0.206,-8.534],[-2.753,-8.109],[-5.124,-6.923],[-6.266,-8.826],[-3.426,-10.246],[-0.059,-10.789],[4.362,-9.31],[6.031,-5.401],[5.342,-2.488],[3.016,0.981],[-3.397,8.68]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[829.362,457.404],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.742,1.425],[0,3.025],[0.741,1.425],[1.581,0],[0.741,-1.425],[0,-3.025],[-0.743,-1.425],[-1.581,0]],"o":[[0.741,-1.425],[0,-3.025],[-0.742,-1.425],[-1.562,0],[-0.743,1.425],[0,3.025],[0.741,1.425],[1.561,0]],"v":[[3.47,6.675],[4.582,0],[3.47,-6.674],[-0.014,-8.812],[-3.469,-6.674],[-4.581,0],[-3.469,6.675],[0.015,8.813]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.171,1.786],[0,3.747],[-1.161,1.786],[-2.381,0],[-1.172,-1.786],[0,-3.748],[1.161,-1.786],[2.381,0]],"o":[[-1.171,-1.786],[0,-3.748],[1.161,-1.786],[2.38,0],[1.171,1.786],[0,3.747],[-1.162,1.786],[-2.381,0]],"v":[[-5.313,8.3],[-7.07,0],[-5.328,-8.299],[-0.014,-10.979],[5.315,-8.299],[7.07,0],[5.328,8.3],[0.015,10.979]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[811.516,457.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.958,-1.112],[5.958,-1.112],[5.958,1.112],[-5.958,1.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[792.338,471.443],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.913,-3.031],[5.913,8.036],[3.542,8.036],[3.542,-2.826],[2.738,-5.006],[0.38,-5.753],[-1.669,-5.388],[-3.543,-4.26],[-3.543,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.718,-7.656],[-3.718,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[773.848,460.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[755.812,460.347],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.293],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.283,0.293],[0,0.547],[-0.283,0.293],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[742.431,457.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.469,-0.547],[-0.976,0],[-0.547,0.176],[0,0],[0.879,0]],"o":[[-0.819,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.468,0.546],[0.527,0],[0,0],[-0.722,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.963,-3.616],[-4.963,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.073,-10.262],[0.073,-5.637],[4.758,-5.637],[4.758,-3.616],[0.073,-3.616],[0.073,4.728],[0.776,7.304],[2.943,8.124],[4.552,7.861],[4.962,9.91],[2.561,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[731.494,458.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.087],[-1.815,0.762],[-3.528,3.337],[-2.752,5.373],[-0.454,6.061]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.923],[5.9,-3.191],[5.9,7.876],[3.733,7.876],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.899,3.514],[-3.616,-0.614],[3.557,-1.962],[3.557,-2.986],[2.635,-5.21],[-0.073,-5.973],[-3.762,-5.152],[-4.377,-7.114],[0.22,-8.197]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[716.27,460.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.087,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[704.103,457.009],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[689.376,460.347],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":4,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.727],[3.835,-2.723],[2.811,-7.247],[-0.234,-8.783],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.493],[-2.181,2.766],[-0.058,3.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.871],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.918],[-3.922,3.601],[-3.922,11.066],[-6.294,11.066],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.637],[-2.166,-10.452],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[672.041,463.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":4,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[656.934,460.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.655],[0.776,5.986],[4.786,4.816],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.046],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.212],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[640.932,460.332],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":4,"cix":2,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.637],[-2.297,-5.637],[-2.297,-10.262],[0.075,-10.262],[0.075,-5.637],[4.758,-5.637],[4.758,-3.616],[0.075,-3.616],[0.075,4.728],[0.777,7.304],[2.944,8.124],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[625.94,458.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.738,-5.006],[0.381,-5.753],[-1.669,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[610.642,460.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[596.692,457.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.383,8.402],[6.383,10.598],[-6.383,10.598],[-6.383,-10.598],[6.03,-10.598],[6.03,-8.403],[-3.952,-8.403],[-3.952,-1.347],[3.513,-1.347],[3.513,0.878],[-3.952,0.878],[-3.952,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[575.681,457.595],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"ix":36,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"E Interpolation_03 Hold Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1605.124,64.606,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[72.458,72.458,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.739,-5.006],[0.381,-5.753],[-1.668,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.913,8.036],[-5.913,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.084,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1104.68,528.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1086.644,528.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.293],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.284,-0.293],[0,-0.507],[0.282,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.282,0.293],[0,0.547],[-0.284,0.293],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.216,-10.422],[1.639,-9.222],[1.216,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1073.263,525.581],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.08],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.075,-10.261],[0.075,-5.636],[4.758,-5.636],[4.758,-3.616],[0.075,-3.616],[0.075,4.729],[0.777,7.305],[2.944,8.125],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1062.326,526.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.088],[-1.816,0.761],[-3.528,3.337],[-2.752,5.372],[-0.454,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.733,7.875],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.9,3.513],[-3.616,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.762,-5.153],[-4.377,-7.115],[0.219,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1047.102,528.567],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.665,7.875],[-2.665,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.087,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1034.935,525.259],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1020.208,528.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.727],[3.835,-2.722],[2.811,-7.247],[-0.234,-8.782],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.494],[-2.181,2.766],[-0.058,3.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.87],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.919],[-3.922,3.602],[-3.922,11.067],[-6.294,11.067],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.636],[-2.166,-10.451],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1002.873,531.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.585,-0.253],[0,0],[0.605,0],[0.555,-0.312],[0.448,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.743,-0.214],[-0.742,0],[-0.557,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.113,-1.678],[0.703,0]],"v":[[4.187,-7.627],[3.661,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.99,-7.686],[-1.99,-5.49],[2.255,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[987.766,528.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.802],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.654],[0.776,5.986],[4.786,4.815],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.213],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[971.764,528.582],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.298,5.08],[-2.298,-3.616],[-4.963,-3.616],[-4.963,-5.636],[-2.298,-5.636],[-2.298,-10.261],[0.074,-10.261],[0.074,-5.636],[4.757,-5.636],[4.757,-3.616],[0.074,-3.616],[0.074,4.729],[0.776,7.305],[2.943,8.125],[4.553,7.861],[4.962,9.91],[2.562,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[956.773,526.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.738,-5.006],[0.381,-5.753],[-1.669,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[941.474,528.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[927.523,525.844],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.596,0.293],[-0.547,0.625],[0,0],[0.674,0.302],[0.741,0],[0.653,-0.995],[0,-1.971],[-0.683,-1.025],[-1.346,0]],"o":[[0.596,-0.292],[0,0],[-0.488,-0.546],[-0.673,-0.303],[-1.288,0],[-0.655,0.995],[0,1.991],[0.683,1.025],[0.723,0]],"v":[[2.211,8.739],[3.923,7.363],[3.923,-1.098],[2.181,-2.371],[0.06,-2.825],[-2.854,-1.332],[-3.836,3.118],[-2.811,7.641],[0.233,9.178]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.762,-0.41],[0.956,0],[1.034,1.464],[0,2.616],[-1.083,1.435],[-1.952,0],[-0.693,-0.312],[-0.488,-0.566],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.528,0.8],[-0.761,0.41],[-1.855,0],[-1.035,-1.464],[0,-2.556],[1.083,-1.434],[0.819,0],[0.693,0.312],[0,0],[0,0]],"v":[[6.294,-11.462],[6.294,11.081],[4.099,11.081],[4.099,9.032],[2.167,10.847],[-0.41,11.462],[-4.742,9.266],[-6.294,3.147],[-4.669,-2.84],[-0.117,-4.991],[2.151,-4.523],[3.923,-3.206],[3.923,-11.462]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[905.225,525.362],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.409,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.253,0.245],[0.352,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.088,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[892.312,525.259],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.693,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.693,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.693,-1.035],[-1.366,0],[-0.693,1.034],[0,2.011],[0.692,1.024],[1.347,0]],"v":[[3.06,4.552],[4.098,0],[3.06,-4.537],[0.029,-6.089],[-3.06,-4.537],[-4.099,0],[-3.06,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.109,0],[-1.133,-1.396],[0,-2.693],[1.131,-1.405],[2.108,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.142,-1.396],[2.088,0],[1.131,1.395],[0,2.675],[-1.133,1.405],[-2.108,0]],"v":[[-4.861,6.134],[-6.557,0],[-4.846,-6.133],[0.029,-8.227],[4.86,-6.133],[6.557,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[877.585,528.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.466,-10.598],[7.466,10.598],[5.035,10.598],[5.035,0.937],[-5.035,0.937],[-5.035,10.598],[-7.466,10.598],[-7.466,-10.598],[-5.035,-10.598],[-5.035,-1.259],[5.035,-1.259],[5.035,-10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[857.85,525.845],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.112,-1.151],[0,-1.874],[0.585,-1.044],[1.054,-0.566],[1.405,0],[1.102,0.302],[0.801,0.508],[0,0],[-0.878,-0.263],[-0.801,0],[-0.791,0.81],[0,1.444],[0.761,0.761],[1.367,0],[0.586,-0.176],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.113,1.152],[0,1.346],[-0.586,1.044],[-1.055,0.565],[-1.015,0],[-1.103,-0.303],[0,0],[0.819,0.468],[0.878,0.263],[1.424,0],[0.79,-0.81],[0,-1.347],[-0.762,-0.761],[-0.742,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.854,0.039]],"v":[[4.86,-0.6],[6.529,3.938],[5.651,7.524],[3.192,9.94],[-0.497,10.788],[-3.674,10.335],[-6.529,9.12],[-5.562,7.041],[-3.015,8.139],[-0.497,8.534],[2.826,7.319],[4.011,3.938],[2.87,0.776],[-0.322,-0.366],[-2.313,-0.102],[-3.22,-1.273],[3.22,-8.681],[-6.177,-8.681],[-6.177,-10.788],[5.915,-10.788],[5.915,-8.681],[0.41,-2.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[829.624,526.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.742,1.425],[0,3.025],[0.741,1.425],[1.581,0],[0.741,-1.425],[0,-3.025],[-0.743,-1.425],[-1.581,0]],"o":[[0.741,-1.425],[0,-3.025],[-0.742,-1.425],[-1.562,0],[-0.743,1.425],[0,3.025],[0.741,1.425],[1.561,0]],"v":[[3.47,6.675],[4.582,0],[3.47,-6.674],[-0.014,-8.812],[-3.469,-6.674],[-4.581,0],[-3.469,6.675],[0.015,8.813]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.171,1.786],[0,3.747],[-1.161,1.786],[-2.381,0],[-1.172,-1.786],[0,-3.748],[1.161,-1.786],[2.381,0]],"o":[[-1.171,-1.786],[0,-3.748],[1.161,-1.786],[2.38,0],[1.171,1.786],[0,3.747],[-1.162,1.786],[-2.381,0]],"v":[[-5.313,8.3],[-7.07,0],[-5.328,-8.299],[-0.014,-10.979],[5.315,-8.299],[7.07,0],[5.328,8.3],[0.015,10.979]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[811.516,525.844],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.958,-1.112],[5.958,-1.112],[5.958,1.112],[-5.958,1.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[792.338,539.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.913,-3.031],[5.913,8.036],[3.542,8.036],[3.542,-2.826],[2.738,-5.006],[0.38,-5.753],[-1.669,-5.388],[-3.543,-4.26],[-3.543,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.718,-7.656],[-3.718,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[773.848,528.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[755.812,528.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.293],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.283,0.293],[0,0.547],[-0.283,0.293],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[742.431,525.581],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":4,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.469,-0.547],[-0.976,0],[-0.547,0.176],[0,0],[0.879,0]],"o":[[-0.819,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.468,0.546],[0.527,0],[0,0],[-0.722,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.297,5.08],[-2.297,-3.616],[-4.963,-3.616],[-4.963,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.073,-10.261],[0.073,-5.636],[4.758,-5.636],[4.758,-3.616],[0.073,-3.616],[0.073,4.729],[0.776,7.305],[2.943,8.125],[4.552,7.861],[4.962,9.91],[2.561,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[731.494,526.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":2,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.088],[-1.815,0.761],[-3.528,3.337],[-2.752,5.372],[-0.454,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.733,7.875],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.899,3.513],[-3.616,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.762,-5.153],[-4.377,-7.115],[0.22,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[716.27,528.567],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.671],[0.087,8.856],[1.288,9.223],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[704.103,525.259],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[689.376,528.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.727],[3.835,-2.722],[2.811,-7.247],[-0.234,-8.782],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.494],[-2.181,2.766],[-0.058,3.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.87],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.919],[-3.922,3.602],[-3.922,11.067],[-6.294,11.067],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.636],[-2.166,-10.451],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[672.041,531.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[656.934,528.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.802],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.687],[-3.997,0.687],[-2.664,4.654],[0.776,5.986],[4.786,4.815],[5.695,6.689],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.046],[0.102,-8.213],[4.758,-6.222],[6.427,-0.66]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[640.932,528.582],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":4,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.08],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.075,-10.261],[0.075,-5.636],[4.758,-5.636],[4.758,-3.616],[0.075,-3.616],[0.075,4.729],[0.777,7.305],[2.944,8.125],[4.554,7.861],[4.963,9.91],[2.563,10.262]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[625.94,526.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.705],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.826],[2.738,-5.006],[0.381,-5.753],[-1.669,-5.388],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.929],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[610.642,528.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[596.692,525.844],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.383,8.402],[6.383,10.598],[-6.383,10.598],[-6.383,-10.598],[6.03,-10.598],[6.03,-8.403],[-3.952,-8.403],[-3.952,-1.347],[3.513,-1.347],[3.513,0.878],[-3.952,0.878],[-3.952,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[575.681,525.845],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"ix":34,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"E Interpolation_04 Spatial Bezier Interpolation","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[324.499,555.091,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[72.458,72.458,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.704],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.825],[2.738,-5.006],[0.381,-5.752],[-1.669,-5.387],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.928],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1238.255,596.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1220.22,596.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.172,-4.831],[1.2,-4.831],[1.2,10.861],[-1.172,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.292],[0,0.527],[-0.283,0.293],[-0.526,0],[-0.284,-0.293],[0,-0.507],[0.282,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.282,0.293],[0,0.547],[-0.284,0.292],[-0.526,0]],"v":[[-1.215,-7.963],[-1.64,-9.193],[-1.215,-10.422],[0,-10.861],[1.216,-10.422],[1.64,-9.222],[1.216,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1206.839,593.831],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.469,-0.547],[-0.976,0],[-0.547,0.176],[0,0],[0.879,0]],"o":[[-0.819,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.468,0.546],[0.527,0],[0,0],[-0.722,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.074,-10.261],[0.074,-5.636],[4.758,-5.636],[4.758,-3.616],[0.074,-3.616],[0.074,4.729],[0.777,7.305],[2.943,8.125],[4.553,7.86],[4.963,9.91],[2.562,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1195.902,594.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.088],[-1.816,0.761],[-3.528,3.337],[-2.752,5.372],[-0.454,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.733,7.875],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.9,3.513],[-3.616,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.762,-5.153],[-4.377,-7.115],[0.219,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1180.678,596.817],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.665,7.875],[-2.665,-11.359],[-0.293,-11.359],[-0.293,7.67],[0.087,8.855],[1.288,9.222],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1168.511,593.509],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1153.784,596.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.728],[3.835,-2.722],[2.811,-7.246],[-0.234,-8.782],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.494],[-2.181,2.766],[-0.058,3.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.87],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.919],[-3.922,3.602],[-3.922,11.067],[-6.294,11.067],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.636],[-2.166,-10.451],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1136.45,599.686],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.816,-3.704],[-1.816,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1121.342,596.686],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.045,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.996,0.688],[-2.664,4.654],[0.776,5.987],[4.786,4.815],[5.695,6.69],[3.426,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.103,-8.212],[4.758,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1105.34,596.832],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.075,-10.261],[0.075,-5.636],[4.758,-5.636],[4.758,-3.616],[0.075,-3.616],[0.075,4.729],[0.777,7.305],[2.944,8.125],[4.554,7.86],[4.963,9.91],[2.563,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1090.349,594.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.704],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.825],[2.739,-5.006],[0.381,-5.752],[-1.668,-5.387],[-3.542,-4.26],[-3.542,8.036],[-5.913,8.036],[-5.913,-7.656],[-3.717,-7.656],[-3.717,-5.928],[1.084,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1075.05,596.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.215,-10.598],[1.215,-10.598],[1.215,10.598],[-1.215,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1061.099,594.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.585,-0.253],[0,0],[0.605,0],[0.555,-0.312],[0.448,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.743,-0.214],[-0.742,0],[-0.557,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.113,-1.678],[0.703,0]],"v":[[4.187,-7.627],[3.661,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.99,-7.686],[-1.99,-5.49],[2.255,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1042.929,596.686],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.703,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.702,-0.849],[-2.401,0]],"v":[[-3.967,-1.245],[4.024,-1.245],[2.942,-4.801],[0.043,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.811,-0.888],[-1.484,0],[-1.211,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.809,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.226,0],[-1.239,-1.444],[0,-2.596],[1.143,-1.445],[1.992,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.997,0.688],[-2.665,4.654],[0.776,5.987],[4.786,4.815],[5.693,6.69],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.101,-8.212],[4.757,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1026.928,596.832],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.172,-4.831],[1.199,-4.831],[1.199,10.861],[-1.172,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.292],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.528,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.528,0],[0.283,0.293],[0,0.547],[-0.283,0.292],[-0.527,0]],"v":[[-1.216,-7.963],[-1.64,-9.193],[-1.216,-10.422],[-0.001,-10.861],[1.214,-10.422],[1.639,-9.222],[1.214,-7.963],[-0.001,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1013.738,593.831],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.548,5.826],[5.548,7.846],[-5.548,7.846],[-5.548,5.826],[2.737,-5.826],[-5.313,-5.826],[-5.313,-7.846],[5.431,-7.846],[5.431,-5.826],[-2.825,5.826]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1001.718,596.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.997,0.688],[-2.664,4.654],[0.776,5.987],[4.786,4.815],[5.695,6.69],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.102,-8.212],[4.758,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[985.79,596.832],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.645,0.645],[0,1.269],[0.663,0.634],[1.288,0],[0,0],[0,0],[0,0]],"o":[[0.644,-0.644],[0,-1.249],[-0.664,-0.634],[0,0],[0,0],[0,0],[1.249,0]],"v":[[3.777,7.436],[4.742,4.567],[3.747,1.742],[0.82,0.79],[-4.86,0.79],[-4.86,8.402],[0.937,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.644,0.576],[0,1.132],[0.663,0.615],[1.288,0]],"o":[[0,0],[0,0],[1.249,0],[0.644,-0.576],[0,-1.19],[-0.664,-0.615],[0,0]],"v":[[-4.86,-8.402],[-4.86,-1.347],[-0.234,-1.347],[2.606,-2.21],[3.572,-4.772],[2.577,-7.48],[-0.352,-8.402]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,-2.752],[1.141,-1.063],[2.029,0],[0,0],[0,0],[0,0],[-1.113,-1.014],[0,-1.835],[0.458,-0.712],[0.897,-0.273]],"o":[[0,1.893],[-1.143,1.064],[0,0],[0,0],[0,0],[1.99,0],[1.113,1.015],[0,1.112],[-0.459,0.713],[2.615,0.683]],"v":[[7.289,4.567],[5.578,9.002],[0.82,10.598],[-7.289,10.598],[-7.289,-10.598],[-0.234,-10.598],[4.421,-9.076],[6.09,-4.801],[5.402,-2.064],[3.367,-0.585]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[967.71,594.095],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":5,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.67],[0.087,8.855],[1.288,9.222],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[944.636,593.509],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.088],[-1.815,0.761],[-3.528,3.337],[-2.752,5.372],[-0.454,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.733,7.875],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.899,3.513],[-3.616,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.762,-5.153],[-4.377,-7.115],[0.22,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[929.689,596.817],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.172,-4.831],[1.2,-4.831],[1.2,10.861],[-1.172,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.292],[0,0.527],[-0.284,0.293],[-0.526,0],[-0.283,-0.293],[0,-0.507],[0.282,-0.293],[0.528,0]],"o":[[-0.284,-0.293],[0,-0.527],[0.283,-0.293],[0.528,0],[0.282,0.293],[0,0.547],[-0.283,0.292],[-0.526,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[-0.001,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[-0.001,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[917.318,593.831],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.298,5.079],[-2.298,-3.616],[-4.963,-3.616],[-4.963,-5.636],[-2.298,-5.636],[-2.298,-10.261],[0.074,-10.261],[0.074,-5.636],[4.757,-5.636],[4.757,-3.616],[0.074,-3.616],[0.074,4.729],[0.776,7.305],[2.943,8.125],[4.553,7.86],[4.962,9.91],[2.562,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[906.381,594.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.303],[-0.566,0.625],[0,0],[1.143,-0.547],[0,-1.171],[-0.518,-0.458],[-1.015,0]],"o":[[0.653,-0.302],[0,0],[-2.44,0.02],[-1.142,0.547],[0,0.898],[0.516,0.459],[0.8,0]],"v":[[1.728,5.606],[3.557,4.215],[3.557,-0.088],[-1.815,0.761],[-3.527,3.337],[-2.751,5.372],[-0.453,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.034,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.127,0],[0.86,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.615,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.016,1.542],[-1.562,0],[-0.858,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.614,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.718,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.734,7.875],[3.734,5.884],[-0.98,8.197],[-4.612,6.967],[-5.899,3.513],[-3.615,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.761,-5.153],[-4.376,-7.115],[0.219,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[891.156,596.817],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.728],[3.835,-2.722],[2.811,-7.246],[-0.234,-8.782],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.494],[-2.181,2.766],[-0.058,3.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.87],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.919],[-3.922,3.602],[-3.922,11.067],[-6.294,11.067],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.636],[-2.166,-10.451],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[874.832,599.686],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.151,0.293],[0.879,0.547],[0,0],[-1.952,0],[-0.81,0.634],[0,1.131],[0.546,0.596],[1.132,0.293],[0,0],[0.839,0.946],[0,1.523],[-1.2,1.064],[-2.068,0],[-1.073,-0.224],[-0.897,-0.429],[0,0],[1.561,0],[0.731,-0.595],[0,-1.054],[-0.537,-0.595],[-1.132,-0.292],[0,0],[-0.85,-0.936],[0,-1.522],[1.269,-1.102],[2.186,0]],"o":[[-1.151,-0.292],[0,0],[1.834,1.053],[1.464,0],[0.809,-0.634],[0,-0.956],[-0.547,-0.595],[0,0],[-1.796,-0.488],[-0.839,-0.947],[0,-1.815],[1.2,-1.064],[1.035,0],[1.074,0.225],[0,0],[-1.991,-0.801],[-1.327,0],[-0.733,0.596],[0,0.957],[0.536,0.596],[0,0],[1.796,0.507],[0.849,0.937],[0,1.894],[-1.269,1.103],[-1.171,0]],"v":[[-3.762,10.51],[-6.807,9.251],[-5.957,7.173],[-0.278,8.754],[3.133,7.802],[4.347,5.153],[3.528,2.825],[1.01,1.493],[-1.391,0.82],[-5.343,-1.332],[-6.602,-5.036],[-4.801,-9.354],[0.102,-10.949],[3.264,-10.613],[6.221,-9.632],[5.373,-7.553],[0.044,-8.754],[-3.044,-7.861],[-4.143,-5.387],[-3.337,-3.06],[-0.834,-1.728],[1.566,-1.054],[5.534,1.112],[6.807,4.801],[4.904,9.295],[-0.278,10.949]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[856.226,594.095],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[2.137,3.865],[2.137,-8.343],[-4.655,3.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.231,3.865],[7.231,6.002],[4.479,6.002],[4.479,10.598],[2.137,10.598],[2.137,6.002],[-7.231,6.002],[-7.231,3.865],[1.083,-10.598],[4.479,-10.598],[4.479,3.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[830.094,594.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.742,1.425],[0,3.025],[0.741,1.425],[1.581,0],[0.741,-1.425],[0,-3.025],[-0.743,-1.425],[-1.581,0]],"o":[[0.741,-1.425],[0,-3.025],[-0.742,-1.425],[-1.562,0],[-0.743,1.425],[0,3.025],[0.741,1.425],[1.561,0]],"v":[[3.47,6.676],[4.582,0.001],[3.47,-6.674],[-0.014,-8.811],[-3.469,-6.674],[-4.581,0.001],[-3.469,6.676],[0.015,8.813]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.171,1.786],[0,3.747],[-1.161,1.786],[-2.381,0],[-1.172,-1.786],[0,-3.748],[1.161,-1.786],[2.381,0]],"o":[[-1.171,-1.786],[0,-3.748],[1.161,-1.786],[2.38,0],[1.171,1.786],[0,3.747],[-1.162,1.786],[-2.381,0]],"v":[[-5.313,8.301],[-7.07,0.001],[-5.328,-8.299],[-0.014,-10.978],[5.315,-8.299],[7.07,0.001],[5.328,8.301],[0.015,10.979]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[811.516,594.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.958,-1.113],[5.958,-1.113],[5.958,1.112],[-5.958,1.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[792.338,607.943],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.704],[5.913,-3.031],[5.913,8.036],[3.542,8.036],[3.542,-2.825],[2.738,-5.006],[0.38,-5.752],[-1.669,-5.387],[-3.543,-4.26],[-3.543,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.718,-7.656],[-3.718,-5.928],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[773.848,596.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[755.812,596.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":4,"cix":2,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.292],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.283,0.293],[0,0.547],[-0.283,0.292],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[742.431,593.831],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":4,"cix":2,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.469,-0.547],[-0.976,0],[-0.547,0.176],[0,0],[0.879,0]],"o":[[-0.819,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.468,0.546],[0.527,0],[0,0],[-0.722,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.963,-3.616],[-4.963,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.073,-10.261],[0.073,-5.636],[4.758,-5.636],[4.758,-3.616],[0.073,-3.616],[0.073,4.729],[0.776,7.305],[2.943,8.125],[4.552,7.86],[4.962,9.91],[2.561,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[731.494,594.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.088],[-1.815,0.761],[-3.528,3.337],[-2.752,5.372],[-0.454,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.733,7.875],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.899,3.513],[-3.616,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.762,-5.153],[-4.377,-7.115],[0.22,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[716.27,596.817],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":4,"cix":2,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.67],[0.087,8.855],[1.288,9.222],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[704.103,593.509],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[689.376,596.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":4,"cix":2,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.728],[3.835,-2.722],[2.811,-7.246],[-0.234,-8.782],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.494],[-2.181,2.766],[-0.058,3.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.87],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.919],[-3.922,3.602],[-3.922,11.067],[-6.294,11.067],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.636],[-2.166,-10.451],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[672.041,599.686],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":4,"cix":2,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[656.934,596.686],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"ix":38,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.997,0.688],[-2.664,4.654],[0.776,5.987],[4.786,4.815],[5.695,6.69],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.102,-8.212],[4.758,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[640.932,596.832],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":4,"cix":2,"ix":39,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.075,-10.261],[0.075,-5.636],[4.758,-5.636],[4.758,-3.616],[0.075,-3.616],[0.075,4.729],[0.777,7.305],[2.944,8.125],[4.554,7.86],[4.963,9.91],[2.563,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[625.94,594.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"ix":40,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.704],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.825],[2.738,-5.006],[0.381,-5.752],[-1.669,-5.387],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.928],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[610.642,596.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"ix":41,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[596.692,594.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"ix":42,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.383,8.402],[6.383,10.598],[-6.383,10.598],[-6.383,-10.598],[6.03,-10.598],[6.03,-8.403],[-3.952,-8.403],[-3.952,-1.347],[3.513,-1.347],[3.513,0.878],[-3.952,0.878],[-3.952,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[575.681,594.095],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"ix":43,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"E Interpolation_05 Rove Across Time","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[964.374,505.638,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[72.458,72.458,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.703,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.702,-0.849],[-2.401,0]],"v":[[-3.967,-1.245],[4.025,-1.245],[2.942,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.811,-0.888],[-1.484,0],[-1.211,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.809,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.226,0],[-1.239,-1.444],[0,-2.596],[1.143,-1.445],[1.992,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.996,0.688],[-2.664,4.654],[0.776,5.987],[4.786,4.815],[5.693,6.69],[3.426,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.102,-8.212],[4.758,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1091.986,665.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.82,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.507,0.498],[0.977,0],[0.624,-0.253],[0.625,-0.546],[0,-0.41],[0,0],[0,0],[0,0],[0.518,0.498],[0.976,0],[0.606,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.834,0],[-0.722,-0.419],[-0.352,-0.781],[-1.932,0]],"o":[[0.819,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.508,-0.498],[-0.702,0],[-0.625,0.254],[0.058,0.352],[0,0],[0,0],[0,0],[0,-0.956],[-0.516,-0.498],[-0.703,0],[-0.604,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[0.996,0],[0.722,0.42],[1.384,-1.62],[1.464,0]],"v":[[9.121,-6.704],[10.349,-3.031],[10.349,8.036],[7.978,8.036],[7.978,-2.825],[7.218,-5.006],[4.992,-5.752],[3.002,-5.372],[1.128,-4.172],[1.216,-3.031],[1.216,8.036],[-1.155,8.036],[-1.155,-2.825],[-1.932,-5.006],[-4.172,-5.752],[-6.133,-5.387],[-7.977,-4.26],[-7.977,8.036],[-10.349,8.036],[-10.349,-7.656],[-8.152,-7.656],[-8.152,-5.928],[-3.469,-8.036],[-0.892,-7.407],[0.719,-5.606],[5.695,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1069.85,664.906],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.292],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.284,-0.293],[0,-0.507],[0.282,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.282,0.293],[0,0.547],[-0.284,0.292],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.216,-10.422],[1.639,-9.222],[1.216,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1051.595,662.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.836,-8.373],[1.215,-8.373],[1.215,10.598],[-1.215,10.598],[-1.215,-8.373],[-6.836,-8.373],[-6.836,-10.598],[6.836,-10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1038.668,662.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.927,0.244],[0.703,0.45],[0,0],[-1.621,0],[-0.576,0.41],[0,0.8],[0.361,0.371],[0.781,0.195],[0,0],[0.683,0.712],[0,1.152],[-0.966,0.82],[-1.738,0],[-0.86,-0.214],[-0.683,-0.351],[0,0],[1.308,0],[0.527,-0.39],[0,-0.742],[-0.371,-0.361],[-0.782,-0.195],[0,0],[-0.673,-0.732],[0,-1.19],[1.014,-0.839],[1.795,0]],"o":[[-0.928,-0.244],[0,0],[1.367,0.86],[1.112,0],[0.575,-0.41],[0,-0.625],[-0.361,-0.371],[0,0],[-1.425,-0.332],[-0.683,-0.712],[0,-1.444],[0.967,-0.82],[0.859,0],[0.858,0.215],[0,0],[-1.367,-0.703],[-1.015,0],[-0.528,0.39],[0,0.586],[0.371,0.361],[0,0],[1.424,0.332],[0.674,0.732],[0,1.483],[-1.016,0.839],[-0.996,0]],"v":[[-3.089,7.831],[-5.534,6.792],[-4.685,4.771],[-0.205,6.06],[2.327,5.445],[3.19,3.63],[2.649,2.138],[0.936,1.289],[-1.143,0.79],[-4.304,-0.776],[-5.329,-3.571],[-3.88,-6.967],[0.175,-8.198],[2.752,-7.875],[5.064,-7.026],[4.128,-5.007],[0.116,-6.06],[-2.196,-5.475],[-2.986,-3.776],[-2.431,-2.357],[-0.703,-1.523],[1.376,-1.024],[4.522,0.57],[5.533,3.455],[4.011,6.939],[-0.205,8.198]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1014.76,665.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.927,0.244],[0.703,0.45],[0,0],[-1.621,0],[-0.576,0.41],[0,0.8],[0.361,0.371],[0.781,0.195],[0,0],[0.683,0.712],[0,1.152],[-0.966,0.82],[-1.738,0],[-0.86,-0.214],[-0.683,-0.351],[0,0],[1.308,0],[0.527,-0.39],[0,-0.742],[-0.371,-0.361],[-0.782,-0.195],[0,0],[-0.673,-0.732],[0,-1.19],[1.014,-0.839],[1.795,0]],"o":[[-0.928,-0.244],[0,0],[1.367,0.86],[1.112,0],[0.575,-0.41],[0,-0.625],[-0.361,-0.371],[0,0],[-1.425,-0.332],[-0.683,-0.712],[0,-1.444],[0.967,-0.82],[0.859,0],[0.858,0.215],[0,0],[-1.367,-0.703],[-1.015,0],[-0.528,0.39],[0,0.586],[0.371,0.361],[0,0],[1.424,0.332],[0.674,0.732],[0,1.483],[-1.016,0.839],[-0.996,0]],"v":[[-3.088,7.831],[-5.533,6.792],[-4.684,4.771],[-0.204,6.06],[2.328,5.445],[3.191,3.63],[2.65,2.138],[0.937,1.289],[-1.142,0.79],[-4.303,-0.776],[-5.328,-3.571],[-3.879,-6.967],[0.176,-8.198],[2.753,-7.875],[5.065,-7.026],[4.129,-5.007],[0.117,-6.06],[-2.195,-5.475],[-2.985,-3.776],[-2.43,-2.357],[-0.702,-1.523],[1.377,-1.024],[4.523,0.57],[5.534,3.455],[4.012,6.939],[-0.204,8.198]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[999.857,665.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[983.724,665.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[969.436,664.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.249,1.444],[0,2.576],[-0.576,1.24],[-1.044,0.683],[-1.366,0],[-0.78,-0.225],[-0.645,-0.409],[0,0],[1.151,0],[0.771,-1.025],[0,-1.834],[-0.81,-1.044],[-1.562,0],[-1.132,0.644],[0,0],[0.78,-0.225],[0.878,0]],"o":[[-1.249,-1.444],[0,-1.64],[0.575,-1.239],[1.044,-0.683],[0.78,0],[0.78,0.224],[0,0],[-1.268,-0.682],[-1.386,0],[-0.771,1.025],[0,2.03],[0.809,1.044],[1.171,0],[0,0],[-0.566,0.429],[-0.781,0.224],[-2.206,0]],"v":[[-3.909,6.046],[-5.782,0.015],[-4.919,-4.304],[-2.489,-7.187],[1.127,-8.212],[3.469,-7.875],[5.607,-6.924],[4.698,-4.992],[1.069,-6.016],[-2.167,-4.479],[-3.323,-0.19],[-2.108,4.421],[1.449,5.987],[4.904,5.021],[5.782,6.895],[3.762,7.876],[1.274,8.213]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[954.459,665.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.616,2.81],[-0.044,-8.022],[-3.674,2.81]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.346,4.978],[-4.406,4.978],[-6.281,10.599],[-8.885,10.599],[-1.362,-10.599],[1.361,-10.599],[8.885,10.599],[6.25,10.599]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[936.131,662.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.997,0.688],[-2.664,4.654],[0.776,5.987],[4.786,4.815],[5.695,6.69],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.102,-8.212],[4.758,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[909.251,665.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.763,-7.846],[1.318,7.846],[-1.289,7.846],[-6.763,-7.846],[-4.187,-7.846],[0.058,5.3],[4.245,-7.846]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[892.371,665.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[875.301,665.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.684,0.732],[0,1.444],[0.702,0.742],[1.366,0],[0,0]],"o":[[0,0],[1.327,0],[0.682,-0.732],[0,-1.425],[-0.703,-0.742],[0,0],[0,0]],"v":[[-4.904,0.322],[-0.278,0.322],[2.738,-0.776],[3.762,-4.04],[2.708,-7.29],[-0.395,-8.403],[-4.904,-8.403]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.161,-1.151],[0,-2.049],[0.78,-1.084],[1.464,-0.352],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[2.068,0],[1.161,1.152],[0,1.679],[-0.781,1.083],[0,0],[0,0],[0,0]],"v":[[-0.835,2.489],[-4.904,2.489],[-4.904,10.598],[-7.334,10.598],[-7.334,-10.598],[-0.278,-10.598],[4.567,-8.871],[6.309,-4.07],[5.138,0.073],[1.771,2.225],[7.333,10.598],[4.347,10.598]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[857.455,662.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.956,-0.556],[-0.518,-1.014],[0,-1.327],[0.585,-1.064],[1.073,-0.585],[1.406,0],[1.025,0.282],[0.722,0.468],[0,0],[-0.83,-0.244],[-0.742,0],[-0.821,0.84],[0,1.484],[0.77,0.8],[1.347,0],[0.625,-0.185],[0.468,-0.351],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.586,0.127],[-0.566,0]],"o":[[0.956,0.556],[0.517,1.016],[0,1.386],[-0.586,1.064],[-1.074,0.586],[-0.995,0],[-1.024,-0.283],[0,0],[0.721,0.429],[0.829,0.244],[1.425,0],[0.819,-0.839],[0,-1.424],[-0.772,-0.8],[-0.664,0],[-0.624,0.186],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.469,-0.214],[0.585,-0.127],[1.248,0]],"v":[[3.382,-2.107],[5.593,0.248],[6.367,3.763],[5.49,7.436],[3.002,9.91],[-0.718,10.789],[-3.747,10.365],[-6.367,9.237],[-5.401,7.159],[-3.073,8.169],[-0.718,8.534],[2.651,7.276],[3.88,3.792],[2.724,0.455],[-0.453,-0.747],[-2.386,-0.469],[-4.024,0.336],[-5.518,-0.482],[-4.875,-10.789],[5.461,-10.789],[5.461,-8.68],[-2.795,-8.68],[-3.234,-2.24],[-1.654,-2.752],[0.073,-2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[829.698,662.535],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.742,1.425],[0,3.025],[0.741,1.425],[1.581,0],[0.741,-1.425],[0,-3.025],[-0.743,-1.425],[-1.581,0]],"o":[[0.741,-1.425],[0,-3.025],[-0.742,-1.425],[-1.562,0],[-0.743,1.425],[0,3.025],[0.741,1.425],[1.561,0]],"v":[[3.47,6.676],[4.582,0.001],[3.47,-6.674],[-0.014,-8.811],[-3.469,-6.674],[-4.581,0.001],[-3.469,6.676],[0.015,8.813]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.171,1.786],[0,3.747],[-1.161,1.786],[-2.381,0],[-1.172,-1.786],[0,-3.748],[1.161,-1.786],[2.381,0]],"o":[[-1.171,-1.786],[0,-3.748],[1.161,-1.786],[2.38,0],[1.171,1.786],[0,3.747],[-1.162,1.786],[-2.381,0]],"v":[[-5.313,8.301],[-7.07,0.001],[-5.328,-8.299],[-0.014,-10.978],[5.315,-8.299],[7.07,0.001],[5.328,8.301],[0.015,10.979]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[811.516,662.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.958,-1.113],[5.958,-1.113],[5.958,1.112],[-5.958,1.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[792.338,676.193],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.536,0.498],[1.035,0],[0.624,-0.243],[0.625,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.85,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.741,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.704],[5.913,-3.031],[5.913,8.036],[3.542,8.036],[3.542,-2.825],[2.738,-5.006],[0.38,-5.752],[-1.669,-5.387],[-3.543,-4.26],[-3.543,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.718,-7.656],[-3.718,-5.928],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[773.848,664.906],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[755.812,665.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.171,-4.831],[1.201,-4.831],[1.201,10.861],[-1.171,10.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.283,0.292],[0,0.527],[-0.283,0.293],[-0.527,0],[-0.283,-0.293],[0,-0.507],[0.283,-0.293],[0.527,0]],"o":[[-0.283,-0.293],[0,-0.527],[0.283,-0.293],[0.527,0],[0.283,0.293],[0,0.547],[-0.283,0.292],[-0.527,0]],"v":[[-1.215,-7.963],[-1.639,-9.193],[-1.215,-10.422],[0,-10.861],[1.215,-10.422],[1.639,-9.222],[1.215,-7.963],[0,-7.524]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[742.431,662.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":4,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.469,-0.547],[-0.976,0],[-0.547,0.176],[0,0],[0.879,0]],"o":[[-0.819,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.468,0.546],[0.527,0],[0,0],[-0.722,0.235],[-1.601,0]],"v":[[-1.068,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.963,-3.616],[-4.963,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.073,-10.261],[0.073,-5.636],[4.758,-5.636],[4.758,-3.616],[0.073,-3.616],[0.073,4.729],[0.776,7.305],[2.943,8.125],[4.552,7.86],[4.962,9.91],[2.561,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[731.494,662.887],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.653,0.303],[-0.566,0.625],[0,0],[1.142,-0.547],[0,-1.171],[-0.517,-0.458],[-1.014,0]],"o":[[0.654,-0.302],[0,0],[-2.439,0.02],[-1.142,0.547],[0,0.898],[0.517,0.459],[0.8,0]],"v":[[1.727,5.606],[3.557,4.215],[3.557,-0.088],[-1.815,0.761],[-3.528,3.337],[-2.752,5.372],[-0.454,6.06]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-0.849],[0,-1.64],[0,0],[0,0],[0,0],[2.128,0],[0.859,0.82],[0,1.483],[-1.522,0.878],[-3.26,0.02],[0,0],[0.614,0.507],[1.191,0],[1.151,-0.546],[0,0],[-1.639,0]],"o":[[1.034,0.849],[0,0],[0,0],[0,0],[-1.015,1.542],[-1.562,0],[-0.859,-0.819],[0,-1.874],[1.523,-0.879],[0,0],[0,-0.975],[-0.615,-0.508],[-1.307,0],[0,0],[1.424,-0.721],[1.717,0]],"v":[[4.348,-6.924],[5.9,-3.191],[5.9,7.875],[3.733,7.875],[3.733,5.884],[-0.981,8.197],[-4.611,6.967],[-5.899,3.513],[-3.616,-0.615],[3.557,-1.962],[3.557,-2.987],[2.635,-5.211],[-0.073,-5.973],[-3.762,-5.153],[-4.377,-7.115],[0.22,-8.198]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[716.27,665.067],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.323],[0,0],[0,0],[0,0],[-0.254,-0.243],[-0.547,0],[-0.41,0.079],[0,0],[0.644,0]],"o":[[0,0],[0,0],[0,0],[0,0.547],[0.254,0.245],[0.351,0],[0,0],[-0.625,0.156],[-2.283,0]],"v":[[-2.664,7.875],[-2.664,-11.359],[-0.293,-11.359],[-0.293,7.67],[0.087,8.855],[1.288,9.222],[2.43,9.104],[2.664,11.125],[0.761,11.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[704.103,661.759],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.692,1.024],[0,2.011],[0.692,1.034],[1.327,0],[0.692,-1.035],[0,-1.99],[-0.694,-1.025],[-1.346,0]],"o":[[0.692,-1.025],[0,-1.99],[-0.692,-1.035],[-1.366,0],[-0.694,1.034],[0,2.011],[0.692,1.024],[1.348,0]],"v":[[3.059,4.552],[4.099,0],[3.059,-4.537],[0.029,-6.089],[-3.059,-4.537],[-4.099,0],[-3.059,4.552],[-0.001,6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.132,1.396],[0,2.694],[-1.142,1.395],[-2.108,0],[-1.132,-1.396],[0,-2.693],[1.132,-1.405],[2.109,0]],"o":[[-1.132,-1.395],[0,-2.693],[1.141,-1.396],[2.089,0],[1.132,1.395],[0,2.675],[-1.132,1.405],[-2.107,0]],"v":[[-4.86,6.134],[-6.558,0],[-4.845,-6.133],[0.029,-8.227],[4.86,-6.133],[6.558,0],[4.86,6.119],[-0.001,8.227]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[689.376,665.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.654,0.995],[0,1.971],[0.683,1.025],[1.347,0],[0.595,-0.293],[0.546,-0.625],[0,0],[-0.673,-0.302],[-0.742,0]],"o":[[0.653,-0.996],[0,-1.991],[-0.684,-1.024],[-0.723,0],[-0.595,0.293],[0,0],[0.487,0.546],[0.674,0.303],[1.288,0]],"v":[[2.855,1.728],[3.835,-2.722],[2.811,-7.246],[-0.234,-8.782],[-2.21,-8.344],[-3.922,-6.967],[-3.922,1.494],[-2.181,2.766],[-0.058,3.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.035,-1.464],[0,-2.616],[1.083,-1.435],[1.951,0],[0.694,0.312],[0.487,0.566],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.761,0.409],[-0.957,0]],"o":[[1.034,1.464],[0,2.557],[-1.084,1.434],[-0.821,0],[-0.692,-0.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0.526,-0.8],[0.761,-0.41],[1.853,0]],"v":[[4.744,-8.87],[6.294,-2.751],[4.67,3.236],[0.118,5.387],[-2.152,4.919],[-3.922,3.602],[-3.922,11.067],[-6.294,11.067],[-6.294,-10.686],[-4.098,-10.686],[-4.098,-8.636],[-2.166,-10.451],[0.411,-11.066]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[672.041,667.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-0.253],[0,0],[0.605,0],[0.556,-0.312],[0.449,-0.663],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.717,0]],"o":[[0,0],[-0.742,-0.214],[-0.742,0],[-0.556,0.313],[0,0],[0,0],[0,0],[0,0],[0,0],[1.114,-1.678],[0.704,0]],"v":[[4.187,-7.627],[3.659,-5.314],[1.639,-5.636],[-0.307,-5.168],[-1.815,-3.704],[-1.815,8.007],[-4.187,8.007],[-4.187,-7.686],[-1.992,-7.686],[-1.992,-5.49],[2.253,-8.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[656.934,664.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,-3.221],[0,0],[0.702,0.849],[1.229,0]],"o":[[0,0],[-0.019,-1.522],[-0.703,-0.849],[-2.402,0]],"v":[[-3.967,-1.245],[4.026,-1.245],[2.943,-4.801],[0.044,-6.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.078,-0.331],[0,0],[-0.81,-0.888],[-1.483,0],[-1.21,0.781],[0,0],[0.887,-0.264],[0.975,0],[1.24,1.444],[0,2.576],[-1.142,1.444],[-2.069,0],[-1.113,-1.327],[0,-2.38]],"o":[[0,0],[0.078,1.757],[0.81,0.889],[1.464,0],[0,0],[-0.625,0.488],[-0.889,0.264],[-2.225,0],[-1.24,-1.444],[0,-2.596],[1.142,-1.445],[1.991,0],[1.112,1.328],[0,0.567]],"v":[[6.308,0.688],[-3.997,0.688],[-2.664,4.654],[0.776,5.987],[4.786,4.815],[5.695,6.69],[3.425,7.816],[0.63,8.212],[-4.568,6.045],[-6.427,0.014],[-4.714,-6.045],[0.102,-8.212],[4.758,-6.221],[6.427,-0.659]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[640.932,665.082],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.819,0.869],[0,1.717],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.468,-0.547],[-0.977,0],[-0.547,0.176],[0,0],[0.878,0]],"o":[[-0.82,-0.869],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1.17],[0.469,0.546],[0.526,0],[0,0],[-0.721,0.235],[-1.601,0]],"v":[[-1.067,8.958],[-2.297,5.079],[-2.297,-3.616],[-4.962,-3.616],[-4.962,-5.636],[-2.297,-5.636],[-2.297,-10.261],[0.075,-10.261],[0.075,-5.636],[4.758,-5.636],[4.758,-3.616],[0.075,-3.616],[0.075,4.729],[0.777,7.305],[2.944,8.125],[4.554,7.86],[4.963,9.91],[2.563,10.261]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[625.94,662.887],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.85,-0.888],[0,-1.561],[0,0],[0,0],[0,0],[0.537,0.498],[1.034,0],[0.625,-0.243],[0.624,-0.507],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.913,0]],"o":[[0.849,0.888],[0,0],[0,0],[0,0],[0,-0.956],[-0.537,-0.498],[-0.742,0],[-0.625,0.245],[0,0],[0,0],[0,0],[0,0],[0,0],[1.288,-1.405],[1.523,0]],"v":[[4.641,-6.704],[5.914,-3.031],[5.914,8.036],[3.543,8.036],[3.543,-2.825],[2.738,-5.006],[0.381,-5.752],[-1.669,-5.387],[-3.542,-4.26],[-3.542,8.036],[-5.914,8.036],[-5.914,-7.656],[-3.717,-7.656],[-3.717,-5.928],[1.083,-8.036]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[610.642,664.906],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.216,-10.598],[1.216,-10.598],[1.216,10.598],[-1.216,10.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[596.692,662.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.383,8.402],[6.383,10.598],[-6.383,10.598],[-6.383,-10.598],[6.03,-10.598],[6.03,-8.403],[-3.952,-8.403],[-3.952,-1.347],[3.513,-1.347],[3.513,0.878],[-3.952,0.878],[-3.952,8.402]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054999998504,0.630999995213,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[575.681,662.345],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"ix":31,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"E Interpolation_01 Linear Interpolation","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"E Interpolation_02 Bezier Interpolation","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"E Interpolation_03 Hold Interpolation","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1597.5,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"E Interpolation_04 Spatial Bezier Interpolation","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"E Interpolation_05 Rove Across Time","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/UXSample_1920x1080/F Masks_All_02_1920x1080.json b/example/resource/UXSample_1920x1080/F Masks_All_02_1920x1080.json new file mode 100755 index 0000000000..e4e2462df9 --- /dev/null +++ b/example/resource/UXSample_1920x1080/F Masks_All_02_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":41,"w":1920,"h":1080,"nm":"F Masks_All_02","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[643.833,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1284.167,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,403],[823,519.5],[994,519.5],[994,403]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[20],"e":[100]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1009.5,484],[1009.5,643],[1101,643],[1101,484]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[50],"e":[100]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"d","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[862,365],[862,626],[1073.5,626],[1073.5,365]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[80],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[80]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,403],[823,519.5],[994,519.5],[994,403]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[100]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1009.5,484],[1009.5,643],[1101,643],[1101,484]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[80]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[80],"e":[100]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[862,365],[862,626],[1073.5,626],[1073.5,365]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[80],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[80]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[904,446],[904,562],[1020,562],[1020,446]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[200]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":20,"s":[200],"e":[0]},{"t":40}],"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[904,446],[904,562],[1020,562],[1020,446]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"SamsungOne-500","fFamily":"SamsungOne","fStyle":"500","ascent":70.9991455078125}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"F Masks_07 Darken","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_07 Darken","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"F Masks_08 Difference","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[679.25,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_08 Difference","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"F Masks_09 Expansion","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1320,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_09 Expansion","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"F Masks_10 Feather","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_10 Feather","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"F Masks_07 Darken_750x488","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"F Masks_08 Difference_750x488","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"F Masks_09 Expansion_750x488","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1597.5,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"F Masks_10 Feather_750x488","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"F","size":150,"style":"500","w":48.7,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-30.716],[42.096,-30.716],[42.096,-37.967],[16.415,-37.967],[16.415,-60.526],[44.211,-60.526],[44.211,-67.877],[7.654,-67.877]],"c":true},"ix":2},"nm":"F","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"F","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":" ","size":150,"style":"500","w":21.2,"data":{},"fFamily":"SamsungOne"},{"ch":"M","size":150,"style":"500","w":80.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.712,-6.848],[0,0],[2.82,8.359],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.201,8.459],[0,0],[-3.223,-9.567],[0,0],[0,0],[0,0],[-2.316,7.956],[0,0],[-0.504,-9.467]],"o":[[0,0],[0,0],[0,0],[0,0],[-3.021,8.56],[0,0],[-1.712,-7.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0.604,-10.172],[0,0],[1.913,8.057],[0,0],[0,0],[0,0],[3.424,-9.366],[0,0],[-0.101,8.459],[0,0]],"v":[[66.568,0],[75.128,0],[70.898,-67.877],[59.72,-67.877],[47.635,-35.046],[40.485,-12.186],[40.182,-12.186],[33.334,-35.046],[21.753,-67.877],[10.574,-67.877],[5.841,0],[14.2,0],[16.013,-29.105],[17.322,-59.116],[17.523,-59.116],[25.378,-32.73],[36.356,-0.403],[43.002,-0.403],[54.987,-33.334],[63.547,-59.116],[63.849,-59.116],[64.856,-29.81]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"M","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"a","size":150,"style":"500","w":48.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.23],[0,0],[14.905,0],[4.028,-2.618],[0,0],[-4.532,0],[0,-4.028],[0,0],[0,-11.783],[-9.869,0],[-2.719,3.827],[0,0],[0,0]],"o":[[-0.604,-3.323],[0,0],[0,-9.769],[-6.143,0],[0,0],[3.424,-2.216],[9.97,0],[0,0],[-18.832,-0.101],[0,7.05],[6.949,0],[0,0],[0,0],[0,0]],"v":[[42.398,0],[41.592,-11.682],[41.592,-29.91],[23.062,-49.85],[7.05,-45.52],[9.064,-39.679],[21.753,-43.304],[32.831,-32.025],[32.831,-31.018],[3.525,-12.891],[18.43,1.108],[33.334,-6.143],[33.636,-6.143],[34.341,0]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-0.906],[6.345,0],[0,5.74],[-9.668,-0.201]],"o":[[0,0.906],[-1.41,4.129],[-4.532,0],[0,-9.467],[0,0]],"v":[[33.032,-16.415],[32.529,-13.596],[20.746,-5.438],[12.387,-13.898],[33.032,-24.875]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"a","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"s","size":150,"style":"500","w":39.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.338,0],[0,8.56],[8.459,3.223],[0,4.028],[-5.237,0],[-1.913,-1.208],[0,0],[4.935,0],[0,-7.855],[-8.762,-3.122],[0,-4.23],[6.445,0],[2.618,1.712]],"o":[[3.424,2.014],[11.581,0],[0,-7.251],[-6.345,-2.417],[0,-3.625],[4.532,0],[0,0],[-2.719,-1.611],[-10.474,0],[0,5.841],[6.546,2.417],[0,4.028],[-4.431,0],[0,0]],"v":[[3.928,-2.316],[17.624,1.007],[35.852,-13.596],[23.062,-28.299],[13.797,-36.557],[21.954,-43.204],[31.924,-40.384],[34.14,-46.829],[22.156,-49.85],[5.338,-35.55],[18.228,-21.753],[27.292,-12.79],[17.825,-5.539],[6.143,-9.064]],"c":true},"ix":2},"nm":"s","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"s","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"k","size":150,"style":"500","w":48.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.208,-1.712],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.41,1.712],[0,0],[0,0]],"v":[[16.113,-71.503],[7.352,-71.503],[7.352,0],[16.113,0],[16.113,-18.329],[20.645,-23.364],[37.463,0],[48.239,0],[26.788,-28.702],[45.621,-48.743],[34.946,-48.743],[20.645,-31.924],[16.315,-26.385],[16.113,-26.385]],"c":true},"ix":2},"nm":"k","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"k","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"_","size":150,"style":"500","w":50,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,7.553],[0,12.589],[50.354,12.589],[50.354,7.553]],"c":true},"ix":2},"nm":"_","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"_","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"1","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.767,0],[32.327,0],[32.327,-65.46],[24.774,-65.46],[10.474,-57.806],[12.186,-51.059],[23.566,-57.202],[23.767,-57.202]],"c":true},"ix":2},"nm":"1","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"0","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.797,0],[0,-21.954],[-12.79,0],[0,22.256]],"o":[[-13.293,0],[0.201,21.652],[14.502,0],[0,-20.847]],"v":[[26.385,-66.568],[3.625,-32.529],[25.278,1.108],[48.038,-33.435]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.755,0],[0,-16.113],[9.064,0],[0,17.02]],"o":[[9.164,0],[0,16.718],[-8.057,0],[0,-17.825]],"v":[[25.882,-59.72],[39.175,-33.032],[25.781,-5.74],[12.488,-32.428]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"0","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"e","size":150,"style":"500","w":50.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.813],[15.912,0],[0,-14.703],[-15.005,0],[-3.122,1.41],[0,0],[6.345,0],[0.201,11.984]],"o":[[0.101,-0.906],[0,-8.963],[-14.2,0],[0,14.703],[7.755,0],[0,0],[-3.323,1.41],[-8.862,0],[0,0]],"v":[[46.527,-22.76],[46.829,-26.889],[26.688,-49.85],[3.827,-23.566],[27.795,1.007],[44.009,-2.014],[42.499,-8.359],[29.004,-5.841],[12.286,-22.76]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-8.963,0],[0.101,-5.64]],"o":[[0.705,-6.143],[9.97,0],[0,0]],"v":[[12.387,-29.105],[25.983,-43.506],[38.269,-29.105]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"t","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.518,-2.618],[-4.129,0],[-1.712,0.705],[0,0],[2.316,0],[0,6.042],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.74],[2.115,2.417],[3.424,0],[0,0],[-1.108,0.302],[-4.935,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.366,-60.425],[9.366,-48.743],[1.813,-48.743],[1.813,-41.995],[9.366,-41.995],[9.366,-15.408],[12.79,-2.719],[22.357,1.007],[30.212,-0.201],[29.81,-6.848],[24.673,-6.244],[18.027,-15.71],[18.027,-41.995],[30.716,-41.995],[30.716,-48.743],[18.027,-48.743],[18.027,-62.741]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"h","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.208],[-5.74,0],[0,-7.855],[0,0],[0,0],[0,0],[6.546,0],[2.618,-1.511],[1.41,-2.518],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-1.712],[1.611,-4.834],[8.359,0],[0,0],[0,0],[0,0],[0,-16.818],[-3.323,0],[-2.719,1.511],[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.407],[16.818,-33.636],[28.702,-42.499],[39.981,-27.997],[39.981,0],[48.843,0],[48.843,-29.004],[31.824,-49.85],[22.76,-47.333],[16.415,-41.089],[16.214,-41.089],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"h","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"h","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"r","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.201,1.208],[-6.244,0],[-0.906,-0.201],[0,0],[1.007,0],[2.216,-6.546],[0,0],[0,0],[0,0],[0,-5.74]],"o":[[0,0],[0,0],[0,-1.511],[1.208,-6.647],[1.208,0],[0,0],[-0.806,-0.201],[-5.942,0],[0,0],[0,0],[0,0],[0.302,4.532],[0,0]],"v":[[7.352,0],[16.113,0],[16.113,-25.983],[16.516,-30.112],[28.4,-41.492],[31.421,-41.19],[31.421,-49.548],[28.903,-49.85],[15.408,-39.175],[15.005,-39.175],[14.703,-48.743],[6.949,-48.743],[7.352,-33.536]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"9","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.223,0.504],[-5.035,4.935],[0,14.401],[13.394,0],[0,-12.387],[-11.783,0],[-3.625,4.431],[0,0],[4.33,-3.928],[5.136,-0.705],[1.913,0.201]],"o":[[2.115,0.101],[7.05,-0.806],[6.445,-6.244],[0,-16.718],[-13.394,0],[0,11.179],[6.546,0],[0,0],[-1.208,7.755],[-3.726,3.525],[-3.021,0.302],[0,0]],"v":[[9.668,1.007],[17.825,0.504],[36.859,-8.258],[48.138,-38.974],[26.486,-66.568],[4.129,-43.304],[23.465,-23.264],[38.873,-30.313],[39.175,-30.313],[30.515,-12.891],[16.818,-6.546],[9.668,-6.244]],"c":true},"ix":2},"nm":"9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.553,0],[0,-11.179],[0.504,-0.806],[5.942,0],[0,8.157]],"o":[[9.265,0],[0,1.41],[-2.316,3.928],[-7.654,0],[0,-9.265]],"v":[[25.781,-59.821],[39.175,-40.082],[38.37,-36.859],[25.479,-30.011],[12.891,-43.909]],"c":true},"ix":2},"nm":"9","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"9","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"E","size":150,"style":"500","w":49.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.801,-39.075],[16.415,-39.075],[16.415,-60.526],[44.312,-60.526],[44.312,-67.877],[7.654,-67.877],[7.654,0],[45.822,0],[45.822,-7.352],[16.415,-7.352],[16.415,-31.824],[42.801,-31.824]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"E","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"x","size":150,"style":"500","w":46.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-1.611,2.921],[0,0],[-1.913,-2.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.611,-2.921],[0,0],[1.813,2.719],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.813,-2.921],[0,0],[1.712,2.921],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.611,2.618],[0,0],[-1.611,-2.719],[0,0],[0,0]],"v":[[1.611,-48.743],[18.127,-24.875],[0.806,0],[10.574,0],[17.624,-10.977],[22.76,-19.437],[22.961,-19.437],[28.198,-10.977],[35.349,0],[45.419,0],[28.299,-25.177],[44.916,-48.743],[35.349,-48.743],[28.5,-38.37],[23.666,-30.313],[23.364,-30.313],[18.43,-38.269],[11.481,-48.743]],"c":true},"ix":2},"nm":"x","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"x","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"p","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.445,0],[0,17.523],[11.783,0],[3.625,-5.942],[0,0],[0,0],[0,0],[0,-6.244]],"o":[[0,0],[0,0],[0,0],[2.921,4.834],[11.481,0],[0,-14.804],[-7.956,0],[0,0],[0,0],[0,0],[0.201,4.633],[0,0]],"v":[[7.352,19.94],[16.113,19.94],[16.113,-6.546],[16.315,-6.546],[31.32,1.108],[53.476,-25.076],[32.831,-49.85],[15.509,-40.384],[15.308,-40.384],[14.905,-48.743],[6.949,-48.743],[7.352,-32.831]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.302,1.108],[-6.042,0],[0,-9.769],[9.366,0],[1.611,6.143],[0,1.309]],"o":[[0,-1.208],[1.712,-6.647],[9.366,0],[0,11.179],[-6.345,0],[-0.201,-1.108],[0,0]],"v":[[16.113,-28.198],[16.718,-31.824],[30.112,-42.801],[44.614,-24.673],[29.81,-5.841],[16.516,-16.214],[16.113,-19.839]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"p","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"n","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.403,1.108],[-5.841,0],[0,-7.855],[0,0],[0,0],[0,0],[6.747,0],[2.417,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.511,-4.935],[8.359,0],[0,0],[0,0],[0,0],[0,-16.718],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.306],[16.818,-33.435],[28.702,-42.499],[39.981,-28.098],[39.981,0],[48.843,0],[48.843,-29.105],[31.622,-49.85],[15.509,-40.686],[15.308,-40.686],[14.804,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"n","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"n","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"i","size":150,"style":"500","w":23.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.214,0],[16.214,-48.743],[7.352,-48.743],[7.352,0]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.323,0],[0,-3.122],[-3.122,0],[0.101,3.021]],"o":[[-3.223,0],[0,3.021],[3.525,0],[0,-3.122]],"v":[[11.783,-67.978],[6.244,-62.439],[11.581,-57.001],[17.221,-62.439]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"i","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"o","size":150,"style":"500","w":54.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.998,0],[0,-16.315],[-13.193,0],[0,18.027]],"o":[[-13.495,0],[0,15.408],[11.783,0],[0,-14.905]],"v":[[27.997,-49.85],[3.827,-23.969],[27.191,1.108],[51.462,-24.774]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-10.474,0],[0,-8.258],[8.459,0],[0,10.675]],"o":[[10.474,0],[0,10.977],[-8.661,0],[0,-9.265]],"v":[[27.795,-43.204],[42.398,-24.472],[27.594,-5.539],[12.79,-24.271]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"8","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.696,0],[0,11.38],[8.157,3.223],[0,0],[0,5.539],[12.689,0],[0,-10.373],[-7.251,-3.424],[0,0],[0,-8.258]],"o":[[12.488,0],[0,-7.956],[0,0],[8.057,-3.827],[0,-8.157],[-11.481,0],[0,5.64],[0,0],[-8.057,3.424],[0,9.567]],"v":[[25.681,1.108],[47.937,-17.926],[34.744,-34.845],[34.744,-35.147],[45.52,-50.455],[26.486,-66.568],[6.244,-49.146],[16.617,-34.442],[16.718,-34.14],[3.726,-16.617]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.956,0],[-0.302,6.647],[-7.654,2.216],[0,-7.956]],"o":[[-8.359,0],[0,-6.244],[8.862,2.518],[0,6.747]],"v":[[25.882,-5.338],[12.79,-17.825],[24.573,-31.32],[38.974,-17.02]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-7.352,0],[0,-5.237],[5.64,-1.913],[0,6.546]],"o":[[7.956,0],[0,5.942],[-7.553,-2.014],[0,-5.64]],"v":[[25.983,-60.223],[37.061,-49.548],[27.09,-37.665],[14.603,-49.75]],"c":true},"ix":2},"nm":"8","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"8","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"D","size":150,"style":"500","w":66.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.244,0],[-6.345,6.345],[0,11.078],[6.042,5.539],[12.589,0],[5.338,-0.806]],"o":[[4.431,0.504],[13.193,0],[6.345,-6.244],[0,-10.977],[-5.942,-5.539],[-6.949,0],[0,0]],"v":[[7.654,-0.201],[23.566,0.604],[53.577,-9.164],[63.345,-35.55],[53.778,-59.921],[26.285,-68.381],[7.654,-66.971]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-4.532,0],[0.101,-16.013],[18.732,0],[2.216,0.403]],"o":[[2.316,-0.504],[18.53,0],[0,18.329],[-3.424,0],[0,0]],"v":[[16.415,-60.526],[26.688,-61.432],[54.181,-35.248],[25.278,-6.445],[16.415,-6.949]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"D","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"f","size":150,"style":"500","w":29.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.553,0],[-1.309,-0.604],[0,0],[3.122,0],[3.323,-3.223],[0,-6.848],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,-7.452],[2.518,0],[0,0],[-1.712,-0.705],[-4.129,0],[-4.129,3.928],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[17.02,0],[17.02,-41.995],[28.802,-41.995],[28.802,-48.743],[17.02,-48.743],[17.02,-51.361],[26.486,-65.46],[32.126,-64.352],[33.334,-71.201],[25.781,-72.61],[13.898,-68.079],[8.258,-51.059],[8.258,-48.743],[1.41,-48.743],[1.41,-41.995],[8.258,-41.995],[8.258,0]],"c":true},"ix":2},"nm":"f","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"f","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"c","size":150,"style":"500","w":44.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.035,0],[0,11.279],[-11.179,0],[-2.115,-1.208],[0,0],[5.237,0],[0,-15.005],[-14.703,0],[-2.316,1.208]],"o":[[-2.518,1.108],[-9.668,0],[0,-10.172],[4.834,0],[0,0],[-2.417,-1.208],[-15.912,0],[0,14.905],[6.546,0],[0,0]],"v":[[40.585,-8.459],[29.709,-6.042],[12.79,-24.271],[30.011,-42.7],[40.283,-40.384],[42.297,-47.232],[30.011,-49.75],[3.827,-23.868],[28.098,1.007],[42.096,-1.813]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"7","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.74,-65.46],[5.74,-58.109],[37.766,-58.109],[37.766,-57.907],[9.366,0],[18.53,0],[47.031,-59.619],[47.031,-65.46]],"c":true},"ix":2},"nm":"7","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"7","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"}]} \ No newline at end of file diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp new file mode 100644 index 0000000000..03fe21115b --- /dev/null +++ b/example/uxsampletest.cpp @@ -0,0 +1,101 @@ +#include"evasapp.h" +#include "lottieview.h" +#include +#include + +class UxSampleTest +{ +public: + UxSampleTest(EvasApp *app, bool renderMode) { + mApp = app; + mRenderMode = renderMode; + mResourceList = EvasApp::jsonFiles(std::string(DEMO_DIR) + "UXSample_1920x1080/"); + mRepeatMode = LottieView::RepeatMode::Restart; + } + + void showPrev() { + if (mResourceList.empty()) return; + mCurIndex--; + if (mCurIndex < 0) + mCurIndex = mResourceList.size() - 1; + show(); + } + + void showNext() { + if (mResourceList.empty()) return; + + mCurIndex++; + if (mCurIndex >= int(mResourceList.size())) + mCurIndex = 0; + show(); + } + +private: + void show() { + mView = std::unique_ptr(new LottieView(mApp->evas(), mRenderMode)); + mView->setFilePath(mResourceList[mCurIndex].c_str()); + mView->setPos(0, 0); + mView->setSize(mApp->width(), mApp->height()); + mView->show(); + mView->play(); + mView->loop(true); + mView->setRepeatMode(mRepeatMode); + } + +public: + EvasApp *mApp; + bool mRenderMode = false; + int mCurIndex = -1; + std::vector mResourceList; + std::unique_ptr mView; + LottieView::RepeatMode mRepeatMode; +}; + +static void +onExitCb(void *data, void *extra) +{ + UxSampleTest *view = (UxSampleTest *)data; + delete view; +} + +static void +onKeyCb(void *data, void *extra) +{ + UxSampleTest *view = (UxSampleTest *)data; + char *keyname = (char *)extra; + + if (!strcmp(keyname, "Right") || !strcmp(keyname, "n")) { + view->showNext(); + } else if (!strcmp(keyname, "Left") || !strcmp(keyname, "p")) { + view->showPrev(); + } else if (!strcmp(keyname,"r")) { + if (view->mRepeatMode == LottieView::RepeatMode::Restart) { + view->mRepeatMode = LottieView::RepeatMode::Reverse; + } else + view->mRepeatMode = LottieView::RepeatMode::Restart; + if (view->mView) + view->mView->setRepeatMode(view->mRepeatMode); + } +} + +int +main(int argc, char **argv) +{ + EvasApp *app = new EvasApp(800, 800); + app->setup(); + + bool renderMode = true; + if (argc > 1) { + if (!strcmp(argv[1],"--disable-render")) + renderMode = false; + } + UxSampleTest *view = new UxSampleTest(app, renderMode); + view->showNext(); + + app->addExitCb(onExitCb, view); + app->addKeyCb(onKeyCb, view); + + app->run(); + delete app; + return 0; +} From 5c0a4f4414e83598decbc5fa3424712d191a9cb1 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 17 Jul 2018 17:20:29 +0900 Subject: [PATCH 028/672] player: update seek behavior. 1. set default position 0 2. renamed to setPos() 3. add getter() Change-Id: Ibf4038f666e686ff00d17066c012e7fb2d8e2709 --- example/lottieview.cpp | 2 +- inc/lottieplayer.h | 3 ++- src/lottie/lottieplayer.cpp | 32 +++++++++++++++++++++++++------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index da757d6549..075ff3be76 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -146,7 +146,7 @@ void LottieView::seek(float pos) evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); } } else { - mPlayer->seek(pos); + mPlayer->setPos(pos); const std::vector &renderList = mPlayer->renderList(); update(renderList); } diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index c2277991f6..8644f1d7a2 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -48,7 +48,8 @@ public: float playTime() const; - void seek(float pos); + void setPos(float pos); + float pos(); const std::vector& renderList() const; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index bda32137ab..314a8f2ede 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -15,14 +15,18 @@ public: void setSize(const VSize &sz); void size(int &w, int &h) const; float playTime() const; - bool seek(float pos); + bool setPos(float pos); + float pos(); const std::vector& renderList()const; bool render(float pos, const LOTBuffer &buffer); public: std::string mFilePath; std::shared_ptr mModel; std::unique_ptr mCompItem; - VSize mSize; + VSize mSize; + +private: + float mPos; }; void LOTPlayerPrivate::setSize(const VSize &sz) @@ -63,20 +67,28 @@ float LOTPlayerPrivate::playTime() const return float(mModel->frameDuration()) / float(mModel->frameRate()); } -bool LOTPlayerPrivate::seek(float pos) +bool LOTPlayerPrivate::setPos(float pos) { if (!mModel || !mCompItem) return false; if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; if (mModel->isStatic()) pos = 0; + + if (vCompare(pos, mPos)) return true; + int frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); return mCompItem->update(frameNumber); } +float LOTPlayerPrivate::pos() +{ + return mPos; +} + bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) { - if (seek(pos)) { + if (setPos(pos)) { if (mCompItem->render(buffer)) return true; else @@ -86,7 +98,7 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) } } -LOTPlayerPrivate::LOTPlayerPrivate() +LOTPlayerPrivate::LOTPlayerPrivate():mPos(-1) { } @@ -103,6 +115,7 @@ LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::unique_ptr(new LOTCompItem(mModel.get())); + setPos(0); return true; } return false; @@ -145,9 +158,14 @@ float LOTPlayer::playTime() const return d->playTime(); } -void LOTPlayer::seek(float pos) +void LOTPlayer::setPos(float pos) { - d->seek(pos); + d->setPos(pos); +} + +float LOTPlayer::pos() +{ + return d->pos(); } const std::vector& LOTPlayer::renderList()const From 1707193e15aa0b5dbc16575c1f80acdd3f62b42a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 17 Jul 2018 19:23:22 +0900 Subject: [PATCH 029/672] vector: clean up single, double-decision comparison Change-Id: I9ed37192c9c1236103aeeb7f239bbae2dabe6368 --- src/lottie/lottieitem.cpp | 2 +- src/vector/vbezier.cpp | 4 ++-- src/vector/vdasher.cpp | 2 +- src/vector/vdrawhelper.cpp | 4 ++-- src/vector/vglobal.h | 28 +++++++++++----------------- src/vector/vmatrix.cpp | 18 +++++++++--------- src/vector/vpath.cpp | 16 ++++++++-------- src/vector/vpoint.h | 2 +- 8 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 72744051a6..c4129ca131 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -703,7 +703,7 @@ void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, float m = mData->mTransform->matrix(frameNo) * parentMatrix; alpha *= mData->mTransform->opacity(frameNo); - if (!floatCmp(alpha, parentAlpha)) { + if (!vCompare(alpha, parentAlpha)) { newFlag |= DirtyFlagBit::Alpha; } } diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index 34e5093838..c3874f4c0a 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -48,7 +48,7 @@ VBezier::length()const chord = lineLength(x1, y1, x4, y4); - if (!floatCmp(len, chord)) { + if (!vCompare(len, chord)) { split(&left, &right); /* split in two */ length = left.length() + /* try left side */ @@ -80,7 +80,7 @@ float VBezier::tAtLength(float l) const float len = length(); float t = 1.0; const float error = 0.01; - if (l > len || floatCmp(l, len)) + if (l > len || vCompare(l, len)) return t; t *= 0.5; diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 8c9f7382de..f3d7f882bf 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -70,7 +70,7 @@ void VDasher::moveTo(const VPointF &p) mStartPt = p; mCurPt = p; - if (!floatCmp(mDashOffset, 0.0)) { + if (!vCompare(mDashOffset, 0.0f)) { float totalLength = 0.0; for (int i = 0; i < mArraySize ; i++) { totalLength = mDashArray[i].length + mDashArray[i].gap; diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index a2c89328d9..d43198a506 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -209,7 +209,7 @@ getRadialGradientValues(RadialGradientValues *v, const VSpanData *data) v->a = v->dr * v->dr - v->dx*v->dx - v->dy*v->dy; v->inv2a = 1 / (2 * v->a); - v->extended = !vIsNull(gradient.radial.fradius) || v->a <= 0; + v->extended = !vIsZero(gradient.radial.fradius) || v->a <= 0; } static inline int @@ -360,7 +360,7 @@ static void fetch(uint32_t *buffer, uint32_t *end, void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData *data, int y, int x, int length) { // avoid division by zero - if (vIsNull(op->radial.a)) { + if (vIsZero(op->radial.a)) { memfill32(buffer, 0, length); return; } diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index aa9e617bad..898460024b 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -79,35 +79,29 @@ V_CONSTEXPR inline const T &vMin(const T &a, const T &b) { return (a < b) ? a : template V_CONSTEXPR inline const T &vMax(const T &a, const T &b) { return (a < b) ? b : a; } + + +static const double EPSILON_DOUBLE = 0.000000000001f; +static const float EPSILON_FLOAT = 0.000001f; + static inline bool vCompare(double p1, double p2) { - return (std::abs(p1 - p2) * 1000000000000. <= vMin(std::abs(p1), std::abs(p2))); + return (std::abs(p1 - p2) < EPSILON_DOUBLE); } static inline bool vCompare(float p1, float p2) { - return (std::abs(p1 - p2) * 100000.f <= vMin(std::abs(p1), std::abs(p2))); + return (std::abs(p1 - p2) < EPSILON_FLOAT); } -static inline bool floatCmp(float p1, float p2) +static inline bool vIsZero(float f) { - return (std::abs(p1 - p2) * 100000.f <= fminf(std::abs(p1), std::abs(p2))); + return (std::abs(f) <= EPSILON_FLOAT); } -static inline bool floatNull(float f) +static inline bool vIsZero(double f) { - return std::abs(f) <= 0.00001f; -} - - -static inline bool vIsNull(double d) -{ - return std::abs(d) <= 0.000000000001; -} - -static inline bool vIsNull(float f) -{ - return std::abs(f) <= 0.00001f; + return (std::abs(f) <= EPSILON_DOUBLE); } // Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index ad5192d246..2a72700a7b 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -43,7 +43,7 @@ bool VMatrix::isIdentity() const bool VMatrix::isInvertible() const { - return !vIsNull(determinant()); + return !vIsZero(determinant()); } bool VMatrix::isScaling() const @@ -178,27 +178,27 @@ VMatrix::MatrixType VMatrix::type() const switch (static_cast(d->dirty)) { case MatrixType::Project: - if (!vIsNull(d->m13) || !vIsNull(d->m23) || !vIsNull(d->m33 - 1)) { + if (!vIsZero(d->m13) || !vIsZero(d->m23) || !vIsZero(d->m33 - 1)) { d->type = MatrixType::Project; break; } case MatrixType::Shear: case MatrixType::Rotate: - if (!vIsNull(d->m12) || !vIsNull(d->m21)) { + if (!vIsZero(d->m12) || !vIsZero(d->m21)) { const float dot = d->m11 * d->m12 + d->m21 * d->m22; - if (vIsNull(dot)) + if (vIsZero(dot)) d->type = MatrixType::Rotate; else d->type = MatrixType::Shear; break; } case MatrixType::Scale: - if (!vIsNull(d->m11 - 1) || !vIsNull(d->m22 - 1)) { + if (!vIsZero(d->m11 - 1) || !vIsZero(d->m22 - 1)) { d->type = MatrixType::Scale; break; } case MatrixType::Translate: - if (!vIsNull(d->mtx) || !vIsNull(d->mty)) { + if (!vIsZero(d->mtx) || !vIsZero(d->mty)) { d->type = MatrixType::Translate; break; } @@ -566,8 +566,8 @@ VMatrix VMatrix::inverted(bool *invertible) const invert.d->mty = -d->mty; break; case MatrixType::Scale: - inv = !vIsNull(d->m11); - inv &= !vIsNull(d->m22); + inv = !vIsZero(d->m11); + inv &= !vIsZero(d->m22); if (inv) { invert.d->m11 = 1. / d->m11; invert.d->m22 = 1. / d->m22; @@ -578,7 +578,7 @@ VMatrix VMatrix::inverted(bool *invertible) const default: // general case float det = determinant(); - inv = !vIsNull(det); + inv = !vIsZero(det); if (inv) invert = (adjoint() /= det); //TODO Test above line diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 4df2918482..ba352ee7f3 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -280,8 +280,8 @@ tForArcAngle(float angle) { float radians, cos_angle, sin_angle, tc, ts, t; - if (floatCmp(angle,0.f)) return 0; - if (floatCmp(angle, 90.0)) return 1; + if (vCompare(angle,0.f)) return 0; + if (vCompare(angle, 90.0f)) return 1; radians = (angle/180) * M_PI; @@ -389,13 +389,13 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, } // avoid empty start segment - if (floatNull(startT - float(1))) { + if (vIsZero(startT - float(1))) { startT = 0; startSegment += delta; } // avoid empty end segment - if (floatNull(endT)) { + if (vIsZero(endT)) { endT = 1; endSegment -= delta; } @@ -403,8 +403,8 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, startT = tForArcAngle(startT * 90); endT = tForArcAngle(endT * 90); - const bool splitAtStart = !floatNull(startT); - const bool splitAtEnd = !floatNull(endT - float(1)); + const bool splitAtStart = !vIsZero(startT); + const bool splitAtEnd = !vIsZero(endT - float(1)); const int end = endSegment + delta; @@ -429,7 +429,7 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, b = VBezier::fromPoints(points[j], points[j + 1], points[j + 2], points[j + 3]); // empty arc? - if (startSegment == endSegment && floatCmp(startT, endT)) + if (startSegment == endSegment && vCompare(startT, endT)) return startPoint; if (i == startSegment) { @@ -546,7 +546,7 @@ void VPath::addRect(const VRectF &rect, VPath::Direction dir) void VPath::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) { - if (floatCmp(rx, 0.f) || floatCmp(ry, 0.f)) { + if (vCompare(rx, 0.f) || vCompare(ry, 0.f)) { addRect(rect, dir); return; } diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 9206856238..3d47514a8f 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -37,7 +37,7 @@ private: inline const bool fuzzyCompare(const VPointF & p1, const VPointF & p2) { - return (floatCmp(p1.mx , p2.mx) && floatCmp(p1.my , p2.my)); + return (vCompare(p1.mx , p2.mx) && vCompare(p1.my , p2.my)); } From 007ad71a398f18093d2544bc11047c6d73b82091 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 09:14:47 +0900 Subject: [PATCH 030/672] lottie/example: add ux sample files Change-Id: I7b632fa515411becc26f07dced2cdcc30a9f21cd --- .../resource/UXSample_1920x1080/F Masks_All_01_1920x1080.json | 1 + 1 file changed, 1 insertion(+) create mode 100755 example/resource/UXSample_1920x1080/F Masks_All_01_1920x1080.json diff --git a/example/resource/UXSample_1920x1080/F Masks_All_01_1920x1080.json b/example/resource/UXSample_1920x1080/F Masks_All_01_1920x1080.json new file mode 100755 index 0000000000..40895fb58e --- /dev/null +++ b/example/resource/UXSample_1920x1080/F Masks_All_01_1920x1080.json @@ -0,0 +1 @@ +{"v":"5.1.18","fr":30,"ip":0,"op":41,"w":1920,"h":1080,"nm":"F Masks_All_01","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1924.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[643.833,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[1284.167,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[3.5,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[60,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-994,4],[1024,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,461],[823,547],[1101,547],[1101,461]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0],"e":[100]},{"t":30}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1060,471],[1060,537],[1126,537],[1126,471]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1060,471],[1060,537],[1126,537],[1126,471]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}]},{"t":40}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1060,471],[1060,537],[1126,537],[1126,471]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1060,471],[1060,537],[1126,537],[1126,471]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}]},{"t":40}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"i","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1087,365],[1087,643],[1101,643],[1101,365]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1087,365],[1087,643],[1101,643],[1101,365]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}]},{"t":40}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"i","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[836.5,643],[836.5,365]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[836.5,643],[836.5,365]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,365],[823,643],[1101,643],[1101,365]],"c":true}]},{"t":40}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]},{"id":"comp_6","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectantgle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,244,0],"ix":2},"a":{"a":0,"k":[962,504,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[823,403],[823,519.5],[994,519.5],[994,403]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[90],"e":[100]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1009.5,484],[1009.5,643],[1101,643],[1101,484]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[80]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[80],"e":[100]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"l","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[862,365],[862,626],[1073.5,626],[1073.5,365]],"c":true},"ix":1},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[80],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[80]},{"t":40}],"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139,139],[-139,139],[-139,-139],[139,-139]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.054901960784,0.63137254902,0.901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[962,504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":6300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"SamsungOne-500","fFamily":"SamsungOne","fStyle":"500","ascent":70.9991455078125}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"div","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"F Masks_01 Mask Path","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_01 Mask Path","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"F Masks_02 Mask Opacity","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[679.25,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_02 Mask Opacity","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"F Masks_03 Add","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1320,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_03 Add","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"F Masks_04 Subtract","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.375,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_04 Subtract","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"F Masks_05 Intersect","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[679.25,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_05 Intersect","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":5,"nm":"F Masks_06 Lighten","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1320,601.938,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[14.576,14.576,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":150,"f":"SamsungOne-500","t":"F Masks_06 Lighten","j":0,"tr":44,"lh":180,"ls":0,"fc":[0.05,0.63,0.9]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"F Masks_01 Mask Path","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"F Masks_02 Mask Opacity","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"F Masks_03 Add","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1597.5,267,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"F Masks_04 Subtract","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"F Masks_05 Intersect","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[965.75,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"F Masks_06 Lighten","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1597.5,809.5,0],"ix":2},"a":{"a":0,"k":[375,244,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"w":750,"h":488,"ip":0,"op":6300,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"F","size":150,"style":"500","w":48.7,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-30.716],[42.096,-30.716],[42.096,-37.967],[16.415,-37.967],[16.415,-60.526],[44.211,-60.526],[44.211,-67.877],[7.654,-67.877]],"c":true},"ix":2},"nm":"F","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"F","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":" ","size":150,"style":"500","w":21.2,"data":{},"fFamily":"SamsungOne"},{"ch":"M","size":150,"style":"500","w":80.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.712,-6.848],[0,0],[2.82,8.359],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.201,8.459],[0,0],[-3.223,-9.567],[0,0],[0,0],[0,0],[-2.316,7.956],[0,0],[-0.504,-9.467]],"o":[[0,0],[0,0],[0,0],[0,0],[-3.021,8.56],[0,0],[-1.712,-7.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0.604,-10.172],[0,0],[1.913,8.057],[0,0],[0,0],[0,0],[3.424,-9.366],[0,0],[-0.101,8.459],[0,0]],"v":[[66.568,0],[75.128,0],[70.898,-67.877],[59.72,-67.877],[47.635,-35.046],[40.485,-12.186],[40.182,-12.186],[33.334,-35.046],[21.753,-67.877],[10.574,-67.877],[5.841,0],[14.2,0],[16.013,-29.105],[17.322,-59.116],[17.523,-59.116],[25.378,-32.73],[36.356,-0.403],[43.002,-0.403],[54.987,-33.334],[63.547,-59.116],[63.849,-59.116],[64.856,-29.81]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"M","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"a","size":150,"style":"500","w":48.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.23],[0,0],[14.905,0],[4.028,-2.618],[0,0],[-4.532,0],[0,-4.028],[0,0],[0,-11.783],[-9.869,0],[-2.719,3.827],[0,0],[0,0]],"o":[[-0.604,-3.323],[0,0],[0,-9.769],[-6.143,0],[0,0],[3.424,-2.216],[9.97,0],[0,0],[-18.832,-0.101],[0,7.05],[6.949,0],[0,0],[0,0],[0,0]],"v":[[42.398,0],[41.592,-11.682],[41.592,-29.91],[23.062,-49.85],[7.05,-45.52],[9.064,-39.679],[21.753,-43.304],[32.831,-32.025],[32.831,-31.018],[3.525,-12.891],[18.43,1.108],[33.334,-6.143],[33.636,-6.143],[34.341,0]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-0.906],[6.345,0],[0,5.74],[-9.668,-0.201]],"o":[[0,0.906],[-1.41,4.129],[-4.532,0],[0,-9.467],[0,0]],"v":[[33.032,-16.415],[32.529,-13.596],[20.746,-5.438],[12.387,-13.898],[33.032,-24.875]],"c":true},"ix":2},"nm":"a","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"a","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"s","size":150,"style":"500","w":39.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.338,0],[0,8.56],[8.459,3.223],[0,4.028],[-5.237,0],[-1.913,-1.208],[0,0],[4.935,0],[0,-7.855],[-8.762,-3.122],[0,-4.23],[6.445,0],[2.618,1.712]],"o":[[3.424,2.014],[11.581,0],[0,-7.251],[-6.345,-2.417],[0,-3.625],[4.532,0],[0,0],[-2.719,-1.611],[-10.474,0],[0,5.841],[6.546,2.417],[0,4.028],[-4.431,0],[0,0]],"v":[[3.928,-2.316],[17.624,1.007],[35.852,-13.596],[23.062,-28.299],[13.797,-36.557],[21.954,-43.204],[31.924,-40.384],[34.14,-46.829],[22.156,-49.85],[5.338,-35.55],[18.228,-21.753],[27.292,-12.79],[17.825,-5.539],[6.143,-9.064]],"c":true},"ix":2},"nm":"s","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"s","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"k","size":150,"style":"500","w":48.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.208,-1.712],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.41,1.712],[0,0],[0,0]],"v":[[16.113,-71.503],[7.352,-71.503],[7.352,0],[16.113,0],[16.113,-18.329],[20.645,-23.364],[37.463,0],[48.239,0],[26.788,-28.702],[45.621,-48.743],[34.946,-48.743],[20.645,-31.924],[16.315,-26.385],[16.113,-26.385]],"c":true},"ix":2},"nm":"k","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"k","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"_","size":150,"style":"500","w":50,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,7.553],[0,12.589],[50.354,12.589],[50.354,7.553]],"c":true},"ix":2},"nm":"_","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"_","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"0","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.797,0],[0,-21.954],[-12.79,0],[0,22.256]],"o":[[-13.293,0],[0.201,21.652],[14.502,0],[0,-20.847]],"v":[[26.385,-66.568],[3.625,-32.529],[25.278,1.108],[48.038,-33.435]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-7.755,0],[0,-16.113],[9.064,0],[0,17.02]],"o":[[9.164,0],[0,16.718],[-8.057,0],[0,-17.825]],"v":[[25.882,-59.72],[39.175,-33.032],[25.781,-5.74],[12.488,-32.428]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"0","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"6","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.618,-0.403],[5.438,-5.338],[0,-12.891],[-13.998,0],[0,11.984],[11.581,0],[3.122,-4.129],[0,0],[-13.898,2.316],[-1.813,-0.101]],"o":[[-1.611,0],[-8.258,1.007],[-6.445,6.445],[0,17.02],[13.596,0],[0,-12.79],[-7.251,0],[0,0],[1.511,-10.776],[2.518,-0.403],[0,0]],"v":[[41.895,-66.467],[35.449,-65.964],[14.502,-56.296],[3.424,-26.788],[26.587,1.108],[48.34,-21.954],[28.601,-43.103],[12.79,-35.55],[12.488,-35.55],[35.248,-58.813],[41.895,-59.216]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.654,0],[0.201,10.776],[-0.604,1.007],[-5.338,0],[0,-9.366]],"o":[[-9.265,0],[0,-1.611],[2.417,-4.733],[8.157,0],[0,9.366]],"v":[[26.587,-5.74],[12.186,-24.472],[13.193,-28.4],[25.882,-36.456],[39.377,-21.451]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"6","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"L","size":150,"style":"500","w":47.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,0],[45.419,0],[45.419,-7.352],[16.415,-7.352],[16.415,-67.877],[7.654,-67.877]],"c":true},"ix":2},"nm":"L","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"L","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"i","size":150,"style":"500","w":23.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.214,0],[16.214,-48.743],[7.352,-48.743],[7.352,0]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.323,0],[0,-3.122],[-3.122,0],[0.101,3.021]],"o":[[-3.223,0],[0,3.021],[3.525,0],[0,-3.122]],"v":[[11.783,-67.978],[6.244,-62.439],[11.581,-57.001],[17.221,-62.439]],"c":true},"ix":2},"nm":"i","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"i","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"g","size":150,"style":"500","w":55.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[8.459,0],[0,-16.516],[-12.085,0],[-2.719,4.532],[0,0],[0,0],[9.064,0],[3.223,2.014],[0,0],[-5.841,0],[-4.733,4.431],[0,11.179],[0,0],[-0.201,3.525]],"o":[[0,0],[0,0],[-2.115,-4.028],[-11.179,0],[0,13.495],[7.553,0],[0,0],[0,0],[0,12.286],[-6.042,0],[0,0],[3.928,2.618],[6.143,0],[4.733,-4.23],[0,0],[0,-5.942],[0,0]],"v":[[41.592,-48.743],[41.19,-41.391],[40.988,-41.391],[25.781,-49.85],[3.827,-23.969],[24.573,-0.201],[40.082,-8.359],[40.283,-8.359],[40.283,-2.921],[24.573,14.099],[10.272,10.272],[8.057,17.02],[24.271,21.048],[41.995,15.207],[48.944,-7.05],[48.944,-35.349],[49.347,-48.743]],"c":true},"ix":2},"nm":"g","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.504,-1.511],[5.438,0],[0,9.567],[-8.459,0],[-1.611,-5.136],[0,-1.511]],"o":[[0,1.511],[-1.913,5.64],[-9.567,0],[0,-11.279],[6.445,0],[0.403,1.208],[0,0]],"v":[[40.182,-20.746],[39.478,-16.013],[27.191,-6.949],[12.79,-24.472],[27.292,-42.902],[39.679,-33.536],[40.182,-29.507]],"c":true},"ix":2},"nm":"g","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"g","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"h","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.504,1.208],[-5.74,0],[0,-7.855],[0,0],[0,0],[0,0],[6.546,0],[2.618,-1.511],[1.41,-2.518],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-1.712],[1.611,-4.834],[8.359,0],[0,0],[0,0],[0,0],[0,-16.818],[-3.323,0],[-2.719,1.511],[0,0],[0,0],[0,0],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.407],[16.818,-33.636],[28.702,-42.499],[39.981,-27.997],[39.981,0],[48.843,0],[48.843,-29.004],[31.824,-49.85],[22.76,-47.333],[16.415,-41.089],[16.214,-41.089],[16.214,-71.503],[7.352,-71.503]],"c":true},"ix":2},"nm":"h","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"h","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"t","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.518,-2.618],[-4.129,0],[-1.712,0.705],[0,0],[2.316,0],[0,6.042],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.74],[2.115,2.417],[3.424,0],[0,0],[-1.108,0.302],[-4.935,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.366,-60.425],[9.366,-48.743],[1.813,-48.743],[1.813,-41.995],[9.366,-41.995],[9.366,-15.408],[12.79,-2.719],[22.357,1.007],[30.212,-0.201],[29.81,-6.848],[24.673,-6.244],[18.027,-15.71],[18.027,-41.995],[30.716,-41.995],[30.716,-48.743],[18.027,-48.743],[18.027,-62.741]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"e","size":150,"style":"500","w":50.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,1.813],[15.912,0],[0,-14.703],[-15.005,0],[-3.122,1.41],[0,0],[6.345,0],[0.201,11.984]],"o":[[0.101,-0.906],[0,-8.963],[-14.2,0],[0,14.703],[7.755,0],[0,0],[-3.323,1.41],[-8.862,0],[0,0]],"v":[[46.527,-22.76],[46.829,-26.889],[26.688,-49.85],[3.827,-23.566],[27.795,1.007],[44.009,-2.014],[42.499,-8.359],[29.004,-5.841],[12.286,-22.76]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-8.963,0],[0.101,-5.64]],"o":[[0.705,-6.143],[9.97,0],[0,0]],"v":[[12.387,-29.105],[25.983,-43.506],[38.269,-29.105]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"n","size":150,"style":"500","w":55.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.403,1.108],[-5.841,0],[0,-7.855],[0,0],[0,0],[0,0],[6.747,0],[2.417,-4.633],[0,0],[0,0],[0,0],[0,-5.035]],"o":[[0,0],[0,0],[0,-1.511],[1.511,-4.935],[8.359,0],[0,0],[0,0],[0,0],[0,-16.718],[-8.057,0],[0,0],[0,0],[0,0],[0.302,4.028],[0,0]],"v":[[7.352,0],[16.214,0],[16.214,-29.306],[16.818,-33.435],[28.702,-42.499],[39.981,-28.098],[39.981,0],[48.843,0],[48.843,-29.105],[31.622,-49.85],[15.509,-40.686],[15.308,-40.686],[14.804,-48.743],[6.949,-48.743],[7.352,-35.55]],"c":true},"ix":2},"nm":"n","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"n","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"5","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.726,0],[-0.101,-8.459],[8.359,0],[2.719,1.611],[0,0],[-7.15,0],[0,12.79],[5.136,2.921],[5.035,0],[1.511,-0.201],[0,0],[0,0]],"o":[[0,0],[0,0],[2.417,-0.302],[13.092,0],[0,8.762],[-5.942,0],[0,0],[3.122,2.014],[14.2,0],[0,-8.258],[-4.028,-2.417],[-2.417,0],[0,0],[0,0],[0,0]],"v":[[43.607,-65.46],[12.286,-65.46],[8.057,-34.039],[17.12,-34.744],[35.953,-20.242],[20.444,-6.042],[6.445,-9.668],[4.23,-2.921],[20.544,1.108],[44.916,-21.249],[35.55,-38.068],[21.451,-41.592],[16.113,-41.19],[18.631,-58.008],[43.607,-58.008]],"c":true},"ix":2},"nm":"5","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"I","size":150,"style":"500","w":23.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.654,-67.877],[7.654,0],[16.415,0],[16.415,-67.877]],"c":true},"ix":2},"nm":"I","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"I","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"r","size":150,"style":"500","w":33.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.201,1.208],[-6.244,0],[-0.906,-0.201],[0,0],[1.007,0],[2.216,-6.546],[0,0],[0,0],[0,0],[0,-5.74]],"o":[[0,0],[0,0],[0,-1.511],[1.208,-6.647],[1.208,0],[0,0],[-0.806,-0.201],[-5.942,0],[0,0],[0,0],[0,0],[0.302,4.532],[0,0]],"v":[[7.352,0],[16.113,0],[16.113,-25.983],[16.516,-30.112],[28.4,-41.492],[31.421,-41.19],[31.421,-49.548],[28.903,-49.85],[15.408,-39.175],[15.005,-39.175],[14.703,-48.743],[6.949,-48.743],[7.352,-33.536]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"c","size":150,"style":"500","w":44.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.035,0],[0,11.279],[-11.179,0],[-2.115,-1.208],[0,0],[5.237,0],[0,-15.005],[-14.703,0],[-2.316,1.208]],"o":[[-2.518,1.108],[-9.668,0],[0,-10.172],[4.834,0],[0,0],[-2.417,-1.208],[-15.912,0],[0,14.905],[6.546,0],[0,0]],"v":[[40.585,-8.459],[29.709,-6.042],[12.79,-24.271],[30.011,-42.7],[40.283,-40.384],[42.297,-47.232],[30.011,-49.75],[3.827,-23.868],[28.098,1.007],[42.096,-1.813]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"4","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.283,0],[40.283,-17.825],[49.448,-17.825],[49.448,-24.774],[40.283,-24.774],[40.283,-65.46],[30.716,-65.46],[1.511,-23.666],[1.511,-17.825],[31.924,-17.825],[31.924,0]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.014,3.827],[0,0],[0,-3.424],[0,0]],"o":[[0,0],[0,0],[1.813,-3.021],[0,0],[-0.201,3.424],[0,0],[0,0]],"v":[[10.474,-24.774],[10.474,-24.976],[26.486,-47.232],[31.924,-56.9],[32.227,-56.9],[31.924,-46.628],[31.924,-24.774]],"c":true},"ix":2},"nm":"4","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"4","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"S","size":150,"style":"500","w":49.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.546,0],[0,10.474],[11.481,4.431],[0,6.345],[-9.265,0],[-2.216,-1.208],[0,0],[6.949,0],[0,-10.574],[-11.078,-3.928],[0,-6.345],[8.963,0],[3.928,2.417]],"o":[[3.625,2.417],[16.013,0],[0,-9.97],[-9.366,-3.625],[0,-4.633],[6.143,0],[0,0],[-3.021,-1.712],[-13.193,0],[0,9.567],[9.164,3.525],[0,6.848],[-6.042,0],[0,0]],"v":[[4.23,-3.323],[21.552,1.007],[45.319,-18.53],[27.997,-38.47],[14.502,-51.562],[27.292,-61.734],[40.182,-58.511],[42.599,-65.662],[27.594,-68.985],[5.64,-50.555],[23.566,-31.32],[36.356,-17.825],[22.156,-6.244],[6.445,-10.675]],"c":true},"ix":2},"nm":"S","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"S","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"u","size":150,"style":"500","w":55.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.504,-1.309],[5.942,0],[0,9.265],[0,0],[0,0],[0,0],[-7.654,0],[-2.316,3.928],[0,0],[0,0],[0,0],[0,5.035]],"o":[[0,0],[0,0],[0,1.611],[-1.611,3.928],[-8.057,0],[0,0],[0,0],[0,0],[0,17.12],[8.661,0],[0,0],[0,0],[0,0],[-0.302,-3.827],[0,0]],"v":[[48.138,-48.743],[39.276,-48.743],[39.276,-18.832],[38.47,-14.301],[26.788,-6.244],[15.912,-21.753],[15.912,-48.743],[7.05,-48.743],[7.05,-20.242],[23.868,1.108],[39.981,-7.956],[40.182,-7.956],[40.686,0],[48.541,0],[48.138,-13.293]],"c":true},"ix":2},"nm":"u","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"u","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"b","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-7.05,0],[0,17.422],[12.085,0],[3.122,-5.438],[0,0],[0,0],[0,0],[0,0],[0.201,-3.323]],"o":[[0,0],[0,0],[3.625,6.445],[10.876,0],[0.101,-14.804],[-7.855,0],[0,0],[0,0],[0,0],[0,0],[0,4.33],[0,0]],"v":[[14.603,0],[15.005,-8.057],[15.308,-8.057],[31.622,1.108],[53.476,-24.976],[32.932,-49.85],[16.315,-40.887],[16.113,-40.887],[16.113,-71.503],[7.352,-71.503],[7.352,-12.589],[6.949,0]],"c":true},"ix":2},"nm":"b","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.201,1.007],[-6.042,0],[0,-9.769],[9.265,0],[1.712,6.143],[0,1.108]],"o":[[0,-1.41],[1.813,-6.747],[9.467,0],[0,11.179],[-6.445,0],[-0.201,-1.007],[0,0]],"v":[[16.113,-28.299],[16.617,-31.924],[30.112,-42.801],[44.614,-24.673],[29.81,-5.942],[16.516,-16.315],[16.113,-19.537]],"c":true},"ix":2},"nm":"b","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"b","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"3","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.352,0],[0,10.474],[8.057,1.611],[0,0],[0,6.747],[12.891,0],[3.424,-2.518],[0,0],[-5.237,0],[0,-5.237],[6.445,0],[0,0],[0,0],[0,0],[-0.101,-9.164],[11.38,0],[2.518,1.611]],"o":[[3.223,2.115],[15.71,0],[0,-9.164],[0,0],[8.057,-2.921],[0,-7.956],[-7.05,0],[0,0],[2.82,-2.014],[8.157,0],[0,7.755],[0,0],[0,0],[0,0],[8.56,0],[0.101,5.438],[-6.143,0],[0,0]],"v":[[4.23,-3.323],[21.249,1.108],[45.117,-18.53],[30.515,-35.349],[30.515,-35.55],[42.599,-50.958],[23.868,-66.568],[6.747,-61.533],[9.064,-55.087],[22.156,-59.418],[33.636,-49.548],[19.034,-38.47],[14.099,-38.47],[14.099,-31.824],[19.034,-31.824],[35.953,-18.732],[21.149,-6.042],[6.647,-10.172]],"c":true},"ix":2},"nm":"3","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"A","size":150,"style":"500","w":61.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.7,-21.35],[49.951,0],[59.317,0],[36.154,-67.877],[25.58,-67.877],[2.518,0],[11.581,0],[18.631,-21.35]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.007,4.028],[0,0],[-1.511,-4.431],[0,0]],"o":[[0,0],[1.309,-4.129],[0,0],[1.007,3.928],[0,0],[0,0]],"v":[[20.444,-28.198],[27.09,-47.836],[30.515,-60.123],[30.716,-60.123],[34.241,-47.736],[40.887,-28.198]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"A","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"d","size":150,"style":"500","w":56.4,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[7.452,0],[-0.101,-16.214],[-11.783,0],[-2.719,5.438],[0,0],[0,0],[0,0],[0,4.33],[0,0]],"o":[[0,0],[0,0],[-2.216,-3.928],[-11.884,0],[0,14.804],[7.956,0],[0,0],[0,0],[0,0],[-0.302,-3.323],[0,0],[0,0]],"v":[[40.585,-71.503],[40.585,-42.398],[40.384,-42.398],[25.681,-49.85],[3.827,-23.666],[24.673,1.108],[41.29,-8.459],[41.492,-8.459],[41.895,0],[49.85,0],[49.448,-12.589],[49.448,-71.503]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.302,-1.208],[5.942,0],[0,9.869],[-9.164,0],[-1.309,-5.64],[0,-1.108]],"o":[[0,1.41],[-1.611,6.647],[-9.567,0],[0,-10.776],[6.647,0],[0.302,1.108],[0,0]],"v":[[40.585,-20.444],[40.182,-16.617],[27.191,-6.042],[12.79,-24.069],[27.393,-42.902],[40.182,-32.629],[40.585,-28.903]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"d","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"2","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.085],[14.099,0],[4.532,-3.827],[0,0],[-5.942,0],[0,-6.647],[16.718,-15.912],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[13.797,-13.293],[0,-9.366],[-7.553,0],[0,0],[3.021,-2.518],[9.769,0],[-0.101,9.869],[0,0],[0,0],[0,0]],"v":[[46.326,0],[46.326,-7.352],[16.919,-7.352],[16.919,-7.553],[22.156,-12.387],[44.714,-47.534],[24.673,-66.568],[6.143,-59.921],[8.963,-53.677],[22.861,-59.216],[35.852,-46.426],[11.481,-12.186],[4.532,-5.438],[4.532,0]],"c":true},"ix":2},"nm":"2","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"O","size":150,"style":"500","w":68.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.53,0],[0,-21.552],[-17.926,0],[0,23.364]],"o":[[-18.127,0],[0,20.544],[17.322,0],[0,-20.142]],"v":[[35.147,-68.985],[3.625,-33.334],[34.14,1.108],[65.662,-34.644]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-14.502,0],[0,-13.495],[13.898,0],[0,14.502]],"o":[[14.603,0],[0,15.408],[-13.797,0],[0,-14.905]],"v":[[34.744,-61.835],[56.396,-34.241],[34.644,-6.042],[12.991,-33.536]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"O","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"p","size":150,"style":"500","w":56.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-6.445,0],[0,17.523],[11.783,0],[3.625,-5.942],[0,0],[0,0],[0,0],[0,-6.244]],"o":[[0,0],[0,0],[0,0],[2.921,4.834],[11.481,0],[0,-14.804],[-7.956,0],[0,0],[0,0],[0,0],[0.201,4.633],[0,0]],"v":[[7.352,19.94],[16.113,19.94],[16.113,-6.546],[16.315,-6.546],[31.32,1.108],[53.476,-25.076],[32.831,-49.85],[15.509,-40.384],[15.308,-40.384],[14.905,-48.743],[6.949,-48.743],[7.352,-32.831]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-0.302,1.108],[-6.042,0],[0,-9.769],[9.366,0],[1.611,6.143],[0,1.309]],"o":[[0,-1.208],[1.712,-6.647],[9.366,0],[0,11.179],[-6.345,0],[-0.201,-1.108],[0,0]],"v":[[16.113,-28.198],[16.718,-31.824],[30.112,-42.801],[44.614,-24.673],[29.81,-5.841],[16.516,-16.214],[16.113,-19.839]],"c":true},"ix":2},"nm":"p","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"p","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"y","size":150,"style":"500","w":48.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-0.504],[0.403,-0.906],[2.417,-1.913],[2.216,-0.705],[0,0],[-4.33,3.827],[-6.345,16.718],[0,0],[0,0],[0,0],[0.906,-2.921],[0,0],[1.108,3.223],[0,0]],"o":[[0,0],[0.403,1.108],[0,0.504],[-2.014,4.532],[-2.618,2.216],[0,0],[2.216,-0.403],[6.042,-5.237],[0,0],[0,0],[0,0],[-1.208,3.525],[0,0],[-0.806,-2.921],[0,0],[0,0]],"v":[[0.906,-48.743],[18.933,-3.827],[19.537,-1.511],[18.832,0.604],[11.38,10.474],[3.625,14.804],[5.841,22.256],[16.718,16.516],[33.435,-13.998],[46.729,-48.743],[37.363,-48.743],[27.695,-20.142],[24.573,-9.97],[24.371,-9.97],[21.249,-19.94],[10.574,-48.743]],"c":true},"ix":2},"nm":"y","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"y","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"1","size":150,"style":"500","w":51.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.767,0],[32.327,0],[32.327,-65.46],[24.774,-65.46],[10.474,-57.806],[12.186,-51.059],[23.566,-57.202],[23.767,-57.202]],"c":true},"ix":2},"nm":"1","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"},{"ch":"P","size":150,"style":"500","w":53.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.618,0],[-4.633,4.935],[0,6.143],[3.726,3.223],[8.661,0],[4.23,-0.705]],"o":[[0,0],[0,0],[2.014,0.504],[8.56,0],[3.424,-3.525],[0,-6.042],[-4.028,-3.625],[-7.05,0],[0,0]],"v":[[7.654,0],[16.415,0],[16.415,-27.191],[23.465,-26.587],[44.211,-34.039],[49.448,-48.541],[43.506,-62.741],[24.472,-68.381],[7.654,-67.072]],"c":true},"ix":2},"nm":"P","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-3.827,0],[0,-8.963],[10.574,0],[1.913,0.504]],"o":[[1.511,-0.403],[9.668,0],[0,9.366],[-2.921,0],[0,0]],"v":[[16.415,-60.727],[24.673,-61.432],[40.686,-48.138],[23.666,-33.636],[16.415,-34.341]],"c":true},"ix":2},"nm":"P","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"P","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SamsungOne"}]} \ No newline at end of file From 8779be1e9f5a5e305fa224364529f466e24d7c0b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 09:18:08 +0900 Subject: [PATCH 031/672] lottie/example: removed bad polystar sample file Change-Id: If03001ace0dfbb0a3f359933dfdd8c3a71c0a15d --- .../resource/polystar_star_with_roundness_points_stroke_99.json | 1 - 1 file changed, 1 deletion(-) delete mode 100755 example/resource/polystar_star_with_roundness_points_stroke_99.json diff --git a/example/resource/polystar_star_with_roundness_points_stroke_99.json b/example/resource/polystar_star_with_roundness_points_stroke_99.json deleted file mode 100755 index 24a82d455f..0000000000 --- a/example/resource/polystar_star_with_roundness_points_stroke_99.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[152,152,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"sr","sy":1,"d":2,"pt":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[5],"e":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[11],"e":[99]},{"t":100.000004073084}],"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[64]},{"t":90.0000036657751}],"ix":5},"ir":{"a":0,"k":75,"ix":6},"is":{"a":0,"k":79,"ix":8},"or":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[142]},{"t":90.0000036657751}],"ix":7},"os":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[79],"e":[247]},{"t":90.0000036657751}],"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 95004fcf34fc29025e052458c40f9929ac69f313 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 19 Jul 2018 10:06:05 +0900 Subject: [PATCH 032/672] lottie/model: refactored path direction handling. Change-Id: I6a41f72e3635f3ad91f188d99868b3e8e44d3174 --- src/lottie/lottieitem.cpp | 17 ++++------------- src/lottie/lottieitem.h | 1 - src/lottie/lottiemodel.h | 5 +++-- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c4129ca131..54fe48764d 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -655,15 +655,6 @@ void LOTShapeLayerItem::renderList(std::vector &list) mRoot->renderList(list); } -VPath::Direction LOTContentItem::direction(bool isCW) -{ - if (isCW) - return VPath::Direction::CW; - else - return VPath::Direction::CCW; -} - - LOTContentGroupItem::LOTContentGroupItem(LOTShapeGroupData *data):mData(data) { addChildren(mData); @@ -813,7 +804,7 @@ VPath LOTRectItem::getPath(int frameNo) VRectF r(pos.x() - size.x()/2, pos.y() - size.y()/2, size.x(), size.y()); VPath path; - path.addRoundRect(r, radius, radius, direction(mData->isDirectionCW())); + path.addRoundRect(r, radius, radius, mData->direction()); return path; } @@ -830,7 +821,7 @@ VPath LOTEllipseItem::getPath(int frameNo) VRectF r(pos.x() - size.x()/2, pos.y() - size.y()/2, size.x(), size.y()); VPath path; - path.addOval(r, direction(mData->isDirectionCW())); + path.addOval(r, mData->direction()); return path; } @@ -884,11 +875,11 @@ VPath LOTPolystarItem::getPath(int frameNo) path.addPolystarStar(0.0, 0.0, 0.0, points, innerRadius, outerRadius, innerRoundness, outerRoundness, - direction(mData->isDirectionCW())); + mData->direction()); } else { path.addPolystarPolygon(0.0, 0.0, 0.0, points, outerRadius, outerRoundness, - direction(mData->isDirectionCW())); + mData->direction()); } m.translate(pos.x(), pos.y()).rotate(rotation); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 58f302d200..88d0b255af 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -215,7 +215,6 @@ public: virtual ~LOTContentItem(){} virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0; virtual void renderList(std::vector &list){} - VPath::Direction direction(bool isCW); }; class LOTContentGroupItem: public LOTContentItem diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index e6c5d9d275..fc3475e981 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -608,8 +608,9 @@ public: class LOTPath : public LOTData { public: - LOTPath(LOTData::Type type):LOTData(type), mDirection(3){} - bool isDirectionCW() const { return ((mDirection == 3) ? false : true );} + LOTPath(LOTData::Type type):LOTData(type), mDirection(1){} + VPath::Direction direction() { if (mDirection == 3) return VPath::Direction::CCW; + else return VPath::Direction::CW;} public: int mDirection; std::vector> mPathOperations; From 1442d9c22da95a9988e9276b0c4789e00b83cd2a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 19 Jul 2018 08:33:50 +0900 Subject: [PATCH 033/672] lottie/model: convert highlightangle and highlightlength of radial from lottie to vector space. Change-Id: I9874ccb53e3fe85a14c2ecd6394dbdb4d9f42790 --- src/lottie/lottiemodel.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 1a7e3b8328..a31f640093 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -336,10 +336,24 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) grad->radial.cx = start.x(); grad->radial.cy = start.y(); grad->radial.cradius = vLineLength(start.x(), start.y(), end.x(), end.y()); - - //TODO update focal radius and focal point - grad->radial.fx = grad->radial.cx; - grad->radial.fy = grad->radial.cy; + /* + * Focal point is the point lives in highlight length distance from center along the + * line (start, end) and rotated by highlight angle. + * below calculation first finds the quadrant(angle) on which the point lives by applying + * inverse slope formula then adds the rotation angle to find the final angle. + * then point is retrived using circle equation of center, angle and distance. + */ + float progress = mHighlightLength.value(frameNo)/100.0f; + if (vCompare(progress, 1.0f)) progress = 0.99f; + float dy = end.y() - start.y(); + float dx = end.x() - start.x(); + float slope = (dx == 0) ? dy * INFINITY : dy/dx; + float startAngleRad = std::atan(slope); + int highlightAngle = mHighlightAngle.value(frameNo); + float angle = startAngleRad + (highlightAngle * M_PI/180.0f); + grad->radial.fx = grad->radial.cx + std::cos(angle) * progress * grad->radial.cradius; + grad->radial.fy = grad->radial.cy + std::sin(angle) * progress * grad->radial.cradius; + // Lottie dosen't have any focal radius concept. grad->radial.fradius = 0; } } From 3aff15cf424833765023703688a5105e94032456 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 19 Jul 2018 09:13:13 +0900 Subject: [PATCH 034/672] lottie/example: delay rendering of view till pre render callback to mimic the evas rendering pipeline. Change-Id: I1d7711feda273f9e69712e2bb37c672f76e68515 --- example/demo.cpp | 8 ++++++++ example/evasapp.cpp | 9 +++++++++ example/evasapp.h | 3 +++ example/lottieview.cpp | 37 ++++++++++++++++++++++++++++++++++--- example/lottieview.h | 6 +++++- example/lottieviewtest.cpp | 14 ++++++++++++++ example/uxsampletest.cpp | 9 +++++++++ 7 files changed, 82 insertions(+), 4 deletions(-) diff --git a/example/demo.cpp b/example/demo.cpp index e56e395136..4bd2b8e997 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -11,6 +11,13 @@ onExitCb(void *data, void *extra) delete view; } +static void +onRenderPreCb(void *data, void *extra) +{ + LottieView *view = (LottieView *)data; + view->render(); +} + int main(void) { @@ -30,6 +37,7 @@ main(void) view->setRepeatMode(LottieView::RepeatMode::Reverse); app->addExitCb(onExitCb, view); + app->addRenderPreCb(onRenderPreCb, view); app->run(); delete app; return 0; diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 2a1552f000..3ce33cba0f 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -35,6 +35,14 @@ on_key_down(void *data, int type, void *event) return false; } +static void +on_pre_render(Ecore_Evas *ee) +{ + EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app"); + if (app->mRenderPreCb) + app->mRenderPreCb(app->mRenderPreData, nullptr); +} + EvasApp::EvasApp(int w, int h) { if (!ecore_evas_init()) @@ -53,6 +61,7 @@ EvasApp::setup() ecore_evas_callback_resize_set(mEcoreEvas, _on_resize); ecore_evas_callback_delete_request_set(mEcoreEvas, _on_delete); ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, on_key_down, this); + ecore_evas_callback_pre_render_set(mEcoreEvas, on_pre_render); ecore_evas_show(mEcoreEvas); mEvas = ecore_evas_get(mEcoreEvas); diff --git a/example/evasapp.h b/example/evasapp.h index 9ae027eba9..18c6cb420c 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -35,6 +35,7 @@ public: void addExitCb(appCb exitcb, void *data) {mExitCb = exitcb; mExitData = data;} void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;} void addKeyCb(appCb keycb, void *data) {mKeyCb = keycb; mKeyData = data;} + void addRenderPreCb(appCb renderPrecb, void *data) {mRenderPreCb = renderPrecb; mRenderPreData = data;} static std::vector jsonFiles(const std::string &dir, bool recurse=false); public: int mw; @@ -50,5 +51,7 @@ public: void *mExitData; appCb mKeyCb; void *mKeyData; + appCb mRenderPreCb; + void *mRenderPreData; }; #endif //EVASAPP_H diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 075ff3be76..489dcfd432 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -80,7 +80,7 @@ void LottieView::update(const std::vector &renderList) evas_object_vg_root_node_set(mVg, root); } -LottieView::LottieView(Evas *evas, bool renderMode):mVg(nullptr), mImage(nullptr) +LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr) { mPalying = false; mReverse = false; @@ -92,6 +92,7 @@ LottieView::LottieView(Evas *evas, bool renderMode):mVg(nullptr), mImage(nullptr mEvas = evas; mPlayer = new LOTPlayer(); mRenderMode = renderMode; + mAsyncRender = asyncRender; if (mRenderMode) { mImage = evas_object_image_filled_add(evas); @@ -134,19 +135,49 @@ void LottieView::seek(float pos) if (mPalying && mReverse) pos = 1.0 - pos; + if (mRenderMode) { + LOTBuffer buf; + evas_object_image_size_get(mImage, &buf.width, &buf.height); + if (mAsyncRender) { + mDirty = true; + mPendingPos = pos; + // to force a redraw + evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); + } else { + buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); + buf.bytesPerLine = evas_object_image_stride_get(mImage); + bool changed = mPlayer->renderSync(pos, buf); + evas_object_image_data_set(mImage, buf.buffer); + // if the buffer is updated notify the image object + if (changed) { + evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); + } + } + } else { + mPlayer->setPos(pos); + const std::vector &renderList = mPlayer->renderList(); + update(renderList); + } +} + +void LottieView::render() +{ + if (!mDirty) return; + mDirty = false; + if (mRenderMode) { LOTBuffer buf; buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); buf.bytesPerLine = evas_object_image_stride_get(mImage); evas_object_image_size_get(mImage, &buf.width, &buf.height); - bool changed = mPlayer->renderSync(pos, buf); + bool changed = mPlayer->renderSync(mPendingPos, buf); evas_object_image_data_set(mImage, buf.buffer); // if the buffer is updated notify the image object if (changed) { evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); } } else { - mPlayer->setPos(pos); + mPlayer->setPos(mPendingPos); const std::vector &renderList = mPlayer->renderList(); update(renderList); } diff --git a/example/lottieview.h b/example/lottieview.h index 59ea019281..4a31ff761e 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -24,7 +24,7 @@ public: Restart, Reverse }; - LottieView(Evas *evas, bool renderMode = true); + LottieView(Evas *evas, bool renderMode = true, bool asyncRender = true); ~LottieView(); void setSize(int w, int h); void setPos(int x, int y); @@ -41,6 +41,7 @@ public: void play(); void pause(); void stop(); + void render(); private: void createVgNode(LOTNode *node, Efl_VG *parent); void update(const std::vector &); @@ -62,5 +63,8 @@ public: Evas_Object *mImage; float mSpeed; bool mRenderMode; + bool mAsyncRender; + bool mDirty; + float mPendingPos; }; #endif //LOTTIEVIEW_H diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 6c27f40177..7af573ea30 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -55,6 +55,12 @@ public: } + void render() { + for (auto &i : mViews) { + i->render(); + } + } + public: EvasApp *mApp; bool mRenderMode = false; @@ -68,6 +74,13 @@ onExitCb(void *data, void *extra) delete view; } +static void +onRenderPreCb(void *data, void *extra) +{ + LottieViewTest *view = (LottieViewTest *)data; + view->render(); +} + int main(int argc, char **argv) { @@ -83,6 +96,7 @@ main(int argc, char **argv) view->show(); app->addExitCb(onExitCb, view); + app->addRenderPreCb(onRenderPreCb, view); app->run(); delete app; diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index 03fe21115b..317c14797c 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -78,6 +78,14 @@ onKeyCb(void *data, void *extra) } } +static void +onRenderPreCb(void *data, void *extra) +{ + UxSampleTest *view = (UxSampleTest *)data; + if (view->mView) + view->mView->render(); +} + int main(int argc, char **argv) { @@ -94,6 +102,7 @@ main(int argc, char **argv) app->addExitCb(onExitCb, view); app->addKeyCb(onKeyCb, view); + app->addRenderPreCb(onRenderPreCb, view); app->run(); delete app; From bad22db71648499f704eb44cbf13b785d663307c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 16:31:03 +0900 Subject: [PATCH 035/672] lottie/vector: update the available variable only when we find a valid span data. Change-Id: I5cad6ac11d2e8574b01399165cd8fc11909ed226 --- src/vector/vrle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 4435e8e969..b8aeccae9d 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -169,9 +169,9 @@ rleIntersectWithRect(const VRect &clip, out->y = spans->y; out->coverage = spans->coverage; ++out; + --available; } ++spans; - --available; } // update the span list that yet to be processed From 04fe68f5afb2542b287b0b7d5f63e7f801f8c290 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 09:40:04 +0900 Subject: [PATCH 036/672] lottie/render: fixed Mask substarct implementation. Change-Id: I1fcf0a9da76dc027b0c8b397ae8655cfbff24b00 --- src/lottie/lottieitem.cpp | 10 +++++----- src/lottie/lottieitem.h | 3 +-- src/vector/vpainter.cpp | 5 +++++ src/vector/vpainter.h | 1 + src/vector/vrle.cpp | 2 +- src/vector/vrle.h | 2 +- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 54fe48764d..0d62d4dee3 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -332,7 +332,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) VRle mask = inheritMask; if (hasMask()) { if (mask.isEmpty()) - mask = maskRle(); + mask = maskRle(painter->clipBoundingRect()); else mask = mask & inheritMask; } @@ -348,7 +348,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) } } -VRle LOTLayerItem::maskRle() +VRle LOTLayerItem::maskRle(const VRect &clipRect) { VRle rle; for (auto &i : mMasks) { @@ -358,8 +358,8 @@ VRle LOTLayerItem::maskRle() break; } case LOTMaskData::Mode::Substarct: { - if (rle.isEmpty() && !mBoundingRect.isEmpty()) - rle = VRle::toRle(mBoundingRect); + if (rle.isEmpty() && !clipRect.isEmpty()) + rle = VRle::toRle(clipRect); rle = rle - i->mRle; break; } @@ -501,7 +501,7 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) if (hasMask()) { if (mask.isEmpty()) - mask = maskRle(); + mask = maskRle(painter->clipBoundingRect()); else mask = mask & inheritMask; } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 88d0b255af..72b7b237e6 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -74,7 +74,7 @@ protected: float opacity(int frameNo) const; bool visible() const; inline DirtyFlag flag() const {return mDirtyFlag;} - VRle maskRle(); + VRle maskRle(const VRect &clipRect); bool hasMask() const {return !mMasks.empty();} protected: std::vector> mMasks; @@ -85,7 +85,6 @@ protected: float mCombinedAlpha; int mFrameNo; DirtyFlag mDirtyFlag; - VRectF mBoundingRect; bool mVisible; bool mStatic; }; diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 56fbf411e5..64d079052e 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -65,4 +65,9 @@ void VPainter::drawRle(const VPoint &pos, const VRle &rle) mImpl->drawRle(pos, rle); } +VRect VPainter::clipBoundingRect() const +{ + return mImpl->mSpanData.mSystemClip; +} + V_END_NAMESPACE diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index d7977fbc40..f48844608c 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -22,6 +22,7 @@ public: void end(); void setBrush(const VBrush &brush); void drawRle(const VPoint &pos, const VRle &rle); + VRect clipBoundingRect() const; private: VPainterImpl *mImpl; }; diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index b8aeccae9d..c41871f4b1 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -780,7 +780,7 @@ const VRle::Span* VRle::data() const return d->impl.m_spans.data(); } -VRle VRle::toRle(const VRectF &rect) +VRle VRle::toRle(const VRect &rect) { if (rect.isEmpty()) return VRle(); diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 0fe3bcfb49..e10919b79a 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -40,7 +40,7 @@ public: VRle operator+(const VRle &o) const; VRle operator-(const VRle &o) const; VRle operator&(const VRle &o) const; - static VRle toRle(const VRectF &rect); + static VRle toRle(const VRect &rect); friend VRle operator*(const VRle &, int alpha); inline friend VRle operator*(int alpha, const VRle &); friend VDebug& operator<<(VDebug& os, const VRle& object); From 0e5e0eba87344d5d617ca29dfcc20e843126cd85 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 16:37:12 +0900 Subject: [PATCH 037/672] lottie/example: update example to handle window resize. Change-Id: Idb67bff5a1900e5ff779ae283fb2a6b1366d97b9 --- example/uxsampletest.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index 317c14797c..dae6b44c6e 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -30,6 +30,12 @@ public: show(); } + void resize() { + if (mView) { + mView->setSize(mApp->width(), mApp->height()); + } + } + private: void show() { mView = std::unique_ptr(new LottieView(mApp->evas(), mRenderMode)); @@ -86,6 +92,13 @@ onRenderPreCb(void *data, void *extra) view->mView->render(); } +static void +onResizeCb(void *data, void *extra) +{ + UxSampleTest *view = (UxSampleTest *)data; + view->resize(); +} + int main(int argc, char **argv) { @@ -103,6 +116,7 @@ main(int argc, char **argv) app->addExitCb(onExitCb, view); app->addKeyCb(onKeyCb, view); app->addRenderPreCb(onRenderPreCb, view); + app->addResizeCb(onResizeCb, view); app->run(); delete app; From db5e2e788c1d84a3afbfacf1a6d59e8126d6ccc3 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 10:46:44 +0900 Subject: [PATCH 038/672] lottie/render: refactor rle generation to enable multi thread. Change-Id: Ia3bda91545241ef64919c9a1674ad1fa94dabea9 --- src/vector/freetype/v_ft_raster.cpp | 3 +- src/vector/vraster.cpp | 57 +++++++++-------------------- 2 files changed, 18 insertions(+), 42 deletions(-) diff --git a/src/vector/freetype/v_ft_raster.cpp b/src/vector/freetype/v_ft_raster.cpp index 6059f0c3b5..88f9d2636d 100644 --- a/src/vector/freetype/v_ft_raster.cpp +++ b/src/vector/freetype/v_ft_raster.cpp @@ -1575,6 +1575,7 @@ typedef struct SW_FT_Outline_Funcs_ gray_raster_render( gray_PRaster raster, const SW_FT_Raster_Params* params ) { + SW_FT_UNUSED( raster ); const SW_FT_Outline* outline = (const SW_FT_Outline*)params->source; gray_TWorker worker[1]; @@ -1584,8 +1585,6 @@ typedef struct SW_FT_Outline_Funcs_ int band_size = (int)( buffer_size / (long)( sizeof ( TCell ) * 8 ) ); - if ( !raster) - return SW_FT_THROW( Invalid_Argument ); if ( !outline ) return SW_FT_THROW( Invalid_Outline ); diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 3328977a51..7a5a892872 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -119,21 +119,6 @@ void FTOutline::end() } } -struct VRasterPrivate -{ -public: - VRle generateFillInfoAsync(const SW_FT_Outline *outline); - VRle generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT_Stroker_LineCap cap, - SW_FT_Stroker_LineJoin join, - int width, int meterLimit, - SW_FT_Bool closed); - - std::mutex m_rasterAcess; - std::mutex m_strokerAcess; - SW_FT_Raster m_raster; - SW_FT_Stroker m_stroker; -}; - struct SpanInfo { VRle::Span *spans; @@ -148,9 +133,8 @@ rleGenerationCb( int count, const SW_FT_Span* spans,void *user) rle->addSpan(rleSpan, count); } -VRle VRasterPrivate::generateFillInfoAsync(const SW_FT_Outline *outline) +VRle generateFillInfoAsync(const SW_FT_Outline *outline) { - m_rasterAcess.lock(); VRle rle; SW_FT_Raster_Params params; @@ -159,33 +143,33 @@ VRle VRasterPrivate::generateFillInfoAsync(const SW_FT_Outline *outline) params.user = &rle; params.source = outline; - sw_ft_grays_raster.raster_render(m_raster, ¶ms); - - m_rasterAcess.unlock(); + sw_ft_grays_raster.raster_render(nullptr, ¶ms); return rle; } -VRle VRasterPrivate::generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT_Stroker_LineCap cap, - SW_FT_Stroker_LineJoin join, - int width, int meterLimit, - SW_FT_Bool closed) +VRle generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT_Stroker_LineCap cap, + SW_FT_Stroker_LineJoin join, + int width, int meterLimit, + SW_FT_Bool closed) { - m_strokerAcess.lock(); + SW_FT_Stroker stroker; + SW_FT_Stroker_New(&stroker); + uint points,contors; SW_FT_Outline strokeOutline = { 0, 0, nullptr, nullptr, nullptr, SW_FT_OUTLINE_NONE }; - SW_FT_Stroker_Set(m_stroker, width, cap, join, meterLimit); - SW_FT_Stroker_ParseOutline(m_stroker, outline, !closed); - SW_FT_Stroker_GetCounts(m_stroker,&points, &contors); + SW_FT_Stroker_Set(stroker, width, cap, join, meterLimit); + SW_FT_Stroker_ParseOutline(stroker, outline, !closed); + SW_FT_Stroker_GetCounts(stroker,&points, &contors); strokeOutline.points = (SW_FT_Vector *) calloc(points, sizeof(SW_FT_Vector)); strokeOutline.tags = (char *) calloc(points, sizeof(char)); strokeOutline.contours = (short *) calloc(contors, sizeof(short)); - SW_FT_Stroker_Export(m_stroker, &strokeOutline); + SW_FT_Stroker_Export(stroker, &strokeOutline); - m_strokerAcess.unlock(); + SW_FT_Stroker_Done(stroker); VRle rle = generateFillInfoAsync(&strokeOutline); @@ -200,17 +184,10 @@ VRle VRasterPrivate::generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT VRaster::VRaster() { - d = new VRasterPrivate; - sw_ft_grays_raster.raster_new(&d->m_raster); - SW_FT_Stroker_New(&d->m_stroker); - SW_FT_Stroker_Set(d->m_stroker, 1 << 6, - SW_FT_STROKER_LINECAP_BUTT, SW_FT_STROKER_LINEJOIN_MITER, 0); } VRaster::~VRaster() { - sw_ft_grays_raster.raster_done(d->m_raster); - SW_FT_Stroker_Done(d->m_stroker); } void VRaster::deleteFTOutline(FTOutline *outline) @@ -267,7 +244,7 @@ VRle VRaster::generateFillInfo(const FTOutline *outline, FillRule fillRule) } FTOutline *outlineRef = const_cast(outline); outlineRef->ft.flags = fillRuleFlag; - return d->generateFillInfoAsync(&outlineRef->ft); + return generateFillInfoAsync(&outlineRef->ft); } VRle VRaster::generateStrokeInfo(const FTOutline *outline, CapStyle cap, JoinStyle join, @@ -311,8 +288,8 @@ VRle VRaster::generateStrokeInfo(const FTOutline *outline, CapStyle cap, JoinSty break; } - return d->generateStrokeInfoAsync(&outline->ft, ftCap, ftJoin, - ftWidth, ftMeterLimit, ftbool); + return generateStrokeInfoAsync(&outline->ft, ftCap, ftJoin, + ftWidth, ftMeterLimit, ftbool); } V_END_NAMESPACE From 2e9d054a7b38a4d781116ab7e231adc5adb74504 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 12:27:53 +0900 Subject: [PATCH 039/672] lottie/vector: added taskqueue class in preparation for multithreaded backend Change-Id: I0b5e5cab84b383bc48f846f99807870178672a1f --- src/vector/vtaskqueue.h | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/vector/vtaskqueue.h diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h new file mode 100644 index 0000000000..5318f0edd2 --- /dev/null +++ b/src/vector/vtaskqueue.h @@ -0,0 +1,60 @@ +#ifndef VTASKQUEUE_H +#define VTASKQUEUE_H + +#include + +template +class TaskQueue { + using lock_t = std::unique_lock; + std::deque _q; + bool _done{false}; + std::mutex _mutex; + std::condition_variable _ready; + +public: + bool try_pop(Task *&task) { + lock_t lock{_mutex, std::try_to_lock}; + if (!lock || _q.empty()) return false; + task = std::move(_q.front()); + _q.pop_front(); + return true; + } + + bool try_push(Task *task) { + { + lock_t lock{_mutex, std::try_to_lock}; + if (!lock) return false; + _q.push_back(task); + } + _ready.notify_one(); + return true; + } + + void done() { + { + lock_t lock{_mutex}; + _done = true; + } + _ready.notify_all(); + } + + bool pop(Task *&task) { + lock_t lock{_mutex}; + while (_q.empty() && !_done) + _ready.wait(lock); + if (_q.empty()) return false; + task = std::move(_q.front()); + _q.pop_front(); + return true; + } + + void push(Task *task) { + { + lock_t lock{_mutex}; + _q.push_back(task); + } + _ready.notify_one(); + } +}; + +#endif // VTASKQUEUE_H From 1728e6955f97246b7af734da66677dad2294d2f1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 14:03:23 +0900 Subject: [PATCH 040/672] lottie:render: added task stealing scheduler for async rle generation. Change-Id: Ie5a48bb018db8bccef499aac5cb7788de5df5b61 --- src/lottie/lottieitem.cpp | 50 ++++++---- src/lottie/lottieitem.h | 18 ++-- src/vector/vraster.cpp | 190 +++++++++++++++++++++++++++++--------- src/vector/vraster.h | 6 +- 4 files changed, 196 insertions(+), 68 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 0d62d4dee3..86bda248f6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -27,18 +27,24 @@ void VDrawable::preprocess() newPath = dasher.dashed(mPath); } FTOutline *outline = VRaster::toFTOutline(newPath); - mRle = VRaster::instance().generateStrokeInfo(outline, mStroke.cap, mStroke.join, - mStroke.width, mStroke.meterLimit); - VRaster::deleteFTOutline(outline); + mRleTask = VRaster::instance().generateStrokeInfo(outline, mStroke.cap, mStroke.join, + mStroke.width, mStroke.meterLimit); } else { FTOutline *outline = VRaster::toFTOutline(mPath); - mRle = VRaster::instance().generateFillInfo(outline, mFillRule); - VRaster::deleteFTOutline(outline); + mRleTask = VRaster::instance().generateFillInfo(outline, mFillRule); } mFlag &= ~DirtyFlag(DirtyState::Path); } } +VRle VDrawable::rle() +{ + if (mRleTask.valid()) { + mRle = std::move(mRleTask.get()); + } + return mRle; +} + void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) { mStroke.enable = true; @@ -310,19 +316,25 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, } float opacity = mData->opacity(frameNo); opacity = opacity * parentAlpha; + mCombinedAlpha = opacity; VPath path = mLocalPath; path.transform(parentMatrix); FTOutline *outline = VRaster::toFTOutline(path); - mRle = VRaster::instance().generateFillInfo(outline); - VRaster::deleteFTOutline(outline); + mRleTask = VRaster::instance().generateFillInfo(outline); +} - mRle = mRle * (opacity * 255); - - if (mData->mInv) { - mRle = ~mRle; +VRle LOTMaskItem::rle() +{ + if (mRleTask.valid()) { + mRle = std::move(mRleTask.get()); + if (!vCompare(mCombinedAlpha, 1.0f)) + mRle = mRle * (mCombinedAlpha * 255); + if (mData->mInv) + mRle = ~mRle; } + return mRle; } void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) @@ -336,35 +348,41 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) else mask = mask & inheritMask; } + + // do preprocessing first to take advantage of thread pool. for(auto i : list) { i->preprocess(); + } + + for(auto i : list) { painter->setBrush(i->mBrush); if (!mask.isEmpty()) { - VRle rle = i->mRle & mask; + VRle rle = i->rle() & mask; painter->drawRle(VPoint(), rle); } else { - painter->drawRle(VPoint(), i->mRle); + painter->drawRle(VPoint(), i->rle()); } } } VRle LOTLayerItem::maskRle(const VRect &clipRect) { + VRle rle; for (auto &i : mMasks) { switch (i->maskMode()) { case LOTMaskData::Mode::Add: { - rle = rle + i->mRle; + rle = rle + i->rle(); break; } case LOTMaskData::Mode::Substarct: { if (rle.isEmpty() && !clipRect.isEmpty()) rle = VRle::toRle(clipRect); - rle = rle - i->mRle; + rle = rle - i->rle(); break; } case LOTMaskData::Mode::Intersect: { - rle = rle & i->mRle; + rle = rle & i->rle(); break; } default: diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 72b7b237e6..5054b6aacb 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -144,12 +144,14 @@ public: LOTMaskItem(LOTMaskData *data): mData(data), mCombinedAlpha(0){} void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); LOTMaskData::Mode maskMode() const { return mData->mMode;} + VRle rle(); public: - LOTMaskData *mData; - float mCombinedAlpha; - VMatrix mCombinedMatrix; - VPath mLocalPath; - VRle mRle; + LOTMaskData *mData; + float mCombinedAlpha; + VMatrix mCombinedMatrix; + VPath mLocalPath; + std::future mRleTask; + VRle mRle; }; class VDrawable @@ -175,13 +177,15 @@ public: void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); void setDashInfo(float *array, int size); void preprocess(); + VRle rle(); public: DirtyFlag mFlag; VDrawable::Type mType; VBrush mBrush; - VPath mPath; + VPath mPath; FillRule mFillRule; - VRle mRle; + std::future mRleTask; + VRle mRle; struct { bool enable; float width; diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 7a5a892872..1d67f2a5e6 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -5,6 +5,8 @@ #include"vmatrix.h" #include #include"vdebug.h" +#include"vtaskqueue.h" +#include V_BEGIN_NAMESPACE @@ -36,6 +38,8 @@ public: bool closed; }; + + #define TO_FT_COORD(x) ((x) * 64) // to freetype 26.6 coordinate. void FTOutline::transform(const VMatrix &m) @@ -133,55 +137,154 @@ rleGenerationCb( int count, const SW_FT_Span* spans,void *user) rle->addSpan(rleSpan, count); } -VRle generateFillInfoAsync(const SW_FT_Outline *outline) +struct RleTask { - VRle rle; - SW_FT_Raster_Params params; + RleTask() { + receiver = sender.get_future(); + } + std::promise sender; + std::future receiver; + bool stroke; + FTOutline *outline; + SW_FT_Stroker_LineCap cap; + SW_FT_Stroker_LineJoin join; + int width; + int meterLimit; + SW_FT_Bool closed; +}; - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; - params.gray_spans = &rleGenerationCb; - params.user = &rle; - params.source = outline; +static VRle generateRleAsync(RleTask *task); - sw_ft_grays_raster.raster_render(nullptr, ¶ms); +class RleTaskScheduler { + const unsigned _count{std::thread::hardware_concurrency()}; + std::vector _threads; + std::vector> _q{_count}; + std::atomic _index{0}; - return rle; -} + void run(unsigned i) { + while (true) { + RleTask *task = nullptr; -VRle generateStrokeInfoAsync(const SW_FT_Outline *outline, SW_FT_Stroker_LineCap cap, - SW_FT_Stroker_LineJoin join, - int width, int meterLimit, - SW_FT_Bool closed) + for (unsigned n = 0; n != _count * 32; ++n) { + if (_q[(i + n) % _count].try_pop(task)) break; + } + if (!task && !_q[i].pop(task)) break; + + VRle rle = generateRleAsync(task); + task->sender.set_value(std::move(rle)); + delete task; + } + } + +public: + RleTaskScheduler() { + for (unsigned n = 0; n != _count; ++n) { + _threads.emplace_back([&, n] { run(n); }); + } + } + + ~RleTaskScheduler() { + for (auto& e : _q) + e.done(); + + for (auto& e : _threads) + e.join(); + } + + std::future async(RleTask *task) { + auto receiver = std::move(task->receiver); + auto i = _index++; + + for (unsigned n = 0; n != _count; ++n) { + if (_q[(i + n) % _count].try_push(task)) return std::move(receiver); + } + + _q[i % _count].push(task); + + return std::move(receiver); + } + + std::future strokeRle(FTOutline *outline, + SW_FT_Stroker_LineCap cap, + SW_FT_Stroker_LineJoin join, + int width, + int meterLimit, + SW_FT_Bool closed) { + RleTask *task = new RleTask(); + task->stroke = true; + task->outline = outline; + task->cap = cap; + task->join = join; + task->width = width; + task->meterLimit = meterLimit; + task->closed = closed; + return async(task); + } + + std::future fillRle(FTOutline *outline) { + RleTask *task = new RleTask(); + task->stroke = false; + task->outline = outline; + return async(task); + } +}; + +static RleTaskScheduler raster_scheduler; + +static VRle generateRleAsync(RleTask *task) { - SW_FT_Stroker stroker; - SW_FT_Stroker_New(&stroker); + if (task->stroke) { + // for stroke generation + SW_FT_Stroker stroker; + SW_FT_Stroker_New(&stroker); - uint points,contors; - SW_FT_Outline strokeOutline = { 0, 0, nullptr, nullptr, nullptr, SW_FT_OUTLINE_NONE }; + uint points,contors; + SW_FT_Outline strokeOutline = { 0, 0, nullptr, nullptr, nullptr, SW_FT_OUTLINE_NONE }; - SW_FT_Stroker_Set(stroker, width, cap, join, meterLimit); - SW_FT_Stroker_ParseOutline(stroker, outline, !closed); - SW_FT_Stroker_GetCounts(stroker,&points, &contors); + SW_FT_Stroker_Set(stroker, task->width, task->cap, task->join, task->meterLimit); + SW_FT_Stroker_ParseOutline(stroker, &task->outline->ft, !task->closed); + SW_FT_Stroker_GetCounts(stroker,&points, &contors); - strokeOutline.points = (SW_FT_Vector *) calloc(points, sizeof(SW_FT_Vector)); - strokeOutline.tags = (char *) calloc(points, sizeof(char)); - strokeOutline.contours = (short *) calloc(contors, sizeof(short)); + strokeOutline.points = (SW_FT_Vector *) calloc(points, sizeof(SW_FT_Vector)); + strokeOutline.tags = (char *) calloc(points, sizeof(char)); + strokeOutline.contours = (short *) calloc(contors, sizeof(short)); - SW_FT_Stroker_Export(stroker, &strokeOutline); + SW_FT_Stroker_Export(stroker, &strokeOutline); - SW_FT_Stroker_Done(stroker); + SW_FT_Stroker_Done(stroker); - VRle rle = generateFillInfoAsync(&strokeOutline); + VRle rle; + SW_FT_Raster_Params params; - // cleanup the outline data. - free(strokeOutline.points); - free(strokeOutline.tags); - free(strokeOutline.contours); + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.gray_spans = &rleGenerationCb; + params.user = &rle; + params.source = &strokeOutline; - return rle; + sw_ft_grays_raster.raster_render(nullptr, ¶ms); + + // cleanup the outline data. + free(strokeOutline.points); + free(strokeOutline.tags); + free(strokeOutline.contours); + + return rle; + } else { + // fill generation + VRle rle; + SW_FT_Raster_Params params; + + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.gray_spans = &rleGenerationCb; + params.user = &rle; + params.source = &task->outline->ft; + + sw_ft_grays_raster.raster_render(nullptr, ¶ms); + + return rle; + } } - VRaster::VRaster() { } @@ -231,7 +334,8 @@ FTOutline *VRaster::toFTOutline(const VPath &path) return outline; } -VRle VRaster::generateFillInfo(const FTOutline *outline, FillRule fillRule) +std::future +VRaster::generateFillInfo(FTOutline *outline, FillRule fillRule) { int fillRuleFlag = SW_FT_OUTLINE_NONE; switch (fillRule) { @@ -242,19 +346,21 @@ VRle VRaster::generateFillInfo(const FTOutline *outline, FillRule fillRule) fillRuleFlag = SW_FT_OUTLINE_NONE; break; } - FTOutline *outlineRef = const_cast(outline); - outlineRef->ft.flags = fillRuleFlag; - return generateFillInfoAsync(&outlineRef->ft); + + outline->ft.flags = fillRuleFlag; + + return std::move(raster_scheduler.fillRle(outline)); } -VRle VRaster::generateStrokeInfo(const FTOutline *outline, CapStyle cap, JoinStyle join, - float width, float meterLimit) +std::future +VRaster::generateStrokeInfo(FTOutline *outline, CapStyle cap, JoinStyle join, + float width, float meterLimit) { SW_FT_Stroker_LineCap ftCap; SW_FT_Stroker_LineJoin ftJoin; int ftWidth; int ftMeterLimit; - SW_FT_Bool ftbool = (SW_FT_Bool) outline->closed; + SW_FT_Bool ftclose = (SW_FT_Bool) outline->closed; // map strokeWidth to freetype. It uses as the radius of the pen not the diameter width = width/2.0; @@ -288,8 +394,8 @@ VRle VRaster::generateStrokeInfo(const FTOutline *outline, CapStyle cap, JoinSty break; } - return generateStrokeInfoAsync(&outline->ft, ftCap, ftJoin, - ftWidth, ftMeterLimit, ftbool); + return std::move(raster_scheduler.strokeRle(outline, ftCap, ftJoin, + ftWidth, ftMeterLimit, ftclose)); } V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 5b8d0ad299..65baab662c 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -25,9 +25,9 @@ public: static FTOutline *toFTOutline(const VPath &path); static void deleteFTOutline(FTOutline *); - VRle generateFillInfo(const FTOutline *, FillRule fillRule = FillRule::Winding); - VRle generateStrokeInfo(const FTOutline *, CapStyle cap, JoinStyle join, - float width, float meterLimit); + std::future generateFillInfo(FTOutline *, FillRule fillRule = FillRule::Winding); + std::future generateStrokeInfo(FTOutline *, CapStyle cap, JoinStyle join, + float width, float meterLimit); private: VRaster(); VRasterPrivate *d; From cb48dc46276573aa9b21be0eae3a75f46ae73d17 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 14:36:47 +0900 Subject: [PATCH 041/672] lottie: fixed valgrind warning for unintialized variable Change-Id: I90e80585f3b217df86e948650e5f6128aef65ac3 --- src/lottie/lottieitem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 86bda248f6..5bae4e996a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -395,6 +395,7 @@ VRle LOTLayerItem::maskRle(const VRect &clipRect) LOTLayerItem::LOTLayerItem(LOTLayerData *layerData):mLayerData(layerData), mParentLayer(nullptr), mPrecompLayer(nullptr), + mCombinedAlpha(0.0f), mFrameNo(-1), mDirtyFlag(DirtyFlagBit::All) { From b63e2ac43f194ed6d297955ccd3051551c669d74 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 18 Jul 2018 17:50:01 +0900 Subject: [PATCH 042/672] lottie/parser: update the static property of gradient model properly. Change-Id: I28bca148869b3a063926bfe56bb8b5adc33000c6 --- src/lottie/lottieparser.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 8905d502fa..11001df589 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1286,6 +1286,13 @@ LottieParserImpl::parseGradientProperty(LOTGradient *obj, const char *key) #endif Skip(key); } + obj->setStatic(obj->mOpacity.isStatic() && + obj->mStartPoint.isStatic() && + obj->mEndPoint.isStatic() && + obj->mHighlightAngle.isStatic() && + obj->mHighlightLength.isStatic() && + obj->mGradient.isStatic()); + } /* @@ -1304,7 +1311,6 @@ LottieParserImpl::parseGFillObject() parseGradientProperty(obj, key); } } - return sharedGFill; } @@ -1361,7 +1367,8 @@ LottieParserImpl::parseGStrokeObject() } } - obj->setStatic(obj->mWidth.isStatic() && + obj->setStatic(obj->isStatic() && + obj->mWidth.isStatic() && obj->mDash.mStatic); return sharedGStroke; } From 393b84e2a1840e360f5fb5ffc0d64da9885ac1a8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 19 Jul 2018 15:04:57 +0900 Subject: [PATCH 043/672] lottie/render: start all preprocess task at once before rendering the frame. Change-Id: I6c625a3ed069c40d4f42fbb3579120ffbcc30d54 --- src/lottie/lottieitem.cpp | 19 ++++++++++--------- src/lottie/lottieitem.h | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 5bae4e996a..a48777b98a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -271,14 +271,14 @@ bool LOTCompItem::update(int frameNo) void LOTCompItem::buildRenderList() { - mRenderList.clear(); - std::vector list; + mDrawableList.clear(); for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { LOTLayerItem *layer = *i; - layer->renderList(list); + layer->renderList(mDrawableList); } - for(auto i : list) { + mRenderList.clear(); + for(auto i : mDrawableList) { i->sync(); mRenderList.push_back(&i->mCNode); } @@ -294,6 +294,12 @@ bool LOTCompItem::render(const LOTBuffer &buffer) VBitmap bitmap((uchar *)buffer.buffer, buffer.width, buffer.height, buffer.bytesPerLine, VBitmap::Format::ARGB32_Premultiplied, nullptr, nullptr); + /* schedule all preprocess task for this frame at once. + */ + for (auto &e : mDrawableList) { + e->preprocess(); + } + VPainter painter(&bitmap); VRle mask; for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { @@ -349,11 +355,6 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } - // do preprocessing first to take advantage of thread pool. - for(auto i : list) { - i->preprocess(); - } - for(auto i : list) { painter->setBrush(i->mBrush); if (!mask.isEmpty()) { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 5054b6aacb..259aeebefd 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -48,6 +48,7 @@ private: bool mUpdateViewBox; int mCurFrameNo; std::vector mRenderList; + std::vector mDrawableList; }; typedef vFlag DirtyFlag; From cf111a2a2d679b90af8117ce15c4a01f61891f71 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 19 Jul 2018 15:50:48 +0900 Subject: [PATCH 044/672] lottie/example: update the example to do stress test. Change-Id: I701fa71d0a05be453c26c252e57ab1ce3b110b0d --- example/lottieviewtest.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 7af573ea30..59a3cf7868 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -22,37 +22,37 @@ public: mRenderMode = renderMode; } - void show() { + void show(int numberOfImage) { auto resource = EvasApp::jsonFiles(std::string(DEMO_DIR)); if (resource.empty()) return; - int count = resource.size(); + int count = numberOfImage; int colums = (int) ceil(sqrt(count)); int offset = 3; int vw = (mApp->width() - (2 * offset * colums))/colums; int vh = vw; int posx = offset; int posy = offset; - for(auto filePath : resource) { - + int resourceSize = resource.size(); + for (int i = 0 ; i < numberOfImage; i++) { + int index = i % resourceSize; std::unique_ptr view(new LottieView(mApp->evas(), mRenderMode)); - view->setFilePath(filePath.c_str()); - view->setPos(posx, posy); - view->setSize(vw, vh); - view->show(); - view->play(); - view->loop(true); - //view->setRepeatMode(LottieView::RepeatMode::Reverse); + view->setFilePath(resource[index].c_str()); + view->setPos(posx, posy); + view->setSize(vw, vh); + view->show(); + view->play(); + view->loop(true); + //view->setRepeatMode(LottieView::RepeatMode::Reverse); - posx += vw+offset; - if ((mApp->width() - posx) < vw) { + posx += vw+offset; + if ((mApp->width() - posx) < vw) { posx = offset; posy = posy + vh + offset; - } - mViews.push_back(std::move(view)); + } + mViews.push_back(std::move(view)); } - } void render() { @@ -93,7 +93,7 @@ main(int argc, char **argv) renderMode = false; } LottieViewTest *view = new LottieViewTest(app, renderMode); - view->show(); + view->show(50); app->addExitCb(onExitCb, view); app->addRenderPreCb(onRenderPreCb, view); From 048dd0d7a36ea98a381326a3470b84b0153b834f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 19 Jul 2018 16:10:41 +0900 Subject: [PATCH 045/672] lottie/render: fixed memory leak regression from last refactoring. Change-Id: I67c83f67a8efe1f367070c05497ec419da2753cb --- src/vector/vraster.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 1d67f2a5e6..202798be00 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -172,6 +172,7 @@ class RleTaskScheduler { VRle rle = generateRleAsync(task); task->sender.set_value(std::move(rle)); + delete task->outline; delete task; } } From f2bf8eabc922e9dcd169f326d7f0c6a52c6c143f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 20 Jul 2018 08:36:43 +0900 Subject: [PATCH 046/672] lottie/vector: make all copy_on_write class in vector thread safe. Change-Id: Ibf3781775d0d26c0240970b720a59fbfed43f6b2 --- src/vector/vbitmap.cpp | 2 +- src/vector/vglobal.h | 21 +++++++++++---------- src/vector/vmatrix.cpp | 16 +++++++++------- src/vector/vpath.cpp | 16 +++++++++------- src/vector/vregion.cpp | 2 +- src/vector/vregion.h | 1 + src/vector/vrle.cpp | 4 ++-- 7 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index a8edd233c5..c4a0190c91 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -156,7 +156,7 @@ VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap::Format fo d->cleanupInfo = nullptr; d->ownData = false; d->roData = false; - d->ref = 1; + d->ref.setOwned(); } VBitmap VBitmap::copy(const VRect& r) const diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 898460024b..0585955991 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -36,42 +36,43 @@ typedef uint8_t uchar; #define VECTOR_FALLTHROUGH +#include class RefCount { public: - inline RefCount(){} inline RefCount(int i):atomic(i){} inline bool ref() { - int count = atomic; + int count = atomic.load(); if (count == 0) // !isSharable return false; if (count != -1) // !isStatic - atomic++; + atomic.fetch_add(1); return true; } inline bool deref() { - int count = atomic; + int count = atomic.load(); if (count == 0) // !isSharable return false; if (count == -1) // isStatic return true; - return --atomic; + atomic.fetch_sub(1); + return --count; } bool isShared() const { - int count = atomic; + int count = atomic.load(); return (count != 1) && (count != 0); } bool isStatic() const { // Persistent object, never deleted - return atomic == -1; + int count = atomic.load(); + return count == -1; } inline int count()const{return atomic;} - void setOwned() { atomic = 1; } - void setUnsharable() { atomic = 0; } + void setOwned() { atomic.store(1); } private: - int atomic; + std::atomic atomic; }; template diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 2a72700a7b..22ec612092 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -12,6 +12,12 @@ V_BEGIN_NAMESPACE */ struct VMatrixData { + VMatrixData(): ref(-1), + type(VMatrix::MatrixType::None), + dirty(VMatrix::MatrixType::None), + m11(1), m12(0), m13(0), + m21(0), m22(1), m23(0), + mtx(0), mty(0), m33(1){} RefCount ref; VMatrix::MatrixType type; VMatrix::MatrixType dirty; @@ -19,12 +25,9 @@ struct VMatrixData { float m21, m22, m23; float mtx, mty, m33; }; -static const struct VMatrixData shared_empty = {RefCount(-1), - VMatrix::MatrixType::None, - VMatrix::MatrixType::None, - 1, 0, 0, - 0, 1, 0, - 0, 0, 1}; + +static const struct VMatrixData shared_empty; + inline float VMatrix::determinant() const { return d->m11*(d->m33*d->m22 - d->mty*d->m23) - @@ -95,7 +98,6 @@ VMatrix::~VMatrix() VMatrix::VMatrix(bool init V_UNUSED) { d = new VMatrixData; - memcpy(d, &shared_empty, sizeof(VMatrixData)); d->ref.setOwned(); } diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index ba352ee7f3..592bd97792 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -9,6 +9,13 @@ V_BEGIN_NAMESPACE struct VPathData { + VPathData():ref(-1), + m_points(), + m_elements(), + m_segments(0), + mStartPoint(), + mNewSegment(true){} + void copy(VPathData *o); void moveTo(const VPointF &pt); void lineTo(const VPointF &pt); @@ -95,12 +102,7 @@ int VPathData::segments() const } -static const struct VPathData shared_empty = {RefCount(-1), - std::vector(), - std::vector(), - 0, - VPointF(), - true}; +static const struct VPathData shared_empty; inline void VPath::cleanUp(VPathData *d) { @@ -117,7 +119,7 @@ VPath VPath::copy() const { VPath other; - other.d = new VPathData(shared_empty); + other.d = new VPathData; other.d->m_points = d->m_points; other.d->m_elements = d->m_elements; other.d->m_segments = d->m_segments; diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index a0cd00e1bd..7738690c26 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -2044,7 +2044,7 @@ typedef region_type_t VRegionPrivate; V_BEGIN_NAMESPACE static VRegionPrivate regionPrivate = {{0,0,0,0}, NULL}; -const VRegion::VRegionData VRegion::shared_empty = {RefCount(-1), ®ionPrivate}; +const VRegion::VRegionData VRegion::shared_empty; inline VRect box_to_rect(box_type_t *box) { diff --git a/src/vector/vregion.h b/src/vector/vregion.h index e5986af035..b5d019c65b 100644 --- a/src/vector/vregion.h +++ b/src/vector/vregion.h @@ -55,6 +55,7 @@ private: void detach(); struct VRegionData { + VRegionData():ref(-1),rgn(nullptr){} RefCount ref; VRegionPrivate *rgn; }; diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index c41871f4b1..1d9ef27dd1 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -555,12 +555,12 @@ void VRleImpl::addSpan(const VRle::Span *span, int count) struct VRleData { + VRleData():ref(-1), impl(){} RefCount ref; VRleImpl impl; }; -static const struct VRleData shared_empty = {RefCount(-1), - VRleImpl()}; +static const struct VRleData shared_empty; inline void VRle::cleanUp(VRleData *d) { From a411696b123665bef070467183860deff279a05e Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Thu, 19 Jul 2018 19:22:19 +0900 Subject: [PATCH 047/672] vector: implement vpathmesure Change-Id: I562df481e72b4e356821b1a44b7749c29ea0b1ca --- src/vector/vpathmesure.cpp | 302 ++++++++++++++++++++++++++++++++++++- src/vector/vpathmesure.h | 4 + 2 files changed, 304 insertions(+), 2 deletions(-) diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index cabbe42d1e..52e93e823b 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,10 +1,308 @@ #include"vpathmesure.h" +#include"vbezier.h" V_BEGIN_NAMESPACE -class VPathMesureData +struct VPathMesureData { - VPath *path; + void setPath(const VPath &path) { mPath = path; } + VPath& getPath() { return mPath; } + VPath mPath; }; V_END_NAMESPACE + +static const struct VPathMesureData shared_empty = {VPath()}; + +VPathMesure::~VPathMesure() +{ +} + +VPathMesure::VPathMesure() + : d(const_cast(&shared_empty)) +{ +} + +VPathMesure::VPathMesure(const VPath *p, bool foceClose) +{ +} + +void VPathMesure::setStart(float pos) +{ + VPath &path = d->getPath(); + const std::vector &elm = path.elements(); + const std::vector &pts = path.points(); + std::vector len; + + std::vector elm_copy; + + int i = 0, idx = 0; + float totlen = 0.0; + float startlen = 0.0; + bool cut = false; + + for (auto e : elm) { + elm_copy.push_back(e); + switch(e) { + case VPath::Element::MoveTo: + break; + case VPath::Element::LineTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + + VBezier b = VBezier::fromPoints(p0, p0, p, p); + totlen += b.length(); + len.push_back(b.length()); + break; + } + case VPath::Element::CubicTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + VPointF p1 = pts[i++]; + VPointF p2 = pts[i++]; + + VBezier b = VBezier::fromPoints(p0, p, p1, p2); + totlen += b.length(); + len.push_back(b.length()); + + break; + } + case VPath::Element::Close: + break; + } + } + + startlen = totlen * (pos / 100); + i = 0; + path.reset(); + + for (auto e : elm_copy) { + switch(e) { + case VPath::Element::MoveTo: + { + VPointF p = pts[i++]; + path.moveTo(p.x(), p.y()); + break; + } + case VPath::Element::LineTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + + if (!cut) + { + if (len.at(idx) < startlen) + { + startlen -= len.at(idx); + } + else if (len.at(idx) == startlen) + { + path.moveTo(p.x(), p.y()); + cut = true; + } + else + { + VBezier b, bleft; + float ratio = (startlen/len.at(idx)); + b = VBezier::fromPoints(p0, p0, p, p); + b.parameterSplitLeft(ratio, &bleft); + + path.moveTo(b.pt1().x(), b.pt1().y()); + path.lineTo(b.pt4().x(), b.pt4().y()); + cut = true; + } + idx++; + } + else + { + path.lineTo(p.x(), p.y()); + } + break; + } + case VPath::Element::CubicTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + VPointF p1 = pts[i++]; + VPointF p2 = pts[i++]; + + if (!cut) + { + if (len.at(idx) < startlen) + { + startlen -= len.at(idx); + } + else if (len.at(idx) == startlen) + { + path.moveTo(p2.x(), p2.y()); + cut = true; + } + else + { + VBezier b, bleft; + float ratio = (startlen/len.at(idx)); + b = VBezier::fromPoints(p0, p, p1, p2); + b.parameterSplitLeft(ratio, &bleft); + + path.moveTo(b.pt1().x(), b.pt1().y()); + path.cubicTo(b.pt2().x(), b.pt2().y(), + b.pt3().x(), b.pt3().y(), + b.pt4().x(), b.pt4().y()); + cut = true; + } + idx++; + } + else + { + path.cubicTo(p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); + } + break; + } + case VPath::Element::Close: + break; + } + } +} + +void VPathMesure::setEnd(float pos) +{ + VPath &path = d->getPath(); + const std::vector &elm = path.elements(); + const std::vector &pts = path.points(); + std::vector len; + + std::vector elm_copy; + + int i = 0, idx = 0; + float totlen = 0.0; + float endlen = 0.0; + bool cut = false; + + for (auto e : elm) { + elm_copy.push_back(e); + switch(e) { + case VPath::Element::MoveTo: + break; + case VPath::Element::LineTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + + VBezier b = VBezier::fromPoints(p0, p0, p, p); + totlen += b.length(); + len.push_back(b.length()); + break; + } + case VPath::Element::CubicTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + VPointF p1 = pts[i++]; + VPointF p2 = pts[i++]; + + VBezier b = VBezier::fromPoints(p0, p, p1, p2); + totlen += b.length(); + len.push_back(b.length()); + + break; + } + case VPath::Element::Close: + break; + } + } + + endlen = totlen * (pos / 100); + i = 0; + path.reset(); + + for (auto e : elm_copy) { + switch(e) { + case VPath::Element::MoveTo: + { + VPointF p = pts[i++]; + path.moveTo(p.x(), p.y()); + break; + } + case VPath::Element::LineTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + + if (!cut) + { + if (len.at(idx) < endlen) + { + path.lineTo(p.x(), p.y()); + endlen -= len.at(idx); + } + else if (len.at(idx) == endlen) + { + path.lineTo(p.x(), p.y()); + cut = true; + } + else + { + VBezier b, bleft; + float ratio = (endlen/len.at(idx)); + b = VBezier::fromPoints(p0, p0, p, p); + b.parameterSplitLeft(ratio, &bleft); + + path.lineTo(bleft.pt4().x(), bleft.pt4().y()); + cut = true; + } + idx++; + } + break; + } + case VPath::Element::CubicTo: + { + VPointF p0 = pts[i - 1]; + VPointF p = pts[i++]; + VPointF p1 = pts[i++]; + VPointF p2 = pts[i++]; + + if (!cut) + { + if (len.at(idx) < endlen) + { + path.cubicTo(p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); + endlen -= len.at(idx); + } + else if (len.at(idx) == endlen) + { + path.cubicTo(p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); + cut = true; + } + else + { + VBezier b, bleft; + float ratio = (endlen/len.at(idx)); + b = VBezier::fromPoints(p0, p, p1, p2); + b.parameterSplitLeft(ratio, &bleft); + + path.cubicTo(bleft.pt2().x(), bleft.pt2().y(), + bleft.pt3().x(), bleft.pt3().y(), + bleft.pt4().x(), bleft.pt4().y()); + cut = true; + } + idx++; + } + break; + } + case VPath::Element::Close: + break; + } + } +} + +void VPathMesure::setPath(const VPath &path) +{ + d->setPath(path); +} + +VPath VPathMesure::getPath() +{ + return d->getPath(); +} diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 0a97fc13db..88fc9fd827 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -13,6 +13,10 @@ public: VPathMesure(); VPathMesure(const VPath *path, bool foceClose); int getLength() const; + void setPath(const VPath &path); + VPath getPath(); + void setStart(float pos); + void setEnd(float pos); private: VPathMesureData *d; }; From 4067491267afd40647c65a58c3b75e4b4baf9a74 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Thu, 19 Jul 2018 20:20:32 +0900 Subject: [PATCH 048/672] lottie: handle trim path Change-Id: I05f1daec3c7e0c4cbb953c5c0a076d81e82d8e30 --- src/lottie/lottieitem.cpp | 62 +++++++++++++++++++++++++++++++++++++-- src/lottie/lottieitem.h | 9 ++++++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index a48777b98a..06797d14de 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -5,7 +5,6 @@ #include"vdasher.h" #include - VDrawable::VDrawable():mFlag(DirtyState::All), mType(Type::Fill), mFillRule(FillRule::Winding) @@ -608,6 +607,7 @@ LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData):LOTLayerItem(layer mRoot = new LOTContentGroupItem(nullptr); mRoot->addChildren(layerData); mRoot->processPaintOperation(); + mRoot->processTrimOperation(); } LOTShapeLayerItem::~LOTShapeLayerItem() @@ -658,6 +658,10 @@ LOTContentItem * LOTShapeLayerItem::createContentItem(LOTData *contentData) return new LOTRepeaterItem(static_cast(contentData)); break; } + case LOTData::Type::Trim: { + return new LOTTrimItem(static_cast(contentData)); + break; + } default: return nullptr; break; @@ -765,9 +769,42 @@ void LOTPathDataItem::addPaintOperation(std::vector &list, i } } +void LOTContentGroupItem::processTrimOperation() +{ + std::vector list; + trimOperationHelper(list); +} + +void LOTContentGroupItem::trimOperationHelper(std::vector &list) +{ + int curOpCount = list.size(); + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto child = *i; + if (auto pathNode = dynamic_cast(child)) { + // the node is a path data node add the paint operation list to it. + pathNode->addTrimOperation(list); + } else if (auto trimNode = dynamic_cast(child)) { + // add it to the trim operation list + list.push_back(trimNode); + } else if (auto groupNode = dynamic_cast(child)) { + // update the groups node with current list + groupNode->trimOperationHelper(list); + } + } + list.erase(list.begin() + curOpCount, list.end()); +} + +void LOTPathDataItem::addTrimOperation(std::vector &list) +{ + for(auto trimItem : list) { + mTrimNodeRefs.push_back(trimItem); + } +} void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) { + VPath tempPath; + mPathChanged = false; mCombinedAlpha = parentAlpha; @@ -778,12 +815,28 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float par mPathChanged = true; } + tempPath = mLocalPath; + // 2. apply path operation if needed - // TODO + if (mTrimNodeRefs.size() > 0) + { + //TODO apply more than one trim path if necessary + VPathMesure pm; + float s = mTrimNodeRefs.front()->getStart(frameNo); + float e = mTrimNodeRefs.front()->getEnd(frameNo); + + pm.setPath(mLocalPath); + pm.setStart(s); + pm.setEnd(e); + tempPath = pm.getPath(); + + mPathChanged = true; + } // 3. compute the final path with parentMatrix + if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { - mFinalPath = mLocalPath; + mFinalPath = tempPath; mFinalPath.transform(parentMatrix); mPathChanged = true; } @@ -1051,7 +1104,10 @@ void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *draw LOTTrimItem::LOTTrimItem(LOTTrimData *data):mData(data) { +} +void LOTTrimItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ } LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data):mData(data) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 259aeebefd..1ef9610e58 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -8,6 +8,7 @@ #include"vmatrix.h" #include"vpath.h" #include"vpoint.h" +#include"vpathmesure.h" #include"lottieplayer.h" #include"vbrush.h" #include"vpainter.h" @@ -202,6 +203,7 @@ public: class LOTNode; class LOTPathDataItem; class LOTPaintDataItem; +class LOTTrimItem; struct LOTRenderNode { LOTRenderNode(LOTPathDataItem *path, LOTPaintDataItem *paint, VDrawable *render, bool sameG) @@ -229,9 +231,11 @@ public: void addChildren(LOTGroupData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; void processPaintOperation(); + void processTrimOperation(); void renderList(std::vector &list) final; private: void paintOperationHelper(std::vector &list); + void trimOperationHelper(std::vector &list); LOTShapeGroupData *mData; std::vector mContents; }; @@ -243,9 +247,11 @@ public: void addPaintOperation(std::vector &list, int externalCount); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; VPath path() const; + void addTrimOperation(std::vector &list); inline float combinedAlpha() const{ return mCombinedAlpha;} void renderList(std::vector &list) final; private: + std::vector mTrimNodeRefs; std::vector mRenderList; std::vector> mNodeList; bool mInit; @@ -386,6 +392,9 @@ class LOTTrimItem : public LOTContentItem { public: LOTTrimItem(LOTTrimData *data); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + float getStart(int frameNo) {return mData->mStart.value(frameNo);} + float getEnd(int frameNo) {return mData->mEnd.value(frameNo);} private: LOTTrimData *mData; }; From 1aea5d64d86d8554e944bc3e21257fe202865b37 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 20 Jul 2018 10:25:06 +0900 Subject: [PATCH 049/672] lottie/render: implement render_scheduler to enable multithreading render job. Change-Id: If3ab28cd7fab0e16703fae5b8f3d158bf40a77e3 --- inc/lottieplayer.h | 4 +- src/lottie/lottieplayer.cpp | 110 +++++++++++++++++++++++++++++++++--- 2 files changed, 104 insertions(+), 10 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 8644f1d7a2..c7fd5c9aeb 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -56,8 +56,8 @@ public: //TODO: Consider correct position... void setSize(int width, int height); void size(int &width, int &height) const; - std::future render(float pos, const LOTBuffer &buffer); - bool renderSync(float pos, const LOTBuffer &buffer); + std::future render(float pos, LOTBuffer &buffer); + bool renderSync(float pos, LOTBuffer &buffer); public: LOTPlayerPrivate *d; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 314a8f2ede..3313f5fdd0 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -24,7 +24,7 @@ public: std::shared_ptr mModel; std::unique_ptr mCompItem; VSize mSize; - + std::atomic mRenderInProgress; private: float mPos; }; @@ -88,17 +88,26 @@ float LOTPlayerPrivate::pos() bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) { + bool renderInProgress = mRenderInProgress.load(); + if (renderInProgress) + vCritical<<"Already Rendering Scheduled for this Player"; + + mRenderInProgress.store(true); + + bool result; if (setPos(pos)) { if (mCompItem->render(buffer)) - return true; + result = true; else - return false; + result = false; } else { - return false; + result = false; } + mRenderInProgress.store(false); + return result; } -LOTPlayerPrivate::LOTPlayerPrivate():mPos(-1) +LOTPlayerPrivate::LOTPlayerPrivate():mRenderInProgress(false), mPos(-1) { } @@ -121,6 +130,90 @@ LOTPlayerPrivate::setFilePath(std::string path) return false; } +/* + * Implement a task stealing schduler to perform render task + * As each player draws into its own buffer we can delegate this + * task to a slave thread. The scheduler creates a threadpool depending + * on the number of cores available in the system and does a simple fair + * scheduling by assigning the task in a round-robin fashion. Each thread + * in the threadpool has its own queue. once it finishes all the task on its + * own queue it goes through rest of the queue and looks for task if it founds one + * it steals the task from it and executes. if it couldn't find one then it just waits + * for new task on its own queue. + */ +struct RenderTask +{ + RenderTask() { + receiver = sender.get_future(); + } + std::promise sender; + std::future receiver; + LOTPlayerPrivate *playerImpl; + float pos; + LOTBuffer buffer; +}; + +#include +class RenderTaskScheduler { + const unsigned _count{std::thread::hardware_concurrency()}; + std::vector _threads; + std::vector> _q{_count}; + std::atomic _index{0}; + + void run(unsigned i) { + while (true) { + RenderTask *task = nullptr; + + for (unsigned n = 0; n != _count * 32; ++n) { + if (_q[(i + n) % _count].try_pop(task)) break; + } + if (!task && !_q[i].pop(task)) break; + + bool result = task->playerImpl->render(task->pos, task->buffer); + task->sender.set_value(result); + delete task; + } + } + +public: + RenderTaskScheduler() { + for (unsigned n = 0; n != _count; ++n) { + _threads.emplace_back([&, n] { run(n); }); + } + } + + ~RenderTaskScheduler() { + for (auto& e : _q) + e.done(); + + for (auto& e : _threads) + e.join(); + } + + std::future async(RenderTask *task) { + auto receiver = std::move(task->receiver); + auto i = _index++; + + for (unsigned n = 0; n != _count; ++n) { + if (_q[(i + n) % _count].try_push(task)) return std::move(receiver); + } + + _q[i % _count].push(task); + + return std::move(receiver); + } + + std::future render(LOTPlayerPrivate *impl, + float pos, LOTBuffer &buffer) { + RenderTask *task = new RenderTask(); + task->playerImpl = impl; + task->pos = pos; + task->buffer = buffer; + return async(task); + } +}; +static RenderTaskScheduler render_scheduler; + LOTPlayer::LOTPlayer():d(new LOTPlayerPrivate()) { @@ -173,12 +266,12 @@ const std::vector& LOTPlayer::renderList()const return d->renderList(); } -std::future LOTPlayer::render(float pos, const LOTBuffer &buffer) +std::future LOTPlayer::render(float pos, LOTBuffer &buffer) { - return std::async(std::launch::async, &LOTPlayerPrivate::render, d, pos, buffer); + return render_scheduler.render(d, pos, buffer); } -bool LOTPlayer::renderSync(float pos, const LOTBuffer &buffer) +bool LOTPlayer::renderSync(float pos, LOTBuffer &buffer) { return d->render(pos, buffer); } @@ -192,3 +285,4 @@ LOTNode::LOTNode() } + From cfdac7e78c87e5d8dee90c61fcf29bf86a246562 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 20 Jul 2018 14:38:18 +0900 Subject: [PATCH 050/672] lottie/vector: refactor the vregion class Change-Id: I093000d097cee2045b32b04ef8774b1aaa2706d8 --- src/vector/vregion.cpp | 17 +++++++++++++++-- src/vector/vregion.h | 14 +++----------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index 7738690c26..da819537ec 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -2044,14 +2044,21 @@ typedef region_type_t VRegionPrivate; V_BEGIN_NAMESPACE static VRegionPrivate regionPrivate = {{0,0,0,0}, NULL}; -const VRegion::VRegionData VRegion::shared_empty; + +struct VRegionData { + VRegionData():ref(-1),rgn(®ionPrivate){} + RefCount ref; + VRegionPrivate *rgn; +}; + +const VRegionData shared_empty; inline VRect box_to_rect(box_type_t *box) { return VRect(box->x1, box->y1, box->x2 - box->x1, box->y2 - box->y1); } -void VRegion::cleanUp(VRegion::VRegionData *x) +void VRegion::cleanUp(VRegionData *x) { if (x->rgn) { PREFIX(_fini)(x->rgn); @@ -2109,6 +2116,12 @@ VRegion::VRegion(const VRegion &r) d->ref.ref(); } +VRegion::VRegion(VRegion &&other): d(other.d) +{ + other.d = const_cast(&shared_empty); + +} + VRegion &VRegion::operator=(const VRegion &r) { r.d->ref.ref(); diff --git a/src/vector/vregion.h b/src/vector/vregion.h index b5d019c65b..00155e91ff 100644 --- a/src/vector/vregion.h +++ b/src/vector/vregion.h @@ -8,8 +8,7 @@ V_BEGIN_NAMESPACE -typedef struct pixman_region region_type_t; -typedef region_type_t VRegionPrivate; +struct VRegionData; class VRegion { @@ -18,7 +17,7 @@ public: VRegion(int x, int y, int w, int h); VRegion(const VRect &r); VRegion(const VRegion ®ion); - VRegion(VRegion &&other): d(other.d) { other.d = const_cast(&shared_empty); } + VRegion(VRegion &&other); ~VRegion(); VRegion &operator=(const VRegion &); VRegion &operator=(VRegion &&); @@ -53,16 +52,9 @@ private: bool within(const VRect &r) const; VRegion copy() const; void detach(); - - struct VRegionData { - VRegionData():ref(-1),rgn(nullptr){} - RefCount ref; - VRegionPrivate *rgn; - }; + void cleanUp(VRegionData *x); struct VRegionData *d; - static const struct VRegionData shared_empty; - static void cleanUp(VRegionData *x); }; inline void VRegion::translate(int dx, int dy) { From 812f816138c2ffad6c39d9f2914ffc1a5ce4915c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 20 Jul 2018 10:30:03 +0900 Subject: [PATCH 051/672] lottie/example: updated example to use async rendering . Change-Id: I6929f00bb6a26f18f7276890c40993329d94ae03 --- example/lottieview.cpp | 23 ++++++++++++++++------- example/lottieview.h | 4 +++- example/lottieviewtest.cpp | 5 ++++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 489dcfd432..a59468d3bb 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -105,6 +105,9 @@ LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullpt LottieView::~LottieView() { + if (mRenderTask.valid()) + mRenderTask.get(); + ecore_animator_del(mAnimator); if (mVg) evas_object_del(mVg); if (mImage) evas_object_del(mImage); @@ -139,8 +142,13 @@ void LottieView::seek(float pos) LOTBuffer buf; evas_object_image_size_get(mImage, &buf.width, &buf.height); if (mAsyncRender) { + if (mRenderTask.valid()) return; mDirty = true; mPendingPos = pos; + buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); + buf.bytesPerLine = evas_object_image_stride_get(mImage); + mRenderTask = mPlayer->render(mPendingPos, buf); + mBuffer = buf; // to force a redraw evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); } else { @@ -166,16 +174,17 @@ void LottieView::render() mDirty = false; if (mRenderMode) { - LOTBuffer buf; - buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); - buf.bytesPerLine = evas_object_image_stride_get(mImage); - evas_object_image_size_get(mImage, &buf.width, &buf.height); - bool changed = mPlayer->renderSync(mPendingPos, buf); - evas_object_image_data_set(mImage, buf.buffer); + if (!mBuffer.buffer) return; + bool changed = false; + if (mRenderTask.valid()) { + changed = mRenderTask.get(); + } + evas_object_image_data_set(mImage, mBuffer.buffer); // if the buffer is updated notify the image object if (changed) { - evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); + evas_object_image_data_update_add(mImage, 0 , 0, mBuffer.width, mBuffer.height); } + mBuffer.buffer = nullptr; } else { mPlayer->setPos(mPendingPos); const std::vector &renderList = mPlayer->renderList(); diff --git a/example/lottieview.h b/example/lottieview.h index 4a31ff761e..846610adf8 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -15,7 +15,7 @@ #include #include #include"lottieplayer.h" - +#include class LOTPlayer; class LottieView { @@ -66,5 +66,7 @@ public: bool mAsyncRender; bool mDirty; float mPendingPos; + std::future mRenderTask; + LOTBuffer mBuffer; }; #endif //LOTTIEVIEW_H diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 59a3cf7868..838b9c8cc5 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -56,9 +56,12 @@ public: } void render() { + //auto clock = std::chrono::high_resolution_clock::now(); for (auto &i : mViews) { i->render(); } + //double d = std::chrono::duration(std::chrono::high_resolution_clock::now()-clock).count(); + //printf("total time taken = %f\n", d); } public: @@ -93,7 +96,7 @@ main(int argc, char **argv) renderMode = false; } LottieViewTest *view = new LottieViewTest(app, renderMode); - view->show(50); + view->show(400); app->addExitCb(onExitCb, view); app->addRenderPreCb(onRenderPreCb, view); From b67be0a4e23e731a33cdd9b45e29f449ff3fe6b5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 20 Jul 2018 14:04:33 +0900 Subject: [PATCH 052/672] lottie/example: workaround to render at 60fps. Change-Id: I6e2ad981467679357a75310027d9482a28e1bc94 --- example/lottieviewtest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 838b9c8cc5..180201db11 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -20,6 +20,7 @@ public: LottieViewTest(EvasApp *app, bool renderMode) { mApp = app; mRenderMode = renderMode; + ecore_animator_frametime_set(1.0/120.0); } void show(int numberOfImage) { @@ -96,7 +97,7 @@ main(int argc, char **argv) renderMode = false; } LottieViewTest *view = new LottieViewTest(app, renderMode); - view->show(400); + view->show(250); app->addExitCb(onExitCb, view); app->addRenderPreCb(onRenderPreCb, view); From 9e04196a9a0ba60e1a69c7bed9cba02bc58b5f22 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 20 Jul 2018 13:21:40 +0900 Subject: [PATCH 053/672] lottie/example: add polystar_anim.json file for testing polystar It has animation for changing its number of points. (3.0 to 15.0) Change-Id: I133c19dc0b37380804da43ac8256f6c86085a536 --- example/resource/polystar_anim.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 example/resource/polystar_anim.json diff --git a/example/resource/polystar_anim.json b/example/resource/polystar_anim.json new file mode 100644 index 0000000000..1c8dfbdf76 --- /dev/null +++ b/example/resource/polystar_anim.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[152,152,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"sr","sy":1,"d":2,"pt":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[5],"e":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[11],"e":[15]},{"t":146.000005946702}],"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[64]},{"t":90.0000036657751}],"ix":5},"ir":{"a":0,"k":106,"ix":6},"is":{"a":0,"k":231,"ix":8},"or":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[142]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[142],"e":[34]},{"t":146.000005946702}],"ix":7},"os":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[79],"e":[265]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[265],"e":[88]},{"t":146.000005946702}],"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From abf01b96a03d5a8833cd7cfe5d1c3593001a439f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 20 Jul 2018 15:44:58 +0900 Subject: [PATCH 054/672] lottie/vector: make the pathmesure class thread safe. Change-Id: I10dc4e0a0c6c050bc573c792f819cf91c2982f03 --- src/vector/vpathmesure.cpp | 64 +++++++++++++++++++++++++++++++++++--- src/vector/vpathmesure.h | 8 ++++- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 52e93e823b..9e92b04590 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -5,30 +5,80 @@ V_BEGIN_NAMESPACE struct VPathMesureData { + VPathMesureData():ref(-1){} void setPath(const VPath &path) { mPath = path; } - VPath& getPath() { return mPath; } + VPath& getPath() { return mPath; } VPath mPath; + RefCount ref; }; -V_END_NAMESPACE +static const struct VPathMesureData shared_empty; -static const struct VPathMesureData shared_empty = {VPath()}; +inline void VPathMesure::cleanUp(VPathMesureData *d) +{ + delete d; +} + +void VPathMesure::detach() +{ + if (d->ref.isShared()) + *this = copy(); +} + +VPathMesure VPathMesure::copy() const +{ + VPathMesure other; + + other.d = new VPathMesureData; + other.d->mPath = d->mPath; + other.d->ref.setOwned(); + return other; +} VPathMesure::~VPathMesure() { + if (!d->ref.deref()) + cleanUp(d); } VPathMesure::VPathMesure() - : d(const_cast(&shared_empty)) + : d(const_cast(&shared_empty)) { } -VPathMesure::VPathMesure(const VPath *p, bool foceClose) +VPathMesure::VPathMesure(const VPathMesure &other) { + d = other.d; + d->ref.ref(); +} + +VPathMesure::VPathMesure(VPathMesure &&other): d(other.d) +{ + other.d = const_cast(&shared_empty); +} + +VPathMesure &VPathMesure::operator=(const VPathMesure &other) +{ + other.d->ref.ref(); + if (!d->ref.deref()) + cleanUp(d); + + d = other.d; + return *this; +} + +inline VPathMesure &VPathMesure::operator=(VPathMesure &&other) +{ + if (!d->ref.deref()) + cleanUp(d); + d = other.d; + other.d = const_cast(&shared_empty); + return *this; } void VPathMesure::setStart(float pos) { + detach(); VPath &path = d->getPath(); const std::vector &elm = path.elements(); const std::vector &pts = path.points(); @@ -168,6 +218,7 @@ void VPathMesure::setStart(float pos) void VPathMesure::setEnd(float pos) { + detach(); VPath &path = d->getPath(); const std::vector &elm = path.elements(); const std::vector &pts = path.points(); @@ -299,6 +350,7 @@ void VPathMesure::setEnd(float pos) void VPathMesure::setPath(const VPath &path) { + detach(); d->setPath(path); } @@ -306,3 +358,5 @@ VPath VPathMesure::getPath() { return d->getPath(); } + +V_END_NAMESPACE diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 88fc9fd827..e95c966e73 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -11,13 +11,19 @@ class VPathMesure public: ~VPathMesure(); VPathMesure(); - VPathMesure(const VPath *path, bool foceClose); + VPathMesure(const VPathMesure &other); + VPathMesure(VPathMesure &&other); + VPathMesure &operator=(const VPathMesure &); + VPathMesure &operator=(VPathMesure &&other); int getLength() const; void setPath(const VPath &path); VPath getPath(); void setStart(float pos); void setEnd(float pos); private: + VPathMesure copy() const; + void detach(); + void cleanUp(VPathMesureData *x); VPathMesureData *d; }; From d8f9ba5a8101b07b4c872fbc91bf7c6124693001 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 20 Jul 2018 16:16:40 +0900 Subject: [PATCH 055/672] lottie/vector: apply direction to polystar path When the given direction is counter clockwise, it calculates polystar with reversed angle changes. Change-Id: Iee833a946f67f0bd967369258d3df820cf3779da --- src/vector/vpath.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 592bd97792..697bd54abe 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -585,7 +585,6 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, float innerRoundness, float outerRoundness, VPath::Direction dir) { - // TODO: Direction feature is missing const static float POLYSTAR_MAGIC_NUMBER = 0.47829 / 0.28; float currentAngle = (startAngle - 90.0) * M_PI / 180.0; float x; @@ -598,23 +597,24 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, float partialPointAmount = points - (int) points; bool longSegment = false; int numPoints = (int) ceil(points) * 2.0; + float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); innerRoundness /= 100.0; outerRoundness /= 100.0; if (partialPointAmount != 0) { - currentAngle += halfAnglePerPoint * (1.0 - partialPointAmount); + currentAngle += halfAnglePerPoint * (1.0 - partialPointAmount) * angleDir; } if (partialPointAmount != 0) { partialPointRadius = innerRadius + partialPointAmount * (outerRadius - innerRadius); x = (float) (partialPointRadius * cos(currentAngle)); y = (float) (partialPointRadius * sin(currentAngle)); - currentAngle += anglePerPoint * partialPointAmount / 2.0; + currentAngle += anglePerPoint * partialPointAmount / 2.0 * angleDir; } else { x = (float) (outerRadius * cos(currentAngle)); y = (float) (outerRadius * sin(currentAngle)); - currentAngle += halfAnglePerPoint; + currentAngle += halfAnglePerPoint * angleDir; } moveTo(VPointF(x + cx, y + cy)); @@ -636,11 +636,10 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, if (innerRoundness == 0 && outerRoundness == 0) { lineTo(VPointF(x + cx, y + cy)); } else { - float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0); + float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0 * angleDir); float cp1Dx = (float) cos(cp1Theta); float cp1Dy = (float) sin(cp1Theta); - - float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0); + float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0 * angleDir); float cp2Dx = (float) cos(cp2Theta); float cp2Dy = (float) sin(cp2Theta); @@ -667,7 +666,7 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, VPointF(x + cx, y + cy)); } - currentAngle += dTheta; + currentAngle += dTheta * angleDir; longSegment = !longSegment; } @@ -678,7 +677,6 @@ void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float point float radius, float roundness, VPath::Direction dir) { - // TODO: Direction feature is missing // TODO: Need to support floating point number for number of points const static float POLYGON_MAGIC_NUMBER = 0.25; float currentAngle = (startAngle - 90.0) * M_PI / 180.0; @@ -688,13 +686,14 @@ void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float point float previousY; float anglePerPoint = (float) (2.0 * M_PI / floor(points)); int numPoints = (int) floor(points); + float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); roundness /= 100.0; currentAngle = (currentAngle - 90.0) * M_PI / 180.0; x = (float) (radius * cos(currentAngle)); y = (float) (radius * sin(currentAngle)); - currentAngle += anglePerPoint; + currentAngle += anglePerPoint * angleDir; moveTo(VPointF(x + cx, y + cy)); @@ -705,11 +704,10 @@ void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float point y = (float) (radius * sin(currentAngle)); if (roundness != 0) { - float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0); + float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0 * angleDir); float cp1Dx = (float) cos(cp1Theta); float cp1Dy = (float) sin(cp1Theta); - - float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0); + float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0 * angleDir); float cp2Dx = (float) cos(cp2Theta); float cp2Dy = (float) sin(cp2Theta); @@ -725,7 +723,7 @@ void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float point lineTo(VPointF(x + cx, y + cy)); } - currentAngle += anglePerPoint; + currentAngle += anglePerPoint * angleDir; } close(); From 7f9edbe3b17109b958af5d577b28b507bbe9aa86 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 20 Jul 2018 16:48:42 +0900 Subject: [PATCH 056/672] lottie/example: add polystar_line_clockwise_trim.json file for testing polystar with trim Change-Id: I0a1db3400b284f973a959a194919221d28871d42 --- example/resource/polystar_line_clockwise_trim.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 example/resource/polystar_line_clockwise_trim.json diff --git a/example/resource/polystar_line_clockwise_trim.json b/example/resource/polystar_line_clockwise_trim.json new file mode 100644 index 0000000000..14178b7296 --- /dev/null +++ b/example/resource/polystar_line_clockwise_trim.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[152,152,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"sr","sy":1,"d":2,"pt":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[5],"e":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[11],"e":[15]},{"t":146.000005946702}],"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[64]},{"t":90.0000036657751}],"ix":5},"ir":{"a":0,"k":106,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[142]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[142],"e":[34]},{"t":146.000005946702}],"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[3],"e":[100]},{"t":149.000006068894}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 0dacf86753dedc251f8657077dc9056368d6adf3 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 20 Jul 2018 17:40:50 +0900 Subject: [PATCH 057/672] vector: bug fix in vpathmesure Change-Id: I4936c9fe5b7db80fe6d99908086c3ebc9dab1398 --- src/vector/vpathmesure.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 9e92b04590..b3f79c7843 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -95,6 +95,7 @@ void VPathMesure::setStart(float pos) elm_copy.push_back(e); switch(e) { case VPath::Element::MoveTo: + i++; break; case VPath::Element::LineTo: { @@ -235,6 +236,7 @@ void VPathMesure::setEnd(float pos) elm_copy.push_back(e); switch(e) { case VPath::Element::MoveTo: + i++; break; case VPath::Element::LineTo: { From 547434e2a6d5e0ce3fc2041518bf86d0c233d112 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 20 Jul 2018 17:59:34 +0900 Subject: [PATCH 058/672] lottie: fixed miscellaneous things regarding trim operation - check if path operator is there before applying it - fixed comment - fixed indentation Change-Id: I2b491423cea3a40e5c28436686b24f92d1e6bcfd --- src/lottie/lottieitem.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 06797d14de..d928b74677 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -607,7 +607,8 @@ LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData):LOTLayerItem(layer mRoot = new LOTContentGroupItem(nullptr); mRoot->addChildren(layerData); mRoot->processPaintOperation(); - mRoot->processTrimOperation(); + if (layerData->hasPathOperator()) + mRoot->processTrimOperation(); } LOTShapeLayerItem::~LOTShapeLayerItem() @@ -781,7 +782,7 @@ void LOTContentGroupItem::trimOperationHelper(std::vector &list) for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { auto child = *i; if (auto pathNode = dynamic_cast(child)) { - // the node is a path data node add the paint operation list to it. + // the node is a path data node add the trim operation list to it. pathNode->addTrimOperation(list); } else if (auto trimNode = dynamic_cast(child)) { // add it to the trim operation list @@ -797,7 +798,7 @@ void LOTContentGroupItem::trimOperationHelper(std::vector &list) void LOTPathDataItem::addTrimOperation(std::vector &list) { for(auto trimItem : list) { - mTrimNodeRefs.push_back(trimItem); + mTrimNodeRefs.push_back(trimItem); } } From 8c20000b08bd86a5b2bf97e7e964b58f30953154 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 23 Jul 2018 09:24:36 +0900 Subject: [PATCH 059/672] lottie/vector: added cow_ptr class to support copy_on_write class in vector. Change-Id: I485637da44d44ce473dc760aaf484b0377bdcda1 --- src/vector/vcowptr.h | 82 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/vector/vcowptr.h diff --git a/src/vector/vcowptr.h b/src/vector/vcowptr.h new file mode 100644 index 0000000000..8e947039b7 --- /dev/null +++ b/src/vector/vcowptr.h @@ -0,0 +1,82 @@ +#ifndef VCOWPTR_H +#define VCOWPTR_H + +#include + +template +class vcow_ptr { + struct model { + std::atomic mRef{1}; + + model() = default; + + template + explicit model(Args&&... args) : mValue(std::forward(args)...) {} + + T mValue; + }; + model* mModel; +public: + using element_type = T; + + vcow_ptr() { + static model default_s; + mModel = &default_s; + ++mModel->mRef; + } + + ~vcow_ptr() { + if (mModel && (--mModel->mRef == 0)) delete mModel; + } + + template + vcow_ptr(Args&&... args) + : mModel(new model(std::forward(args)...)) {} + + vcow_ptr(const vcow_ptr& x) noexcept : mModel(x.mModel) { + assert(mModel); + ++mModel->mRef; + } + vcow_ptr(vcow_ptr&& x) noexcept : mModel(x.mModel) { + assert(mModel); + x.mModel = nullptr; + } + + auto operator=(const vcow_ptr& x) noexcept -> vcow_ptr& { + return *this = vcow_ptr(x); + } + + auto operator=(vcow_ptr&& x) noexcept -> vcow_ptr& { + auto tmp = std::move(x); + swap(*this, tmp); + return *this; + } + + auto operator*() const noexcept -> const element_type& { return read(); } + + auto operator-> () const noexcept -> const element_type* { return &read(); } + + bool unique() const noexcept { + assert(mModel); + + return mModel->mRef == 1; + } + + auto write() -> element_type& { + if (!unique()) *this = vcow_ptr(read()); + + return mModel->mValue; + } + + auto read() const noexcept -> const element_type& { + assert(mModel); + + return mModel->mValue; + } + + friend inline void swap(vcow_ptr& x, vcow_ptr& y) noexcept { + std::swap(x.mModel, y.mModel); + } +}; + +#endif // VCOWPTR_H From 84c04119290d645e987928b7c0db8c27fff25162 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 23 Jul 2018 09:33:56 +0900 Subject: [PATCH 060/672] lottie/vector: refactor vpath class to use vcow_ptr Change-Id: Ib16da52a8a97bbee87766ee362e1d6e5678ac305 --- src/vector/vpath.cpp | 424 ++++++++++++++----------------------------- src/vector/vpath.h | 132 ++++++++++++-- 2 files changed, 253 insertions(+), 303 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 697bd54abe..d8e2e13485 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -7,56 +7,34 @@ V_BEGIN_NAMESPACE -struct VPathData -{ - VPathData():ref(-1), - m_points(), - m_elements(), - m_segments(0), - mStartPoint(), - mNewSegment(true){} +VPath::VPathData::VPathData():m_points(), + m_elements(), + m_segments(0), + mStartPoint(), + mNewSegment(true){} - void copy(VPathData *o); - void moveTo(const VPointF &pt); - void lineTo(const VPointF &pt); - void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); - void close(); - void reset(); - void checkNewSegment(); - int segments() const; - void transform(const VMatrix &m); - RefCount ref; - std::vector m_points; - std::vector m_elements; - int m_segments; - VPointF mStartPoint; - bool mNewSegment; -}; +VPath::VPathData::VPathData(const VPathData &o):m_points(o.m_points), + m_elements(o.m_elements), + m_segments(o.m_segments), + mStartPoint(o.mStartPoint), + mNewSegment(o.mNewSegment){} - -void VPathData::transform(const VMatrix &m) +void VPath::VPathData::transform(const VMatrix &m) { for(auto &i : m_points) { i = m.map(i); } } -void VPathData::checkNewSegment() +void VPath::VPathData::checkNewSegment() { if (mNewSegment) { moveTo(VPointF(0,0)); mNewSegment = false; } } -void VPathData::copy(VPathData *o) -{ - m_points = o->m_points; - m_elements = o->m_elements; - m_segments = o->m_segments; - mStartPoint = o->mStartPoint; -} -void VPathData::moveTo(const VPointF &p) +void VPath::VPathData::moveTo(const VPointF &p) { mStartPoint = p; mNewSegment = false; @@ -64,13 +42,13 @@ void VPathData::moveTo(const VPointF &p) m_points.push_back(p); m_segments++; } -void VPathData::lineTo(const VPointF &p) +void VPath::VPathData::lineTo(const VPointF &p) { checkNewSegment(); m_elements.push_back(VPath::Element::LineTo); m_points.push_back(p); } -void VPathData::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) +void VPath::VPathData::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) { checkNewSegment(); m_elements.push_back(VPath::Element::CubicTo); @@ -79,8 +57,10 @@ void VPathData::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) m_points.push_back(e); } -void VPathData::close() +void VPath::VPathData::close() { + if (isEmpty()) return; + const VPointF &lastPt = m_points.back(); if (!fuzzyCompare(mStartPoint, lastPt)) { lineTo(mStartPoint); @@ -89,144 +69,149 @@ void VPathData::close() mNewSegment = true; } -void VPathData::reset() +void VPath::VPathData::reset() { + if (isEmpty()) return; + m_elements.clear(); m_points.clear(); m_segments = 0; } -int VPathData::segments() const +int VPath::VPathData::segments() const { - return m_segments; + return m_segments + 1; } - -static const struct VPathData shared_empty; - -inline void VPath::cleanUp(VPathData *d) +void VPath::VPathData::reserve(int num_elm) { - delete d; + m_elements.reserve(num_elm); + m_points.reserve(2 * num_elm); } -void VPath::detach() +static VPointF curvesForArc(const VRectF &, float, float, VPointF *, int *); +static constexpr float PATH_KAPPA = 0.5522847498; + +void VPath::VPathData::arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo) { - if (d->ref.isShared()) - *this = copy(); + int point_count = 0; + VPointF pts[15]; + VPointF curve_start = curvesForArc(rect, startAngle, sweepLength, pts, &point_count); + + if (isEmpty() || forceMoveTo) { + moveTo(curve_start); + } else { + lineTo(curve_start); + } + for (int i=0; im_points = d->m_points; - other.d->m_elements = d->m_elements; - other.d->m_segments = d->m_segments; - other.d->ref.setOwned(); - return other; + addOval(VRectF(cx-radius, cy-radius, 2*radius, 2*radius) , dir); } -VPath::~VPath() +void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) { - if (!d->ref.deref()) - cleanUp(d); + if (rect.isNull()) return; + + float x = rect.x(); + float y = rect.y(); + + float w = rect.width(); + float w2 = rect.width() / 2; + float w2k = w2 * PATH_KAPPA; + + float h = rect.height(); + float h2 = rect.height() / 2; + float h2k = h2 * PATH_KAPPA; + + + if (dir == VPath::Direction::CW) { + // moveto 12 o'clock. + moveTo(VPointF(x+w2, y)); + // 12 -> 3 o'clock + cubicTo(VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), VPointF(x + w, y + h2)); + // 3 -> 6 o'clock + cubicTo(VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), VPointF(x + w2, y + h)); + // 6 -> 9 o'clock + cubicTo(VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), VPointF(x , y + h2)); + // 9 -> 12 o'clock + cubicTo(VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), VPointF(x + w2, y)); + } else { + // moveto 12 o'clock. + moveTo(VPointF(x+w2, y)); + // 12 -> 9 o'clock + cubicTo(VPointF(x + w2 - w2k, y), VPointF(x, y + h2 - h2k), VPointF(x , y + h2)); + // 9 -> 6 o'clock + cubicTo(VPointF(x, y + h2 + h2k), VPointF(x + w2 - w2k, y + h), VPointF(x + w2, y + h)); + // 6 -> 3 o'clock + cubicTo(VPointF(x + w2 + w2k, y + h), VPointF(x + w, y + h2 + h2k), VPointF(x + w, y + h2)); + // 3 -> 12 o'clock + cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), VPointF(x+w2, y)); + } } -VPath::VPath() - : d(const_cast(&shared_empty)) +void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) { + if (rect.isNull()) return; + + float x = rect.x(); + float y = rect.y(); + float w = rect.width(); + float h = rect.height(); + + if (dir == VPath::Direction::CW) { + moveTo(VPointF(x + w, y)); + lineTo(VPointF(x + w, y + h)); + lineTo(VPointF(x , y + h)); + lineTo(VPointF(x , y)); + close(); + } else { + moveTo(VPointF(x + w, y)); + lineTo(VPointF(x , y)); + lineTo(VPointF(x , y + h)); + lineTo(VPointF(x + w, y + h)); + close(); + } } -VPath::VPath(const VPath &other) +void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) { - d = other.d; - d->ref.ref(); -} + if (vCompare(rx, 0.f) || vCompare(ry, 0.f)) { + addRect(rect, dir); + return; + } -VPath::VPath(VPath &&other): d(other.d) -{ - other.d = const_cast(&shared_empty); -} + float x = rect.x(); + float y = rect.y(); + float w = rect.width(); + float h = rect.height(); + // clamp the rx and ry radius value. + rx = 2*rx; + ry = 2*ry; + if (rx > w) rx = w; + if (ry > h) ry = h; -VPath &VPath::operator=(const VPath &other) -{ - other.d->ref.ref(); - if (!d->ref.deref()) - cleanUp(d); - - d = other.d; - return *this; + if (dir == VPath::Direction::CW) { + moveTo(VPointF(x + w, y + ry/2.f)); + arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0 , -90, false); + arcTo(VRectF(x, y + h - ry, rx, ry), -90 , -90, false); + arcTo(VRectF(x, y, rx, ry), -180 , -90, false); + arcTo(VRectF(x + w - rx, y, rx, ry), -270 , -90, false); + close(); + } else { + moveTo(VPointF(x + w, y + ry/2.f)); + arcTo(VRectF(x + w - rx, y , rx, ry), 0 , 90, false); + arcTo(VRectF(x, y, rx, ry), 90 , 90, false); + arcTo(VRectF(x, y + h - ry, rx, ry), 180 , 90, false); + arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 270 , 90, false); + close(); + } } -inline VPath &VPath::operator=(VPath &&other) -{ - if (!d->ref.deref()) - cleanUp(d); - d = other.d; - other.d = const_cast(&shared_empty); - return *this; -} - -bool VPath::isEmpty()const -{ - return d->m_elements.empty(); -} - -void VPath::close() -{ - if (isEmpty()) return; - detach(); - d->close(); -} - -void VPath::reset() -{ - if (isEmpty()) return; - detach(); - d->reset(); -} - -void VPath::moveTo(const VPointF &p) -{ - detach(); - d->moveTo(p); -} - -void VPath::lineTo(const VPointF &p) -{ - detach(); - d->lineTo(p); -} - -void VPath::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) -{ - detach(); - d->cubicTo(c1, c2, e); -} - -void VPath::reserve(int num_elm) -{ - detach(); - d->m_elements.reserve(num_elm); - d->m_points.reserve(num_elm); -} - -const std::vector &VPath::elements() const -{ - return d->m_elements; -} -const std::vector &VPath::points() const -{ - return d->m_points; -} -int VPath::segments() const -{ - return d->m_segments + 1; -} - -#define PATH_KAPPA 0.5522847498 - static float tForArcAngle(float angle); void findEllipseCoords(const VRectF &r, float angle, float length, VPointF* startPoint, VPointF *endPoint) @@ -454,132 +439,6 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, return startPoint; } -void VPath::arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo) -{ - detach(); - - int point_count = 0; - VPointF pts[15]; - VPointF curve_start = curvesForArc(rect, startAngle, sweepLength, pts, &point_count); - - if (isEmpty() || forceMoveTo) { - d->moveTo(curve_start); - } else { - d->lineTo(curve_start); - } - for (int i=0; icubicTo(pts[i], pts[i+1], pts[i+2]); - } -} - -void VPath::addCircle(float cx, float cy, float radius, VPath::Direction dir) -{ - addOval(VRectF(cx-radius, cy-radius, 2*radius, 2*radius) , dir); -} - -void VPath::addOval(const VRectF &rect, VPath::Direction dir) -{ - if (rect.isNull()) return; - - detach(); - - float x = rect.x(); - float y = rect.y(); - - float w = rect.width(); - float w2 = rect.width() / 2; - float w2k = w2 * PATH_KAPPA; - - float h = rect.height(); - float h2 = rect.height() / 2; - float h2k = h2 * PATH_KAPPA; - - - if (dir == VPath::Direction::CW) { - // moveto 12 o'clock. - d->moveTo(VPointF(x+w2, y)); - // 12 -> 3 o'clock - d->cubicTo(VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), VPointF(x + w, y + h2)); - // 3 -> 6 o'clock - d->cubicTo(VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), VPointF(x + w2, y + h)); - // 6 -> 9 o'clock - d->cubicTo(VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), VPointF(x , y + h2)); - // 9 -> 12 o'clock - d->cubicTo(VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), VPointF(x + w2, y)); - } else { - // moveto 12 o'clock. - d->moveTo(VPointF(x+w2, y)); - // 12 -> 9 o'clock - d->cubicTo(VPointF(x + w2 - w2k, y), VPointF(x, y + h2 - h2k), VPointF(x , y + h2)); - // 9 -> 6 o'clock - d->cubicTo(VPointF(x, y + h2 + h2k), VPointF(x + w2 - w2k, y + h), VPointF(x + w2, y + h)); - // 6 -> 3 o'clock - d->cubicTo(VPointF(x + w2 + w2k, y + h), VPointF(x + w, y + h2 + h2k), VPointF(x + w, y + h2)); - // 3 -> 12 o'clock - d->cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), VPointF(x+w2, y)); - } -} - -void VPath::addRect(const VRectF &rect, VPath::Direction dir) -{ - if (rect.isNull()) return; - - detach(); - - float x = rect.x(); - float y = rect.y(); - float w = rect.width(); - float h = rect.height(); - - if (dir == VPath::Direction::CW) { - moveTo(VPointF(x + w, y)); - lineTo(VPointF(x + w, y + h)); - lineTo(VPointF(x , y + h)); - lineTo(VPointF(x , y)); - close(); - } else { - moveTo(VPointF(x + w, y)); - lineTo(VPointF(x , y)); - lineTo(VPointF(x , y + h)); - lineTo(VPointF(x + w, y + h)); - close(); - } -} - -void VPath::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) -{ - if (vCompare(rx, 0.f) || vCompare(ry, 0.f)) { - addRect(rect, dir); - return; - } - - float x = rect.x(); - float y = rect.y(); - float w = rect.width(); - float h = rect.height(); - // clamp the rx and ry radius value. - rx = 2*rx; - ry = 2*ry; - if (rx > w) rx = w; - if (ry > h) ry = h; - - if (dir == VPath::Direction::CW) { - moveTo(VPointF(x + w, y + ry/2.f)); - arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0 , -90, false); - arcTo(VRectF(x, y + h - ry, rx, ry), -90 , -90, false); - arcTo(VRectF(x, y, rx, ry), -180 , -90, false); - arcTo(VRectF(x + w - rx, y, rx, ry), -270 , -90, false); - close(); - } else { - moveTo(VPointF(x + w, y + ry/2.f)); - arcTo(VRectF(x + w - rx, y , rx, ry), 0 , 90, false); - arcTo(VRectF(x, y, rx, ry), 90 , 90, false); - arcTo(VRectF(x, y + h - ry, rx, ry), 180 , 90, false); - arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 270 , 90, false); - close(); - } -} - void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, float innerRadius, float outerRadius, float innerRoundness, float outerRoundness, @@ -617,7 +476,9 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, currentAngle += halfAnglePerPoint * angleDir; } - moveTo(VPointF(x + cx, y + cy)); + VPathData &ref = d.write(); + + ref.moveTo(VPointF(x + cx, y + cy)); for (int i = 0; i < numPoints; i++) { float radius = longSegment ? outerRadius : innerRadius; @@ -634,7 +495,7 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, y = (float) (radius * sin(currentAngle)); if (innerRoundness == 0 && outerRoundness == 0) { - lineTo(VPointF(x + cx, y + cy)); + ref.lineTo(VPointF(x + cx, y + cy)); } else { float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0 * angleDir); float cp1Dx = (float) cos(cp1Theta); @@ -661,9 +522,9 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, cp2y *= partialPointAmount; } - cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), - VPointF(x + cp2x + cx, y + cp2y + cy), - VPointF(x + cx, y + cy)); + ref.cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), + VPointF(x + cp2x + cx, y + cp2y + cy), + VPointF(x + cx, y + cy)); } currentAngle += dTheta * angleDir; @@ -729,11 +590,4 @@ void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float point close(); } -void VPath::transform(const VMatrix &m) -{ - if (isEmpty()) return; - detach(); - d->transform(m); -} - V_END_NAMESPACE diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 2fe0b9de48..68acc52980 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -4,6 +4,7 @@ #include "vrect.h" #include "vmatrix.h" #include +#include V_BEGIN_NAMESPACE @@ -22,24 +23,18 @@ public: CubicTo, Close }; - ~VPath(); - VPath(); - VPath(const VPath &path); - VPath(VPath &&other); - VPath &operator=(const VPath &); - VPath &operator=(VPath &&other); bool isEmpty()const; void moveTo(const VPointF &p); - inline void moveTo(float x, float y); + void moveTo(float x, float y); void lineTo(const VPointF &p); - inline void lineTo(float x, float y); + void lineTo(float x, float y); void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); - inline void cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey); + void cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey); void arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo); void close(); void reset(); void reserve(int num_elm); - + int segments() const; void addCircle(float cx, float cy, float radius, VPath::Direction dir = Direction::CW); void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); void addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir = Direction::CW); @@ -51,19 +46,80 @@ public: void addPolystarPolygon(float startAngle, float cx, float cy, float points, float radius, float roundness, VPath::Direction dir = Direction::CW); - void transform(const VMatrix &m); const std::vector &elements() const; const std::vector &points() const; private: - friend class VRaster; - int segments() const; - VPath copy() const; - void detach(); - void cleanUp(VPathData *x); - VPathData *d; + struct VPathData { + VPathData(); + VPathData(const VPathData &o); + bool isEmpty() const { return m_elements.empty();} + void moveTo(const VPointF &pt); + void lineTo(const VPointF &pt); + void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); + void close(); + void reset(); + void reserve(int num_elm); + void checkNewSegment(); + int segments() const; + void transform(const VMatrix &m); + void addRoundRect(const VRectF &, float, float, VPath::Direction); + void addRect(const VRectF &, VPath::Direction); + void arcTo(const VRectF&, float, float, bool); + void addCircle(float, float, float, VPath::Direction); + void addOval(const VRectF &, VPath::Direction); + const std::vector &elements() const { return m_elements;} + const std::vector &points() const {return m_points;} + std::vector m_points; + std::vector m_elements; + int m_segments; + VPointF mStartPoint; + bool mNewSegment; + }; + + vcow_ptr d; }; +inline bool VPath::isEmpty()const +{ + return d->isEmpty(); +} + +inline void VPath::moveTo(const VPointF &p) +{ + d.write().moveTo(p); +} + +inline void VPath::lineTo(const VPointF &p) +{ + d.write().lineTo(p); +} + +inline void VPath::close() +{ + d.write().close(); +} + +inline void VPath::reset() +{ + d.write().reset(); +} + +inline void VPath::reserve(int num_elm) +{ + d.write().reserve(num_elm); +} + +inline int VPath::segments() const +{ + return d->segments(); +} + +inline void VPath::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) +{ + d.write().cubicTo(c1, c2, e); +} + inline void VPath::lineTo(float x, float y) { lineTo(VPointF(x,y)); @@ -76,7 +132,47 @@ inline void VPath::moveTo(float x, float y) inline void VPath::cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey) { - cubicTo(VPointF(c1x, c1y), VPointF(c2x, c2y), VPointF(ex, ey)); + cubicTo(VPointF(c1x, c1y), VPointF(c2x, c2y), VPointF(ex, ey)); +} + +inline void VPath::transform(const VMatrix &m) +{ + d.write().transform(m); +} + +inline void VPath::arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo) +{ + d.write().arcTo(rect, startAngle, sweepLength, forceMoveTo); +} + +inline void VPath::addRect(const VRectF &rect, VPath::Direction dir) +{ + d.write().addRect(rect, dir); +} + +inline void VPath::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) +{ + d.write().addRoundRect(rect, rx, ry, dir); +} + +inline void VPath::addCircle(float cx, float cy, float radius, VPath::Direction dir) +{ + d.write().addCircle(cx, cy, radius, dir); +} + +inline void VPath::addOval(const VRectF &rect, VPath::Direction dir) +{ + d.write().addOval(rect, dir); +} + +inline const std::vector &VPath::elements() const +{ + return d->elements(); +} + +inline const std::vector &VPath::points() const +{ + return d->points(); } V_END_NAMESPACE From 5f556cf0d55465adf87cc248834a5650b2ef29fa Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 21 Jul 2018 17:07:00 +0900 Subject: [PATCH 061/672] lottie: give a make_unique wrapper till we move to c++14 Change-Id: I09061f807f6bf9ad5eea631f206d89705e3ae1bc --- src/lottie/lottieitem.cpp | 6 +++--- src/lottie/lottiemodel.cpp | 4 ++-- src/lottie/lottieplayer.cpp | 2 +- src/vector/vglobal.h | 10 ++++++++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index d928b74677..e037b6c07f 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -401,7 +401,7 @@ LOTLayerItem::LOTLayerItem(LOTLayerData *layerData):mLayerData(layerData), { if (mLayerData->mHasMask) { for (auto i : mLayerData->mMasks) { - mMasks.push_back(std::unique_ptr(new LOTMaskItem(i.get()))); + mMasks.push_back(std::make_unique(i.get())); } } } @@ -565,7 +565,7 @@ LOTSolidLayerItem::LOTSolidLayerItem(LOTLayerData *layerData):LOTLayerItem(layer void LOTSolidLayerItem::updateContent() { if (!mRenderNode) { - mRenderNode = std::unique_ptr(new VDrawable()); + mRenderNode = std::make_unique(); mRenderNode->mType = VDrawable::Type::Fill; mRenderNode->mFlag |= VDrawable::DirtyState::All; } @@ -765,7 +765,7 @@ void LOTPathDataItem::addPaintOperation(std::vector &list, i { for(auto paintItem : list) { bool sameGroup = (externalCount-- > 0) ? false : true; - mNodeList.push_back(std::unique_ptr(new VDrawable())); + mNodeList.push_back(std::make_unique()); mRenderList.push_back(LOTRenderNode(this, paintItem, mNodeList.back().get(), sameGroup)); } } diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index a31f640093..17cbb00a36 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -312,9 +312,9 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) bool init = false; if (!grad) { if (mGradientType == 1) - grad = std::unique_ptr(new VLinearGradient(0,0,0,0)); + grad = std::make_unique(0,0,0,0); else - grad = std::unique_ptr(new VRadialGradient(0,0,0,0,0,0)); + grad = std::make_unique(0,0,0,0,0,0); grad->mSpread = VGradient::Spread::Pad; init = true; } diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 3313f5fdd0..e33613991d 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -123,7 +123,7 @@ LOTPlayerPrivate::setFilePath(std::string path) LottieLoader loader; if (loader.load(path)) { mModel = loader.model(); - mCompItem = std::unique_ptr(new LOTCompItem(mModel.get())); + mCompItem = std::make_unique(mModel.get()); setPos(0); return true; } diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 0585955991..eefe5b2909 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -35,6 +35,16 @@ typedef uint8_t uchar; #include"vdebug.h" #define VECTOR_FALLTHROUGH +/* + * keep this till we move the code to c++14 + */ +namespace std { +template +std::unique_ptr make_unique( Args&& ...args ) +{ + return std::unique_ptr( new T( std::forward(args)... ) ); +} +} #include class RefCount From 3475625b38ba3ca46fd53063802b291fdb05691d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 23 Jul 2018 15:02:45 +0900 Subject: [PATCH 062/672] lottie/vector: Implement intersect function with callback. Change-Id: I8d5e3be9d4a77c246ef174e716c22c8766fc82a1 --- src/vector/vrle.cpp | 32 ++++++++++++++++++++++++++++++-- src/vector/vrle.h | 2 +- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 1d9ef27dd1..de248a563d 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -309,6 +309,7 @@ public: void updateBbox(); bool operator ==(const VRleImpl &) const; void intersected(const VRect &r, VRleImpl &result); + void intersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) const; void intersected(const VRleImpl &clip, VRleImpl &result); friend VDebug& operator<<(VDebug& os, const VRleImpl& object); void invert(); @@ -406,6 +407,33 @@ void VRleImpl::intersected(const VRect &r, VRleImpl &result) result.updateBbox(); } +void VRleImpl::intersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) const +{ + VRect clip = r; + + VRleHelper tresult, tmp_obj; + std::array array; + + //setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup tmp object + tmp_obj.size = m_spans.size(); + tmp_obj.spans = const_cast(m_spans.data()); + + // run till all the spans are processed + while (tmp_obj.size) + { + rleIntersectWithRect(clip, &tmp_obj, &tresult); + if (tresult.size) { + cb(tresult.size, tresult.spans, userData); + } + tresult.size = 0; + } +} + void VRleImpl::intersected(const VRleImpl &clip, VRleImpl &result) { VRleHelper tresult, tmp_obj, tmp_clip; @@ -740,9 +768,9 @@ VRle VRle::operator&(const VRle &o) const -void VRle::intersected(const VRect &r, VRleSpanCb cb, void *userData) +void VRle::intersect(const VRect &r, VRleSpanCb cb, void *userData) const { - //TODO Implement + d->impl.intersect(r, cb, userData); } diff --git a/src/vector/vrle.h b/src/vector/vrle.h index e10919b79a..fd7ca29856 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -32,7 +32,7 @@ public: void translate(int x, int y); VRle intersected(const VRect &r) const; VRle intersected(const VRle &other) const; - void intersected(const VRect &r, VRleSpanCb cb, void *userData); + void intersect(const VRect &r, VRleSpanCb cb, void *userData) const; VRle &intersect(const VRect &r); int size() const; const VRle::Span* data() const; From ea4c4bd5c088b5e57281cf93bcbd57b9c104bfac Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 23 Jul 2018 12:48:52 +0900 Subject: [PATCH 063/672] lottie/vector: avoid copy-elision by using move on temporary object. Change-Id: I6b54951dab7d15966760d5ec682d151e9745da63 --- src/vector/vraster.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 202798be00..814d537591 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -170,8 +170,7 @@ class RleTaskScheduler { } if (!task && !_q[i].pop(task)) break; - VRle rle = generateRleAsync(task); - task->sender.set_value(std::move(rle)); + task->sender.set_value(generateRleAsync(task)); delete task->outline; delete task; } From 9626223abdb317d8d5648bd5e3d061bb6022a8ab Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 23 Jul 2018 15:10:51 +0900 Subject: [PATCH 064/672] lottie/vector: use callback version of intersect() for performance. Change-Id: I194f1da65b766e59c4c5230040b8a329a39fa95b --- src/vector/vpainter.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 64d079052e..6d3beab0cf 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -19,12 +19,8 @@ void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle) if (!mSpanData.mUnclippedBlendFunc) return; - // apply clip if any - VRle final = rle.intersected(mSpanData.mSystemClip); - - if (final.isEmpty()) return; - - mSpanData.mUnclippedBlendFunc(final.size(), final.data(), &mSpanData); + // do draw after applying clip. + rle.intersect(mSpanData.mSystemClip, mSpanData.mUnclippedBlendFunc, &mSpanData); } VPainter::~VPainter() From d0a08aadc86861f230342e8b4a3763c6adb89caa Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 24 Jul 2018 18:00:25 +0900 Subject: [PATCH 065/672] lottie/vector: change addPolystar* method to addPolystar/addPolygon It also move its implemented code to VPath::VPathData from VPath. Change-Id: Idc6f04e04930f1863bb78fd1a05ba86c573e328b --- example/pathtest.cpp | 6 ++---- src/lottie/lottieitem.cpp | 12 +++++------- src/vector/vpath.cpp | 24 ++++++++++-------------- src/vector/vpath.h | 33 ++++++++++++++++++++++++++------- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/example/pathtest.cpp b/example/pathtest.cpp index 011d38f0c9..8fa1e0afb9 100644 --- a/example/pathtest.cpp +++ b/example/pathtest.cpp @@ -87,10 +87,8 @@ main(void) path.addOval(VRectF(300, 100, 100, 50), VPath::Direction::CCW); - path.addPolystarStar(0.0, 150, 150, 15.0, - 106.0, 34.0, - 231.0, 88.0, VPath::Direction::CW); - + path.addPolystar(15.0, 106.0, 34.0, 0.0, 150, + 150, 231.0, 88.0, VPath::Direction::CW); PathTest test(APP); test.setPath(path); diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index e037b6c07f..53cd79a7e7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -946,14 +946,12 @@ VPath LOTPolystarItem::getPath(int frameNo) VMatrix m; if (mData->mType == LOTPolystarData::PolyType::Star) { - path.addPolystarStar(0.0, 0.0, 0.0, points, - innerRadius, outerRadius, - innerRoundness, outerRoundness, - mData->direction()); + path.addPolystar(points, innerRadius, outerRadius, + innerRoundness, outerRoundness, + 0.0, 0.0, 0.0, mData->direction()); } else { - path.addPolystarPolygon(0.0, 0.0, 0.0, points, - outerRadius, outerRoundness, - mData->direction()); + path.addPolygon(points, outerRadius, outerRoundness, + 0.0, 0.0, 0.0, mData->direction()); } m.translate(pos.x(), pos.y()).rotate(rotation); diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index d8e2e13485..639f2d0202 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -439,10 +439,9 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, return startPoint; } -void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, - float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, - VPath::Direction dir) +void VPath::VPathData::addPolystar(float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + float startAngle, float cx, float cy, VPath::Direction dir) { const static float POLYSTAR_MAGIC_NUMBER = 0.47829 / 0.28; float currentAngle = (startAngle - 90.0) * M_PI / 180.0; @@ -476,9 +475,7 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, currentAngle += halfAnglePerPoint * angleDir; } - VPathData &ref = d.write(); - - ref.moveTo(VPointF(x + cx, y + cy)); + moveTo(VPointF(x + cx, y + cy)); for (int i = 0; i < numPoints; i++) { float radius = longSegment ? outerRadius : innerRadius; @@ -495,7 +492,7 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, y = (float) (radius * sin(currentAngle)); if (innerRoundness == 0 && outerRoundness == 0) { - ref.lineTo(VPointF(x + cx, y + cy)); + lineTo(VPointF(x + cx, y + cy)); } else { float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0 * angleDir); float cp1Dx = (float) cos(cp1Theta); @@ -522,9 +519,9 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, cp2y *= partialPointAmount; } - ref.cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), - VPointF(x + cp2x + cx, y + cp2y + cy), - VPointF(x + cx, y + cy)); + cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), + VPointF(x + cp2x + cx, y + cp2y + cy), + VPointF(x + cx, y + cy)); } currentAngle += dTheta * angleDir; @@ -534,9 +531,8 @@ void VPath::addPolystarStar(float startAngle, float cx, float cy, float points, close(); } -void VPath::addPolystarPolygon(float startAngle, float cx, float cy, float points, - float radius, float roundness, - VPath::Direction dir) +void VPath::VPathData::addPolygon(float points, float radius, float roundness, + float startAngle, float cx, float cy, VPath::Direction dir) { // TODO: Need to support floating point number for number of points const static float POLYGON_MAGIC_NUMBER = 0.25; diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 68acc52980..5b15a943f5 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -39,13 +39,11 @@ public: void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); void addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir = Direction::CW); void addRect(const VRectF &rect, VPath::Direction dir = Direction::CW); - void addPolystarStar(float startAngle, float cx, float cy, float points, - float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, - VPath::Direction dir = Direction::CW); - void addPolystarPolygon(float startAngle, float cx, float cy, float points, - float radius, float roundness, - VPath::Direction dir = Direction::CW); + void addPolystar(float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); + void addPolygon(float points, float radius, float roundness, + float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); void transform(const VMatrix &m); const std::vector &elements() const; const std::vector &points() const; @@ -68,6 +66,11 @@ private: void arcTo(const VRectF&, float, float, bool); void addCircle(float, float, float, VPath::Direction); void addOval(const VRectF &, VPath::Direction); + void addPolystar(float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); + void addPolygon(float points, float radius, float roundness, + float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); const std::vector &elements() const { return m_elements;} const std::vector &points() const {return m_points;} std::vector m_points; @@ -165,6 +168,22 @@ inline void VPath::addOval(const VRectF &rect, VPath::Direction dir) d.write().addOval(rect, dir); } +inline void VPath::addPolystar(float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + float startAngle, float cx, float cy, VPath::Direction dir) +{ + d.write().addPolystar(points, innerRadius, outerRadius, + innerRoundness, outerRoundness, + startAngle, cx, cy, dir); +} + +inline void VPath::addPolygon(float points, float radius, float roundness, + float startAngle, float cx, float cy, VPath::Direction dir) +{ + d.write().addPolygon(points, radius, roundness, + startAngle, cx, cy, dir); +} + inline const std::vector &VPath::elements() const { return d->elements(); From 85a5463cc0b90b7c0d5a8e1d88bcb080c268b58c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 24 Jul 2018 09:57:20 +0900 Subject: [PATCH 066/672] lottie/vector: refactor vraster to optimize number of memory allocation. Change-Id: I55ffb29d9a039a458830200a56ff3a6a057ff361 --- src/lottie/lottieitem.cpp | 9 +- src/vector/vraster.cpp | 326 ++++++++++++++++++++------------------ src/vector/vraster.h | 7 +- 3 files changed, 173 insertions(+), 169 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 53cd79a7e7..a55bc3c560 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -25,12 +25,10 @@ void VDrawable::preprocess() VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); newPath = dasher.dashed(mPath); } - FTOutline *outline = VRaster::toFTOutline(newPath); - mRleTask = VRaster::instance().generateStrokeInfo(outline, mStroke.cap, mStroke.join, + mRleTask = VRaster::instance().generateStrokeInfo(mPath, mStroke.cap, mStroke.join, mStroke.width, mStroke.meterLimit); } else { - FTOutline *outline = VRaster::toFTOutline(mPath); - mRleTask = VRaster::instance().generateFillInfo(outline, mFillRule); + mRleTask = VRaster::instance().generateFillInfo(mPath, mFillRule); } mFlag &= ~DirtyFlag(DirtyState::Path); } @@ -326,8 +324,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, VPath path = mLocalPath; path.transform(parentMatrix); - FTOutline *outline = VRaster::toFTOutline(path); - mRleTask = VRaster::instance().generateFillInfo(outline); + mRleTask = VRaster::instance().generateFillInfo(path); } VRle LOTMaskItem::rle() diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 814d537591..689db38127 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -13,46 +13,133 @@ V_BEGIN_NAMESPACE struct FTOutline { public: - FTOutline() = delete; - FTOutline(int points, int segments) - { - ft.points = new SW_FT_Vector[points + segments]; - ft.tags = new char[points + segments]; - ft.contours = new short[segments]; - ft.n_points = ft.n_contours = 0; - ft.flags = 0x0; + FTOutline():mMemory(nullptr){} + ~FTOutline(){delete[] mMemory;} + void releaseMemory() { + if (mMemory) delete [] mMemory; + mMemory = nullptr; } + void grow(int, int); + void convert(const VPath &path); + void convert(CapStyle, JoinStyle, float, float); void moveTo(const VPointF &pt); void lineTo(const VPointF &pt); void cubicTo(const VPointF &ctr1, const VPointF &ctr2, const VPointF end); void close(); void end(); void transform(const VMatrix &m); - ~FTOutline() - { - delete[] ft.points; - delete[] ft.tags; - delete[] ft.contours; - } - SW_FT_Outline ft; - bool closed; + SW_FT_Outline ft; + SW_FT_Vector *mMemory{nullptr}; + int mPointSize{0}; + int mSegmentSize{0}; + bool closed{false}; + SW_FT_Stroker_LineCap ftCap; + SW_FT_Stroker_LineJoin ftJoin; + int ftWidth; + int ftMeterLimit; + SW_FT_Bool ftClosed; }; +void FTOutline::grow(int points, int segments) +{ + if (mPointSize > points && mSegmentSize > segments) + return; + mPointSize = points; + mSegmentSize = segments; + + int point_size = (points + segments); + int contour_size = ((sizeof(short) * segments) / sizeof(SW_FT_Vector)) + 1; + int tag_size = ((sizeof(char) * (points + segments)) / sizeof(SW_FT_Vector)) + 1; + + releaseMemory(); + + /* + * Optimization, instead of allocating 3 different buffer + * allocate one big buffer and divide the buffer into 3 different + * segment. + */ + mMemory = new SW_FT_Vector[point_size + contour_size + tag_size]; + ft.points = reinterpret_cast(mMemory); + ft.tags = reinterpret_cast(mMemory + point_size); + ft.contours = reinterpret_cast(mMemory + point_size + tag_size); + + ft.n_points = ft.n_contours = 0; + ft.flags = 0x0; +} + +void FTOutline::convert(const VPath &path) +{ + const std::vector &elements = path.elements(); + const std::vector &points = path.points(); + + grow(points.size(), path.segments()); + + int index = 0; + for(auto element : elements) { + switch (element){ + case VPath::Element::MoveTo: + moveTo(points[index]); + index++; + break; + case VPath::Element::LineTo: + lineTo(points[index]); + index++; + break; + case VPath::Element::CubicTo: + cubicTo(points[index], points[index+1], points[index+2]); + index = index+3; + break; + case VPath::Element::Close: + close(); + break; + default: + break; + } + } + end(); +} + +void FTOutline::convert(CapStyle cap, JoinStyle join, + float width, float meterLimit) +{ + ftClosed = (SW_FT_Bool) closed; + + // map strokeWidth to freetype. It uses as the radius of the pen not the diameter + width = width/2.0; + // convert to freetype co-ordinate + ftWidth = int(width * 64); + ftMeterLimit = int(meterLimit * 64); + + // map to freetype capstyle + switch (cap) + { + case CapStyle::Square: + ftCap = SW_FT_STROKER_LINECAP_SQUARE; + break; + case CapStyle::Round: + ftCap = SW_FT_STROKER_LINECAP_ROUND; + break; + default: + ftCap = SW_FT_STROKER_LINECAP_BUTT; + break; + } + switch (join) + { + case JoinStyle::Bevel: + ftJoin = SW_FT_STROKER_LINEJOIN_BEVEL; + break; + case JoinStyle::Round: + ftJoin = SW_FT_STROKER_LINEJOIN_ROUND; + break; + default: + ftJoin = SW_FT_STROKER_LINEJOIN_MITER; + break; + } +} #define TO_FT_COORD(x) ((x) * 64) // to freetype 26.6 coordinate. -void FTOutline::transform(const VMatrix &m) -{ - VPointF pt; - if (m.isIdentity()) return; - for (auto i = 0; i < ft.n_points; i++) { - pt = m.map(VPointF(ft.points[i].x/64.0, ft.points[i].y/64.0)); - ft.points[i].x = TO_FT_COORD(pt.x()); - ft.points[i].y = TO_FT_COORD(pt.y()); - } -} - void FTOutline::moveTo(const VPointF &pt) { ft.points[ft.n_points].x = TO_FT_COORD(pt.x()); @@ -145,15 +232,15 @@ struct RleTask std::promise sender; std::future receiver; bool stroke; - FTOutline *outline; - SW_FT_Stroker_LineCap cap; - SW_FT_Stroker_LineJoin join; - int width; - int meterLimit; - SW_FT_Bool closed; + VPath path; + FillRule fillRule; + CapStyle cap; + JoinStyle join; + float width; + float meterLimit; }; -static VRle generateRleAsync(RleTask *task); +static VRle generateRleAsync(RleTask *task, FTOutline &outRef); class RleTaskScheduler { const unsigned _count{std::thread::hardware_concurrency()}; @@ -164,14 +251,15 @@ class RleTaskScheduler { void run(unsigned i) { while (true) { RleTask *task = nullptr; - + //@TODO why the outline creation dosen't work + //outside of while loop. + FTOutline outlineRef; for (unsigned n = 0; n != _count * 32; ++n) { if (_q[(i + n) % _count].try_pop(task)) break; } if (!task && !_q[i].pop(task)) break; - task->sender.set_value(generateRleAsync(task)); - delete task->outline; + task->sender.set_value(generateRleAsync(task, outlineRef)); delete task; } } @@ -204,52 +292,51 @@ public: return std::move(receiver); } - std::future strokeRle(FTOutline *outline, - SW_FT_Stroker_LineCap cap, - SW_FT_Stroker_LineJoin join, - int width, - int meterLimit, - SW_FT_Bool closed) { + std::future strokeRle(const VPath &path, + CapStyle cap, + JoinStyle join, + float width, + float meterLimit) { RleTask *task = new RleTask(); task->stroke = true; - task->outline = outline; + task->path = path; task->cap = cap; task->join = join; task->width = width; task->meterLimit = meterLimit; - task->closed = closed; return async(task); } - std::future fillRle(FTOutline *outline) { + std::future fillRle(const VPath &path, FillRule fillRule) { RleTask *task = new RleTask(); + task->path = path; + task->fillRule = fillRule; task->stroke = false; - task->outline = outline; return async(task); } }; static RleTaskScheduler raster_scheduler; -static VRle generateRleAsync(RleTask *task) +static VRle generateRleAsync(RleTask *task, FTOutline &outRef) { if (task->stroke) { + outRef.convert(task->path); + outRef.convert(task->cap, task->join, task->width, task->meterLimit); // for stroke generation SW_FT_Stroker stroker; SW_FT_Stroker_New(&stroker); uint points,contors; - SW_FT_Outline strokeOutline = { 0, 0, nullptr, nullptr, nullptr, SW_FT_OUTLINE_NONE }; - SW_FT_Stroker_Set(stroker, task->width, task->cap, task->join, task->meterLimit); - SW_FT_Stroker_ParseOutline(stroker, &task->outline->ft, !task->closed); + SW_FT_Stroker_Set(stroker, outRef.ftWidth, outRef.ftCap, outRef.ftJoin, outRef.ftMeterLimit); + SW_FT_Stroker_ParseOutline(stroker, &outRef.ft, !outRef.ftClosed); SW_FT_Stroker_GetCounts(stroker,&points, &contors); - strokeOutline.points = (SW_FT_Vector *) calloc(points, sizeof(SW_FT_Vector)); - strokeOutline.tags = (char *) calloc(points, sizeof(char)); - strokeOutline.contours = (short *) calloc(contors, sizeof(short)); + FTOutline strokeOutline; + strokeOutline.grow(points, contors); - SW_FT_Stroker_Export(stroker, &strokeOutline); + SW_FT_Stroker_Export(stroker, &strokeOutline.ft); SW_FT_Stroker_Done(stroker); @@ -263,24 +350,29 @@ static VRle generateRleAsync(RleTask *task) sw_ft_grays_raster.raster_render(nullptr, ¶ms); - // cleanup the outline data. - free(strokeOutline.points); - free(strokeOutline.tags); - free(strokeOutline.contours); - return rle; } else { // fill generation + outRef.convert(task->path); + int fillRuleFlag = SW_FT_OUTLINE_NONE; + switch (task->fillRule) { + case FillRule::EvenOdd: + fillRuleFlag = SW_FT_OUTLINE_EVEN_ODD_FILL; + break; + default: + fillRuleFlag = SW_FT_OUTLINE_NONE; + break; + } + outRef.ft.flags = fillRuleFlag; VRle rle; SW_FT_Raster_Params params; params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; params.gray_spans = &rleGenerationCb; params.user = &rle; - params.source = &task->outline->ft; + params.source = &outRef.ft; sw_ft_grays_raster.raster_render(nullptr, ¶ms); - return rle; } } @@ -293,109 +385,27 @@ VRaster::~VRaster() { } -void VRaster::deleteFTOutline(FTOutline *outline) +std::future +VRaster::generateFillInfo(const VPath &path, FillRule fillRule) { - delete outline; -} - -FTOutline *VRaster::toFTOutline(const VPath &path) -{ - if (path.isEmpty()) - return nullptr; - - const std::vector &elements = path.elements(); - const std::vector &points = path.points(); - - FTOutline *outline = new FTOutline(points.size(), path.segments()); - - int index = 0; - for(auto element : elements) { - switch (element){ - case VPath::Element::MoveTo: - outline->moveTo(points[index]); - index++; - break; - case VPath::Element::LineTo: - outline->lineTo(points[index]); - index++; - break; - case VPath::Element::CubicTo: - outline->cubicTo(points[index], points[index+1], points[index+2]); - index = index+3; - break; - case VPath::Element::Close: - outline->close(); - break; - default: - break; - } + if (path.isEmpty()) { + std::promise promise; + promise.set_value(VRle()); + return promise.get_future(); } - outline->end(); - return outline; + return std::move(raster_scheduler.fillRle(path, fillRule)); } std::future -VRaster::generateFillInfo(FTOutline *outline, FillRule fillRule) -{ - int fillRuleFlag = SW_FT_OUTLINE_NONE; - switch (fillRule) { - case FillRule::EvenOdd: - fillRuleFlag = SW_FT_OUTLINE_EVEN_ODD_FILL; - break; - default: - fillRuleFlag = SW_FT_OUTLINE_NONE; - break; - } - - outline->ft.flags = fillRuleFlag; - - return std::move(raster_scheduler.fillRle(outline)); -} - -std::future -VRaster::generateStrokeInfo(FTOutline *outline, CapStyle cap, JoinStyle join, +VRaster::generateStrokeInfo(const VPath &path, CapStyle cap, JoinStyle join, float width, float meterLimit) { - SW_FT_Stroker_LineCap ftCap; - SW_FT_Stroker_LineJoin ftJoin; - int ftWidth; - int ftMeterLimit; - SW_FT_Bool ftclose = (SW_FT_Bool) outline->closed; - - // map strokeWidth to freetype. It uses as the radius of the pen not the diameter - width = width/2.0; - // convert to freetype co-ordinate - ftWidth = int(width * 64); - ftMeterLimit = int(meterLimit * 64); - - // map to freetype capstyle - switch (cap) - { - case CapStyle::Square: - ftCap = SW_FT_STROKER_LINECAP_SQUARE; - break; - case CapStyle::Round: - ftCap = SW_FT_STROKER_LINECAP_ROUND; - break; - default: - ftCap = SW_FT_STROKER_LINECAP_BUTT; - break; - } - switch (join) - { - case JoinStyle::Bevel: - ftJoin = SW_FT_STROKER_LINEJOIN_BEVEL; - break; - case JoinStyle::Round: - ftJoin = SW_FT_STROKER_LINEJOIN_ROUND; - break; - default: - ftJoin = SW_FT_STROKER_LINEJOIN_MITER; - break; - } - - return std::move(raster_scheduler.strokeRle(outline, ftCap, ftJoin, - ftWidth, ftMeterLimit, ftclose)); + if (path.isEmpty()) { + std::promise promise; + promise.set_value(VRle()); + return promise.get_future(); + } + return std::move(raster_scheduler.strokeRle(path, cap, join, width, meterLimit)); } V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 65baab662c..a2c1ad84c2 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -23,14 +23,11 @@ public: VRaster& operator=(VRaster const&) = delete; VRaster& operator=(VRaster &&) = delete; - static FTOutline *toFTOutline(const VPath &path); - static void deleteFTOutline(FTOutline *); - std::future generateFillInfo(FTOutline *, FillRule fillRule = FillRule::Winding); - std::future generateStrokeInfo(FTOutline *, CapStyle cap, JoinStyle join, + std::future generateFillInfo(const VPath &path, FillRule fillRule = FillRule::Winding); + std::future generateStrokeInfo(const VPath &path, CapStyle cap, JoinStyle join, float width, float meterLimit); private: VRaster(); - VRasterPrivate *d; }; V_END_NAMESPACE From d39ce3f62f25735a95fe295e04a45bba9e9fb569 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 25 Jul 2018 16:55:40 +0900 Subject: [PATCH 067/672] lottie: added cmake build system for lottie Change-Id: I8e03709ae668bc221c4ec936317cf579d326876f --- CMakeLists.txt | 51 ++++++++++++++++++++++++++++++ inc/CMakeLists.txt | 4 +++ src/CMakeLists.txt | 4 +++ src/lottie/CMakeLists.txt | 14 ++++++++ src/vector/CMakeLists.txt | 28 ++++++++++++++++ src/vector/freetype/CMakeLists.txt | 11 +++++++ 6 files changed, 112 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 inc/CMakeLists.txt create mode 100644 src/CMakeLists.txt create mode 100644 src/lottie/CMakeLists.txt create mode 100644 src/vector/CMakeLists.txt create mode 100644 src/vector/freetype/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..13ebfa6ffa --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required( VERSION 3.2 ) + +#declare project +project( lottie-player LANGUAGES C CXX ) + +#declare target +add_library( lottie-player SHARED "" ) + +#declare alias so that library can be used inside the build tree, e.g. when testing +add_library(lottie-player::lottie-player ALIAS lottie-player) + +#declare target compilation options +target_compile_options(lottie-player + PUBLIC + -std=c++11 + PRIVATE + -Wall -fvisibility=hidden) + +#declare dependancy +set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) +find_package( Threads ) + +target_link_libraries(lottie-player + PUBLIC + "${CMAKE_THREAD_LIBS_INIT}" + ) + +#declare source and include files +add_subdirectory(inc) +add_subdirectory(src) + +#install header +install(FILES inc/lottieplayer.h DESTINATION include) + +#install lib +install( TARGETS lottie-player EXPORT lottie-player-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + INCLUDES DESTINATION include + ) + +#install config file. +install( EXPORT lottie-player-targets + FILE lottie-player.cmake + NAMESPACE lottie-player:: + DESTINATION lib/cmake/lottie-player + ) + + +#Register package in user's package registry +export(PACKAGE lottie-player) \ No newline at end of file diff --git a/inc/CMakeLists.txt b/inc/CMakeLists.txt new file mode 100644 index 0000000000..adc3dc01d7 --- /dev/null +++ b/inc/CMakeLists.txt @@ -0,0 +1,4 @@ +target_include_directories(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}" + ) \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000..fce73dbf8d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,4 @@ + +add_subdirectory(vector) + +add_subdirectory(lottie) \ No newline at end of file diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt new file mode 100644 index 0000000000..d6c006d340 --- /dev/null +++ b/src/lottie/CMakeLists.txt @@ -0,0 +1,14 @@ + +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/lottieitem.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottieloader.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottiemodel.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottieparser.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottieplayer.cpp" + ) + +target_include_directories(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}" + ) \ No newline at end of file diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt new file mode 100644 index 0000000000..e52b019f9a --- /dev/null +++ b/src/vector/CMakeLists.txt @@ -0,0 +1,28 @@ + +add_subdirectory(freetype) + +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/vdasher.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vbrush.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vbitmap.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vpainter.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vcompositionfunctions.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper_sse2.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vrle.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vpath.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vpathmesure.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vmatrix.cpp" + "${CMAKE_CURRENT_LIST_DIR}/velapsedtimer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vdebug.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vinterpolator.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vbezier.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vraster.cpp" + ) + +target_include_directories(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}" + ) diff --git a/src/vector/freetype/CMakeLists.txt b/src/vector/freetype/CMakeLists.txt new file mode 100644 index 0000000000..0ce7e69da1 --- /dev/null +++ b/src/vector/freetype/CMakeLists.txt @@ -0,0 +1,11 @@ +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/v_ft_math.cpp" + "${CMAKE_CURRENT_LIST_DIR}/v_ft_raster.cpp" + "${CMAKE_CURRENT_LIST_DIR}/v_ft_stroker.cpp" + ) + +target_include_directories(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}" + ) \ No newline at end of file From 970dd837359bb7c5fe47ef17ffef65912c6b86e4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 25 Jul 2018 19:23:57 +0900 Subject: [PATCH 068/672] lottie: add pc file for lottie player Change-Id: Ic44b84b756b0ae7939a016cddd1e51eec7d3a3bc --- CMakeLists.txt | 5 ++++- lottie-player.pc.in | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 lottie-player.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 13ebfa6ffa..a42fbc20a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,9 @@ target_link_libraries(lottie-player add_subdirectory(inc) add_subdirectory(src) +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) + #install header install(FILES inc/lottieplayer.h DESTINATION include) @@ -48,4 +51,4 @@ install( EXPORT lottie-player-targets #Register package in user's package registry -export(PACKAGE lottie-player) \ No newline at end of file +export(PACKAGE lottie-player) diff --git a/lottie-player.pc.in b/lottie-player.pc.in new file mode 100644 index 0000000000..52c5b4a4ba --- /dev/null +++ b/lottie-player.pc.in @@ -0,0 +1,11 @@ +prefix=@PREFIX@ +exec_prefix=@EXEC_DIR@ +libdir=@LIBDIR@ +includedir=@INCDIR@ + +Name: lottie-player +Description: A lottie-player library +Version: @VERSION@ +Requires: +Libs: -L${libdir} -llottie-player +Cflags: -I${includedir} From a34f172479298acb5f651969421a68c49e1b58b9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 25 Jul 2018 19:24:53 +0900 Subject: [PATCH 069/672] lottie: Support tizen gbs build . Change-Id: I516206ba3cc83d80770888b1d1c21e37780c3e45 --- LICENSE | 178 +++++++++++++++++++++++++++++++ lottie-player.manifest | 5 + packaging/lottie-player.manifest | 5 + packaging/lottie-player.spec | 67 ++++++++++++ 4 files changed, 255 insertions(+) create mode 100644 LICENSE create mode 100644 lottie-player.manifest create mode 100644 packaging/lottie-player.manifest create mode 100644 packaging/lottie-player.spec diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..4544429441 --- /dev/null +++ b/LICENSE @@ -0,0 +1,178 @@ +Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/lottie-player.manifest b/lottie-player.manifest new file mode 100644 index 0000000000..017d22d3af --- /dev/null +++ b/lottie-player.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/lottie-player.manifest b/packaging/lottie-player.manifest new file mode 100644 index 0000000000..017d22d3af --- /dev/null +++ b/packaging/lottie-player.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec new file mode 100644 index 0000000000..cc4e78a3a5 --- /dev/null +++ b/packaging/lottie-player.spec @@ -0,0 +1,67 @@ +Name: lottie-player +Summary: lottie player library +Version: 0.0.1 +Release: 1 +Group: System/Libraries +License: Apache-2.0 +URL: http://www.tizen.org/ +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description +lottie player library + + +%package devel +Summary: lottie player library (devel) +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + + +%description devel +lottie player library (devel) + + +%prep +%setup -q + + +%build +export CFLAGS+=" -fvisibility=hidden -fPIC -Wall" +export LDFLAGS+=" " + + +cmake \ + . -DCMAKE_INSTALL_PREFIX=/usr + + +make %{?jobs:-j%jobs} + +%install +%make_install + +mkdir -p %{buildroot}/%{_datadir}/license +cp %{_builddir}/%{buildsubdir}/LICENSE %{buildroot}/%{_datadir}/license/%{name} + + +%post -p /sbin/ldconfig +echo "INFO: System should be restarted or execute: systemctl --user daemon-reload from user session to finish service installation." +%postun -p /sbin/ldconfig + + +%files +%defattr(-,root,root,-) +%{_libdir}/liblottie-player.so* +%{_datadir}/license/%{name} +%manifest %{name}.manifest + +%files devel +%defattr(-,root,root,-) +%{_includedir}/*.h +%{_libdir}/cmake/lottie-player/*.cmake +%{_libdir}/pkgconfig/lottie-player.pc + + + From 7b4f8a44be6bdf47be4b67fcf1a671dc67eba346 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 09:33:20 +0900 Subject: [PATCH 070/672] lottie: support library version in cmake build system. Change-Id: I494a29cc02ddd5dbba6014f08d27f11da62ecfb3 --- CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a42fbc20a3..40f8ea602c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,16 @@ project( lottie-player LANGUAGES C CXX ) #declare target add_library( lottie-player SHARED "" ) +#declare version of the target +set(player_version_major 0) +set(player_version_minor 0) +set(player_version_patch 1) +set(player_version ${player_version_major}.${player_version_minor}.${player_version_patch} ) +set_target_properties(lottie-player PROPERTIES + VERSION ${player_version} + SOVERSION ${player_version_major} + ) + #declare alias so that library can be used inside the build tree, e.g. when testing add_library(lottie-player::lottie-player ALIAS lottie-player) From 8aaeff98a3588089ddfacc2d8ad4ae508f20415d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 09:43:36 +0900 Subject: [PATCH 071/672] lottie: updated library dependancy to c++14 Change-Id: I6262065f30393830ea5192d0f549491f2c42677e --- CMakeLists.txt | 2 +- meson.build | 2 +- src/vector/vglobal.h | 10 ---------- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40f8ea602c..daf3d6bad9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ add_library(lottie-player::lottie-player ALIAS lottie-player) #declare target compilation options target_compile_options(lottie-player PUBLIC - -std=c++11 + -std=c++14 PRIVATE -Wall -fvisibility=hidden) diff --git a/meson.build b/meson.build index c6a2f2afba..8abff811a5 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ lottie_player_lib_version = '0.0.1' add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_source_dir()), language : 'cpp') -compiler_flags = ['-Wall','-std=c++11', '-fvisibility=hidden'] +compiler_flags = ['-Wall','-std=c++14', '-fvisibility=hidden'] if (build_machine.system() == 'linux') compiler_flags += ['-pthread'] diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index eefe5b2909..0585955991 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -35,16 +35,6 @@ typedef uint8_t uchar; #include"vdebug.h" #define VECTOR_FALLTHROUGH -/* - * keep this till we move the code to c++14 - */ -namespace std { -template -std::unique_ptr make_unique( Args&& ...args ) -{ - return std::unique_ptr( new T( std::forward(args)... ) ); -} -} #include class RefCount From f35ca73d48f341338dc470da714cfa5454041cf4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 09:58:44 +0900 Subject: [PATCH 072/672] lottie/optimization: Refactored to reduced number of allocation per task. Change-Id: I380e0b6c720c698e84e9d157678c8abf6ac83191 --- src/vector/vraster.cpp | 152 ++++++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 70 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 689db38127..c9ae53fd6d 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -18,7 +18,10 @@ public: void releaseMemory() { if (mMemory) delete [] mMemory; mMemory = nullptr; + mPointSize = 0; + mSegmentSize = 0; } + void reset(); void grow(int, int); void convert(const VPath &path); void convert(CapStyle, JoinStyle, float, float); @@ -40,10 +43,22 @@ public: SW_FT_Bool ftClosed; }; +void FTOutline::reset() +{ + ft.n_points = ft.n_contours = 0; + ft.flags = 0x0; +} + void FTOutline::grow(int points, int segments) { - if (mPointSize > points && mSegmentSize > segments) + reset(); + if (mPointSize >= points && mSegmentSize >= segments) return; + + // release old memory + releaseMemory(); + + //update book keeping mPointSize = points; mSegmentSize = segments; @@ -51,8 +66,6 @@ void FTOutline::grow(int points, int segments) int contour_size = ((sizeof(short) * segments) / sizeof(SW_FT_Vector)) + 1; int tag_size = ((sizeof(char) * (points + segments)) / sizeof(SW_FT_Vector)) + 1; - releaseMemory(); - /* * Optimization, instead of allocating 3 different buffer * allocate one big buffer and divide the buffer into 3 different @@ -62,9 +75,6 @@ void FTOutline::grow(int points, int segments) ft.points = reinterpret_cast(mMemory); ft.tags = reinterpret_cast(mMemory + point_size); ft.contours = reinterpret_cast(mMemory + point_size + tag_size); - - ft.n_points = ft.n_contours = 0; - ft.flags = 0x0; } void FTOutline::convert(const VPath &path) @@ -238,9 +248,61 @@ struct RleTask JoinStyle join; float width; float meterLimit; + VRle operator()(FTOutline &outRef, SW_FT_Stroker &stroker); }; -static VRle generateRleAsync(RleTask *task, FTOutline &outRef); +VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) +{ + if (stroke) { //Stroke Task + outRef.convert(path); + outRef.convert(cap, join, width, meterLimit); + + uint points,contors; + + SW_FT_Stroker_Set(stroker, outRef.ftWidth, outRef.ftCap, outRef.ftJoin, outRef.ftMeterLimit); + SW_FT_Stroker_ParseOutline(stroker, &outRef.ft, !outRef.ftClosed); + SW_FT_Stroker_GetCounts(stroker,&points, &contors); + + FTOutline strokeOutline; + strokeOutline.grow(points, contors); + + SW_FT_Stroker_Export(stroker, &strokeOutline.ft); + + VRle rle; + SW_FT_Raster_Params params; + + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.gray_spans = &rleGenerationCb; + params.user = &rle; + params.source = &strokeOutline; + + sw_ft_grays_raster.raster_render(nullptr, ¶ms); + + return rle; + } else { //Fill Task + outRef.convert(path); + int fillRuleFlag = SW_FT_OUTLINE_NONE; + switch (fillRule) { + case FillRule::EvenOdd: + fillRuleFlag = SW_FT_OUTLINE_EVEN_ODD_FILL; + break; + default: + fillRuleFlag = SW_FT_OUTLINE_NONE; + break; + } + outRef.ft.flags = fillRuleFlag; + VRle rle; + SW_FT_Raster_Params params; + + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.gray_spans = &rleGenerationCb; + params.user = &rle; + params.source = &outRef.ft; + + sw_ft_grays_raster.raster_render(nullptr, ¶ms); + return rle; + } +} class RleTaskScheduler { const unsigned _count{std::thread::hardware_concurrency()}; @@ -249,19 +311,28 @@ class RleTaskScheduler { std::atomic _index{0}; void run(unsigned i) { + /* + * initalize per thread objects. + */ + FTOutline outlineRef; + SW_FT_Stroker stroker; + SW_FT_Stroker_New(&stroker); + + // Task Loop while (true) { RleTask *task = nullptr; - //@TODO why the outline creation dosen't work - //outside of while loop. - FTOutline outlineRef; + for (unsigned n = 0; n != _count * 32; ++n) { if (_q[(i + n) % _count].try_pop(task)) break; } if (!task && !_q[i].pop(task)) break; - task->sender.set_value(generateRleAsync(task, outlineRef)); + task->sender.set_value((*task)(outlineRef, stroker)); delete task; } + + //cleanup + SW_FT_Stroker_Done(stroker); } public: @@ -318,65 +389,6 @@ public: static RleTaskScheduler raster_scheduler; -static VRle generateRleAsync(RleTask *task, FTOutline &outRef) -{ - if (task->stroke) { - outRef.convert(task->path); - outRef.convert(task->cap, task->join, task->width, task->meterLimit); - // for stroke generation - SW_FT_Stroker stroker; - SW_FT_Stroker_New(&stroker); - - uint points,contors; - - SW_FT_Stroker_Set(stroker, outRef.ftWidth, outRef.ftCap, outRef.ftJoin, outRef.ftMeterLimit); - SW_FT_Stroker_ParseOutline(stroker, &outRef.ft, !outRef.ftClosed); - SW_FT_Stroker_GetCounts(stroker,&points, &contors); - - FTOutline strokeOutline; - strokeOutline.grow(points, contors); - - SW_FT_Stroker_Export(stroker, &strokeOutline.ft); - - SW_FT_Stroker_Done(stroker); - - VRle rle; - SW_FT_Raster_Params params; - - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; - params.gray_spans = &rleGenerationCb; - params.user = &rle; - params.source = &strokeOutline; - - sw_ft_grays_raster.raster_render(nullptr, ¶ms); - - return rle; - } else { - // fill generation - outRef.convert(task->path); - int fillRuleFlag = SW_FT_OUTLINE_NONE; - switch (task->fillRule) { - case FillRule::EvenOdd: - fillRuleFlag = SW_FT_OUTLINE_EVEN_ODD_FILL; - break; - default: - fillRuleFlag = SW_FT_OUTLINE_NONE; - break; - } - outRef.ft.flags = fillRuleFlag; - VRle rle; - SW_FT_Raster_Params params; - - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; - params.gray_spans = &rleGenerationCb; - params.user = &rle; - params.source = &outRef.ft; - - sw_ft_grays_raster.raster_render(nullptr, ¶ms); - return rle; - } -} - VRaster::VRaster() { } From f6658ae623dca40e3b5939168bf157ff3c8d88ef Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 11:11:28 +0900 Subject: [PATCH 073/672] lottie/vector: update reserve() api in vpath Change-Id: Ib43afa96a0c1a7764dd410ea1e7f01019f592d6d --- src/vector/vpath.cpp | 6 +++--- src/vector/vpath.h | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 639f2d0202..cfe64eea55 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -83,10 +83,10 @@ int VPath::VPathData::segments() const return m_segments + 1; } -void VPath::VPathData::reserve(int num_elm) +void VPath::VPathData::reserve(int pts, int elms) { - m_elements.reserve(num_elm); - m_points.reserve(2 * num_elm); + m_points.reserve(m_points.size() + pts); + m_elements.reserve(m_elements.size() + elms); } static VPointF curvesForArc(const VRectF &, float, float, VPointF *, int *); diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 5b15a943f5..14a29bdee6 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -33,7 +33,7 @@ public: void arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo); void close(); void reset(); - void reserve(int num_elm); + void reserve(int pts, int elms); int segments() const; void addCircle(float cx, float cy, float radius, VPath::Direction dir = Direction::CW); void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); @@ -57,7 +57,7 @@ private: void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); void close(); void reset(); - void reserve(int num_elm); + void reserve(int, int); void checkNewSegment(); int segments() const; void transform(const VMatrix &m); @@ -108,9 +108,9 @@ inline void VPath::reset() d.write().reset(); } -inline void VPath::reserve(int num_elm) +inline void VPath::reserve(int pts, int elms) { - d.write().reserve(num_elm); + d.write().reserve(pts, elms); } inline int VPath::segments() const From 6d5d456d0fdd51d0b537ce6c50a7172376fedac7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 11:23:14 +0900 Subject: [PATCH 074/672] lottie/optimization: reserve() memory ahead before calling path api to optimize the number of allocation. Change-Id: Iab0b8db715c868de0a0f4a0c688421cc11be4b01 --- src/lottie/lottieitem.cpp | 18 +----------------- src/lottie/lottiemodel.h | 5 +++++ 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index a55bc3c560..51bfe91824 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -904,23 +904,7 @@ LOTShapeItem::LOTShapeItem(LOTShapeData *data):LOTPathDataItem(data->isStatic()) VPath LOTShapeItem::getPath(int frameNo) { - LottieShapeData shapeData = mData->mShape.value(frameNo); - - if (shapeData.mPoints.empty()) - return VPath(); - - VPath path; - - int size = shapeData.mPoints.size(); - const VPointF *points = shapeData.mPoints.data(); - path.moveTo(points[0]); - for (int i = 1 ; i < size; i+=3) { - path.cubicTo(points[i], points[i+1], points[i+2]); - } - if (shapeData.mClosed) - path.close(); - - return path; + return mData->mShape.value(frameNo).toPath(); } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index fc3475e981..9e37dc1bf0 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -109,6 +109,11 @@ public: VPath path; int size = mPoints.size(); const VPointF *points = mPoints.data(); + /* reserve exact memory requirement at once + * ptSize = size + 1(size + close) + * elmSize = size/3 cubic + 1 move + 1 close + */ + path.reserve(size + 1 , size/3 + 2); path.moveTo(points[0]); for (int i = 1 ; i < size; i+=3) { path.cubicTo(points[i], points[i+1], points[i+2]); From c4aea880440b603199fa53bdd9b13b9675d27d5d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 12:46:07 +0900 Subject: [PATCH 075/672] lottie/optimization: added reserve() on lottieshapeData to optimize memory allocation Change-Id: Ic41d90a4463b54c47d3f39fa72bb09d5ddbc47f0 --- src/lottie/lottiemodel.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 9e37dc1bf0..93bcf4bcb9 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -103,6 +103,9 @@ inline const LottieColor operator*(float m, const LottieColor &c) class LottieShapeData { public: + void reserve(int size) { + mPoints.reserve(mPoints.size() + size); + } VPath toPath() const{ if (mPoints.empty()) return VPath(); @@ -221,6 +224,7 @@ public: return LottieShapeData(); LottieShapeData result; + result.reserve(mStartValue.mPoints.size()); for (unsigned int i = 0 ; i < mStartValue.mPoints.size(); i++) { result.mPoints.push_back(mStartValue.mPoints[i] + progress * (mEndValue.mPoints[i] - mStartValue.mPoints[i])); } From f0fc4f8c3bb6411bf935d5f5f00a0989b78059cd Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 13:10:36 +0900 Subject: [PATCH 076/672] lottie/render: fixed meter join type rendering issue. Change-Id: Ie32e60b0d613a5ca7b68176d7f8cc0859aa0f315 --- src/vector/vraster.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index c9ae53fd6d..e896932b85 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -38,8 +38,8 @@ public: bool closed{false}; SW_FT_Stroker_LineCap ftCap; SW_FT_Stroker_LineJoin ftJoin; - int ftWidth; - int ftMeterLimit; + SW_FT_Fixed ftWidth; + SW_FT_Fixed ftMeterLimit; SW_FT_Bool ftClosed; }; @@ -117,8 +117,10 @@ void FTOutline::convert(CapStyle cap, JoinStyle join, // map strokeWidth to freetype. It uses as the radius of the pen not the diameter width = width/2.0; // convert to freetype co-ordinate - ftWidth = int(width * 64); - ftMeterLimit = int(meterLimit * 64); + //IMP: stroker takes radius in 26.6 co-ordinate + ftWidth = SW_FT_Fixed(width * (1<<6)); + //IMP: stroker takes meterlimit in 16.16 co-ordinate + ftMeterLimit = SW_FT_Fixed(meterLimit * (1<<16)); // map to freetype capstyle switch (cap) From 6f5a77fa45783a57021b479ea6ac51fa44971212 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 26 Jul 2018 18:29:33 +0900 Subject: [PATCH 077/672] lottie/optimization: reduce temporary object by calling *= operator. Change-Id: I9a5273a81cdad0ac78edf6a6564cfb6965884311 --- src/lottie/lottieitem.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 51bfe91824..a6bcd2e636 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -420,7 +420,8 @@ void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, float parent if (!visible()) return; // 2. calculate the parent matrix and alpha - VMatrix m = matrix(frameNo) * parentMatrix; + VMatrix m = matrix(frameNo); + m *= parentMatrix; float alpha = parentAlpha * opacity(frameNo); //6. update the mask @@ -713,7 +714,8 @@ void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, float if ((flag & DirtyFlagBit::Matrix) || !mData->mTransform->staticMatrix() ) { newFlag |= DirtyFlagBit::Matrix; } - m = mData->mTransform->matrix(frameNo) * parentMatrix; + m = mData->mTransform->matrix(frameNo); + m *= parentMatrix; alpha *= mData->mTransform->opacity(frameNo); if (!vCompare(alpha, parentAlpha)) { From 8b77e6ce9377d29f70fda58ffcaecdbfb018f211 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 24 Jul 2018 09:42:24 +0900 Subject: [PATCH 078/672] lottie/vector: refactor vmatrix class as a POD class because memory allocation is showing up in profiling. Change-Id: Ib86e8e3766faa1f8e43e3b21b356d16adf3c9cab --- src/vector/vdrawhelper.cpp | 18 +- src/vector/vmatrix.cpp | 595 ++++++++++++++----------------------- src/vector/vmatrix.h | 32 +- 3 files changed, 246 insertions(+), 399 deletions(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index d43198a506..05319b3b0f 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -583,15 +583,15 @@ VSpanData::setup(const VBrush &brush, VPainter::CompositionMode mode, int alpha) void VSpanData::setupMatrix(const VMatrix &matrix) { VMatrix inv = matrix.inverted(); - m11 = inv.m11(); - m12 = inv.m12(); - m13 = inv.m13(); - m21 = inv.m21(); - m22 = inv.m22(); - m23 = inv.m23(); - m33 = inv.m33(); - dx = inv.m31(); - dy = inv.m32(); + m11 = inv.m11; + m12 = inv.m12; + m13 = inv.m13; + m21 = inv.m21; + m22 = inv.m22; + m23 = inv.m23; + m33 = inv.m33; + dx = inv.mtx; + dy = inv.mty; //const bool affine = inv.isAffine(); // fast_matrix = affine diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 22ec612092..412877d99f 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -11,27 +11,10 @@ V_BEGIN_NAMESPACE * m13 m23 m33 */ -struct VMatrixData { - VMatrixData(): ref(-1), - type(VMatrix::MatrixType::None), - dirty(VMatrix::MatrixType::None), - m11(1), m12(0), m13(0), - m21(0), m22(1), m23(0), - mtx(0), mty(0), m33(1){} - RefCount ref; - VMatrix::MatrixType type; - VMatrix::MatrixType dirty; - float m11, m12, m13; - float m21, m22, m23; - float mtx, mty, m33; -}; - -static const struct VMatrixData shared_empty; - inline float VMatrix::determinant() const { - return d->m11*(d->m33*d->m22 - d->mty*d->m23) - - d->m21*(d->m33*d->m12 - d->mty*d->m13)+d->mtx*(d->m23*d->m12 - d->m22*d->m13); + return m11*(m33*m22 - mty*m23) - + m21*(m33*m12 - mty*m13)+mtx*(m23*m12 - m22*m13); } bool VMatrix::isAffine() const @@ -63,154 +46,75 @@ bool VMatrix::isTranslating() const return type() >= MatrixType::Translate; } -inline void VMatrix::cleanUp(VMatrixData *d) -{ - delete d; -} - -void VMatrix::detach() -{ - if (d->ref.isShared()) - *this = copy(); -} - -VMatrix VMatrix::copy() const -{ - VMatrix r; - - r.d = new VMatrixData; - memcpy(r.d, d, sizeof(VMatrixData)); - r.d->ref.setOwned(); - return r; -} - -VMatrix::VMatrix() - : d(const_cast(&shared_empty)) -{ -} - -VMatrix::~VMatrix() -{ - if (!d->ref.deref()) - cleanUp(d); -} - -VMatrix::VMatrix(bool init V_UNUSED) -{ - d = new VMatrixData; - d->ref.setOwned(); -} - -VMatrix::VMatrix(float h11, float h12, float h13, - float h21, float h22, float h23, - float h31, float h32, float h33) -{ - d = new VMatrixData; - d->ref.setOwned(); - d->m11 = h11; d->m12 = h12; d->m13 = h13; - d->m21 = h21; d->m22 = h22; d->m23 = h23; - d->mtx = h31; d->mty = h32; d->m33 = h33; - d->type = MatrixType::None; - d->dirty = MatrixType::Project; -} - -VMatrix::VMatrix(const VMatrix &m) -{ - d = m.d; - d->ref.ref(); -} - -VMatrix::VMatrix(VMatrix &&other): d(other.d) -{ - other.d = const_cast(&shared_empty); -} - -VMatrix &VMatrix::operator=(const VMatrix &m) -{ - m.d->ref.ref(); - if (!d->ref.deref()) - cleanUp(d); - - d = m.d; - return *this; -} - -inline VMatrix &VMatrix::operator=(VMatrix &&other) -{ - if (!d->ref.deref()) - cleanUp(d); - d = other.d; - other.d = const_cast(&shared_empty); - return *this; -} - -inline VMatrix &VMatrix::operator*=(float num) +VMatrix &VMatrix::operator*=(float num) { if (num == 1.) return *this; - detach(); - d->m11 *= num; - d->m12 *= num; - d->m13 *= num; - d->m21 *= num; - d->m22 *= num; - d->m23 *= num; - d->mtx *= num; - d->mty *= num; - d->m33 *= num; - if (d->dirty < MatrixType::Scale) - d->dirty = MatrixType::Scale; + + m11 *= num; + m12 *= num; + m13 *= num; + m21 *= num; + m22 *= num; + m23 *= num; + mtx *= num; + mty *= num; + m33 *= num; + if (dirty < MatrixType::Scale) + dirty = MatrixType::Scale; return *this; } -inline VMatrix &VMatrix::operator/=(float div) +VMatrix &VMatrix::operator/=(float div) { if (div == 0) return *this; - detach(); + div = 1/div; return operator*=(div); } VMatrix::MatrixType VMatrix::type() const { - if(d->dirty == MatrixType::None || d->dirty < d->type) - return static_cast(d->type); + if(dirty == MatrixType::None || dirty < mType) + return mType; - switch (static_cast(d->dirty)) { + VMatrix::MatrixType newType; + switch (dirty) { case MatrixType::Project: - if (!vIsZero(d->m13) || !vIsZero(d->m23) || !vIsZero(d->m33 - 1)) { - d->type = MatrixType::Project; + if (!vIsZero(m13) || !vIsZero(m23) || !vIsZero(m33 - 1)) { + newType = MatrixType::Project; break; } case MatrixType::Shear: case MatrixType::Rotate: - if (!vIsZero(d->m12) || !vIsZero(d->m21)) { - const float dot = d->m11 * d->m12 + d->m21 * d->m22; + if (!vIsZero(m12) || !vIsZero(m21)) { + const float dot = m11 * m12 + m21 * m22; if (vIsZero(dot)) - d->type = MatrixType::Rotate; + newType = MatrixType::Rotate; else - d->type = MatrixType::Shear; + newType = MatrixType::Shear; break; } case MatrixType::Scale: - if (!vIsZero(d->m11 - 1) || !vIsZero(d->m22 - 1)) { - d->type = MatrixType::Scale; + if (!vIsZero(m11 - 1) || !vIsZero(m22 - 1)) { + newType = MatrixType::Scale; break; } case MatrixType::Translate: - if (!vIsZero(d->mtx) || !vIsZero(d->mty)) { - d->type = MatrixType::Translate; + if (!vIsZero(mtx) || !vIsZero(mty)) { + newType = MatrixType::Translate; break; } case MatrixType::None: - d->type = MatrixType::None; + newType = MatrixType::None; break; } - d->dirty = MatrixType::None; - return static_cast(d->type); + const_cast(this)->dirty = MatrixType::None; + const_cast(this)->mType = newType; + return newType; } @@ -218,30 +122,30 @@ VMatrix &VMatrix::translate(float dx, float dy) { if (dx == 0 && dy == 0) return *this; - detach(); + switch(type()) { case MatrixType::None: - d->mtx = dx; - d->mty = dy; + mtx = dx; + mty = dy; break; case MatrixType::Translate: - d->mtx += dx; - d->mty += dy; + mtx += dx; + mty += dy; break; case MatrixType::Scale: - d->mtx += dx* d->m11; - d->mty += dy* d->m22; + mtx += dx* m11; + mty += dy* m22; break; case MatrixType::Project: - d->m33 += dx * d->m13 + dy * d->m23; + m33 += dx * m13 + dy * m23; case MatrixType::Shear: case MatrixType::Rotate: - d->mtx += dx*d->m11 + dy*d->m21; - d->mty += dy*d->m22 + dx*d->m12; + mtx += dx*m11 + dy*m21; + mty += dy*m22 + dx*m12; break; } - if (d->dirty < MatrixType::Translate) - d->dirty = MatrixType::Translate; + if (dirty < MatrixType::Translate) + dirty = MatrixType::Translate; return *this; } @@ -249,27 +153,27 @@ VMatrix & VMatrix::scale(float sx, float sy) { if (sx == 1 && sy == 1) return *this; - detach(); + switch(type()) { case MatrixType::None: case MatrixType::Translate: - d->m11 = sx; - d->m22 = sy; + m11 = sx; + m22 = sy; break; case MatrixType::Project: - d->m13 *= sx; - d->m23 *= sy; + m13 *= sx; + m23 *= sy; case MatrixType::Rotate: case MatrixType::Shear: - d->m12 *= sx; - d->m21 *= sy; + m12 *= sx; + m21 *= sy; case MatrixType::Scale: - d->m11 *= sx; - d->m22 *= sy; + m11 *= sx; + m22 *= sy; break; } - if (d->dirty < MatrixType::Scale) - d->dirty = MatrixType::Scale; + if (dirty < MatrixType::Scale) + dirty = MatrixType::Scale; return *this; } @@ -277,36 +181,36 @@ VMatrix & VMatrix::shear(float sh, float sv) { if (sh == 0 && sv == 0) return *this; - detach(); + switch(type()) { case MatrixType::None: case MatrixType::Translate: - d->m12 = sv; - d->m21 = sh; + m12 = sv; + m21 = sh; break; case MatrixType::Scale: - d->m12 = sv*d->m22; - d->m21 = sh*d->m11; + m12 = sv*m22; + m21 = sh*m11; break; case MatrixType::Project: { - float tm13 = sv*d->m23; - float tm23 = sh*d->m13; - d->m13 += tm13; - d->m23 += tm23; + float tm13 = sv*m23; + float tm23 = sh*m13; + m13 += tm13; + m23 += tm23; } case MatrixType::Rotate: case MatrixType::Shear: { - float tm11 = sv*d->m21; - float tm22 = sh*d->m12; - float tm12 = sv*d->m22; - float tm21 = sh*d->m11; - d->m11 += tm11; d->m12 += tm12; - d->m21 += tm21; d->m22 += tm22; + float tm11 = sv*m21; + float tm22 = sh*m12; + float tm12 = sv*m22; + float tm21 = sh*m11; + m11 += tm11; m12 += tm12; + m21 += tm21; m22 += tm22; break; } } - if (d->dirty < MatrixType::Shear) - d->dirty = MatrixType::Shear; + if (dirty < MatrixType::Shear) + dirty = MatrixType::Shear; return *this; } @@ -318,7 +222,7 @@ VMatrix & VMatrix::rotate(float a, Axis axis) { if (a == 0) return *this; - detach(); + float sina = 0; float cosa = 0; if (a == 90. || a == -270.) @@ -337,49 +241,49 @@ VMatrix & VMatrix::rotate(float a, Axis axis) switch(type()) { case MatrixType::None: case MatrixType::Translate: - d->m11 = cosa; - d->m12 = sina; - d->m21 = -sina; - d->m22 = cosa; + m11 = cosa; + m12 = sina; + m21 = -sina; + m22 = cosa; break; case MatrixType::Scale: { - float tm11 = cosa*d->m11; - float tm12 = sina*d->m22; - float tm21 = -sina*d->m11; - float tm22 = cosa*d->m22; - d->m11 = tm11; d->m12 = tm12; - d->m21 = tm21; d->m22 = tm22; + float tm11 = cosa*m11; + float tm12 = sina*m22; + float tm21 = -sina*m11; + float tm22 = cosa*m22; + m11 = tm11; m12 = tm12; + m21 = tm21; m22 = tm22; break; } case MatrixType::Project: { - float tm13 = cosa*d->m13 + sina*d->m23; - float tm23 = -sina*d->m13 + cosa*d->m23; - d->m13 = tm13; - d->m23 = tm23; + float tm13 = cosa*m13 + sina*m23; + float tm23 = -sina*m13 + cosa*m23; + m13 = tm13; + m23 = tm23; } case MatrixType::Rotate: case MatrixType::Shear: { - float tm11 = cosa*d->m11 + sina*d->m21; - float tm12 = cosa*d->m12 + sina*d->m22; - float tm21 = -sina*d->m11 + cosa*d->m21; - float tm22 = -sina*d->m12 + cosa*d->m22; - d->m11 = tm11; d->m12 = tm12; - d->m21 = tm21; d->m22 = tm22; + float tm11 = cosa*m11 + sina*m21; + float tm12 = cosa*m12 + sina*m22; + float tm21 = -sina*m11 + cosa*m21; + float tm22 = -sina*m12 + cosa*m22; + m11 = tm11; m12 = tm12; + m21 = tm21; m22 = tm22; break; } } - if (d->dirty < MatrixType::Rotate) - d->dirty = MatrixType::Rotate; + if (dirty < MatrixType::Rotate) + dirty = MatrixType::Rotate; } else { VMatrix result; if (axis == Axis::Y) { - result.d->m11 = cosa; - result.d->m13 = -sina * inv_dist_to_plane; + result.m11 = cosa; + result.m13 = -sina * inv_dist_to_plane; } else { - result.d->m22 = cosa; - result.d->m23 = -sina * inv_dist_to_plane; + result.m22 = cosa; + result.m23 = -sina * inv_dist_to_plane; } - result.d->type = MatrixType::Project; + result.mType = MatrixType::Project; *this = result * *this; } @@ -396,67 +300,67 @@ VMatrix VMatrix::operator*(const VMatrix &m) const if (thisType == MatrixType::None) return m; - VMatrix t(true); + VMatrix t; MatrixType type = vMax(thisType, otherType); switch(type) { case MatrixType::None: break; case MatrixType::Translate: - t.d->mtx = d->mtx + m.d->mtx; - t.d->mty += d->mty + m.d->mty; + t.mtx = mtx + m.mtx; + t.mty += mty + m.mty; break; case MatrixType::Scale: { - float m11 = d->m11*m.d->m11; - float m22 = d->m22*m.d->m22; + float m11v = m11*m.m11; + float m22v = m22*m.m22; - float m31 = d->mtx*m.d->m11 + m.d->mtx; - float m32 = d->mty*m.d->m22 + m.d->mty; + float m31v = mtx*m.m11 + m.mtx; + float m32v = mty*m.m22 + m.mty; - t.d->m11 = m11; - t.d->m22 = m22; - t.d->mtx = m31; t.d->mty = m32; + t.m11 = m11v; + t.m22 = m22v; + t.mtx = m31v; t.mty = m32v; break; } case MatrixType::Rotate: case MatrixType::Shear: { - float m11 = d->m11*m.d->m11 + d->m12*m.d->m21; - float m12 = d->m11*m.d->m12 + d->m12*m.d->m22; + float m11v = m11*m.m11 + m12*m.m21; + float m12v = m11*m.m12 + m12*m.m22; - float m21 = d->m21*m.d->m11 + d->m22*m.d->m21; - float m22 = d->m21*m.d->m12 + d->m22*m.d->m22; + float m21v = m21*m.m11 + m22*m.m21; + float m22v = m21*m.m12 + m22*m.m22; - float m31 = d->mtx*m.d->m11 + d->mty*m.d->m21 + m.d->mtx; - float m32 = d->mtx*m.d->m12 + d->mty*m.d->m22 + m.d->mty; + float m31v = mtx*m.m11 + mty*m.m21 + m.mtx; + float m32v = mtx*m.m12 + mty*m.m22 + m.mty; - t.d->m11 = m11; t.d->m12 = m12; - t.d->m21 = m21; t.d->m22 = m22; - t.d->mtx = m31; t.d->mty = m32; + t.m11 = m11v; t.m12 = m12v; + t.m21 = m21v; t.m22 = m22v; + t.mtx = m31v; t.mty = m32v; break; } case MatrixType::Project: { - float m11 = d->m11*m.d->m11 + d->m12*m.d->m21 + d->m13*m.d->mtx; - float m12 = d->m11*m.d->m12 + d->m12*m.d->m22 + d->m13*m.d->mty; - float m13 = d->m11*m.d->m13 + d->m12*m.d->m23 + d->m13*m.d->m33; + float m11v = m11*m.m11 + m12*m.m21 + m13*m.mtx; + float m12v = m11*m.m12 + m12*m.m22 + m13*m.mty; + float m13v = m11*m.m13 + m12*m.m23 + m13*m.m33; - float m21 = d->m21*m.d->m11 + d->m22*m.d->m21 + d->m23*m.d->mtx; - float m22 = d->m21*m.d->m12 + d->m22*m.d->m22 + d->m23*m.d->mty; - float m23 = d->m21*m.d->m13 + d->m22*m.d->m23 + d->m23*m.d->m33; + float m21v = m21*m.m11 + m22*m.m21 + m23*m.mtx; + float m22v = m21*m.m12 + m22*m.m22 + m23*m.mty; + float m23v = m21*m.m13 + m22*m.m23 + m23*m.m33; - float m31 = d->mtx*m.d->m11 + d->mty*m.d->m21 + d->m33*m.d->mtx; - float m32 = d->mtx*m.d->m12 + d->mty*m.d->m22 + d->m33*m.d->mty; - float m33 = d->mtx*m.d->m13 + d->mty*m.d->m23 + d->m33*m.d->m33; + float m31v = mtx*m.m11 + mty*m.m21 + m33*m.mtx; + float m32v = mtx*m.m12 + mty*m.m22 + m33*m.mty; + float m33v = mtx*m.m13 + mty*m.m23 + m33*m.m33; - t.d->m11 = m11; t.d->m12 = m12; t.d->m13 = m13; - t.d->m21 = m21; t.d->m22 = m22; t.d->m23 = m23; - t.d->mtx = m31; t.d->mty = m32; t.d->m33 = m33; + t.m11 = m11v; t.m12 = m12v; t.m13 = m13v; + t.m21 = m21v; t.m22 = m22v; t.m23 = m23v; + t.mtx = m31v; t.mty = m32v; t.m33 = m33v; } } - t.d->dirty = type; - t.d->type = type; + t.dirty = type; + t.mType = type; return t; } @@ -470,67 +374,67 @@ VMatrix & VMatrix::operator*=(const VMatrix &o) const MatrixType thisType = type(); if (thisType == MatrixType::None) return operator=(o); - detach(); + MatrixType t = vMax(thisType, otherType); switch(t) { case MatrixType::None: break; case MatrixType::Translate: - d->mtx += o.d->mtx; - d->mty += o.d->mty; + mtx += o.mtx; + mty += o.mty; break; case MatrixType::Scale: { - float m11 = d->m11*o.d->m11; - float m22 = d->m22*o.d->m22; + float m11v = m11*o.m11; + float m22v = m22*o.m22; - float m31 = d->mtx*o.d->m11 + o.d->mtx; - float m32 = d->mty*o.d->m22 + o.d->mty; + float m31v = mtx*o.m11 + o.mtx; + float m32v = mty*o.m22 + o.mty; - d->m11 = m11; - d->m22 = m22; - d->mtx = m31; d->mty = m32; + m11 = m11v; + m22 = m22v; + mtx = m31v; mty = m32v; break; } case MatrixType::Rotate: case MatrixType::Shear: { - float m11 = d->m11*o.d->m11 + d->m12*o.d->m21; - float m12 = d->m11*o.d->m12 + d->m12*o.d->m22; + float m11v = m11*o.m11 + m12*o.m21; + float m12v = m11*o.m12 + m12*o.m22; - float m21 = d->m21*o.d->m11 + d->m22*o.d->m21; - float m22 = d->m21*o.d->m12 + d->m22*o.d->m22; + float m21v = m21*o.m11 + m22*o.m21; + float m22v = m21*o.m12 + m22*o.m22; - float m31 = d->mtx*o.d->m11 + d->mty*o.d->m21 + o.d->mtx; - float m32 = d->mtx*o.d->m12 + d->mty*o.d->m22 + o.d->mty; + float m31v = mtx*o.m11 + mty*o.m21 + o.mtx; + float m32v = mtx*o.m12 + mty*o.m22 + o.mty; - d->m11 = m11; d->m12 = m12; - d->m21 = m21; d->m22 = m22; - d->mtx = m31; d->mty = m32; + m11 = m11v; m12 = m12v; + m21 = m21v; m22 = m22v; + mtx = m31v; mty = m32v; break; } case MatrixType::Project: { - float m11 = d->m11*o.d->m11 + d->m12*o.d->m21 + d->m13*o.d->mtx; - float m12 = d->m11*o.d->m12 + d->m12*o.d->m22 + d->m13*o.d->mty; - float m13 = d->m11*o.d->m13 + d->m12*o.d->m23 + d->m13*o.d->m33; + float m11v = m11*o.m11 + m12*o.m21 + m13*o.mtx; + float m12v = m11*o.m12 + m12*o.m22 + m13*o.mty; + float m13v = m11*o.m13 + m12*o.m23 + m13*o.m33; - float m21 = d->m21*o.d->m11 + d->m22*o.d->m21 + d->m23*o.d->mtx; - float m22 = d->m21*o.d->m12 + d->m22*o.d->m22 + d->m23*o.d->mty; - float m23 = d->m21*o.d->m13 + d->m22*o.d->m23 + d->m23*o.d->m33; + float m21v = m21*o.m11 + m22*o.m21 + m23*o.mtx; + float m22v = m21*o.m12 + m22*o.m22 + m23*o.mty; + float m23v = m21*o.m13 + m22*o.m23 + m23*o.m33; - float m31 = d->mtx*o.d->m11 + d->mty*o.d->m21 + d->m33*o.d->mtx; - float m32 = d->mtx*o.d->m12 + d->mty*o.d->m22 + d->m33*o.d->mty; - float m33 = d->mtx*o.d->m13 + d->mty*o.d->m23 + d->m33*o.d->m33; + float m31v = mtx*o.m11 + mty*o.m21 + m33*o.mtx; + float m32v = mtx*o.m12 + mty*o.m22 + m33*o.mty; + float m33v = mtx*o.m13 + mty*o.m23 + m33*o.m33; - d->m11 = m11; d->m12 = m12; d->m13 = m13; - d->m21 = m21; d->m22 = m22; d->m23 = m23; - d->mtx = m31; d->mty = m32; d->m33 = m33; + m11 = m11v; m12 = m12v; m13 = m13v; + m21 = m21v; m22 = m22v; m23 = m23v; + mtx = m31v; mty = m32v; m33 = m33v; } } - d->dirty = t; - d->type = t; + dirty = t; + mType = t; return *this; } @@ -540,41 +444,52 @@ VMatrix VMatrix::adjoint() const float h11, h12, h13, h21, h22, h23, h31, h32, h33; - h11 = d->m22*d->m33 - d->m23*d->mty; - h21 = d->m23*d->mtx - d->m21*d->m33; - h31 = d->m21*d->mty - d->m22*d->mtx; - h12 = d->m13*d->mty - d->m12*d->m33; - h22 = d->m11*d->m33 - d->m13*d->mtx; - h32 = d->m12*d->mtx - d->m11*d->mty; - h13 = d->m12*d->m23 - d->m13*d->m22; - h23 = d->m13*d->m21 - d->m11*d->m23; - h33 = d->m11*d->m22 - d->m12*d->m21; + h11 = m22*m33 - m23*mty; + h21 = m23*mtx - m21*m33; + h31 = m21*mty - m22*mtx; + h12 = m13*mty - m12*m33; + h22 = m11*m33 - m13*mtx; + h32 = m12*mtx - m11*mty; + h13 = m12*m23 - m13*m22; + h23 = m13*m21 - m11*m23; + h33 = m11*m22 - m12*m21; - return VMatrix(h11, h12, h13, - h21, h22, h23, - h31, h32, h33); + VMatrix res; + res.m11 = h11; + res.m12 = h12; + res.m13 = h13; + res.m21 = h21; + res.m22 = h22; + res.m23 = h23; + res.mtx = h31; + res.mty = h32; + res.m33 = h33; + res.mType = MatrixType::None; + res.dirty = MatrixType::Project; + + return res; } VMatrix VMatrix::inverted(bool *invertible) const { - VMatrix invert(true); + VMatrix invert; bool inv = true; switch(type()) { case MatrixType::None: break; case MatrixType::Translate: - invert.d->mtx = -d->mtx; - invert.d->mty = -d->mty; + invert.mtx = -mtx; + invert.mty = -mty; break; case MatrixType::Scale: - inv = !vIsZero(d->m11); - inv &= !vIsZero(d->m22); + inv = !vIsZero(m11); + inv &= !vIsZero(m22); if (inv) { - invert.d->m11 = 1. / d->m11; - invert.d->m22 = 1. / d->m22; - invert.d->mtx = -d->mtx * invert.d->m11; - invert.d->mty = -d->mty * invert.d->m22; + invert.m11 = 1. / m11; + invert.m22 = 1. / m22; + invert.mtx = -mtx * invert.m11; + invert.mty = -mty * invert.m22; } break; default: @@ -592,8 +507,8 @@ VMatrix VMatrix::inverted(bool *invertible) const if (inv) { // inverting doesn't change the type - invert.d->type = d->type; - invert.d->dirty = d->dirty; + invert.mType = mType; + invert.dirty = dirty; } return invert; @@ -601,17 +516,7 @@ VMatrix VMatrix::inverted(bool *invertible) const bool VMatrix::operator==(const VMatrix &o) const { - if (d == o.d) return true; - - return d->m11 == o.d->m11 && - d->m12 == o.d->m12 && - d->m13 == o.d->m13 && - d->m21 == o.d->m21 && - d->m22 == o.d->m22 && - d->m23 == o.d->m23 && - d->mtx == o.d->mtx && - d->mty == o.d->mty && - d->m33 == o.d->m33; + return fuzzyCompare(o); } bool VMatrix::operator!=(const VMatrix &o) const @@ -621,13 +526,12 @@ bool VMatrix::operator!=(const VMatrix &o) const bool VMatrix::fuzzyCompare(const VMatrix& o) const { - if (*this == o) return true; - return vCompare(d->m11 , o.d->m11 ) - && vCompare(d->m12 , o.d->m12) - && vCompare(d->m21 , o.d->m21) - && vCompare(d->m22 , o.d->m22) - && vCompare(d->mtx , o.d->mtx) - && vCompare(d->mty , o.d->mty); + return vCompare(m11 , o.m11 ) + && vCompare(m12 , o.m12) + && vCompare(m21 , o.m21) + && vCompare(m22 , o.m22) + && vCompare(mtx , o.mtx) + && vCompare(mty , o.mty); } #define V_NEAR_CLIP 0.000001 @@ -644,20 +548,20 @@ bool VMatrix::fuzzyCompare(const VMatrix& o) const ny = FY_; \ break; \ case MatrixType::Translate: \ - nx = FX_ + d->mtx; \ - ny = FY_ + d->mty; \ + nx = FX_ + mtx; \ + ny = FY_ + mty; \ break; \ case MatrixType::Scale: \ - nx = d->m11 * FX_ + d->mtx; \ - ny = d->m22 * FY_ + d->mty; \ + nx = m11 * FX_ + mtx; \ + ny = m22 * FY_ + mty; \ break; \ case MatrixType::Rotate: \ case MatrixType::Shear: \ case MatrixType::Project: \ - nx = d->m11 * FX_ + d->m21 * FY_ + d->mtx; \ - ny = d->m12 * FX_ + d->m22 * FY_ + d->mty; \ + nx = m11 * FX_ + m21 * FY_ + mtx; \ + ny = m12 * FX_ + m22 * FY_ + mty; \ if (t == MatrixType::Project) { \ - float w = ( d->m13 * FX_ + d->m23 * FY_ + d->m33); \ + float w = ( m13 * FX_ + m23 * FY_ + m33); \ if (w < V_NEAR_CLIP) w = V_NEAR_CLIP; \ w = 1./w; \ nx *= w; \ @@ -670,13 +574,13 @@ VRect VMatrix::map(const VRect &rect) const { VMatrix::MatrixType t = type(); if (t <= MatrixType::Translate) - return rect.translated(std::round(d->mtx), std::round(d->mty)); + return rect.translated(std::round(mtx), std::round(mty)); if (t <= MatrixType::Scale) { - int x = std::round(d->m11*rect.x() + d->mtx); - int y = std::round(d->m22*rect.y() + d->mty); - int w = std::round(d->m11*rect.width()); - int h = std::round(d->m22*rect.height()); + int x = std::round(m11*rect.x() + mtx); + int y = std::round(m22*rect.y() + mty); + int w = std::round(m11*rect.width()); + int h = std::round(m22*rect.height()); if (w < 0) { w = -w; x -= w; @@ -724,7 +628,7 @@ VRegion VMatrix::map(const VRegion &r) const if (t == MatrixType::Translate) { VRegion copy(r); - copy.translate(std::round(d->mtx), std::round(d->mty)); + copy.translate(std::round(mtx), std::round(mty)); return copy; } @@ -749,20 +653,20 @@ VPointF VMatrix::map(const VPointF &p) const y = fy; break; case MatrixType::Translate: - x = fx + d->mtx; - y = fy + d->mty; + x = fx + mtx; + y = fy + mty; break; case MatrixType::Scale: - x = d->m11 * fx + d->mtx; - y = d->m22 * fy + d->mty; + x = m11 * fx + mtx; + y = m22 * fy + mty; break; case MatrixType::Rotate: case MatrixType::Shear: case MatrixType::Project: - x = d->m11 * fx + d->m21 * fy + d->mtx; - y = d->m12 * fx + d->m22 * fy + d->mty; + x = m11 * fx + m21 * fy + mtx; + y = m12 * fx + m22 * fy + mty; if (t == MatrixType::Project) { - float w = 1./(d->m13 * fx + d->m23 * fy + d->m33); + float w = 1./(m13 * fx + m23 * fy + m33); x *= w; y *= w; } @@ -795,46 +699,9 @@ static std::string type_helper(VMatrix::MatrixType t) } std::ostream& operator<<(std::ostream& os, const VMatrix& o) { - os<<"[Matrix: [dptr = "<ref.count()<<"]"<<"type ="<m11<<" "<m12<<" "<m13<<" "<m21<<" "<m22<<" "<m23<<" "<mtx<<" "<mty<<" "<m33<<" "<<"]"<m11; -} -float VMatrix::m12()const -{ - return d->m12; -} -float VMatrix::m13()const -{ - return d->m13; -} -float VMatrix::m21()const -{ - return d->m21; -} -float VMatrix::m22()const -{ - return d->m22; -} -float VMatrix::m23()const -{ - return d->m23; -} -float VMatrix::m31()const -{ - return d->mtx; -} -float VMatrix::m32()const -{ - return d->mty; -} -float VMatrix::m33()const -{ - return d->m33; -} - V_END_NAMESPACE diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 10c632a3bd..3e46563774 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -24,13 +24,6 @@ public: Project = 0x10 }; - VMatrix(); - ~VMatrix(); - VMatrix(const VMatrix &matrix); - VMatrix(VMatrix &&other); - VMatrix &operator=(const VMatrix &); - VMatrix &operator=(VMatrix &&other); - bool isAffine() const; bool isIdentity() const; bool isInvertible() const; @@ -64,26 +57,13 @@ public: bool operator!=(const VMatrix &) const; bool fuzzyCompare(const VMatrix &) const; friend std::ostream& operator<<(std::ostream& os, const VMatrix& o); - - float m11()const; - float m12()const; - float m13()const; - float m21()const; - float m22()const; - float m23()const; - float m31()const; - float m32()const; - float m33()const; private: - explicit VMatrix(bool init); - explicit VMatrix(float m11, float m12, float m13, - float m21, float m22, float m23, - float m31, float m32, float m33); - VMatrix copy() const; - void detach(); - void cleanUp(VMatrixData *x); - - VMatrixData *d; + friend class VSpanData; + MatrixType mType{MatrixType::None}; + MatrixType dirty{MatrixType::None}; + float m11{1}, m12{0}, m13{0}; + float m21{0}, m22{1}, m23{0}; + float mtx{0}, mty{0}, m33{1}; }; inline VPointF VMatrix::map(float x, float y) const From 1c62266e43b45604ca3a0a29f7590ed36dd5adf9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 27 Jul 2018 11:09:13 +0900 Subject: [PATCH 079/672] lottie/render: Move drawable class to vector. Change-Id: I4cb296e7a1d86b5215ab191b4306514d3fcdeacf --- src/lottie/lottieitem.cpp | 261 +++++++++++++++----------------------- src/lottie/lottieitem.h | 40 +----- src/vector/CMakeLists.txt | 1 + src/vector/meson.build | 2 + src/vector/vdrawable.cpp | 46 +++++++ src/vector/vdrawable.h | 50 ++++++++ 6 files changed, 206 insertions(+), 194 deletions(-) create mode 100644 src/vector/vdrawable.cpp create mode 100644 src/vector/vdrawable.h diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index a6bcd2e636..c0a9869fde 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -5,158 +5,6 @@ #include"vdasher.h" #include -VDrawable::VDrawable():mFlag(DirtyState::All), - mType(Type::Fill), - mFillRule(FillRule::Winding) -{ - mStroke.dashArraySize = 0; - mStroke.cap = CapStyle::Round; - mStroke.join= JoinStyle::Round; - mStroke.meterLimit = 10; - mStroke.enable = false; -} - -void VDrawable::preprocess() -{ - if (mFlag & (DirtyState::Path)) { - if (mStroke.enable) { - VPath newPath = mPath; - if (mStroke.dashArraySize) { - VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); - newPath = dasher.dashed(mPath); - } - mRleTask = VRaster::instance().generateStrokeInfo(mPath, mStroke.cap, mStroke.join, - mStroke.width, mStroke.meterLimit); - } else { - mRleTask = VRaster::instance().generateFillInfo(mPath, mFillRule); - } - mFlag &= ~DirtyFlag(DirtyState::Path); - } -} - -VRle VDrawable::rle() -{ - if (mRleTask.valid()) { - mRle = std::move(mRleTask.get()); - } - return mRle; -} - -void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) -{ - mStroke.enable = true; - mStroke.cap = cap; - mStroke.join = join; - mStroke.meterLimit = meterLimit; - mStroke.width = strokeWidth; - mFlag |= DirtyState::Path; -} -void VDrawable::setDashInfo(float *array, int size) -{ - mStroke.dashArray = array; - mStroke.dashArraySize = size; - mFlag |= DirtyState::Path; -} - -void VDrawable::sync() -{ - mCNode.mFlag = ChangeFlagNone; - if (mFlag & DirtyState::None) return; - - if (mFlag & DirtyState::Path) { - const std::vector &elm = mPath.elements(); - const std::vector &pts = mPath.points(); - const float *ptPtr = reinterpret_cast(pts.data()); - const char *elmPtr = reinterpret_cast(elm.data()); - mCNode.mPath.elmPtr = elmPtr; - mCNode.mPath.elmCount = elm.size(); - mCNode.mPath.ptPtr = ptPtr; - mCNode.mPath.ptCount = 2 * pts.size(); - mCNode.mFlag |= ChangeFlagPath; - } - - if (mStroke.enable) { - mCNode.mStroke.width = mStroke.width; - mCNode.mStroke.meterLimit = mStroke.meterLimit; - mCNode.mStroke.enable = 1; - - switch (mFillRule) { - case FillRule::EvenOdd: - mCNode.mFillRule = LOTNode::EvenOdd; - break; - default: - mCNode.mFillRule = LOTNode::Winding; - break; - } - - switch (mStroke.cap) { - case CapStyle::Flat: - mCNode.mStroke.cap = LOTNode::FlatCap; - break; - case CapStyle::Square: - mCNode.mStroke.cap = LOTNode::SquareCap; - break; - case CapStyle::Round: - mCNode.mStroke.cap = LOTNode::RoundCap; - break; - default: - mCNode.mStroke.cap = LOTNode::FlatCap; - break; - } - - switch (mStroke.join) { - case JoinStyle::Miter: - mCNode.mStroke.join = LOTNode::MiterJoin; - break; - case JoinStyle::Bevel: - mCNode.mStroke.join = LOTNode::BevelJoin; - break; - case JoinStyle::Round: - mCNode.mStroke.join = LOTNode::RoundJoin; - break; - default: - mCNode.mStroke.join = LOTNode::MiterJoin; - break; - } - - mCNode.mStroke.dashArray = mStroke.dashArray; - mCNode.mStroke.dashArraySize = mStroke.dashArraySize; - - } else { - mCNode.mStroke.enable = 0; - } - - switch (mBrush.type()) { - case VBrush::Type::Solid: - mCNode.mType = LOTNode::BrushSolid; - mCNode.mColor.r = mBrush.mColor.r; - mCNode.mColor.g = mBrush.mColor.g; - mCNode.mColor.b = mBrush.mColor.b; - mCNode.mColor.a = mBrush.mColor.a; - break; - case VBrush::Type::LinearGradient: - mCNode.mType = LOTNode::BrushGradient; - mCNode.mGradient.type = LOTNode::Gradient::Linear; - mCNode.mGradient.start.x = mBrush.mGradient->linear.x1; - mCNode.mGradient.start.y = mBrush.mGradient->linear.y1; - mCNode.mGradient.end.x = mBrush.mGradient->linear.x2; - mCNode.mGradient.end.y = mBrush.mGradient->linear.y2; - break; - case VBrush::Type::RadialGradient: - mCNode.mType = LOTNode::BrushGradient; - mCNode.mGradient.type = LOTNode::Gradient::Radial; - mCNode.mGradient.center.x = mBrush.mGradient->radial.cx; - mCNode.mGradient.center.y = mBrush.mGradient->radial.cy; - mCNode.mGradient.focal.x = mBrush.mGradient->radial.fx; - mCNode.mGradient.focal.y = mBrush.mGradient->radial.fy; - mCNode.mGradient.cradius = mBrush.mGradient->radial.cradius; - mCNode.mGradient.fradius = mBrush.mGradient->radial.fradius; - break; - default: - break; - } -} - /* Lottie Layer Rules * 1. time stretch is pre calculated and applied to all the properties of the lottilayer model and all its children * 2. The frame property could be reversed using,time-reverse layer property in AE. which means (start frame > endFrame) @@ -276,8 +124,9 @@ void LOTCompItem::buildRenderList() mRenderList.clear(); for(auto i : mDrawableList) { - i->sync(); - mRenderList.push_back(&i->mCNode); + LOTDrawable *lotDrawable = static_cast(i); + lotDrawable->sync(); + mRenderList.push_back(&lotDrawable->mCNode); } } @@ -563,7 +412,7 @@ LOTSolidLayerItem::LOTSolidLayerItem(LOTLayerData *layerData):LOTLayerItem(layer void LOTSolidLayerItem::updateContent() { if (!mRenderNode) { - mRenderNode = std::make_unique(); + mRenderNode = std::make_unique(); mRenderNode->mType = VDrawable::Type::Fill; mRenderNode->mFlag |= VDrawable::DirtyState::All; } @@ -764,7 +613,7 @@ void LOTPathDataItem::addPaintOperation(std::vector &list, i { for(auto paintItem : list) { bool sameGroup = (externalCount-- > 0) ? false : true; - mNodeList.push_back(std::make_unique()); + mNodeList.push_back(std::make_unique()); mRenderList.push_back(LOTRenderNode(this, paintItem, mNodeList.back().get(), sameGroup)); } } @@ -1107,3 +956,103 @@ void LOTRepeaterItem::renderList(std::vector &list) } +void LOTDrawable::sync() +{ + mCNode.mFlag = ChangeFlagNone; + if (mFlag & DirtyState::None) return; + + if (mFlag & DirtyState::Path) { + const std::vector &elm = mPath.elements(); + const std::vector &pts = mPath.points(); + const float *ptPtr = reinterpret_cast(pts.data()); + const char *elmPtr = reinterpret_cast(elm.data()); + mCNode.mPath.elmPtr = elmPtr; + mCNode.mPath.elmCount = elm.size(); + mCNode.mPath.ptPtr = ptPtr; + mCNode.mPath.ptCount = 2 * pts.size(); + mCNode.mFlag |= ChangeFlagPath; + } + + if (mStroke.enable) { + mCNode.mStroke.width = mStroke.width; + mCNode.mStroke.meterLimit = mStroke.meterLimit; + mCNode.mStroke.enable = 1; + + switch (mFillRule) { + case FillRule::EvenOdd: + mCNode.mFillRule = LOTNode::EvenOdd; + break; + default: + mCNode.mFillRule = LOTNode::Winding; + break; + } + + switch (mStroke.cap) { + case CapStyle::Flat: + mCNode.mStroke.cap = LOTNode::FlatCap; + break; + case CapStyle::Square: + mCNode.mStroke.cap = LOTNode::SquareCap; + break; + case CapStyle::Round: + mCNode.mStroke.cap = LOTNode::RoundCap; + break; + default: + mCNode.mStroke.cap = LOTNode::FlatCap; + break; + } + + switch (mStroke.join) { + case JoinStyle::Miter: + mCNode.mStroke.join = LOTNode::MiterJoin; + break; + case JoinStyle::Bevel: + mCNode.mStroke.join = LOTNode::BevelJoin; + break; + case JoinStyle::Round: + mCNode.mStroke.join = LOTNode::RoundJoin; + break; + default: + mCNode.mStroke.join = LOTNode::MiterJoin; + break; + } + + mCNode.mStroke.dashArray = mStroke.dashArray; + mCNode.mStroke.dashArraySize = mStroke.dashArraySize; + + } else { + mCNode.mStroke.enable = 0; + } + + switch (mBrush.type()) { + case VBrush::Type::Solid: + mCNode.mType = LOTNode::BrushSolid; + mCNode.mColor.r = mBrush.mColor.r; + mCNode.mColor.g = mBrush.mColor.g; + mCNode.mColor.b = mBrush.mColor.b; + mCNode.mColor.a = mBrush.mColor.a; + break; + case VBrush::Type::LinearGradient: + mCNode.mType = LOTNode::BrushGradient; + mCNode.mGradient.type = LOTNode::Gradient::Linear; + mCNode.mGradient.start.x = mBrush.mGradient->linear.x1; + mCNode.mGradient.start.y = mBrush.mGradient->linear.y1; + mCNode.mGradient.end.x = mBrush.mGradient->linear.x2; + mCNode.mGradient.end.y = mBrush.mGradient->linear.y2; + break; + case VBrush::Type::RadialGradient: + mCNode.mType = LOTNode::BrushGradient; + mCNode.mGradient.type = LOTNode::Gradient::Radial; + mCNode.mGradient.center.x = mBrush.mGradient->radial.cx; + mCNode.mGradient.center.y = mBrush.mGradient->radial.cy; + mCNode.mGradient.focal.x = mBrush.mGradient->radial.fx; + mCNode.mGradient.focal.y = mBrush.mGradient->radial.fy; + mCNode.mGradient.cradius = mBrush.mGradient->radial.cradius; + mCNode.mGradient.fradius = mBrush.mGradient->radial.fradius; + break; + default: + break; + } +} + + diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 1ef9610e58..cb87ecc6f7 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -10,8 +10,8 @@ #include"vpoint.h" #include"vpathmesure.h" #include"lottieplayer.h" -#include"vbrush.h" #include"vpainter.h" +#include"vdrawable.h" V_USE_NAMESPACE @@ -156,47 +156,11 @@ public: VRle mRle; }; -class VDrawable +class LOTDrawable : public VDrawable { public: - enum class DirtyState { - None = 0x00000000, - Path = 0x00000001, - Stroke = 0x00000010, - Brush = 0x00000100, - All = (None | Path | Stroke | Brush) - }; - enum class Type { - Fill, - Stroke, - }; - typedef vFlag DirtyFlag; - VDrawable(); void sync(); - void setPath(const VPath &path); - void setFillRule(FillRule rule){mFillRule = rule;} - void setBrush(const VBrush &brush){mBrush = brush;} - void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); - void setDashInfo(float *array, int size); - void preprocess(); - VRle rle(); public: - DirtyFlag mFlag; - VDrawable::Type mType; - VBrush mBrush; - VPath mPath; - FillRule mFillRule; - std::future mRleTask; - VRle mRle; - struct { - bool enable; - float width; - CapStyle cap; - JoinStyle join; - float meterLimit; - float *dashArray; - int dashArraySize; - }mStroke; LOTNode mCNode; }; diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index e52b019f9a..98525e5ded 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -20,6 +20,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vinterpolator.cpp" "${CMAKE_CURRENT_LIST_DIR}/vbezier.cpp" "${CMAKE_CURRENT_LIST_DIR}/vraster.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vdrawable.cpp" ) target_include_directories(lottie-player diff --git a/src/vector/meson.build b/src/vector/meson.build index 761309ab00..d56d49c9a8 100644 --- a/src/vector/meson.build +++ b/src/vector/meson.build @@ -10,6 +10,8 @@ source_file += files('vpainter.cpp') source_file += files('vcompositionfunctions.cpp') source_file += files('vdrawhelper.cpp') source_file += files('vdrawhelper_sse2.cpp') +source_file += files('vdrawable.cpp') + source_file += files('vregion.cpp') source_file += files('vrle.cpp') diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp new file mode 100644 index 0000000000..5a13edc71a --- /dev/null +++ b/src/vector/vdrawable.cpp @@ -0,0 +1,46 @@ +#include "vdrawable.h" +#include"vdasher.h" +#include"vraster.h" + +void VDrawable::preprocess() +{ + if (mFlag & (DirtyState::Path)) { + if (mStroke.enable) { + VPath newPath = mPath; + if (mStroke.dashArraySize) { + VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); + newPath = dasher.dashed(mPath); + } + mRleTask = VRaster::instance().generateStrokeInfo(mPath, mStroke.cap, mStroke.join, + mStroke.width, mStroke.meterLimit); + } else { + mRleTask = VRaster::instance().generateFillInfo(mPath, mFillRule); + } + mFlag &= ~DirtyFlag(DirtyState::Path); + } +} + +VRle VDrawable::rle() +{ + if (mRleTask.valid()) { + mRle = std::move(mRleTask.get()); + } + return mRle; +} + +void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) +{ + mStroke.enable = true; + mStroke.cap = cap; + mStroke.join = join; + mStroke.meterLimit = meterLimit; + mStroke.width = strokeWidth; + mFlag |= DirtyState::Path; +} + +void VDrawable::setDashInfo(float *array, int size) +{ + mStroke.dashArray = array; + mStroke.dashArraySize = size; + mFlag |= DirtyState::Path; +} diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h new file mode 100644 index 0000000000..8e8b3ac487 --- /dev/null +++ b/src/vector/vdrawable.h @@ -0,0 +1,50 @@ +#ifndef VDRAWABLE_H +#define VDRAWABLE_H +#include "vbrush.h" +#include "vpath.h" +#include "vrle.h" +#include + +class VDrawable +{ +public: + enum class DirtyState { + None = 0x00000000, + Path = 0x00000001, + Stroke = 0x00000010, + Brush = 0x00000100, + All = (None | Path | Stroke | Brush) + }; + enum class Type { + Fill, + Stroke, + }; + typedef vFlag DirtyFlag; + VDrawable() = default; + void setPath(const VPath &path); + void setFillRule(FillRule rule){mFillRule = rule;} + void setBrush(const VBrush &brush){mBrush = brush;} + void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); + void setDashInfo(float *array, int size); + void preprocess(); + VRle rle(); +public: + DirtyFlag mFlag {DirtyState::All}; + VDrawable::Type mType {Type::Fill}; + VBrush mBrush; + VPath mPath; + FillRule mFillRule{FillRule::Winding}; + std::future mRleTask; + VRle mRle; + struct { + bool enable {false}; + float width {0.0}; + CapStyle cap {CapStyle::Flat}; + JoinStyle join {JoinStyle::Bevel}; + float meterLimit {10}; + float *dashArray {nullptr}; + int dashArraySize {0}; + }mStroke; +}; + +#endif // VDRAWABLE_H From 792cd0d5f59947fa146d605f46de0ac2eee3adef Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 27 Jul 2018 12:48:53 +0900 Subject: [PATCH 080/672] lttie/example: fixed layouting issue. Change-Id: Id6ac76f9e4161321252e32a7a4484f69d130c04f --- example/lottieviewtest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 180201db11..342d4d2ec5 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -31,7 +31,7 @@ public: int count = numberOfImage; int colums = (int) ceil(sqrt(count)); int offset = 3; - int vw = (mApp->width() - (2 * offset * colums))/colums; + int vw = (mApp->width() - (offset * colums))/colums; int vh = vw; int posx = offset; int posy = offset; From e62f74b624989c9dc7d42994e18ce324d56524ca Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 27 Jul 2018 14:42:02 +0900 Subject: [PATCH 081/672] lottie/render: Use AlignCenter rule when the composition dosen't scale exactly to the requested size. Change-Id: Ibd8aa929186104378287b65785afbc799cad0e04 --- src/lottie/lottieitem.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c0a9869fde..e516954175 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -92,16 +92,25 @@ VSize LOTCompItem::size() const bool LOTCompItem::update(int frameNo) { - VMatrix m; - float sx, sy; - // check if cached frame is same as requested frame. if (!mUpdateViewBox && (mCurFrameNo == frameNo)) return false; - sx = mViewSize.width() / float(mCompData->size().width()); - sy = mViewSize.height() / float(mCompData->size().height()); + /* + * if viewbox dosen't scale exactly to the viewport + * we scale the viewbox keeping AspectRatioPreserved and then align the + * viewbox to the viewport using AlignCenter rule. + */ + VSize viewPort = mViewSize; + VSize viewBox = mCompData->size(); + + float sx = float(viewPort.width()) / viewBox.width(); + float sy = float(viewPort.height()) / viewBox.height(); float scale = fmin(sx, sy); - m.scale(scale, scale); + float tx = (viewPort.width() - viewBox.width() * scale) * 0.5; + float ty = (viewPort.height() - viewBox.height() * scale) * 0.5; + + VMatrix m; + m.scale(scale, scale).translate(tx, ty); // update the layer from back to front for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { From 1570254a2e87c82b1c6ab7a3322878db4c95744f Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 27 Jul 2018 15:42:05 +0900 Subject: [PATCH 082/672] vector: fixed variable type from int to float Change-Id: I5ab0d6f14de6e1aa302cb6b4df1f61781dd3468b --- src/vector/vdasher.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 5b5c66d565..c2007880d1 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -24,7 +24,7 @@ private: VPointF mStartPt; VPointF mCurPt; int mCurrentDashIndex; - int mCurrentDashLength; + float mCurrentDashLength; bool mIsCurrentOperationGap; float mDashOffset; VPath mDashedPath; From 0255310b0888b18e2fd5e7b4ea86eae8420c4501 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 27 Jul 2018 16:30:46 +0900 Subject: [PATCH 083/672] lottie/render: Disable buggy sse2 implementation till it fixed. Change-Id: Iffc2006afc1bb29a65944a6da23fa308ce0b5955 --- src/vector/vdrawhelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 05319b3b0f..69b13b2ef3 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -680,7 +680,7 @@ void vInitDrawhelperFunctions() COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = comp_func_solid_SourceOver_sse2; COMP_functionForMode_C[VPainter::CompModeSrc] = comp_func_Source_sse2; - COMP_functionForMode_C[VPainter::CompModeSrcOver] = comp_func_SourceOver_sse2; + //COMP_functionForMode_C[VPainter::CompModeSrcOver] = comp_func_SourceOver_sse2; #endif } From 86d179f9b14a30e755d5234a7cf13c4115da6ba7 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 27 Jul 2018 17:04:49 +0900 Subject: [PATCH 084/672] vector: add length() function in vpath Change-Id: I94e2a3d7a1441f250ca722f53de018efce191c74 --- src/vector/vpath.cpp | 35 +++++++++++++++++++++++++++++++++++ src/vector/vpath.h | 8 ++++++++ 2 files changed, 43 insertions(+) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index cfe64eea55..1724f8fbba 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -26,6 +26,41 @@ void VPath::VPathData::transform(const VMatrix &m) } } +float VPath::VPathData::length() const +{ + float len = 0.0; + int i = 0; + for (auto e : m_elements) { + switch (e) { + case VPath::Element::MoveTo: + i++; + break; + case VPath::Element::LineTo: + { + VPointF p0 = m_points[i - 1]; + VPointF p = m_points[i++]; + VBezier b = VBezier::fromPoints(p0, p0, p, p); + len += b.length(); + break; + } + case VPath::Element::CubicTo: + { + VPointF p0 = m_points[i - 1]; + VPointF p = m_points[i++]; + VPointF p1 = m_points[i++]; + VPointF p2 = m_points[i++]; + VBezier b = VBezier::fromPoints(p0, p, p1, p2); + len += b.length(); + break; + } + case VPath::Element::Close: + break; + } + } + + return len; +} + void VPath::VPathData::checkNewSegment() { if (mNewSegment) { diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 14a29bdee6..2782861713 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -45,6 +45,7 @@ public: void addPolygon(float points, float radius, float roundness, float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); void transform(const VMatrix &m); + float length() const; const std::vector &elements() const; const std::vector &points() const; private: @@ -61,6 +62,7 @@ private: void checkNewSegment(); int segments() const; void transform(const VMatrix &m); + float length() const; void addRoundRect(const VRectF &, float, float, VPath::Direction); void addRect(const VRectF &, VPath::Direction); void arcTo(const VRectF&, float, float, bool); @@ -118,6 +120,12 @@ inline int VPath::segments() const return d->segments(); } +inline float VPath::length() const +{ + //TODO re-calculate when there is a change + return d->length(); +} + inline void VPath::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) { d.write().cubicTo(c1, c2, e); From c607e87f97223a3daa1839cf568ece7afe30a8eb Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 27 Jul 2018 17:42:16 +0900 Subject: [PATCH 085/672] lottie/vector: clean up vpathmesure and use vdasher in it Change-Id: Id5367613f89487f4a764010ef155d19f78e2372a --- src/lottie/lottieitem.cpp | 11 +- src/vector/vpathmesure.cpp | 363 ++----------------------------------- src/vector/vpathmesure.h | 20 +- 3 files changed, 22 insertions(+), 372 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index e516954175..db50b49bfb 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -680,14 +680,11 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float par { //TODO apply more than one trim path if necessary VPathMesure pm; - float s = mTrimNodeRefs.front()->getStart(frameNo); - float e = mTrimNodeRefs.front()->getEnd(frameNo); - - pm.setPath(mLocalPath); - pm.setStart(s); - pm.setEnd(e); - tempPath = pm.getPath(); + float s = mTrimNodeRefs.front()->getStart(frameNo) / 100.0f; + float e = mTrimNodeRefs.front()->getEnd(frameNo) / 100.0f; + pm.setOffset(s, e); + tempPath = pm.trim(tempPath); mPathChanged = true; } diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index b3f79c7843..69f27882a3 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,364 +1,29 @@ #include"vpathmesure.h" #include"vbezier.h" +#include"vdasher.h" V_BEGIN_NAMESPACE -struct VPathMesureData +void VPathMesure::setOffset(float sp, float ep) { - VPathMesureData():ref(-1){} - void setPath(const VPath &path) { mPath = path; } - VPath& getPath() { return mPath; } - VPath mPath; - RefCount ref; -}; - -static const struct VPathMesureData shared_empty; - -inline void VPathMesure::cleanUp(VPathMesureData *d) -{ - delete d; + startOffset = sp; + endOffset = ep; } -void VPathMesure::detach() +VPath VPathMesure::trim(const VPath &path) { - if (d->ref.isShared()) - *this = copy(); -} + if (vCompare(startOffset, 0.0f) && (vCompare(endOffset, 1.0f))) return path; -VPathMesure VPathMesure::copy() const -{ - VPathMesure other; + float len = path.length(); + float len1 = len; + float sg = len * startOffset; + float eg = len * (1.0f - endOffset); + len = len - (sg + eg); - other.d = new VPathMesureData; - other.d->mPath = d->mPath; - other.d->ref.setOwned(); - return other; -} + float array[5] = { 0.0f, sg, len, 1000, 0.0f }; + VDasher dasher(array, 5); -VPathMesure::~VPathMesure() -{ - if (!d->ref.deref()) - cleanUp(d); -} - -VPathMesure::VPathMesure() - : d(const_cast(&shared_empty)) -{ -} - -VPathMesure::VPathMesure(const VPathMesure &other) -{ - d = other.d; - d->ref.ref(); -} - -VPathMesure::VPathMesure(VPathMesure &&other): d(other.d) -{ - other.d = const_cast(&shared_empty); -} - -VPathMesure &VPathMesure::operator=(const VPathMesure &other) -{ - other.d->ref.ref(); - if (!d->ref.deref()) - cleanUp(d); - - d = other.d; - return *this; -} - -inline VPathMesure &VPathMesure::operator=(VPathMesure &&other) -{ - if (!d->ref.deref()) - cleanUp(d); - d = other.d; - other.d = const_cast(&shared_empty); - return *this; -} - -void VPathMesure::setStart(float pos) -{ - detach(); - VPath &path = d->getPath(); - const std::vector &elm = path.elements(); - const std::vector &pts = path.points(); - std::vector len; - - std::vector elm_copy; - - int i = 0, idx = 0; - float totlen = 0.0; - float startlen = 0.0; - bool cut = false; - - for (auto e : elm) { - elm_copy.push_back(e); - switch(e) { - case VPath::Element::MoveTo: - i++; - break; - case VPath::Element::LineTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - - VBezier b = VBezier::fromPoints(p0, p0, p, p); - totlen += b.length(); - len.push_back(b.length()); - break; - } - case VPath::Element::CubicTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - VPointF p1 = pts[i++]; - VPointF p2 = pts[i++]; - - VBezier b = VBezier::fromPoints(p0, p, p1, p2); - totlen += b.length(); - len.push_back(b.length()); - - break; - } - case VPath::Element::Close: - break; - } - } - - startlen = totlen * (pos / 100); - i = 0; - path.reset(); - - for (auto e : elm_copy) { - switch(e) { - case VPath::Element::MoveTo: - { - VPointF p = pts[i++]; - path.moveTo(p.x(), p.y()); - break; - } - case VPath::Element::LineTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - - if (!cut) - { - if (len.at(idx) < startlen) - { - startlen -= len.at(idx); - } - else if (len.at(idx) == startlen) - { - path.moveTo(p.x(), p.y()); - cut = true; - } - else - { - VBezier b, bleft; - float ratio = (startlen/len.at(idx)); - b = VBezier::fromPoints(p0, p0, p, p); - b.parameterSplitLeft(ratio, &bleft); - - path.moveTo(b.pt1().x(), b.pt1().y()); - path.lineTo(b.pt4().x(), b.pt4().y()); - cut = true; - } - idx++; - } - else - { - path.lineTo(p.x(), p.y()); - } - break; - } - case VPath::Element::CubicTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - VPointF p1 = pts[i++]; - VPointF p2 = pts[i++]; - - if (!cut) - { - if (len.at(idx) < startlen) - { - startlen -= len.at(idx); - } - else if (len.at(idx) == startlen) - { - path.moveTo(p2.x(), p2.y()); - cut = true; - } - else - { - VBezier b, bleft; - float ratio = (startlen/len.at(idx)); - b = VBezier::fromPoints(p0, p, p1, p2); - b.parameterSplitLeft(ratio, &bleft); - - path.moveTo(b.pt1().x(), b.pt1().y()); - path.cubicTo(b.pt2().x(), b.pt2().y(), - b.pt3().x(), b.pt3().y(), - b.pt4().x(), b.pt4().y()); - cut = true; - } - idx++; - } - else - { - path.cubicTo(p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); - } - break; - } - case VPath::Element::Close: - break; - } - } -} - -void VPathMesure::setEnd(float pos) -{ - detach(); - VPath &path = d->getPath(); - const std::vector &elm = path.elements(); - const std::vector &pts = path.points(); - std::vector len; - - std::vector elm_copy; - - int i = 0, idx = 0; - float totlen = 0.0; - float endlen = 0.0; - bool cut = false; - - for (auto e : elm) { - elm_copy.push_back(e); - switch(e) { - case VPath::Element::MoveTo: - i++; - break; - case VPath::Element::LineTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - - VBezier b = VBezier::fromPoints(p0, p0, p, p); - totlen += b.length(); - len.push_back(b.length()); - break; - } - case VPath::Element::CubicTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - VPointF p1 = pts[i++]; - VPointF p2 = pts[i++]; - - VBezier b = VBezier::fromPoints(p0, p, p1, p2); - totlen += b.length(); - len.push_back(b.length()); - - break; - } - case VPath::Element::Close: - break; - } - } - - endlen = totlen * (pos / 100); - i = 0; - path.reset(); - - for (auto e : elm_copy) { - switch(e) { - case VPath::Element::MoveTo: - { - VPointF p = pts[i++]; - path.moveTo(p.x(), p.y()); - break; - } - case VPath::Element::LineTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - - if (!cut) - { - if (len.at(idx) < endlen) - { - path.lineTo(p.x(), p.y()); - endlen -= len.at(idx); - } - else if (len.at(idx) == endlen) - { - path.lineTo(p.x(), p.y()); - cut = true; - } - else - { - VBezier b, bleft; - float ratio = (endlen/len.at(idx)); - b = VBezier::fromPoints(p0, p0, p, p); - b.parameterSplitLeft(ratio, &bleft); - - path.lineTo(bleft.pt4().x(), bleft.pt4().y()); - cut = true; - } - idx++; - } - break; - } - case VPath::Element::CubicTo: - { - VPointF p0 = pts[i - 1]; - VPointF p = pts[i++]; - VPointF p1 = pts[i++]; - VPointF p2 = pts[i++]; - - if (!cut) - { - if (len.at(idx) < endlen) - { - path.cubicTo(p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); - endlen -= len.at(idx); - } - else if (len.at(idx) == endlen) - { - path.cubicTo(p.x(), p.y(), p1.x(), p1.y(), p2.x(), p2.y()); - cut = true; - } - else - { - VBezier b, bleft; - float ratio = (endlen/len.at(idx)); - b = VBezier::fromPoints(p0, p, p1, p2); - b.parameterSplitLeft(ratio, &bleft); - - path.cubicTo(bleft.pt2().x(), bleft.pt2().y(), - bleft.pt3().x(), bleft.pt3().y(), - bleft.pt4().x(), bleft.pt4().y()); - cut = true; - } - idx++; - } - break; - } - case VPath::Element::Close: - break; - } - } -} - -void VPathMesure::setPath(const VPath &path) -{ - detach(); - d->setPath(path); -} - -VPath VPathMesure::getPath() -{ - return d->getPath(); + return dasher.dashed(path); } V_END_NAMESPACE diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index e95c966e73..6e507c838d 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -5,26 +5,14 @@ V_BEGIN_NAMESPACE -class VPathMesureData; class VPathMesure { public: - ~VPathMesure(); - VPathMesure(); - VPathMesure(const VPathMesure &other); - VPathMesure(VPathMesure &&other); - VPathMesure &operator=(const VPathMesure &); - VPathMesure &operator=(VPathMesure &&other); - int getLength() const; - void setPath(const VPath &path); - VPath getPath(); - void setStart(float pos); - void setEnd(float pos); + void setOffset(float sp, float ep); + VPath trim(const VPath &path); private: - VPathMesure copy() const; - void detach(); - void cleanUp(VPathMesureData *x); - VPathMesureData *d; + float startOffset { 0.0f }; + float endOffset { 1.0f }; }; V_END_NAMESPACE From edb4dd17a1776d050ef956e2f092f2229601057d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 27 Jul 2018 18:50:42 +0900 Subject: [PATCH 086/672] lottie/render: fixed regression in dash rendering. Change-Id: I3f4a4aa5d990b9386ddf2ceddc141c2ac83cda76 --- src/vector/vdrawable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 5a13edc71a..fdeebe87dc 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -11,7 +11,7 @@ void VDrawable::preprocess() VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); newPath = dasher.dashed(mPath); } - mRleTask = VRaster::instance().generateStrokeInfo(mPath, mStroke.cap, mStroke.join, + mRleTask = VRaster::instance().generateStrokeInfo(newPath, mStroke.cap, mStroke.join, mStroke.width, mStroke.meterLimit); } else { mRleTask = VRaster::instance().generateFillInfo(mPath, mFillRule); From a5223736af315a23324656760b5c6a87b0eb60e8 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 28 Jul 2018 17:02:37 +0900 Subject: [PATCH 087/672] lottie/render: fixed std::move copy elision warning Change-Id: I0eee41225dbc19ee958b7d747d2536532efb3445 --- src/lottie/lottieitem.cpp | 2 +- src/lottie/lottieplayer.cpp | 4 ++-- src/vector/vdrawable.cpp | 2 +- src/vector/vraster.cpp | 8 ++++---- src/vector/vtaskqueue.h | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index db50b49bfb..cc5c02ea6a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -188,7 +188,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, VRle LOTMaskItem::rle() { if (mRleTask.valid()) { - mRle = std::move(mRleTask.get()); + mRle = mRleTask.get(); if (!vCompare(mCombinedAlpha, 1.0f)) mRle = mRle * (mCombinedAlpha * 255); if (mData->mInv) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index e33613991d..f2264be686 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -195,12 +195,12 @@ public: auto i = _index++; for (unsigned n = 0; n != _count; ++n) { - if (_q[(i + n) % _count].try_push(task)) return std::move(receiver); + if (_q[(i + n) % _count].try_push(task)) return receiver; } _q[i % _count].push(task); - return std::move(receiver); + return receiver; } std::future render(LOTPlayerPrivate *impl, diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index fdeebe87dc..f057c1f4ab 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -23,7 +23,7 @@ void VDrawable::preprocess() VRle VDrawable::rle() { if (mRleTask.valid()) { - mRle = std::move(mRleTask.get()); + mRle = mRleTask.get(); } return mRle; } diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index e896932b85..3c17908998 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -357,12 +357,12 @@ public: auto i = _index++; for (unsigned n = 0; n != _count; ++n) { - if (_q[(i + n) % _count].try_push(task)) return std::move(receiver); + if (_q[(i + n) % _count].try_push(task)) return receiver; } _q[i % _count].push(task); - return std::move(receiver); + return receiver; } std::future strokeRle(const VPath &path, @@ -407,7 +407,7 @@ VRaster::generateFillInfo(const VPath &path, FillRule fillRule) promise.set_value(VRle()); return promise.get_future(); } - return std::move(raster_scheduler.fillRle(path, fillRule)); + return raster_scheduler.fillRle(path, fillRule); } std::future @@ -419,7 +419,7 @@ VRaster::generateStrokeInfo(const VPath &path, CapStyle cap, JoinStyle join, promise.set_value(VRle()); return promise.get_future(); } - return std::move(raster_scheduler.strokeRle(path, cap, join, width, meterLimit)); + return raster_scheduler.strokeRle(path, cap, join, width, meterLimit); } V_END_NAMESPACE diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h index 5318f0edd2..66bb6931fe 100644 --- a/src/vector/vtaskqueue.h +++ b/src/vector/vtaskqueue.h @@ -15,7 +15,7 @@ public: bool try_pop(Task *&task) { lock_t lock{_mutex, std::try_to_lock}; if (!lock || _q.empty()) return false; - task = std::move(_q.front()); + task = _q.front(); _q.pop_front(); return true; } @@ -43,7 +43,7 @@ public: while (_q.empty() && !_done) _ready.wait(lock); if (_q.empty()) return false; - task = std::move(_q.front()); + task = _q.front(); _q.pop_front(); return true; } From e6bce26b6e30bcda5ebe65624d0f9f8a58c4625f Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 28 Jul 2018 17:08:32 +0900 Subject: [PATCH 088/672] lottie: fix some more warning. Change-Id: I0b1fe8773ec1f795e7df603a35a02687697f3e00 --- src/vector/vbitmap.cpp | 2 ++ src/vector/vmatrix.h | 2 +- src/vector/vpathmesure.cpp | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index c4a0190c91..f92c9ca42a 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -205,6 +205,8 @@ VBitmap VBitmap::copy(const VRect& r) const } } //TODO implement properly. + return image; + } int VBitmap::stride() const diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 3e46563774..4c3be7c0d4 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -58,7 +58,7 @@ public: bool fuzzyCompare(const VMatrix &) const; friend std::ostream& operator<<(std::ostream& os, const VMatrix& o); private: - friend class VSpanData; + friend struct VSpanData; MatrixType mType{MatrixType::None}; MatrixType dirty{MatrixType::None}; float m11{1}, m12{0}, m13{0}; diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 69f27882a3..835f0f875f 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -15,7 +15,6 @@ VPath VPathMesure::trim(const VPath &path) if (vCompare(startOffset, 0.0f) && (vCompare(endOffset, 1.0f))) return path; float len = path.length(); - float len1 = len; float sg = len * startOffset; float eg = len * (1.0f - endOffset); len = len - (sg + eg); From 61bb4fba3e80a317bf8025176c9f4c8e232e2d5a Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 28 Jul 2018 17:29:58 +0900 Subject: [PATCH 089/672] lottie/vector: Remove the hack with mutable data member. NOTE: if you need to modify the object in a const member function make the data as mutable. Change-Id: I28b2cc18d75433475f75b048af878297747980db --- src/vector/vmatrix.cpp | 18 ++++++++---------- src/vector/vmatrix.h | 4 ++-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 412877d99f..688b27342f 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -80,11 +80,10 @@ VMatrix::MatrixType VMatrix::type() const if(dirty == MatrixType::None || dirty < mType) return mType; - VMatrix::MatrixType newType; switch (dirty) { case MatrixType::Project: if (!vIsZero(m13) || !vIsZero(m23) || !vIsZero(m33 - 1)) { - newType = MatrixType::Project; + mType = MatrixType::Project; break; } case MatrixType::Shear: @@ -92,29 +91,28 @@ VMatrix::MatrixType VMatrix::type() const if (!vIsZero(m12) || !vIsZero(m21)) { const float dot = m11 * m12 + m21 * m22; if (vIsZero(dot)) - newType = MatrixType::Rotate; + mType = MatrixType::Rotate; else - newType = MatrixType::Shear; + mType = MatrixType::Shear; break; } case MatrixType::Scale: if (!vIsZero(m11 - 1) || !vIsZero(m22 - 1)) { - newType = MatrixType::Scale; + mType = MatrixType::Scale; break; } case MatrixType::Translate: if (!vIsZero(mtx) || !vIsZero(mty)) { - newType = MatrixType::Translate; + mType = MatrixType::Translate; break; } case MatrixType::None: - newType = MatrixType::None; + mType = MatrixType::None; break; } - const_cast(this)->dirty = MatrixType::None; - const_cast(this)->mType = newType; - return newType; + dirty = MatrixType::None; + return mType; } diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 4c3be7c0d4..20e5e980e2 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -59,8 +59,8 @@ public: friend std::ostream& operator<<(std::ostream& os, const VMatrix& o); private: friend struct VSpanData; - MatrixType mType{MatrixType::None}; - MatrixType dirty{MatrixType::None}; + mutable MatrixType mType{MatrixType::None}; + mutable MatrixType dirty{MatrixType::None}; float m11{1}, m12{0}, m13{0}; float m21{0}, m22{1}, m23{0}; float mtx{0}, mty{0}, m33{1}; From 99e3caa0d26c34b24c261df58d3a5af2cd3a4c1d Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 28 Jul 2018 20:34:54 +0900 Subject: [PATCH 090/672] lottie/render: ported sse2 srcOver composition from pixman. Change-Id: I8d38caf4190a97a8575c5cecd9847fc37f4ef256 --- src/vector/vdrawhelper_sse2.cpp | 261 +++++++++++++++++++++++++++++++- 1 file changed, 260 insertions(+), 1 deletion(-) diff --git a/src/vector/vdrawhelper_sse2.cpp b/src/vector/vdrawhelper_sse2.cpp index 18b4acf88f..fe7f5da0a3 100644 --- a/src/vector/vdrawhelper_sse2.cpp +++ b/src/vector/vdrawhelper_sse2.cpp @@ -258,7 +258,7 @@ void comp_func_Source_sse2(uint32_t *dest, const uint32_t *src, int length, uint } } -void comp_func_SourceOver_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +void comp_func_SourceOver_sse2_1(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) { uint32_t s, sia; @@ -295,5 +295,264 @@ void comp_func_SourceOver_sse2(uint32_t *dest, const uint32_t *src, int length, } } +// Pixman implementation +#define force_inline inline + +static force_inline __m128i +unpack_32_1x128 (uint32_t data) +{ + return _mm_unpacklo_epi8 (_mm_cvtsi32_si128 (data), _mm_setzero_si128 ()); +} + +static force_inline void +unpack_128_2x128 (__m128i data, __m128i* data_lo, __m128i* data_hi) +{ + *data_lo = _mm_unpacklo_epi8 (data, _mm_setzero_si128 ()); + *data_hi = _mm_unpackhi_epi8 (data, _mm_setzero_si128 ()); +} + +static force_inline uint32_t +pack_1x128_32 (__m128i data) +{ + return _mm_cvtsi128_si32 (_mm_packus_epi16 (data, _mm_setzero_si128 ())); +} + +static force_inline __m128i +pack_2x128_128 (__m128i lo, __m128i hi) +{ + return _mm_packus_epi16 (lo, hi); +} + +/* load 4 pixels from a 16-byte boundary aligned address */ +static force_inline __m128i +load_128_aligned (__m128i* src) +{ + return _mm_load_si128 (src); +} + +/* load 4 pixels from a unaligned address */ +static force_inline __m128i +load_128_unaligned (const __m128i* src) +{ + return _mm_loadu_si128 (src); +} + +/* save 4 pixels on a 16-byte boundary aligned address */ +static force_inline void +save_128_aligned (__m128i* dst, + __m128i data) +{ + _mm_store_si128 (dst, data); +} + +static force_inline int +is_opaque (__m128i x) +{ + __m128i ffs = _mm_cmpeq_epi8 (x, x); + + return (_mm_movemask_epi8 (_mm_cmpeq_epi8 (x, ffs)) & 0x8888) == 0x8888; +} + +static force_inline int +is_zero (__m128i x) +{ + return _mm_movemask_epi8 ( + _mm_cmpeq_epi8 (x, _mm_setzero_si128 ())) == 0xffff; +} + +static force_inline __m128i +expand_alpha_1x128 (__m128i data) +{ + return _mm_shufflehi_epi16 (_mm_shufflelo_epi16 (data, + _MM_SHUFFLE (3, 3, 3, 3)), + _MM_SHUFFLE (3, 3, 3, 3)); +} + +static force_inline __m128i +create_mask_16_128 (uint16_t mask) +{ + return _mm_set1_epi16 (mask); +} + +static __m128i mask_0080 = create_mask_16_128 (0x0080); +static __m128i mask_00ff = create_mask_16_128 (0x00ff); +static __m128i mask_0101 = create_mask_16_128 (0x0101); + +static force_inline __m128i +negate_1x128 (__m128i data) +{ + return _mm_xor_si128 (data, mask_00ff); +} + +static force_inline void +negate_2x128 (__m128i data_lo, + __m128i data_hi, + __m128i* neg_lo, + __m128i* neg_hi) +{ + *neg_lo = _mm_xor_si128 (data_lo, mask_00ff); + *neg_hi = _mm_xor_si128 (data_hi, mask_00ff); +} + +static force_inline __m128i +pix_multiply_1x128 (__m128i data, + __m128i alpha) +{ + return _mm_mulhi_epu16 (_mm_adds_epu16 (_mm_mullo_epi16 (data, alpha), + mask_0080), + mask_0101); +} + +static force_inline void +pix_multiply_2x128 (__m128i* data_lo, + __m128i* data_hi, + __m128i* alpha_lo, + __m128i* alpha_hi, + __m128i* ret_lo, + __m128i* ret_hi) +{ + __m128i lo, hi; + + lo = _mm_mullo_epi16 (*data_lo, *alpha_lo); + hi = _mm_mullo_epi16 (*data_hi, *alpha_hi); + lo = _mm_adds_epu16 (lo, mask_0080); + hi = _mm_adds_epu16 (hi, mask_0080); + *ret_lo = _mm_mulhi_epu16 (lo, mask_0101); + *ret_hi = _mm_mulhi_epu16 (hi, mask_0101); +} + +static force_inline __m128i +over_1x128 (__m128i src, __m128i alpha, __m128i dst) +{ + return _mm_adds_epu8 (src, pix_multiply_1x128 (dst, negate_1x128 (alpha))); +} + +static force_inline void +expand_alpha_2x128 (__m128i data_lo, + __m128i data_hi, + __m128i* alpha_lo, + __m128i* alpha_hi) +{ + __m128i lo, hi; + + lo = _mm_shufflelo_epi16 (data_lo, _MM_SHUFFLE (3, 3, 3, 3)); + hi = _mm_shufflelo_epi16 (data_hi, _MM_SHUFFLE (3, 3, 3, 3)); + + *alpha_lo = _mm_shufflehi_epi16 (lo, _MM_SHUFFLE (3, 3, 3, 3)); + *alpha_hi = _mm_shufflehi_epi16 (hi, _MM_SHUFFLE (3, 3, 3, 3)); +} + +static force_inline void +over_2x128 (__m128i* src_lo, + __m128i* src_hi, + __m128i* alpha_lo, + __m128i* alpha_hi, + __m128i* dst_lo, + __m128i* dst_hi) +{ + __m128i t1, t2; + + negate_2x128 (*alpha_lo, *alpha_hi, &t1, &t2); + + pix_multiply_2x128 (dst_lo, dst_hi, &t1, &t2, dst_lo, dst_hi); + + *dst_lo = _mm_adds_epu8 (*src_lo, *dst_lo); + *dst_hi = _mm_adds_epu8 (*src_hi, *dst_hi); +} + +static force_inline uint32_t +core_combine_over_u_pixel_sse2 (uint32_t src, uint32_t dst) +{ + uint8_t a; + __m128i xmms; + + a = src >> 24; + + if (a == 0xff) + { + return src; + } + else if (src) + { + xmms = unpack_32_1x128 (src); + return pack_1x128_32 ( + over_1x128 (xmms, expand_alpha_1x128 (xmms), + unpack_32_1x128 (dst))); + } + + return dst; +} + +//static force_inline void +//core_combine_over_u_sse2_no_mask (uint32_t * pd, +// const uint32_t* ps, +// int w) +void comp_func_SourceOver_sse2(uint32_t *pd, const uint32_t *ps, int w, uint32_t) +{ + uint32_t s, d; + + /* Align dst on a 16-byte boundary */ + while (w && ((uintptr_t)pd & 15)) + { + d = *pd; + s = *ps; + + if (s) + *pd = core_combine_over_u_pixel_sse2 (s, d); + pd++; + ps++; + w--; + } + + while (w >= 4) + { + __m128i src; + __m128i src_hi, src_lo, dst_hi, dst_lo; + __m128i alpha_hi, alpha_lo; + + src = load_128_unaligned ((__m128i *)ps); + + if (!is_zero (src)) + { + if (is_opaque (src)) + { + save_128_aligned ((__m128i *)pd, src); + } + else + { + __m128i dst = load_128_aligned ((__m128i *)pd); + + unpack_128_2x128 (src, &src_lo, &src_hi); + unpack_128_2x128 (dst, &dst_lo, &dst_hi); + + expand_alpha_2x128 (src_lo, src_hi, + &alpha_lo, &alpha_hi); + over_2x128 (&src_lo, &src_hi, &alpha_lo, &alpha_hi, + &dst_lo, &dst_hi); + + save_128_aligned ( + (__m128i *)pd, + pack_2x128_128 (dst_lo, dst_hi)); + } + } + + ps += 4; + pd += 4; + w -= 4; + } + while (w) + { + d = *pd; + s = *ps; + + if (s) + *pd = core_combine_over_u_pixel_sse2 (s, d); + pd++; + ps++; + + w--; + } +} + #endif From 6b363ae02126654c793300a1e45a91b6d44a5191 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sun, 29 Jul 2018 17:51:17 +0900 Subject: [PATCH 091/672] lottie/model: refactor Keyframe class for space optimization. Change-Id: I5b5a614ef69ab430459003764e7707ace4575ebd --- src/lottie/lottiemodel.h | 159 +++++++++++++----------------------- src/lottie/lottieparser.cpp | 50 ++++++++---- 2 files changed, 93 insertions(+), 116 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 93bcf4bcb9..d20d5540fc 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -132,119 +132,74 @@ public: }; + +template +inline T lerp(const T& start, const T& end, float t) +{ + return start + t * (end - start); +} + +inline LottieShapeData lerp(const LottieShapeData& start, const LottieShapeData& end, float t) +{ + if (start.mPoints.size() != start.mPoints.size()) + return LottieShapeData(); + + LottieShapeData result; + result.reserve(start.mPoints.size()); + for (unsigned int i = 0 ; i < start.mPoints.size(); i++) { + result.mPoints.push_back(start.mPoints[i] + t * (end.mPoints[i] - start.mPoints[i])); + } + return result; +} + +template +struct LOTKeyFrameValue +{ + T mStartValue; + T mEndValue; + T value(float t) const { + return lerp(mStartValue, mEndValue, t); + } +}; + +template <> +struct LOTKeyFrameValue +{ + VPointF mStartValue; + VPointF mEndValue; + VPointF mInTangent; + VPointF mOutTangent; + bool mPathKeyFrame = false; + + VPointF value(float t) const { + if (mPathKeyFrame) { + return VBezier::fromPoints(mStartValue, mStartValue + mOutTangent, + mEndValue + mInTangent, mEndValue).pointAt(t); + } else { + return lerp(mStartValue, mEndValue, t); + } + } +}; + + template class LOTKeyFrame { public: - LOTKeyFrame():mStartValue(), - mEndValue(), - mStartFrame(0), - mEndFrame(0), - mInterpolator(nullptr), - mInTangent(), - mOutTangent(), - mPathKeyFrame(false){} + LOTKeyFrame(): mStartFrame(0), + mEndFrame(0), + mInterpolator(nullptr){} T value(int frameNo) const { float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); - return mStartValue + progress * (mEndValue - mStartValue); + return mValue.value(progress); } public: - T mStartValue; - T mEndValue; int mStartFrame; int mEndFrame; std::shared_ptr mInterpolator; - - /* this is for interpolating position along a path - * Need to move to other place because its only applicable - * for positional property. - */ - VPointF mInTangent; - VPointF mOutTangent; - bool mPathKeyFrame; -}; - -template<> -class LOTKeyFrame -{ -public: - LOTKeyFrame():mStartValue(), - mEndValue(), - mStartFrame(0), - mEndFrame(0), - mInterpolator(nullptr), - mInTangent(), - mOutTangent(), - mPathKeyFrame(false){} - - VPointF value(int frameNo) const { - float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); - if (mPathKeyFrame & 1) { - return VBezier::fromPoints(mStartValue, mStartValue + mOutTangent, mEndValue + mInTangent, mEndValue).pointAt(progress); - } else { - return mStartValue + progress * (mEndValue - mStartValue); - } - } - -public: - VPointF mStartValue; - VPointF mEndValue; - int mStartFrame; - int mEndFrame; - std::shared_ptr mInterpolator; - - /* this is for interpolating position along a path - * Need to move to other place because its only applicable - * for positional property. - */ - VPointF mInTangent; - VPointF mOutTangent; - bool mPathKeyFrame; -}; - -template<> -class LOTKeyFrame -{ -public: - LOTKeyFrame():mStartValue(), - mEndValue(), - mStartFrame(0), - mEndFrame(0), - mInterpolator(nullptr), - mInTangent(), - mOutTangent(), - mPathKeyFrame(false){} - - LottieShapeData value(int frameNo) const { - float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); - - if (mStartValue.mPoints.size() != mEndValue.mPoints.size()) - return LottieShapeData(); - - LottieShapeData result; - result.reserve(mStartValue.mPoints.size()); - for (unsigned int i = 0 ; i < mStartValue.mPoints.size(); i++) { - result.mPoints.push_back(mStartValue.mPoints[i] + progress * (mEndValue.mPoints[i] - mStartValue.mPoints[i])); - } - return result; - } - -public: - LottieShapeData mStartValue; - LottieShapeData mEndValue; - int mStartFrame; - int mEndFrame; - std::shared_ptr mInterpolator; - - /* this is for interpolating position along a path - * Need to move to other place because its only applicable - * for positional property. - */ - VPointF mInTangent; - VPointF mOutTangent; - bool mPathKeyFrame; + LOTKeyFrameValue mValue; }; template @@ -253,9 +208,9 @@ class LOTAnimInfo public: T value(int frameNo) const { if (mKeyFrames.front().mStartFrame >= frameNo) - return mKeyFrames.front().mStartValue; + return mKeyFrames.front().mValue.mStartValue; if(mKeyFrames.back().mEndFrame <= frameNo) - return mKeyFrames.back().mEndValue; + return mKeyFrames.back().mValue.mEndValue; for(auto keyFrame : mKeyFrames) { if (frameNo >= keyFrame.mStartFrame && frameNo < keyFrame.mEndFrame) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 11001df589..cf296c8d26 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -166,6 +166,8 @@ public: void getValue(LottieShapeData &shape); void getValue(LottieGradient &gradient); template + bool parseKeyFrameValue(const char* key, LOTKeyFrameValue &value); + template void parseKeyFrame(LOTAnimInfo &obj); template void parseProperty(LOTAnimatable &obj); @@ -1592,6 +1594,38 @@ LottieParserImpl::parseInperpolatorPoint() return cp; } +template +bool LottieParserImpl::parseKeyFrameValue(const char* key, LOTKeyFrameValue &value) +{ + if (0 == strcmp(key, "s")) { + getValue(value.mStartValue); + } else if (0 == strcmp(key, "e")) { + getValue(value.mEndValue); + } else { + return false; + } + return true; +} + +template<> +bool LottieParserImpl::parseKeyFrameValue(const char* key, LOTKeyFrameValue &value) +{ + if (0 == strcmp(key, "s")) { + getValue(value.mStartValue); + } else if (0 == strcmp(key, "e")) { + getValue(value.mEndValue); + } else if (0 == strcmp(key, "ti")) { + value.mPathKeyFrame = true; + getValue(value.mInTangent); + } else if (0 == strcmp(key, "to")) { + value.mPathKeyFrame = true; + getValue(value.mOutTangent); + } else { + return false; + } + return true; +} + /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/properties/multiDimensionalKeyframed.json */ @@ -1623,19 +1657,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) continue; } else if (0 == strcmp(key, "t")) { keyframe.mStartFrame = GetDouble(); - } else if (0 == strcmp(key, "s")) { - getValue(keyframe.mStartValue); - continue; - } else if (0 == strcmp(key, "e")) { - getValue(keyframe.mEndValue); - continue; - } else if (0 == strcmp(key, "ti")) { - keyframe.mPathKeyFrame = true; - getValue(keyframe.mInTangent); - continue; - } else if (0 == strcmp(key, "to")) { - keyframe.mPathKeyFrame = true; - getValue(keyframe.mOutTangent); + } else if (parseKeyFrameValue(key, keyframe.mValue)) { continue; } else if (0 == strcmp(key, "h")) { hold = GetInt(); @@ -1657,7 +1679,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) interpolatorKey = "hold_interpolator"; inTangent = VPointF(); outTangent = VPointF(); - keyframe.mEndValue = keyframe.mStartValue; + keyframe.mValue.mEndValue = keyframe.mValue.mStartValue; keyframe.mEndFrame = keyframe.mStartFrame; } From 6bf0c9bf690e476f795266e99959a67164f1cff0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 10:41:25 +0900 Subject: [PATCH 092/672] lottie: Updated clang-format based on tizen coding guide line. Change-Id: I25ddd59307ded91b71d7aaf46c2fc32e8e88fd33 --- .clang-format | 54 +++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/.clang-format b/.clang-format index 3a5940ef65..830be3872b 100644 --- a/.clang-format +++ b/.clang-format @@ -1,26 +1,26 @@ --- Language: Cpp -# BasedOnStyle: LLVM -AccessModifierOffset: -2 +# BasedOnStyle: Tizen +AccessModifierOffset: -4 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false -AlignConsecutiveDeclarations: false -AlignEscapedNewlinesLeft: false +AlignConsecutiveDeclarations: true +AlignEscapedNewlinesLeft: true AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: All -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: true +AllowShortLoopsOnASingleLine: true AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: false +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: true BinPackArguments: true BinPackParameters: true -BraceWrapping: +BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false @@ -33,43 +33,43 @@ BraceWrapping: BeforeElse: false IndentBraces: false BreakBeforeBinaryOperators: None -BreakBeforeBraces: Attach +BreakBeforeBraces: WebKit BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' -ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true -DerivePointerAlignment: false +DerivePointerAlignment: true DisableFormat: false ExperimentalAutoDetectBinPacking: false ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] -IncludeCategories: - - Regex: '^"(llvm|llvm-c|clang|clang-c)/' - Priority: 2 - - Regex: '^(<|"(gtest|isl|json)/)' - Priority: 3 - - Regex: '.*' +IncludeCategories: + - Regex: '^<.*\.h>' Priority: 1 + - Regex: '^<.*' + Priority: 2 + - Regex: '.*' + Priority: 3 IndentCaseLabels: false -IndentWidth: 2 +IndentWidth: 4 IndentWrappedFunctionNames: false -KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtTheStartOfBlocks: false MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: true -PenaltyBreakBeforeFirstCallParameter: 19 +ObjCSpaceBeforeProtocolList: false +PenaltyBreakBeforeFirstCallParameter: 1 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 60 +PenaltyReturnTypeOnItsOwnLine: 200 PointerAlignment: Right ReflowComments: true SortIncludes: true @@ -77,14 +77,14 @@ SpaceAfterCStyleCast: false SpaceBeforeAssignmentOperators: true SpaceBeforeParens: ControlStatements SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 +SpacesBeforeTrailingComments: 2 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false -Standard: Cpp11 -TabWidth: 8 +Standard: Auto +TabWidth: 4 UseTab: Never ... From 485f55f99b26b247c6557569d962122e3f3153dc Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sun, 29 Jul 2018 19:53:44 +0900 Subject: [PATCH 093/672] lottie/model: unique pointer will do the job. Change-Id: If421eb50bfbb529dece4d42fce1b71ff70574694 --- src/lottie/lottiemodel.h | 2 +- src/lottie/lottieparser.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index d20d5540fc..fa9e9d5f1b 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -238,7 +238,7 @@ public: public: T mValue; int mPropertyIndex; /* "ix" */ - std::shared_ptr> mAnimInfo; + std::unique_ptr> mAnimInfo; }; enum class LottieBlendMode diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index cf296c8d26..3eede425ab 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1715,7 +1715,7 @@ LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) while (NextArrayValue()) { RAPIDJSON_ASSERT(PeekType() == kObjectType); if (!obj.mAnimInfo) - obj.mAnimInfo = std::make_shared>(); + obj.mAnimInfo = std::make_unique>(); parseKeyFrame(*obj.mAnimInfo.get()); } } else { @@ -1749,7 +1749,7 @@ void LottieParserImpl::parseProperty(LOTAnimatable &obj) /* property with keyframe info*/ if (PeekType() == kObjectType) { if (!obj.mAnimInfo) - obj.mAnimInfo = std::make_shared>(); + obj.mAnimInfo = std::make_unique>(); parseKeyFrame(*obj.mAnimInfo.get()); } else { /* Read before modifying. From 9e63597b976461e88eefad402672f1b551cd0eda Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 12:03:49 +0900 Subject: [PATCH 094/672] lottie: Follow Tizen coding guideline. Change-Id: Ice6a5af7cb08e768e157f8bb45bef64bb4062dce --- inc/lottieplayer.h | 126 +- src/lottie/lottieitem.cpp | 988 ++++---- src/lottie/lottieloader.cpp | 96 +- src/lottie/lottiemodel.cpp | 227 +- src/lottie/lottieparser.cpp | 1021 +++++---- src/lottie/lottieplayer.cpp | 187 +- src/vector/freetype/v_ft_math.cpp | 605 ++--- src/vector/freetype/v_ft_raster.cpp | 2181 ++++++++---------- src/vector/freetype/v_ft_stroker.cpp | 3184 ++++++++++++-------------- src/vector/vbezier.cpp | 76 +- src/vector/vbezier.h | 110 +- src/vector/vbitmap.cpp | 135 +- src/vector/vbitmap.h | 38 +- src/vector/vbrush.cpp | 36 +- src/vector/vbrush.h | 78 +- src/vector/vcompositionfunctions.cpp | 63 +- src/vector/vcowptr.h | 45 +- src/vector/vdasher.cpp | 274 +-- src/vector/vdasher.h | 33 +- src/vector/vdebug.cpp | 935 ++++---- src/vector/vdebug.h | 107 +- src/vector/vdrawable.cpp | 12 +- src/vector/vdrawable.h | 57 +- src/vector/vdrawhelper.cpp | 402 ++-- src/vector/vdrawhelper.h | 204 +- src/vector/vdrawhelper_sse2.cpp | 608 +++-- src/vector/velapsedtimer.cpp | 10 +- src/vector/velapsedtimer.h | 22 +- src/vector/vglobal.h | 277 ++- src/vector/vinterpolator.cpp | 178 +- src/vector/vinterpolator.h | 70 +- src/vector/vmatrix.cpp | 439 ++-- src/vector/vmatrix.h | 72 +- src/vector/vpainter.cpp | 20 +- src/vector/vpainter.h | 24 +- src/vector/vpath.cpp | 562 ++--- src/vector/vpath.h | 178 +- src/vector/vpathmesure.cpp | 26 +- src/vector/vpathmesure.h | 14 +- src/vector/vpoint.h | 177 +- src/vector/vraster.cpp | 260 +-- src/vector/vraster.h | 24 +- src/vector/vrect.h | 233 +- src/vector/vregion.cpp | 1897 +++++++-------- src/vector/vregion.h | 70 +- src/vector/vrle.cpp | 547 ++--- src/vector/vrle.h | 68 +- src/vector/vtaskqueue.h | 28 +- 48 files changed, 8047 insertions(+), 8977 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index c7fd5c9aeb..795a3471fd 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -1,36 +1,35 @@ #ifndef LOTPLAYER_H #define LOTPLAYER_H -#include #include +#include #ifdef _WIN32 -# ifdef LOT_BUILD -# ifdef DLL_EXPORT -# define LOT_EXPORT __declspec(dllexport) -# else -# define LOT_EXPORT -# endif -# else -# define LOT_EXPORT __declspec(dllimport) -# endif +#ifdef LOT_BUILD +#ifdef DLL_EXPORT +#define LOT_EXPORT __declspec(dllexport) #else -# ifdef __GNUC__ -# if __GNUC__ >= 4 -# define LOT_EXPORT __attribute__ ((visibility("default"))) -# else -# define LOT_EXPORT -# endif -# else -# define LOT_EXPORT -# endif +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT __declspec(dllimport) +#endif +#else +#ifdef __GNUC__ +#if __GNUC__ >= 4 +#define LOT_EXPORT __attribute__((visibility("default"))) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT +#endif #endif class LOTPlayerPrivate; class LOTNode; -struct LOT_EXPORT LOTBuffer -{ +struct LOT_EXPORT LOTBuffer { uint32_t *buffer; int width; int height; @@ -38,8 +37,7 @@ struct LOT_EXPORT LOTBuffer bool clear; }; -class LOT_EXPORT LOTPlayer -{ +class LOT_EXPORT LOTPlayer { public: ~LOTPlayer(); LOTPlayer(); @@ -48,75 +46,57 @@ public: float playTime() const; - void setPos(float pos); + void setPos(float pos); float pos(); - const std::vector& renderList() const; + const std::vector &renderList() const; - //TODO: Consider correct position... - void setSize(int width, int height); - void size(int &width, int &height) const; + // TODO: Consider correct position... + void setSize(int width, int height); + void size(int &width, int &height) const; std::future render(float pos, LOTBuffer &buffer); - bool renderSync(float pos, LOTBuffer &buffer); + bool renderSync(float pos, LOTBuffer &buffer); public: - LOTPlayerPrivate *d; + LOTPlayerPrivate *d; }; -#define ChangeFlagNone 0x0000 -#define ChangeFlagPath 0x0001 +#define ChangeFlagNone 0x0000 +#define ChangeFlagPath 0x0001 #define ChangeFlagPaint 0x0010 -#define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) +#define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) -class LOT_EXPORT LOTNode -{ +class LOT_EXPORT LOTNode { public: struct PathData { const float *ptPtr; int ptCount; - const char *elmPtr; + const char * elmPtr; int elmCount; }; struct Color { unsigned short r, g, b, a; }; - enum BrushType { - BrushSolid, - BrushGradient - }; - enum FillRule { - EvenOdd, - Winding - }; + enum BrushType { BrushSolid, BrushGradient }; + enum FillRule { EvenOdd, Winding }; - enum JoinStyle { - MiterJoin, - BevelJoin, - RoundJoin - }; + enum JoinStyle { MiterJoin, BevelJoin, RoundJoin }; - enum CapStyle { - FlatCap, - SquareCap, - RoundCap - }; + enum CapStyle { FlatCap, SquareCap, RoundCap }; struct Stroke { - bool enable; - int width; - CapStyle cap; - JoinStyle join; - int meterLimit; - float *dashArray; - int dashArraySize; + bool enable; + int width; + CapStyle cap; + JoinStyle join; + int meterLimit; + float * dashArray; + int dashArraySize; }; struct Gradient { - enum Type { - Linear = 1, - Radial = 2 - }; + enum Type { Linear = 1, Radial = 2 }; Gradient::Type type; struct { float x, y; @@ -132,13 +112,13 @@ public: LOTNode(); public: - int mFlag; - LOTNode::BrushType mType; - FillRule mFillRule; - PathData mPath; - Color mColor; - Stroke mStroke; - Gradient mGradient; + int mFlag; + LOTNode::BrushType mType; + FillRule mFillRule; + PathData mPath; + Color mColor; + Stroke mStroke; + Gradient mGradient; }; -#endif // LOTPLAYER_H +#endif // LOTPLAYER_H diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index cc5c02ea6a..bef0c2d69e 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1,145 +1,146 @@ #include "lottieitem.h" -#include"vbitmap.h" -#include"vpainter.h" -#include"vraster.h" -#include"vdasher.h" #include +#include "vbitmap.h" +#include "vdasher.h" +#include "vpainter.h" +#include "vraster.h" /* Lottie Layer Rules - * 1. time stretch is pre calculated and applied to all the properties of the lottilayer model and all its children - * 2. The frame property could be reversed using,time-reverse layer property in AE. which means (start frame > endFrame) - * 3. + * 1. time stretch is pre calculated and applied to all the properties of the + * lottilayer model and all its children + * 2. The frame property could be reversed using,time-reverse layer property in + * AE. which means (start frame > endFrame) 3. */ -LOTCompItem::LOTCompItem(LOTModel *model):mRootModel(model), mUpdateViewBox(false),mCurFrameNo(-1) +LOTCompItem::LOTCompItem(LOTModel *model) + : mRootModel(model), mUpdateViewBox(false), mCurFrameNo(-1) { - // 1. build layer item list - mCompData = model->mRoot.get(); - for(auto i : mCompData->mChildren) { - LOTLayerData *layerData = dynamic_cast(i.get()); - if (layerData) { - LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerData); - if (layerItem) { - mLayers.push_back(layerItem); - mLayerMap[layerItem->id()] = layerItem; - } - } - } + // 1. build layer item list + mCompData = model->mRoot.get(); + for (auto i : mCompData->mChildren) { + LOTLayerData *layerData = dynamic_cast(i.get()); + if (layerData) { + LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerData); + if (layerItem) { + mLayers.push_back(layerItem); + mLayerMap[layerItem->id()] = layerItem; + } + } + } - //2. update parent layer - for(auto i : mLayers) { - int id = i->parentId(); - if (id >=0) { - auto search = mLayerMap.find(id); - if (search != mLayerMap.end()) { - LOTLayerItem *parentLayer = search->second; - i->setParentLayer(parentLayer); - } - } - } - //3. update static property of each layer - for(auto i : mLayers) { - i->updateStaticProperty(); - } + // 2. update parent layer + for (auto i : mLayers) { + int id = i->parentId(); + if (id >= 0) { + auto search = mLayerMap.find(id); + if (search != mLayerMap.end()) { + LOTLayerItem *parentLayer = search->second; + i->setParentLayer(parentLayer); + } + } + } + // 3. update static property of each layer + for (auto i : mLayers) { + i->updateStaticProperty(); + } - mViewSize = mCompData->size(); + mViewSize = mCompData->size(); } LOTCompItem::~LOTCompItem() { - for(auto i : mLayers) { - delete i; + for (auto i : mLayers) { + delete i; } } -LOTLayerItem * -LOTCompItem::createLayerItem(LOTLayerData *layerData) +LOTLayerItem *LOTCompItem::createLayerItem(LOTLayerData *layerData) { - switch(layerData->mLayerType) { - case LayerType::Precomp: { - return new LOTCompLayerItem(layerData); - break; - } - case LayerType::Solid: { - return new LOTSolidLayerItem(layerData); - break; - } - case LayerType::Shape: { - return new LOTShapeLayerItem(layerData); - break; - } - case LayerType::Null: { - return new LOTNullLayerItem(layerData); - break; - } - default: - return nullptr; - break; + switch (layerData->mLayerType) { + case LayerType::Precomp: { + return new LOTCompLayerItem(layerData); + break; + } + case LayerType::Solid: { + return new LOTSolidLayerItem(layerData); + break; + } + case LayerType::Shape: { + return new LOTShapeLayerItem(layerData); + break; + } + case LayerType::Null: { + return new LOTNullLayerItem(layerData); + break; + } + default: + return nullptr; + break; } } void LOTCompItem::resize(const VSize &size) { - if (mViewSize == size) return; - mViewSize = size; - mUpdateViewBox = true; + if (mViewSize == size) return; + mViewSize = size; + mUpdateViewBox = true; } VSize LOTCompItem::size() const { - return mViewSize; + return mViewSize; } bool LOTCompItem::update(int frameNo) { - // check if cached frame is same as requested frame. - if (!mUpdateViewBox && (mCurFrameNo == frameNo)) return false; + // check if cached frame is same as requested frame. + if (!mUpdateViewBox && (mCurFrameNo == frameNo)) return false; - /* - * if viewbox dosen't scale exactly to the viewport - * we scale the viewbox keeping AspectRatioPreserved and then align the - * viewbox to the viewport using AlignCenter rule. - */ - VSize viewPort = mViewSize; - VSize viewBox = mCompData->size(); + /* + * if viewbox dosen't scale exactly to the viewport + * we scale the viewbox keeping AspectRatioPreserved and then align the + * viewbox to the viewport using AlignCenter rule. + */ + VSize viewPort = mViewSize; + VSize viewBox = mCompData->size(); - float sx = float(viewPort.width()) / viewBox.width(); - float sy = float(viewPort.height()) / viewBox.height(); - float scale = fmin(sx, sy); - float tx = (viewPort.width() - viewBox.width() * scale) * 0.5; - float ty = (viewPort.height() - viewBox.height() * scale) * 0.5; + float sx = float(viewPort.width()) / viewBox.width(); + float sy = float(viewPort.height()) / viewBox.height(); + float scale = fmin(sx, sy); + float tx = (viewPort.width() - viewBox.width() * scale) * 0.5; + float ty = (viewPort.height() - viewBox.height() * scale) * 0.5; - VMatrix m; - m.scale(scale, scale).translate(tx, ty); + VMatrix m; + m.scale(scale, scale).translate(tx, ty); - // update the layer from back to front - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->update(frameNo, m, 1.0); - } - buildRenderList(); - mCurFrameNo = frameNo; - mUpdateViewBox = false; - return true; + // update the layer from back to front + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->update(frameNo, m, 1.0); + } + buildRenderList(); + mCurFrameNo = frameNo; + mUpdateViewBox = false; + return true; } void LOTCompItem::buildRenderList() { mDrawableList.clear(); for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->renderList(mDrawableList); + LOTLayerItem *layer = *i; + layer->renderList(mDrawableList); } mRenderList.clear(); - for(auto i : mDrawableList) { + for (auto i : mDrawableList) { LOTDrawable *lotDrawable = static_cast(i); lotDrawable->sync(); mRenderList.push_back(&lotDrawable->mCNode); } } -const std::vector& LOTCompItem::renderList() const +const std::vector &LOTCompItem::renderList() const { return mRenderList; } @@ -147,7 +148,8 @@ const std::vector& LOTCompItem::renderList() const bool LOTCompItem::render(const LOTBuffer &buffer) { VBitmap bitmap((uchar *)buffer.buffer, buffer.width, buffer.height, - buffer.bytesPerLine, VBitmap::Format::ARGB32_Premultiplied, nullptr, nullptr); + buffer.bytesPerLine, VBitmap::Format::ARGB32_Premultiplied, + nullptr, nullptr); /* schedule all preprocess task for this frame at once. */ @@ -156,10 +158,10 @@ bool LOTCompItem::render(const LOTBuffer &buffer) } VPainter painter(&bitmap); - VRle mask; + VRle mask; for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->render(&painter, mask); + LOTLayerItem *layer = *i; + layer->render(&painter, mask); } return true; @@ -191,8 +193,7 @@ VRle LOTMaskItem::rle() mRle = mRleTask.get(); if (!vCompare(mCombinedAlpha, 1.0f)) mRle = mRle * (mCombinedAlpha * 255); - if (mData->mInv) - mRle = ~mRle; + if (mData->mInv) mRle = ~mRle; } return mRle; } @@ -209,7 +210,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } - for(auto i : list) { + for (auto i : list) { painter->setBrush(i->mBrush); if (!mask.isEmpty()) { VRle rle = i->rle() & mask; @@ -222,37 +223,37 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) VRle LOTLayerItem::maskRle(const VRect &clipRect) { - VRle rle; for (auto &i : mMasks) { switch (i->maskMode()) { - case LOTMaskData::Mode::Add: { - rle = rle + i->rle(); - break; - } - case LOTMaskData::Mode::Substarct: { - if (rle.isEmpty() && !clipRect.isEmpty()) - rle = VRle::toRle(clipRect); - rle = rle - i->rle(); - break; - } - case LOTMaskData::Mode::Intersect: { - rle = rle & i->rle(); - break; - } - default: - break; + case LOTMaskData::Mode::Add: { + rle = rle + i->rle(); + break; + } + case LOTMaskData::Mode::Substarct: { + if (rle.isEmpty() && !clipRect.isEmpty()) + rle = VRle::toRle(clipRect); + rle = rle - i->rle(); + break; + } + case LOTMaskData::Mode::Intersect: { + rle = rle & i->rle(); + break; + } + default: + break; } } return rle; } -LOTLayerItem::LOTLayerItem(LOTLayerData *layerData):mLayerData(layerData), - mParentLayer(nullptr), - mPrecompLayer(nullptr), - mCombinedAlpha(0.0f), - mFrameNo(-1), - mDirtyFlag(DirtyFlagBit::All) +LOTLayerItem::LOTLayerItem(LOTLayerData *layerData) + : mLayerData(layerData), + mParentLayer(nullptr), + mPrecompLayer(nullptr), + mCombinedAlpha(0.0f), + mFrameNo(-1), + mDirtyFlag(DirtyFlagBit::All) { if (mLayerData->mHasMask) { for (auto i : mLayerData->mMasks) { @@ -263,110 +264,107 @@ LOTLayerItem::LOTLayerItem(LOTLayerData *layerData):mLayerData(layerData), void LOTLayerItem::updateStaticProperty() { - if (mParentLayer) - mParentLayer->updateStaticProperty(); + if (mParentLayer) mParentLayer->updateStaticProperty(); - mStatic = mLayerData->isStatic(); - mStatic = mParentLayer ? (mStatic & mParentLayer->isStatic()) : mStatic; - mStatic = mPrecompLayer ? (mStatic & mPrecompLayer->isStatic()) : mStatic; + mStatic = mLayerData->isStatic(); + mStatic = mParentLayer ? (mStatic & mParentLayer->isStatic()) : mStatic; + mStatic = mPrecompLayer ? (mStatic & mPrecompLayer->isStatic()) : mStatic; } -void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha) +void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha) { - mFrameNo = frameNo; - // 1. check if the layer is part of the current frame - if (!visible()) return; + mFrameNo = frameNo; + // 1. check if the layer is part of the current frame + if (!visible()) return; - // 2. calculate the parent matrix and alpha - VMatrix m = matrix(frameNo); - m *= parentMatrix; - float alpha = parentAlpha * opacity(frameNo); + // 2. calculate the parent matrix and alpha + VMatrix m = matrix(frameNo); + m *= parentMatrix; + float alpha = parentAlpha * opacity(frameNo); - //6. update the mask - if (hasMask()) { - for (auto &i : mMasks) - i->update(frameNo, m, alpha, mDirtyFlag); - } + // 6. update the mask + if (hasMask()) { + for (auto &i : mMasks) i->update(frameNo, m, alpha, mDirtyFlag); + } - // 3. update the dirty flag based on the change - if (!mCombinedMatrix.fuzzyCompare(m)) { - mDirtyFlag |= DirtyFlagBit::Matrix; - } - if (!vCompare(mCombinedAlpha, alpha)) { - mDirtyFlag |= DirtyFlagBit::Alpha; - } - mCombinedMatrix = m; - mCombinedAlpha = alpha; + // 3. update the dirty flag based on the change + if (!mCombinedMatrix.fuzzyCompare(m)) { + mDirtyFlag |= DirtyFlagBit::Matrix; + } + if (!vCompare(mCombinedAlpha, alpha)) { + mDirtyFlag |= DirtyFlagBit::Alpha; + } + mCombinedMatrix = m; + mCombinedAlpha = alpha; - // 4. if no parent property change and layer is static then nothing to do. - if ((flag() & DirtyFlagBit::None) && isStatic()) - return; + // 4. if no parent property change and layer is static then nothing to do. + if ((flag() & DirtyFlagBit::None) && isStatic()) return; - //5. update the content of the layer - updateContent(); + // 5. update the content of the layer + updateContent(); - //6. reset the dirty flag - mDirtyFlag = DirtyFlagBit::None; + // 6. reset the dirty flag + mDirtyFlag = DirtyFlagBit::None; } -float -LOTLayerItem::opacity(int frameNo) const +float LOTLayerItem::opacity(int frameNo) const { - return mLayerData->mTransform->opacity(frameNo); + return mLayerData->mTransform->opacity(frameNo); } -VMatrix -LOTLayerItem::matrix(int frameNo) const +VMatrix LOTLayerItem::matrix(int frameNo) const { if (mParentLayer) - return mLayerData->mTransform->matrix(frameNo) * mParentLayer->matrix(frameNo); + return mLayerData->mTransform->matrix(frameNo) * + mParentLayer->matrix(frameNo); else return mLayerData->mTransform->matrix(frameNo); } bool LOTLayerItem::visible() const { - if (frameNo() >= mLayerData->inFrame() && frameNo() < mLayerData->outFrame()) - return true; - else - return false; + if (frameNo() >= mLayerData->inFrame() && + frameNo() < mLayerData->outFrame()) + return true; + else + return false; } - - -LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel):LOTLayerItem(layerModel) +LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) + : LOTLayerItem(layerModel) { - for(auto i : mLayerData->mChildren) { - LOTLayerData *layerModel = dynamic_cast(i.get()); - if (layerModel) { - LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel); - if (layerItem) { - mLayers.push_back(layerItem); - mLayerMap[layerItem->id()] = layerItem; - } - } - } + for (auto i : mLayerData->mChildren) { + LOTLayerData *layerModel = dynamic_cast(i.get()); + if (layerModel) { + LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel); + if (layerItem) { + mLayers.push_back(layerItem); + mLayerMap[layerItem->id()] = layerItem; + } + } + } - //2. update parent layer - for(auto i : mLayers) { - int id = i->parentId(); - if (id >=0) { - auto search = mLayerMap.find(id); - if (search != mLayerMap.end()) { - LOTLayerItem *parentLayer = search->second; - i->setParentLayer(parentLayer); - } - } - i->setPrecompLayer(this); - } + // 2. update parent layer + for (auto i : mLayers) { + int id = i->parentId(); + if (id >= 0) { + auto search = mLayerMap.find(id); + if (search != mLayerMap.end()) { + LOTLayerItem *parentLayer = search->second; + i->setParentLayer(parentLayer); + } + } + i->setPrecompLayer(this); + } } void LOTCompLayerItem::updateStaticProperty() { LOTLayerItem::updateStaticProperty(); - for(auto i : mLayers) { - i->updateStaticProperty(); + for (auto i : mLayers) { + i->updateStaticProperty(); } } @@ -381,15 +379,15 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } - for(auto i : mLayers) { - i->render(painter, mask); + for (auto i : mLayers) { + i->render(painter, mask); } } LOTCompLayerItem::~LOTCompLayerItem() { - for(auto i : mLayers) { - delete i; + for (auto i : mLayers) { + delete i; } } @@ -397,8 +395,8 @@ void LOTCompLayerItem::updateContent() { // update the layer from back to front for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->update(frameNo(), combinedMatrix(), combinedAlpha()); + LOTLayerItem *layer = *i; + layer->update(frameNo(), combinedMatrix(), combinedAlpha()); } } @@ -408,37 +406,38 @@ void LOTCompLayerItem::renderList(std::vector &list) // update the layer from back to front for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->renderList(list); + LOTLayerItem *layer = *i; + layer->renderList(list); } } -LOTSolidLayerItem::LOTSolidLayerItem(LOTLayerData *layerData):LOTLayerItem(layerData) +LOTSolidLayerItem::LOTSolidLayerItem(LOTLayerData *layerData) + : LOTLayerItem(layerData) { - } void LOTSolidLayerItem::updateContent() { - if (!mRenderNode) { - mRenderNode = std::make_unique(); - mRenderNode->mType = VDrawable::Type::Fill; - mRenderNode->mFlag |= VDrawable::DirtyState::All; - } + if (!mRenderNode) { + mRenderNode = std::make_unique(); + mRenderNode->mType = VDrawable::Type::Fill; + mRenderNode->mFlag |= VDrawable::DirtyState::All; + } - if (flag() & DirtyFlagBit::Matrix) { - VPath path; - path.addRect(VRectF(0, 0, mLayerData->solidWidth(), mLayerData->solidHeight())); - path.transform(combinedMatrix()); - mRenderNode->mFlag |= VDrawable::DirtyState::Path; - mRenderNode->mPath = path; - } - if (flag() & DirtyFlagBit::Alpha) { - LottieColor color = mLayerData->solidColor(); - VBrush brush(color.toColor(combinedAlpha())); - mRenderNode->setBrush(brush); - mRenderNode->mFlag |= VDrawable::DirtyState::Brush; - } + if (flag() & DirtyFlagBit::Matrix) { + VPath path; + path.addRect( + VRectF(0, 0, mLayerData->solidWidth(), mLayerData->solidHeight())); + path.transform(combinedMatrix()); + mRenderNode->mFlag |= VDrawable::DirtyState::Path; + mRenderNode->mPath = path; + } + if (flag() & DirtyFlagBit::Alpha) { + LottieColor color = mLayerData->solidColor(); + VBrush brush(color.toColor(combinedAlpha())); + mRenderNode->setBrush(brush); + mRenderNode->mFlag |= VDrawable::DirtyState::Brush; + } } void LOTSolidLayerItem::renderList(std::vector &list) @@ -448,23 +447,19 @@ void LOTSolidLayerItem::renderList(std::vector &list) list.push_back(mRenderNode.get()); } -LOTNullLayerItem::LOTNullLayerItem(LOTLayerData *layerData):LOTLayerItem(layerData) +LOTNullLayerItem::LOTNullLayerItem(LOTLayerData *layerData) + : LOTLayerItem(layerData) { - } -void LOTNullLayerItem::updateContent() -{ +void LOTNullLayerItem::updateContent() {} -} - - -LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData):LOTLayerItem(layerData) +LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData) + : LOTLayerItem(layerData) { mRoot = new LOTContentGroupItem(nullptr); mRoot->addChildren(layerData); mRoot->processPaintOperation(); - if (layerData->hasPathOperator()) - mRoot->processTrimOperation(); + if (layerData->hasPathOperator()) mRoot->processTrimOperation(); } LOTShapeLayerItem::~LOTShapeLayerItem() @@ -472,62 +467,63 @@ LOTShapeLayerItem::~LOTShapeLayerItem() delete mRoot; } -LOTContentItem * LOTShapeLayerItem::createContentItem(LOTData *contentData) +LOTContentItem *LOTShapeLayerItem::createContentItem(LOTData *contentData) { - switch(contentData->type()) { - case LOTData::Type::ShapeGroup: { - return new LOTContentGroupItem(static_cast(contentData)); - break; - } - case LOTData::Type::Rect: { - return new LOTRectItem(static_cast(contentData)); - break; - } - case LOTData::Type::Ellipse: { - return new LOTEllipseItem(static_cast(contentData)); - break; - } - case LOTData::Type::Shape: { - return new LOTShapeItem(static_cast(contentData)); - break; - } - case LOTData::Type::Polystar: { - return new LOTPolystarItem(static_cast(contentData)); - break; - } - case LOTData::Type::Fill: { - return new LOTFillItem(static_cast(contentData)); - break; - } - case LOTData::Type::GFill: { - return new LOTGFillItem(static_cast(contentData)); - break; - } - case LOTData::Type::Stroke: { - return new LOTStrokeItem(static_cast(contentData)); - break; - } - case LOTData::Type::GStroke: { - return new LOTGStrokeItem(static_cast(contentData)); - break; - } - case LOTData::Type::Repeater: { - return new LOTRepeaterItem(static_cast(contentData)); - break; - } - case LOTData::Type::Trim: { - return new LOTTrimItem(static_cast(contentData)); - break; - } - default: - return nullptr; - break; + switch (contentData->type()) { + case LOTData::Type::ShapeGroup: { + return new LOTContentGroupItem( + static_cast(contentData)); + break; + } + case LOTData::Type::Rect: { + return new LOTRectItem(static_cast(contentData)); + break; + } + case LOTData::Type::Ellipse: { + return new LOTEllipseItem(static_cast(contentData)); + break; + } + case LOTData::Type::Shape: { + return new LOTShapeItem(static_cast(contentData)); + break; + } + case LOTData::Type::Polystar: { + return new LOTPolystarItem(static_cast(contentData)); + break; + } + case LOTData::Type::Fill: { + return new LOTFillItem(static_cast(contentData)); + break; + } + case LOTData::Type::GFill: { + return new LOTGFillItem(static_cast(contentData)); + break; + } + case LOTData::Type::Stroke: { + return new LOTStrokeItem(static_cast(contentData)); + break; + } + case LOTData::Type::GStroke: { + return new LOTGStrokeItem(static_cast(contentData)); + break; + } + case LOTData::Type::Repeater: { + return new LOTRepeaterItem(static_cast(contentData)); + break; + } + case LOTData::Type::Trim: { + return new LOTTrimItem(static_cast(contentData)); + break; + } + default: + return nullptr; + break; } } void LOTShapeLayerItem::updateContent() { - mRoot->update(frameNo(), combinedMatrix(), combinedAlpha(), flag()); + mRoot->update(frameNo(), combinedMatrix(), combinedAlpha(), flag()); } void LOTShapeLayerItem::renderList(std::vector &list) @@ -536,227 +532,235 @@ void LOTShapeLayerItem::renderList(std::vector &list) mRoot->renderList(list); } -LOTContentGroupItem::LOTContentGroupItem(LOTShapeGroupData *data):mData(data) +LOTContentGroupItem::LOTContentGroupItem(LOTShapeGroupData *data) : mData(data) { - addChildren(mData); + addChildren(mData); } void LOTContentGroupItem::addChildren(LOTGroupData *data) { - if (!data) return; + if (!data) return; - for(auto i : data->mChildren) { - LOTData *data = i.get(); - LOTContentItem *content = LOTShapeLayerItem::createContentItem(data); - if (content) - mContents.push_back(content); - } + for (auto i : data->mChildren) { + LOTData * data = i.get(); + LOTContentItem *content = LOTShapeLayerItem::createContentItem(data); + if (content) mContents.push_back(content); + } } LOTContentGroupItem::~LOTContentGroupItem() { - for(auto i : mContents) { + for (auto i : mContents) { delete i; } } - -void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha, const DirtyFlag &flag) { - VMatrix m = parentMatrix; - float alpha = parentAlpha; - DirtyFlag newFlag = flag; + VMatrix m = parentMatrix; + float alpha = parentAlpha; + DirtyFlag newFlag = flag; - if (mData) { - // update the matrix and the flag - if ((flag & DirtyFlagBit::Matrix) || !mData->mTransform->staticMatrix() ) { - newFlag |= DirtyFlagBit::Matrix; - } - m = mData->mTransform->matrix(frameNo); - m *= parentMatrix; - alpha *= mData->mTransform->opacity(frameNo); + if (mData) { + // update the matrix and the flag + if ((flag & DirtyFlagBit::Matrix) || + !mData->mTransform->staticMatrix()) { + newFlag |= DirtyFlagBit::Matrix; + } + m = mData->mTransform->matrix(frameNo); + m *= parentMatrix; + alpha *= mData->mTransform->opacity(frameNo); - if (!vCompare(alpha, parentAlpha)) { - newFlag |= DirtyFlagBit::Alpha; - } - } + if (!vCompare(alpha, parentAlpha)) { + newFlag |= DirtyFlagBit::Alpha; + } + } - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - (*i)->update(frameNo, m, alpha, newFlag); - } + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + (*i)->update(frameNo, m, alpha, newFlag); + } } void LOTContentGroupItem::renderList(std::vector &list) { for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - (*i)->renderList(list); + (*i)->renderList(list); } } void LOTContentGroupItem::processPaintOperation() { - std::vector list; - paintOperationHelper(list); + std::vector list; + paintOperationHelper(list); } -void LOTContentGroupItem::paintOperationHelper(std::vector &list) +void LOTContentGroupItem::paintOperationHelper( + std::vector &list) { - int curOpCount = list.size(); - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - auto child = *i; - if (auto pathNode = dynamic_cast(child)) { - // the node is a path data node add the paint operation list to it. - pathNode->addPaintOperation(list, curOpCount); - } else if (auto paintNode = dynamic_cast(child)) { - // add it to the paint operation list - list.push_back(paintNode); - } else if (auto groupNode = dynamic_cast(child)) { - // update the groups node with current list - groupNode->paintOperationHelper(list); - } - } - list.erase(list.begin() + curOpCount, list.end()); + int curOpCount = list.size(); + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto child = *i; + if (auto pathNode = dynamic_cast(child)) { + // the node is a path data node add the paint operation list to it. + pathNode->addPaintOperation(list, curOpCount); + } else if (auto paintNode = dynamic_cast(child)) { + // add it to the paint operation list + list.push_back(paintNode); + } else if (auto groupNode = + dynamic_cast(child)) { + // update the groups node with current list + groupNode->paintOperationHelper(list); + } + } + list.erase(list.begin() + curOpCount, list.end()); } -void LOTPathDataItem::addPaintOperation(std::vector &list, int externalCount) +void LOTPathDataItem::addPaintOperation(std::vector &list, + int externalCount) { - for(auto paintItem : list) { - bool sameGroup = (externalCount-- > 0) ? false : true; - mNodeList.push_back(std::make_unique()); - mRenderList.push_back(LOTRenderNode(this, paintItem, mNodeList.back().get(), sameGroup)); + for (auto paintItem : list) { + bool sameGroup = (externalCount-- > 0) ? false : true; + mNodeList.push_back(std::make_unique()); + mRenderList.push_back( + LOTRenderNode(this, paintItem, mNodeList.back().get(), sameGroup)); } } void LOTContentGroupItem::processTrimOperation() { - std::vector list; - trimOperationHelper(list); + std::vector list; + trimOperationHelper(list); } void LOTContentGroupItem::trimOperationHelper(std::vector &list) { - int curOpCount = list.size(); - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - auto child = *i; - if (auto pathNode = dynamic_cast(child)) { - // the node is a path data node add the trim operation list to it. - pathNode->addTrimOperation(list); - } else if (auto trimNode = dynamic_cast(child)) { - // add it to the trim operation list - list.push_back(trimNode); - } else if (auto groupNode = dynamic_cast(child)) { - // update the groups node with current list - groupNode->trimOperationHelper(list); - } - } - list.erase(list.begin() + curOpCount, list.end()); + int curOpCount = list.size(); + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto child = *i; + if (auto pathNode = dynamic_cast(child)) { + // the node is a path data node add the trim operation list to it. + pathNode->addTrimOperation(list); + } else if (auto trimNode = dynamic_cast(child)) { + // add it to the trim operation list + list.push_back(trimNode); + } else if (auto groupNode = + dynamic_cast(child)) { + // update the groups node with current list + groupNode->trimOperationHelper(list); + } + } + list.erase(list.begin() + curOpCount, list.end()); } void LOTPathDataItem::addTrimOperation(std::vector &list) { - for(auto trimItem : list) { - mTrimNodeRefs.push_back(trimItem); - } + for (auto trimItem : list) { + mTrimNodeRefs.push_back(trimItem); + } } -void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha, const DirtyFlag &flag) { - VPath tempPath; + VPath tempPath; - mPathChanged = false; - mCombinedAlpha = parentAlpha; + mPathChanged = false; + mCombinedAlpha = parentAlpha; - // 1. update the local path if needed - if (!(mInit && mStaticPath)) { - mLocalPath = getPath(frameNo); - mInit = true; - mPathChanged = true; - } + // 1. update the local path if needed + if (!(mInit && mStaticPath)) { + mLocalPath = getPath(frameNo); + mInit = true; + mPathChanged = true; + } - tempPath = mLocalPath; + tempPath = mLocalPath; - // 2. apply path operation if needed - if (mTrimNodeRefs.size() > 0) - { - //TODO apply more than one trim path if necessary + // 2. apply path operation if needed + if (mTrimNodeRefs.size() > 0) { + // TODO apply more than one trim path if necessary VPathMesure pm; - float s = mTrimNodeRefs.front()->getStart(frameNo) / 100.0f; - float e = mTrimNodeRefs.front()->getEnd(frameNo) / 100.0f; + float s = mTrimNodeRefs.front()->getStart(frameNo) / 100.0f; + float e = mTrimNodeRefs.front()->getEnd(frameNo) / 100.0f; pm.setOffset(s, e); tempPath = pm.trim(tempPath); mPathChanged = true; - } + } - // 3. compute the final path with parentMatrix + // 3. compute the final path with parentMatrix - if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { - mFinalPath = tempPath; - mFinalPath.transform(parentMatrix); - mPathChanged = true; - } + if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { + mFinalPath = tempPath; + mFinalPath.transform(parentMatrix); + mPathChanged = true; + } - // 2. update the rendernode list - for (const auto &i : mRenderList) { - i.drawable->mFlag = VDrawable::DirtyState::None; - i.paintNodeRef->updateRenderNode(i.pathNodeRef, i.drawable, i.sameGroup); - if (mPathChanged) { - i.drawable->mPath = mFinalPath; - i.drawable->mFlag |= VDrawable::DirtyState::Path; - } - } + // 2. update the rendernode list + for (const auto &i : mRenderList) { + i.drawable->mFlag = VDrawable::DirtyState::None; + i.paintNodeRef->updateRenderNode(i.pathNodeRef, i.drawable, + i.sameGroup); + if (mPathChanged) { + i.drawable->mPath = mFinalPath; + i.drawable->mFlag |= VDrawable::DirtyState::Path; + } + } } void LOTPathDataItem::renderList(std::vector &list) { - for (const auto &i : mRenderList) { - list.push_back(i.drawable); - } + for (const auto &i : mRenderList) { + list.push_back(i.drawable); + } } VPath LOTPathDataItem::path() const { - return mFinalPath; + return mFinalPath; } - -LOTRectItem::LOTRectItem(LOTRectData *data):LOTPathDataItem(data->isStatic()),mData(data) +LOTRectItem::LOTRectItem(LOTRectData *data) + : LOTPathDataItem(data->isStatic()), mData(data) { } VPath LOTRectItem::getPath(int frameNo) { - VPointF pos = mData->mPos.value(frameNo); - VPointF size = mData->mSize.value(frameNo); - float radius = mData->mRound.value(frameNo); - VRectF r(pos.x() - size.x()/2, pos.y() - size.y()/2, size.x(), size.y()); + VPointF pos = mData->mPos.value(frameNo); + VPointF size = mData->mSize.value(frameNo); + float radius = mData->mRound.value(frameNo); + VRectF r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(), + size.y()); - VPath path; - path.addRoundRect(r, radius, radius, mData->direction()); + VPath path; + path.addRoundRect(r, radius, radius, mData->direction()); - return path; + return path; } -LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data):LOTPathDataItem(data->isStatic()),mData(data) +LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data) + : LOTPathDataItem(data->isStatic()), mData(data) { - } VPath LOTEllipseItem::getPath(int frameNo) { - VPointF pos = mData->mPos.value(frameNo); - VPointF size = mData->mSize.value(frameNo); - VRectF r(pos.x() - size.x()/2, pos.y() - size.y()/2, size.x(), size.y()); + VPointF pos = mData->mPos.value(frameNo); + VPointF size = mData->mSize.value(frameNo); + VRectF r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(), + size.y()); - VPath path; - path.addOval(r, mData->direction()); + VPath path; + path.addOval(r, mData->direction()); - return path; + return path; } -LOTShapeItem::LOTShapeItem(LOTShapeData *data):LOTPathDataItem(data->isStatic()),mData(data) +LOTShapeItem::LOTShapeItem(LOTShapeData *data) + : LOTPathDataItem(data->isStatic()), mData(data) { - } VPath LOTShapeItem::getPath(int frameNo) @@ -764,90 +768,88 @@ VPath LOTShapeItem::getPath(int frameNo) return mData->mShape.value(frameNo).toPath(); } - -LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data):LOTPathDataItem(data->isStatic()),mData(data) +LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data) + : LOTPathDataItem(data->isStatic()), mData(data) { - } VPath LOTPolystarItem::getPath(int frameNo) { - VPointF pos = mData->mPos.value(frameNo); - float points = mData->mPointCount.value(frameNo); - float innerRadius = mData->mInnerRadius.value(frameNo); - float outerRadius = mData->mOuterRadius.value(frameNo); - float innerRoundness = mData->mInnerRoundness.value(frameNo); - float outerRoundness = mData->mOuterRoundness.value(frameNo); - float rotation = mData->mRotation.value(frameNo); + VPointF pos = mData->mPos.value(frameNo); + float points = mData->mPointCount.value(frameNo); + float innerRadius = mData->mInnerRadius.value(frameNo); + float outerRadius = mData->mOuterRadius.value(frameNo); + float innerRoundness = mData->mInnerRoundness.value(frameNo); + float outerRoundness = mData->mOuterRoundness.value(frameNo); + float rotation = mData->mRotation.value(frameNo); - VPath path; - VMatrix m; + VPath path; + VMatrix m; - if (mData->mType == LOTPolystarData::PolyType::Star) { - path.addPolystar(points, innerRadius, outerRadius, - innerRoundness, outerRoundness, - 0.0, 0.0, 0.0, mData->direction()); - } else { - path.addPolygon(points, outerRadius, outerRoundness, - 0.0, 0.0, 0.0, mData->direction()); - } + if (mData->mType == LOTPolystarData::PolyType::Star) { + path.addPolystar(points, innerRadius, outerRadius, innerRoundness, + outerRoundness, 0.0, 0.0, 0.0, mData->direction()); + } else { + path.addPolygon(points, outerRadius, outerRoundness, 0.0, 0.0, 0.0, + mData->direction()); + } - m.translate(pos.x(), pos.y()).rotate(rotation); - m.rotate(rotation); - path.transform(m); + m.translate(pos.x(), pos.y()).rotate(rotation); + m.rotate(rotation); + path.transform(m); - return path; + return path; } - - /* * PaintData Node handling * */ -void LOTPaintDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +void LOTPaintDataItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha, const DirtyFlag &flag) { - mContentChanged = false; - mParentAlpha = parentAlpha; - mParentMatrix = parentMatrix; - mFlag = flag; - mFrameNo = frameNo; - // 1. update the local content if needed - // if (!(mInit && mStaticContent)) { - mInit = true; - updateContent(frameNo); - mContentChanged = true; - // } + mContentChanged = false; + mParentAlpha = parentAlpha; + mParentMatrix = parentMatrix; + mFlag = flag; + mFrameNo = frameNo; + // 1. update the local content if needed + // if (!(mInit && mStaticContent)) { + mInit = true; + updateContent(frameNo); + mContentChanged = true; + // } } - -LOTFillItem::LOTFillItem(LOTFillData *data):LOTPaintDataItem(data->isStatic()),mData(data) +LOTFillItem::LOTFillItem(LOTFillData *data) + : LOTPaintDataItem(data->isStatic()), mData(data) { } void LOTFillItem::updateContent(int frameNo) { - LottieColor c = mData->mColor.value(frameNo); - float opacity = mData->opacity(frameNo); - mColor = c.toColor(opacity); - mFillRule = mData->fillRule(); + LottieColor c = mData->mColor.value(frameNo); + float opacity = mData->opacity(frameNo); + mColor = c.toColor(opacity); + mFillRule = mData->fillRule(); } -void LOTFillItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +void LOTFillItem::updateRenderNode(LOTPathDataItem *pathNode, + VDrawable *drawable, bool sameParent) { VColor color = mColor; if (sameParent) - color.setAlpha(color.a * pathNode->combinedAlpha()); + color.setAlpha(color.a * pathNode->combinedAlpha()); else - color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); + color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); VBrush brush(color); drawable->setBrush(brush); drawable->setFillRule(mFillRule); } - -LOTGFillItem::LOTGFillItem(LOTGFillData *data):LOTPaintDataItem(data->isStatic()),mData(data) +LOTGFillItem::LOTGFillItem(LOTGFillData *data) + : LOTPaintDataItem(data->isStatic()), mData(data) { } @@ -858,13 +860,15 @@ void LOTGFillItem::updateContent(int frameNo) mFillRule = mData->fillRule(); } -void LOTGFillItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +void LOTGFillItem::updateRenderNode(LOTPathDataItem *pathNode, + VDrawable *drawable, bool sameParent) { drawable->setBrush(VBrush(mGradient.get())); drawable->setFillRule(mFillRule); } -LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data):LOTPaintDataItem(data->isStatic()),mData(data) +LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data) + : LOTPaintDataItem(data->isStatic()), mData(data) { mDashArraySize = 0; } @@ -872,7 +876,7 @@ LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data):LOTPaintDataItem(data->isStati void LOTStrokeItem::updateContent(int frameNo) { LottieColor c = mData->mColor.value(frameNo); - float opacity = mData->opacity(frameNo); + float opacity = mData->opacity(frameNo); mColor = c.toColor(opacity); mCap = mData->capStyle(); mJoin = mData->joinStyle(); @@ -886,33 +890,36 @@ void LOTStrokeItem::updateContent(int frameNo) static float getScale(const VMatrix &matrix) { constexpr float SQRT_2 = 1.41421; - VPointF p1(0,0); - VPointF p2(SQRT_2,SQRT_2); + VPointF p1(0, 0); + VPointF p2(SQRT_2, SQRT_2); p1 = matrix.map(p1); p2 = matrix.map(p2); VPointF final = p2 - p1; - return std::sqrt( final.x() * final.x() + final.y() * final.y()); + return std::sqrt(final.x() * final.x() + final.y() * final.y()); } -void LOTStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +void LOTStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, + VDrawable *drawable, bool sameParent) { VColor color = mColor; if (sameParent) - color.setAlpha(color.a * pathNode->combinedAlpha()); + color.setAlpha(color.a * pathNode->combinedAlpha()); else - color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); + color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); VBrush brush(color); drawable->setBrush(brush); - drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * getScale(mParentMatrix)); + drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, + mWidth * getScale(mParentMatrix)); if (mDashArraySize) { drawable->setDashInfo(mDashArray, mDashArraySize); } } -LOTGStrokeItem::LOTGStrokeItem(LOTGStrokeData *data):LOTPaintDataItem(data->isStatic()),mData(data) +LOTGStrokeItem::LOTGStrokeItem(LOTGStrokeData *data) + : LOTPaintDataItem(data->isStatic()), mData(data) { mDashArraySize = 0; } @@ -930,37 +937,32 @@ void LOTGStrokeItem::updateContent(int frameNo) } } -void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) +void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, + VDrawable *drawable, bool sameParent) { drawable->setBrush(VBrush(mGradient.get())); - drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * getScale(mParentMatrix)); + drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, + mWidth * getScale(mParentMatrix)); if (mDashArraySize) { drawable->setDashInfo(mDashArray, mDashArraySize); } } -LOTTrimItem::LOTTrimItem(LOTTrimData *data):mData(data) +LOTTrimItem::LOTTrimItem(LOTTrimData *data) : mData(data) {} + +void LOTTrimItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha, const DirtyFlag &flag) { } -void LOTTrimItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) {} + +void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, + float parentAlpha, const DirtyFlag &flag) { } -LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data):mData(data) -{ - -} - -void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) -{ - -} - -void LOTRepeaterItem::renderList(std::vector &list) -{ - -} +void LOTRepeaterItem::renderList(std::vector &list) {} void LOTDrawable::sync() { @@ -969,9 +971,9 @@ void LOTDrawable::sync() if (mFlag & DirtyState::Path) { const std::vector &elm = mPath.elements(); - const std::vector &pts = mPath.points(); + const std::vector & pts = mPath.points(); const float *ptPtr = reinterpret_cast(pts.data()); - const char *elmPtr = reinterpret_cast(elm.data()); + const char * elmPtr = reinterpret_cast(elm.data()); mCNode.mPath.elmPtr = elmPtr; mCNode.mPath.elmCount = elm.size(); mCNode.mPath.ptPtr = ptPtr; @@ -1060,5 +1062,3 @@ void LOTDrawable::sync() break; } } - - diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index 122dbe2094..b97dd6861d 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -1,85 +1,75 @@ #include "lottieloader.h" #include "lottieparser.h" -#include -#include +#include +#include using namespace std; -class LottieFileCache -{ +class LottieFileCache { public: - ~LottieFileCache(); - static LottieFileCache &get() { - static LottieFileCache CACHE; + ~LottieFileCache(); + static LottieFileCache &get() + { + static LottieFileCache CACHE; + + return CACHE; + } + std::shared_ptr find(std::string &key); + void add(std::string &key, std::shared_ptr value); - return CACHE; - } - std::shared_ptr find(std::string &key); - void add(std::string &key, std::shared_ptr value); private: - LottieFileCache(){} - - std::unordered_map> mHash; + LottieFileCache() {} + std::unordered_map> mHash; }; -LottieFileCache::~LottieFileCache() +LottieFileCache::~LottieFileCache() {} +std::shared_ptr LottieFileCache::find(std::string &key) { - -} -std::shared_ptr -LottieFileCache::find(std::string &key) -{ - auto search = mHash.find(key); - if (search != mHash.end()) { - return search->second; - } else { - return nullptr; - } + auto search = mHash.find(key); + if (search != mHash.end()) { + return search->second; + } else { + return nullptr; + } } -void -LottieFileCache::add(std::string &key, std::shared_ptr value) +void LottieFileCache::add(std::string &key, std::shared_ptr value) { - mHash[key] = value; + mHash[key] = value; } -LottieLoader::LottieLoader() -{ - -} +LottieLoader::LottieLoader() {} bool LottieLoader::load(std::string &path) { - LottieFileCache &fileCache = LottieFileCache::get(); + LottieFileCache &fileCache = LottieFileCache::get(); - mModel = fileCache.find(path); - if (mModel) - return true; + mModel = fileCache.find(path); + if (mModel) return true; - std::ifstream f; - f.open(path); + std::ifstream f; + f.open(path); - if (!f.is_open()) { - vCritical << "failed to open file = " << path.c_str(); - return false; - } else { - std::stringstream buf; - buf << f.rdbuf(); + if (!f.is_open()) { + vCritical << "failed to open file = " << path.c_str(); + return false; + } else { + std::stringstream buf; + buf << f.rdbuf(); - LottieParser parser(const_cast(buf.str().data())); - mModel = parser.model(); - fileCache.add(path, mModel); + LottieParser parser(const_cast(buf.str().data())); + mModel = parser.model(); + fileCache.add(path, mModel); - f.close(); - } + f.close(); + } - return true; + return true; } std::shared_ptr LottieLoader::model() { - return mModel; + return mModel; } - diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 17cbb00a36..7015749c09 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -1,13 +1,10 @@ #include "lottiemodel.h" -#include -#include +#include +#include - - -class LottieRepeaterProcesser : public LOTDataVisitor -{ +class LottieRepeaterProcesser : public LOTDataVisitor { public: - LottieRepeaterProcesser():mRepeaterFound(false){} + LottieRepeaterProcesser() : mRepeaterFound(false) {} void visit(LOTCompositionData *obj) {} void visit(LOTLayerData *obj) {} void visit(LOTTransformData *) {} @@ -16,24 +13,26 @@ public: void visit(LOTRectData *) {} void visit(LOTEllipseData *) {} void visit(LOTTrimData *) {} - void visit(LOTRepeaterData *) { mRepeaterFound = true;} + void visit(LOTRepeaterData *) { mRepeaterFound = true; } void visit(LOTFillData *) {} void visit(LOTStrokeData *) {} void visit(LOTPolystarData *) {} - void visitChildren(LOTGroupData *obj) { - for(auto child :obj->mChildren) { + void visitChildren(LOTGroupData *obj) + { + for (auto child : obj->mChildren) { child.get()->accept(this); if (mRepeaterFound) { - LOTRepeaterData *repeater = static_cast(child.get()); - std::shared_ptr sharedShapeGroup= std::make_shared(); + LOTRepeaterData *repeater = + static_cast(child.get()); + std::shared_ptr sharedShapeGroup = + std::make_shared(); LOTShapeGroupData *shapeGroup = sharedShapeGroup.get(); repeater->mChildren.push_back(sharedShapeGroup); // copy all the child of the object till repeater and // move that in to a group and then add that group to // the repeater object. - for(auto cpChild :obj->mChildren) { - if (cpChild == child) - break; + for (auto cpChild : obj->mChildren) { + if (cpChild == child) break; // there shouldn't be any trim object left in the child list if (cpChild.get()->type() == LOTData::Type::Trim) { assert(0); @@ -44,102 +43,113 @@ public: } } } + public: bool mRepeaterFound; }; -class LottiePathOperationProcesser : public LOTDataVisitor -{ +class LottiePathOperationProcesser : public LOTDataVisitor { public: - LottiePathOperationProcesser():mPathOperator(false), mPathNode(false){} + LottiePathOperationProcesser() : mPathOperator(false), mPathNode(false) {} void visit(LOTCompositionData *obj) {} void visit(LOTLayerData *obj) {} void visit(LOTTransformData *) {} void visit(LOTShapeGroupData *obj) {} - void visit(LOTShapeData *) {mPathNode = true;} - void visit(LOTRectData *) {mPathNode = true;} - void visit(LOTEllipseData *) { mPathNode = true;} - void visit(LOTTrimData *) { mPathOperator = true;} + void visit(LOTShapeData *) { mPathNode = true; } + void visit(LOTRectData *) { mPathNode = true; } + void visit(LOTEllipseData *) { mPathNode = true; } + void visit(LOTTrimData *) { mPathOperator = true; } void visit(LOTRepeaterData *) {} void visit(LOTFillData *) {} void visit(LOTStrokeData *) {} - void visit(LOTPolystarData *) { mPathNode = true;} - void visitChildren(LOTGroupData *obj) { + void visit(LOTPolystarData *) { mPathNode = true; } + void visitChildren(LOTGroupData *obj) + { int curOpCount = mPathOperationList.size(); mPathOperator = false; mPathNode = false; - for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); ++i) { + for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); + ++i) { auto child = *i; child.get()->accept(this); if (mPathOperator) { mPathOperationList.push_back(child); - //obj->mChildren.erase(std::next(i).base()); + // obj->mChildren.erase(std::next(i).base()); } if (mPathNode) { - updatePathObject(static_cast(child.get())); + updatePathObject(static_cast(child.get())); } mPathOperator = false; mPathNode = false; } - mPathOperationList.erase(mPathOperationList.begin() + curOpCount, mPathOperationList.end()); + mPathOperationList.erase(mPathOperationList.begin() + curOpCount, + mPathOperationList.end()); } - void updatePathObject(LOTPath *drawable) { - for (auto i = mPathOperationList.rbegin(); i != mPathOperationList.rend(); ++i) { + void updatePathObject(LOTPath *drawable) + { + for (auto i = mPathOperationList.rbegin(); + i != mPathOperationList.rend(); ++i) { drawable->mPathOperations.push_back(*i); } } + public: - bool mPathOperator; - bool mPathNode; + bool mPathOperator; + bool mPathNode; std::vector> mPathOperationList; }; -class LottiePaintOperationProcesser : public LOTDataVisitor -{ +class LottiePaintOperationProcesser : public LOTDataVisitor { public: - LottiePaintOperationProcesser():mPaintOperator(false), mPathNode(false){} + LottiePaintOperationProcesser() : mPaintOperator(false), mPathNode(false) {} void visit(LOTCompositionData *obj) {} void visit(LOTLayerData *obj) {} void visit(LOTTransformData *) {} void visit(LOTShapeGroupData *obj) {} - void visit(LOTShapeData *) {mPathNode = true;} - void visit(LOTRectData *) {mPathNode = true;} - void visit(LOTEllipseData *) { mPathNode = true;} + void visit(LOTShapeData *) { mPathNode = true; } + void visit(LOTRectData *) { mPathNode = true; } + void visit(LOTEllipseData *) { mPathNode = true; } void visit(LOTTrimData *) {} void visit(LOTRepeaterData *) {} - void visit(LOTFillData *) { mPaintOperator = true;} - void visit(LOTStrokeData *) { mPaintOperator = true;} - void visit(LOTPolystarData *) { mPathNode = true;} - void visitChildren(LOTGroupData *obj) { + void visit(LOTFillData *) { mPaintOperator = true; } + void visit(LOTStrokeData *) { mPaintOperator = true; } + void visit(LOTPolystarData *) { mPathNode = true; } + void visitChildren(LOTGroupData *obj) + { int curOpCount = mPaintOperationList.size(); mPaintOperator = false; mPathNode = false; - for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); ++i) { + for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); + ++i) { auto child = *i; child.get()->accept(this); if (mPaintOperator) { mPaintOperationList.push_back(child); - //obj->mChildren.erase(std::next(i).base()); + // obj->mChildren.erase(std::next(i).base()); } if (mPathNode) { - // put it in the list - updatePathObject(static_cast(child.get())); + // put it in the list + updatePathObject(static_cast(child.get())); } mPaintOperator = false; mPathNode = false; } - mPaintOperationList.erase(mPaintOperationList.begin() + curOpCount, mPaintOperationList.end()); + mPaintOperationList.erase(mPaintOperationList.begin() + curOpCount, + mPaintOperationList.end()); } - void updatePathObject(LOTPath *drawable) { - for (auto i = mPaintOperationList.begin(); i != mPaintOperationList.end(); ++i) { + void updatePathObject(LOTPath *drawable) + { + for (auto i = mPaintOperationList.begin(); + i != mPaintOperationList.end(); ++i) { drawable->mPaintOperations.push_back(*i); } } + public: - bool mPaintOperator; - bool mPathNode; + bool mPaintOperator; + bool mPathNode; std::vector> mPaintOperationList; }; @@ -161,7 +171,6 @@ void LOTCompositionData::processPaintOperatorObjects() accept(&visitor); } - VMatrix LOTTransformData::matrix(int frameNo) const { if (mStaticMatrix) @@ -172,7 +181,7 @@ VMatrix LOTTransformData::matrix(int frameNo) const float LOTTransformData::opacity(int frameNo) const { - return mOpacity.value(frameNo)/100.f; + return mOpacity.value(frameNo) / 100.f; } void LOTTransformData::cacheMatrix() @@ -183,10 +192,10 @@ void LOTTransformData::cacheMatrix() VMatrix LOTTransformData::computeMatrix(int frameNo) const { VMatrix m; - m.translate(mPosition.value(frameNo)). - rotate(mRotation.value(frameNo)). - scale(mScale.value(frameNo)/100.f). - translate(-mAnchor.value(frameNo)); + m.translate(mPosition.value(frameNo)) + .rotate(mRotation.value(frameNo)) + .scale(mScale.value(frameNo) / 100.f) + .translate(-mAnchor.value(frameNo)); return m; } @@ -199,14 +208,14 @@ int LOTStrokeData::getDashInfo(int frameNo, float *array) const array[i] = mDash.mDashArray[i].value(frameNo); } return mDash.mDashCount; - } else { // even case when last gap info is not provided. + } else { // even case when last gap info is not provided. int i; - for (i = 0; i < mDash.mDashCount-1 ; i++) { + for (i = 0; i < mDash.mDashCount - 1; i++) { array[i] = mDash.mDashArray[i].value(frameNo); } - array[i] = array[i-1]; - array[i+1] = mDash.mDashArray[i].value(frameNo); - return mDash.mDashCount+1; + array[i] = array[i - 1]; + array[i + 1] = mDash.mDashArray[i].value(frameNo); + return mDash.mDashCount + 1; } } @@ -219,14 +228,14 @@ int LOTGStrokeData::getDashInfo(int frameNo, float *array) const array[i] = mDash.mDashArray[i].value(frameNo); } return mDash.mDashCount; - } else { // even case when last gap info is not provided. + } else { // even case when last gap info is not provided. int i; - for (i = 0; i < mDash.mDashCount-1 ; i++) { + for (i = 0; i < mDash.mDashCount - 1; i++) { array[i] = mDash.mDashArray[i].value(frameNo); } - array[i] = array[i-1]; - array[i+1] = mDash.mDashArray[i].value(frameNo); - return mDash.mDashCount+1; + array[i] = array[i - 1]; + array[i + 1] = mDash.mDashArray[i].value(frameNo); + return mDash.mDashCount + 1; } } @@ -253,49 +262,57 @@ int LOTGStrokeData::getDashInfo(int frameNo, float *array) const void LOTGradient::populate(VGradientStops &stops, int frameNo) { LottieGradient gradData = mGradient.value(frameNo); - int size = gradData.mGradient.size(); - float *ptr = gradData.mGradient.data(); - int colorPoints = mColorPoints; - if (colorPoints == -1 ) { // for legacy bodymovin (ref: lottie-android) + int size = gradData.mGradient.size(); + float * ptr = gradData.mGradient.data(); + int colorPoints = mColorPoints; + if (colorPoints == -1) { // for legacy bodymovin (ref: lottie-android) colorPoints = size / 4; } - int opacityArraySize = size - colorPoints * 4; + int opacityArraySize = size - colorPoints * 4; float *opacityPtr = ptr + (colorPoints * 4); stops.clear(); int j = 0; - for (int i = 0; i < colorPoints ; i++) { - float colorStop = ptr[0]; + for (int i = 0; i < colorPoints; i++) { + float colorStop = ptr[0]; LottieColor color = LottieColor(ptr[1], ptr[2], ptr[3]); if (opacityArraySize) { if (j == opacityArraySize) { // already reached the end - float stop1 = opacityPtr[j-4]; - float op1 = opacityPtr[j-3]; - float stop2 = opacityPtr[j-2]; - float op2 = opacityPtr[j-1]; + float stop1 = opacityPtr[j - 4]; + float op1 = opacityPtr[j - 3]; + float stop2 = opacityPtr[j - 2]; + float op2 = opacityPtr[j - 1]; if (colorStop > stop2) { - stops.push_back(std::make_pair(colorStop, color.toColor(op2))); + stops.push_back( + std::make_pair(colorStop, color.toColor(op2))); } else { float progress = (colorStop - stop1) / (stop2 - stop1); float opacity = op1 + progress * (op2 - op1); - stops.push_back(std::make_pair(colorStop, color.toColor(opacity))); + stops.push_back( + std::make_pair(colorStop, color.toColor(opacity))); } continue; } - for (; j < opacityArraySize ; j += 2) { + for (; j < opacityArraySize; j += 2) { float opacityStop = opacityPtr[j]; if (opacityStop < colorStop) { // add a color using opacity stop - stops.push_back(std::make_pair(opacityStop, color.toColor(opacityPtr[j+1]))); + stops.push_back(std::make_pair( + opacityStop, color.toColor(opacityPtr[j + 1]))); continue; } // add a color using color stop if (j == 0) { - stops.push_back(std::make_pair(colorStop, color.toColor(opacityPtr[j+1]))); + stops.push_back(std::make_pair( + colorStop, color.toColor(opacityPtr[j + 1]))); } else { - float progress = (colorStop - opacityPtr[j-2]) / (opacityPtr[j] - opacityPtr[j-2]); - float opacity = opacityPtr[j-1] + progress * (opacityPtr[j+1] - opacityPtr[j-1]); - stops.push_back(std::make_pair(colorStop, color.toColor(opacity))); + float progress = (colorStop - opacityPtr[j - 2]) / + (opacityPtr[j] - opacityPtr[j - 2]); + float opacity = + opacityPtr[j - 1] + + progress * (opacityPtr[j + 1] - opacityPtr[j - 1]); + stops.push_back( + std::make_pair(colorStop, color.toColor(opacity))); } j += 2; break; @@ -312,9 +329,9 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) bool init = false; if (!grad) { if (mGradientType == 1) - grad = std::make_unique(0,0,0,0); + grad = std::make_unique(0, 0, 0, 0); else - grad = std::make_unique(0,0,0,0,0,0); + grad = std::make_unique(0, 0, 0, 0, 0, 0); grad->mSpread = VGradient::Spread::Pad; init = true; } @@ -323,39 +340,41 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) populate(grad->mStops, frameNo); } - if (mGradientType == 1) { //linear gradient + if (mGradientType == 1) { // linear gradient VPointF start = mStartPoint.value(frameNo); VPointF end = mEndPoint.value(frameNo); grad->linear.x1 = start.x(); grad->linear.y1 = start.y(); grad->linear.x2 = end.x(); grad->linear.y2 = end.y(); - } else { // radial gradient + } else { // radial gradient VPointF start = mStartPoint.value(frameNo); VPointF end = mEndPoint.value(frameNo); grad->radial.cx = start.x(); grad->radial.cy = start.y(); - grad->radial.cradius = vLineLength(start.x(), start.y(), end.x(), end.y()); + grad->radial.cradius = + vLineLength(start.x(), start.y(), end.x(), end.y()); /* - * Focal point is the point lives in highlight length distance from center along the - * line (start, end) and rotated by highlight angle. - * below calculation first finds the quadrant(angle) on which the point lives by applying - * inverse slope formula then adds the rotation angle to find the final angle. - * then point is retrived using circle equation of center, angle and distance. + * Focal point is the point lives in highlight length distance from + * center along the line (start, end) and rotated by highlight angle. + * below calculation first finds the quadrant(angle) on which the point + * lives by applying inverse slope formula then adds the rotation angle + * to find the final angle. then point is retrived using circle equation + * of center, angle and distance. */ - float progress = mHighlightLength.value(frameNo)/100.0f; + float progress = mHighlightLength.value(frameNo) / 100.0f; if (vCompare(progress, 1.0f)) progress = 0.99f; float dy = end.y() - start.y(); float dx = end.x() - start.x(); - float slope = (dx == 0) ? dy * INFINITY : dy/dx; + float slope = (dx == 0) ? dy * INFINITY : dy / dx; float startAngleRad = std::atan(slope); - int highlightAngle = mHighlightAngle.value(frameNo); - float angle = startAngleRad + (highlightAngle * M_PI/180.0f); - grad->radial.fx = grad->radial.cx + std::cos(angle) * progress * grad->radial.cradius; - grad->radial.fy = grad->radial.cy + std::sin(angle) * progress * grad->radial.cradius; + int highlightAngle = mHighlightAngle.value(frameNo); + float angle = startAngleRad + (highlightAngle * M_PI / 180.0f); + grad->radial.fx = + grad->radial.cx + std::cos(angle) * progress * grad->radial.cradius; + grad->radial.fy = + grad->radial.cy + std::sin(angle) * progress * grad->radial.cradius; // Lottie dosen't have any focal radius concept. grad->radial.fradius = 0; } } - - diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 3eede425ab..bcdc213d67 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -8,37 +8,36 @@ // callbacks. Instead, we retrieve values from the JSON stream by calling // GetInt(), GetDouble(), GetString() and GetBool(), traverse into structures // by calling EnterObject() and EnterArray(), and skip over unwanted data by -// calling SkipValue(). As we know the lottie file structure this way will be the efficient way -// of parsing the file. +// calling SkipValue(). As we know the lottie file structure this way will be +// the efficient way of parsing the file. // -// If you aren't sure of what's next in the JSON data, you can use PeekType() and -// PeekValue() to look ahead to the next object before reading it. +// If you aren't sure of what's next in the JSON data, you can use PeekType() +// and PeekValue() to look ahead to the next object before reading it. // -// If you call the wrong retrieval method--e.g. GetInt when the next JSON token is -// not an int, EnterObject or EnterArray when there isn't actually an object or array -// to read--the stream parsing will end immediately and no more data will be delivered. +// If you call the wrong retrieval method--e.g. GetInt when the next JSON token +// is not an int, EnterObject or EnterArray when there isn't actually an object +// or array to read--the stream parsing will end immediately and no more data +// will be delivered. // -// After calling EnterObject, you retrieve keys via NextObjectKey() and values via -// the normal getters. When NextObjectKey() returns null, you have exited the -// object, or you can call SkipObject() to skip to the end of the object -// immediately. If you fetch the entire object (i.e. NextObjectKey() returned null), -// you should not call SkipObject(). +// After calling EnterObject, you retrieve keys via NextObjectKey() and values +// via the normal getters. When NextObjectKey() returns null, you have exited +// the object, or you can call SkipObject() to skip to the end of the object +// immediately. If you fetch the entire object (i.e. NextObjectKey() returned +// null), you should not call SkipObject(). // -// After calling EnterArray(), you must alternate between calling NextArrayValue() -// to see if the array has more data, and then retrieving values via the normal -// getters. You can call SkipArray() to skip to the end of the array immediately. -// If you fetch the entire array (i.e. NextArrayValue() returned null), -// you should not call SkipArray(). +// After calling EnterArray(), you must alternate between calling +// NextArrayValue() to see if the array has more data, and then retrieving +// values via the normal getters. You can call SkipArray() to skip to the end of +// the array immediately. If you fetch the entire array (i.e. NextArrayValue() +// returned null), you should not call SkipArray(). // -// This parser uses in-situ strings, so the JSON buffer will be altered during the -// parse. +// This parser uses in-situ strings, so the JSON buffer will be altered during +// the parse. - -#include "rapidjson/document.h" #include #include "lottiemodel.h" -#include"velapsedtimer.h" - +#include "rapidjson/document.h" +#include "velapsedtimer.h" RAPIDJSON_DIAG_PUSH #ifdef __GNUC__ @@ -49,23 +48,84 @@ using namespace rapidjson; class LookaheadParserHandler { public: - bool Null() { st_ = kHasNull; v_.SetNull(); return true; } - bool Bool(bool b) { st_ = kHasBool; v_.SetBool(b); return true; } - bool Int(int i) { st_ = kHasNumber; v_.SetInt(i); return true; } - bool Uint(unsigned u) { st_ = kHasNumber; v_.SetUint(u); return true; } - bool Int64(int64_t i) { st_ = kHasNumber; v_.SetInt64(i); return true; } - bool Uint64(uint64_t u) { st_ = kHasNumber; v_.SetUint64(u); return true; } - bool Double(double d) { st_ = kHasNumber; v_.SetDouble(d); return true; } - bool RawNumber(const char*, SizeType, bool) { return false; } - bool String(const char* str, SizeType length, bool) { st_ = kHasString; v_.SetString(str, length); return true; } - bool StartObject() { st_ = kEnteringObject; return true; } - bool Key(const char* str, SizeType length, bool) { st_ = kHasKey; v_.SetString(str, length); return true; } - bool EndObject(SizeType) { st_ = kExitingObject; return true; } - bool StartArray() { st_ = kEnteringArray; return true; } - bool EndArray(SizeType) { st_ = kExitingArray; return true; } + bool Null() + { + st_ = kHasNull; + v_.SetNull(); + return true; + } + bool Bool(bool b) + { + st_ = kHasBool; + v_.SetBool(b); + return true; + } + bool Int(int i) + { + st_ = kHasNumber; + v_.SetInt(i); + return true; + } + bool Uint(unsigned u) + { + st_ = kHasNumber; + v_.SetUint(u); + return true; + } + bool Int64(int64_t i) + { + st_ = kHasNumber; + v_.SetInt64(i); + return true; + } + bool Uint64(uint64_t u) + { + st_ = kHasNumber; + v_.SetUint64(u); + return true; + } + bool Double(double d) + { + st_ = kHasNumber; + v_.SetDouble(d); + return true; + } + bool RawNumber(const char *, SizeType, bool) { return false; } + bool String(const char *str, SizeType length, bool) + { + st_ = kHasString; + v_.SetString(str, length); + return true; + } + bool StartObject() + { + st_ = kEnteringObject; + return true; + } + bool Key(const char *str, SizeType length, bool) + { + st_ = kHasKey; + v_.SetString(str, length); + return true; + } + bool EndObject(SizeType) + { + st_ = kExitingObject; + return true; + } + bool StartArray() + { + st_ = kEnteringArray; + return true; + } + bool EndArray(SizeType) + { + st_ = kExitingArray; + return true; + } protected: - LookaheadParserHandler(char* str); + LookaheadParserHandler(char *str); void ParseNext(); protected: @@ -83,93 +143,95 @@ protected: kExitingArray }; - Value v_; + Value v_; LookaheadParsingState st_; - Reader r_; - InsituStringStream ss_; + Reader r_; + InsituStringStream ss_; static const int parseFlags = kParseDefaultFlags | kParseInsituFlag; }; - class LottieParserImpl : protected LookaheadParserHandler { public: - LottieParserImpl(char* str) : LookaheadParserHandler(str) {} + LottieParserImpl(char *str) : LookaheadParserHandler(str) {} public: - bool EnterObject(); - bool EnterArray(); - const char* NextObjectKey(); - bool NextArrayValue(); - int GetInt(); - double GetDouble(); - const char* GetString(); - bool GetBool(); - void GetNull(); + bool EnterObject(); + bool EnterArray(); + const char *NextObjectKey(); + bool NextArrayValue(); + int GetInt(); + double GetDouble(); + const char *GetString(); + bool GetBool(); + void GetNull(); - void SkipObject(); - void SkipArray(); - void SkipValue(); - Value* PeekValue(); - int PeekType(); // returns a rapidjson::Type, or -1 for no value (at end of object/array) + void SkipObject(); + void SkipArray(); + void SkipValue(); + Value *PeekValue(); + int PeekType(); // returns a rapidjson::Type, or -1 for no value (at end of + // object/array) bool IsValid() { return st_ != kError; } - void Skip(const char *key); - VRect getRect(); - LottieBlendMode getBlendMode(); - CapStyle getLineCap(); - JoinStyle getLineJoin(); - FillRule getFillRule(); + void Skip(const char *key); + VRect getRect(); + LottieBlendMode getBlendMode(); + CapStyle getLineCap(); + JoinStyle getLineJoin(); + FillRule getFillRule(); LOTTrimData::TrimType getTrimType(); - MatteType getMatteType(); - LayerType getLayerType(); + MatteType getMatteType(); + LayerType getLayerType(); - std::shared_ptr composition() const {return mComposition;} - void parseComposition(); - void parseAssets(LOTCompositionData *comp); - std::shared_ptr parseAsset(); - void parseLayers(LOTCompositionData *comp); - std::shared_ptr parseLayer(); - void parseMaskProperty(LOTLayerData *layer); - void parseShapesAttr(LOTLayerData *layer); - void parseObject(LOTGroupData *parent); - std::shared_ptr parseMaskObject(); - std::shared_ptr parseObjectTypeAttr(); - std::shared_ptr parseGroupObject(); - std::shared_ptr parseRectObject(); - std::shared_ptr parseEllipseObject(); - std::shared_ptr parseShapeObject(); - std::shared_ptr parsePolystarObject(); + std::shared_ptr composition() const + { + return mComposition; + } + void parseComposition(); + void parseAssets(LOTCompositionData *comp); + std::shared_ptr parseAsset(); + void parseLayers(LOTCompositionData *comp); + std::shared_ptr parseLayer(); + void parseMaskProperty(LOTLayerData *layer); + void parseShapesAttr(LOTLayerData *layer); + void parseObject(LOTGroupData *parent); + std::shared_ptr parseMaskObject(); + std::shared_ptr parseObjectTypeAttr(); + std::shared_ptr parseGroupObject(); + std::shared_ptr parseRectObject(); + std::shared_ptr parseEllipseObject(); + std::shared_ptr parseShapeObject(); + std::shared_ptr parsePolystarObject(); std::shared_ptr parseTransformObject(); - std::shared_ptr parseFillObject(); - std::shared_ptr parseGFillObject(); - std::shared_ptr parseStrokeObject(); - std::shared_ptr parseGStrokeObject(); - std::shared_ptr parseTrimObject(); - std::shared_ptr parseReapeaterObject(); - + std::shared_ptr parseFillObject(); + std::shared_ptr parseGFillObject(); + std::shared_ptr parseStrokeObject(); + std::shared_ptr parseGStrokeObject(); + std::shared_ptr parseTrimObject(); + std::shared_ptr parseReapeaterObject(); void parseGradientProperty(LOTGradient *gradient, const char *key); VPointF parseInperpolatorPoint(); - void parseArrayValue(VPointF &pt); - void parseArrayValue(LottieColor &pt); - void parseArrayValue(float &val); - void parseArrayValue(int &val); - void parseArrayValue(LottieGradient &gradient); - void getValue(VPointF &val); - void getValue(float &val); - void getValue(LottieColor &val); - void getValue(int &val); - void getValue(LottieShapeData &shape); - void getValue(LottieGradient &gradient); - template - bool parseKeyFrameValue(const char* key, LOTKeyFrameValue &value); - template + void parseArrayValue(VPointF &pt); + void parseArrayValue(LottieColor &pt); + void parseArrayValue(float &val); + void parseArrayValue(int &val); + void parseArrayValue(LottieGradient &gradient); + void getValue(VPointF &val); + void getValue(float &val); + void getValue(LottieColor &val); + void getValue(int &val); + void getValue(LottieShapeData &shape); + void getValue(LottieGradient &gradient); + template + bool parseKeyFrameValue(const char *key, LOTKeyFrameValue &value); + template void parseKeyFrame(LOTAnimInfo &obj); - template + template void parseProperty(LOTAnimatable &obj); void parseShapeKeyFrame(LOTAnimInfo &obj); @@ -180,35 +242,39 @@ public: LottieColor toColor(const char *str); void resolveLayerRefs(); + protected: - std::shared_ptr mComposition; - LOTCompositionData *compRef; - LOTLayerData *curLayerRef; - std::vector> mLayersToUpdate; - void SkipOut(int depth); + std::shared_ptr mComposition; + LOTCompositionData * compRef; + LOTLayerData * curLayerRef; + std::vector> mLayersToUpdate; + void SkipOut(int depth); }; -LookaheadParserHandler::LookaheadParserHandler(char* str) : v_(), st_(kInit), r_(), ss_(str) { +LookaheadParserHandler::LookaheadParserHandler(char *str) + : v_(), st_(kInit), r_(), ss_(str) +{ r_.IterativeParseInit(); ParseNext(); } -void LookaheadParserHandler::ParseNext() { +void LookaheadParserHandler::ParseNext() +{ if (r_.HasParseError()) { st_ = kError; return; } if (!r_.IterativeParseNext(ss_, *this)) { - vCritical<<"Lottie file parsing error"; + vCritical << "Lottie file parsing error"; RAPIDJSON_ASSERT(0); } } - -bool LottieParserImpl::EnterObject() { +bool LottieParserImpl::EnterObject() +{ if (st_ != kEnteringObject) { - st_ = kError; + st_ = kError; RAPIDJSON_ASSERT(false); return false; } @@ -217,9 +283,10 @@ bool LottieParserImpl::EnterObject() { return true; } -bool LottieParserImpl::EnterArray() { +bool LottieParserImpl::EnterArray() +{ if (st_ != kEnteringArray) { - st_ = kError; + st_ = kError; RAPIDJSON_ASSERT(false); return false; } @@ -228,9 +295,10 @@ bool LottieParserImpl::EnterArray() { return true; } -const char* LottieParserImpl::NextObjectKey() { +const char *LottieParserImpl::NextObjectKey() +{ if (st_ == kHasKey) { - const char* result = v_.GetString(); + const char *result = v_.GetString(); ParseNext(); return result; } @@ -241,10 +309,10 @@ const char* LottieParserImpl::NextObjectKey() { * object we can call multiple time NextObjectKey() while exiting the object * so ignore those and don't put parser in the error state. * */ - if (st_ == kExitingArray || st_ == kEnteringObject ) { -// #ifdef DEBUG_PARSER -// vDebug<<"Object: Exiting nested loop"; -// #endif + if (st_ == kExitingArray || st_ == kEnteringObject) { + // #ifdef DEBUG_PARSER + // vDebug<<"Object: Exiting nested loop"; + // #endif return 0; } @@ -258,7 +326,8 @@ const char* LottieParserImpl::NextObjectKey() { return 0; } -bool LottieParserImpl::NextArrayValue() { +bool LottieParserImpl::NextArrayValue() +{ if (st_ == kExitingArray) { ParseNext(); return false; @@ -268,13 +337,12 @@ bool LottieParserImpl::NextArrayValue() { * same as NextObjectKey() */ if (st_ == kExitingObject) { -// #ifdef DEBUG_PARSER -// vDebug<<"Array: Exiting nested loop"; -// #endif + // #ifdef DEBUG_PARSER + // vDebug<<"Array: Exiting nested loop"; + // #endif return 0; } - if (st_ == kError || st_ == kHasKey) { RAPIDJSON_ASSERT(false); st_ = kError; @@ -284,7 +352,8 @@ bool LottieParserImpl::NextArrayValue() { return true; } -int LottieParserImpl::GetInt() { +int LottieParserImpl::GetInt() +{ if (st_ != kHasNumber || !v_.IsInt()) { st_ = kError; RAPIDJSON_ASSERT(false); @@ -296,9 +365,10 @@ int LottieParserImpl::GetInt() { return result; } -double LottieParserImpl::GetDouble() { +double LottieParserImpl::GetDouble() +{ if (st_ != kHasNumber) { - st_ = kError; + st_ = kError; RAPIDJSON_ASSERT(false); return 0.; } @@ -308,9 +378,10 @@ double LottieParserImpl::GetDouble() { return result; } -bool LottieParserImpl::GetBool() { +bool LottieParserImpl::GetBool() +{ if (st_ != kHasBool) { - st_ = kError; + st_ = kError; RAPIDJSON_ASSERT(false); return false; } @@ -320,58 +391,62 @@ bool LottieParserImpl::GetBool() { return result; } -void LottieParserImpl::GetNull() { +void LottieParserImpl::GetNull() +{ if (st_ != kHasNull) { - st_ = kError; + st_ = kError; return; } ParseNext(); } -const char* LottieParserImpl::GetString() { +const char *LottieParserImpl::GetString() +{ if (st_ != kHasString) { - st_ = kError; + st_ = kError; RAPIDJSON_ASSERT(false); return 0; } - const char* result = v_.GetString(); + const char *result = v_.GetString(); ParseNext(); return result; } -void LottieParserImpl::SkipOut(int depth) { +void LottieParserImpl::SkipOut(int depth) +{ do { if (st_ == kEnteringArray || st_ == kEnteringObject) { ++depth; - } - else if (st_ == kExitingArray || st_ == kExitingObject) { + } else if (st_ == kExitingArray || st_ == kExitingObject) { --depth; - } - else if (st_ == kError) { + } else if (st_ == kError) { RAPIDJSON_ASSERT(false); return; } ParseNext(); - } - while (depth > 0); + } while (depth > 0); } -void LottieParserImpl::SkipValue() { +void LottieParserImpl::SkipValue() +{ SkipOut(0); } -void LottieParserImpl::SkipArray() { +void LottieParserImpl::SkipArray() +{ SkipOut(1); } -void LottieParserImpl::SkipObject() { +void LottieParserImpl::SkipObject() +{ SkipOut(1); } -Value* LottieParserImpl::PeekValue() { +Value *LottieParserImpl::PeekValue() +{ if (st_ >= kHasNull && st_ <= kHasKey) { return &v_; } @@ -379,7 +454,8 @@ Value* LottieParserImpl::PeekValue() { return 0; } -int LottieParserImpl::PeekType() { +int LottieParserImpl::PeekType() +{ if (st_ >= kHasNull && st_ <= kHasKey) { return v_.GetType(); } @@ -408,8 +484,7 @@ void LottieParserImpl::Skip(const char *key) } } -LottieBlendMode -LottieParserImpl::getBlendMode() +LottieBlendMode LottieParserImpl::getBlendMode() { RAPIDJSON_ASSERT(PeekType() == kNumberType); LottieBlendMode mode = LottieBlendMode::Normal; @@ -434,7 +509,7 @@ VRect LottieParserImpl::getRect() VRect r; RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "l")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); r.setLeft(GetInt()); @@ -456,25 +531,24 @@ VRect LottieParserImpl::getRect() void LottieParserImpl::resolveLayerRefs() { - for(auto i : mLayersToUpdate) { + for (auto i : mLayersToUpdate) { LOTLayerData *layer = i.get(); - auto search = compRef->mAssets.find(layer->mPreCompRefId); + auto search = compRef->mAssets.find(layer->mPreCompRefId); if (search != compRef->mAssets.end()) { - layer->mChildren = search->second.get()->mLayers; - } + layer->mChildren = search->second.get()->mLayers; + } } } - -void -LottieParserImpl::parseComposition() +void LottieParserImpl::parseComposition() { RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - std::shared_ptr sharedComposition = std::make_shared(); + std::shared_ptr sharedComposition = + std::make_shared(); LOTCompositionData *comp = sharedComposition.get(); compRef = comp; - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "v")) { RAPIDJSON_ASSERT(PeekType() == kStringType); comp->mVersion = std::string(GetString()); @@ -499,7 +573,7 @@ LottieParserImpl::parseComposition() parseLayers(comp); } else { #ifdef DEBUG_PARSER - vWarning<<"Composition Attribute Skipped : "<mAssets[asset->mRefId] = asset; } // update the precomp layers with the actual layer object - } /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/layers/shape.json * */ -std::shared_ptr -LottieParserImpl::parseAsset() +std::shared_ptr LottieParserImpl::parseAsset() { RAPIDJSON_ASSERT(PeekType() == kObjectType); std::shared_ptr sharedAsset = std::make_shared(); - LOTAsset *asset = sharedAsset.get(); + LOTAsset * asset = sharedAsset.get(); EnterObject(); - while (const char* key = NextObjectKey()) { - if (0 == strcmp(key, "ty")) { /* Type of layer: Shape. Value 4.*/ + while (const char *key = NextObjectKey()) { + if (0 == strcmp(key, "ty")) { /* Type of layer: Shape. Value 4.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); asset->mAssetType = GetInt(); - } else if (0 == strcmp(key, "id")) { /* reference id*/ + } else if (0 == strcmp(key, "id")) { /* reference id*/ RAPIDJSON_ASSERT(PeekType() == kStringType); asset->mRefId = std::string(GetString()); - }else if (0 == strcmp(key, "layers")) { + } else if (0 == strcmp(key, "layers")) { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { @@ -553,9 +625,9 @@ LottieParserImpl::parseAsset() asset->mLayers.push_back(layer); } } else { - #ifdef DEBUG_PARSER - vWarning<<"Asset Attribute Skipped : "< -LottieParserImpl::parseLayer() +std::shared_ptr LottieParserImpl::parseLayer() { RAPIDJSON_ASSERT(PeekType() == kObjectType); - std::shared_ptr sharedLayer = std::make_shared(); + std::shared_ptr sharedLayer = + std::make_shared(); LOTLayerData *layer = sharedLayer.get(); curLayerRef = layer; bool hasLayerRef = false; EnterObject(); - while (const char* key = NextObjectKey()) { - if (0 == strcmp(key, "ty")) { /* Type of layer*/ + while (const char *key = NextObjectKey()) { + if (0 == strcmp(key, "ty")) { /* Type of layer*/ layer->mLayerType = getLayerType(); - } else if (0 == strcmp(key, "ind")) { /*Layer index in AE. Used for parenting and expressions.*/ + } else if (0 == strcmp(key, "ind")) { /*Layer index in AE. Used for + parenting and expressions.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mId = GetInt(); - } else if (0 == strcmp(key, "parent")) { /*Layer Parent. Uses "ind" of parent.*/ + } else if (0 == + strcmp(key, + "parent")) { /*Layer Parent. Uses "ind" of parent.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mParentId = GetInt(); } else if (0 == strcmp(key, "refId")) { /*preComp Layer reference id*/ @@ -671,18 +747,18 @@ LottieParserImpl::parseLayer() layer->mPreCompRefId = std::string(GetString()); mLayersToUpdate.push_back(sharedLayer); hasLayerRef = true; - }else if (0 == strcmp(key, "sr")) { // "Layer Time Stretching" + } else if (0 == strcmp(key, "sr")) { // "Layer Time Stretching" RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mTimeStreatch = GetDouble(); - } else if (0 == strcmp(key, "tm")) { // time remapping + } else if (0 == strcmp(key, "tm")) { // time remapping parseProperty(layer->mTimeRemap); - }else if (0 == strcmp(key, "ip")) { + } else if (0 == strcmp(key, "ip")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mInFrame = std::round(GetDouble()); } else if (0 == strcmp(key, "op")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mOutFrame = std::round(GetDouble()); - } else if (0 == strcmp(key, "st")) { + } else if (0 == strcmp(key, "st")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mStartFrame = GetDouble(); } else if (0 == strcmp(key, "bounds")) { @@ -709,10 +785,10 @@ LottieParserImpl::parseLayer() layer->mHasMask = GetBool(); } else if (0 == strcmp(key, "masksProperties")) { parseMaskProperty(layer); - }else { - #ifdef DEBUG_PARSER - vWarning<<"Layer Attribute Skipped : "<isStatic(); } - layer->setStatic(staticFlag && - layer->mTransform->isStatic() && + layer->setStatic(staticFlag && layer->mTransform->isStatic() && !hasLayerRef); return sharedLayer; @@ -742,15 +817,14 @@ void LottieParserImpl::parseMaskProperty(LOTLayerData *layer) } } -std::shared_ptr -LottieParserImpl::parseMaskObject() +std::shared_ptr LottieParserImpl::parseMaskObject() { std::shared_ptr sharedMask = std::make_shared(); - LOTMaskData *obj = sharedMask.get(); + LOTMaskData * obj = sharedMask.get(); RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "inv")) { obj->mInv = GetBool(); } else if (0 == strcmp(key, "mode")) { @@ -784,8 +858,6 @@ LottieParserImpl::parseMaskObject() return sharedMask; } - - void LottieParserImpl::parseShapesAttr(LOTLayerData *layer) { RAPIDJSON_ASSERT(PeekType() == kArrayType); @@ -795,8 +867,7 @@ void LottieParserImpl::parseShapesAttr(LOTLayerData *layer) } } -std::shared_ptr -LottieParserImpl::parseObjectTypeAttr() +std::shared_ptr LottieParserImpl::parseObjectTypeAttr() { RAPIDJSON_ASSERT(PeekType() == kStringType); const char *type = GetString(); @@ -826,23 +897,21 @@ LottieParserImpl::parseObjectTypeAttr() return parseReapeaterObject(); } else { #ifdef DEBUG_PARSER - vDebug<<"The Object Type not yet handled = "<< type; + vDebug << "The Object Type not yet handled = " << type; #endif return nullptr; } } -void -LottieParserImpl::parseObject(LOTGroupData *parent) +void LottieParserImpl::parseObject(LOTGroupData *parent) { RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "ty")) { auto child = parseObjectTypeAttr(); if (child) { - if (child) - parent->mChildren.push_back(child); + if (child) parent->mChildren.push_back(child); } } else { Skip(key); @@ -850,13 +919,13 @@ LottieParserImpl::parseObject(LOTGroupData *parent) } } -std::shared_ptr -LottieParserImpl::parseGroupObject() +std::shared_ptr LottieParserImpl::parseGroupObject() { - std::shared_ptr sharedGroup = std::make_shared(); + std::shared_ptr sharedGroup = + std::make_shared(); LOTShapeGroupData *group = sharedGroup.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "it")) { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); @@ -864,7 +933,8 @@ LottieParserImpl::parseGroupObject() RAPIDJSON_ASSERT(PeekType() == kObjectType); parseObject(group); } - group->mTransform = std::dynamic_pointer_cast(group->mChildren.back()); + group->mTransform = std::dynamic_pointer_cast( + group->mChildren.back()); group->mChildren.pop_back(); } else { Skip(key); @@ -875,8 +945,7 @@ LottieParserImpl::parseGroupObject() staticFlag &= child.get()->isStatic(); } - group->setStatic(staticFlag && - group->mTransform->isStatic()); + group->setStatic(staticFlag && group->mTransform->isStatic()); return sharedGroup; } @@ -884,13 +953,12 @@ LottieParserImpl::parseGroupObject() /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/rect.json */ -std::shared_ptr -LottieParserImpl::parseRectObject() +std::shared_ptr LottieParserImpl::parseRectObject() { std::shared_ptr sharedRect = std::make_shared(); - LOTRectData *obj = sharedRect.get(); + LOTRectData * obj = sharedRect.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "p")) { parseProperty(obj->mPos); } else if (0 == strcmp(key, "s")) { @@ -903,8 +971,7 @@ LottieParserImpl::parseRectObject() Skip(key); } } - obj->setStatic(obj->mPos.isStatic() && - obj->mSize.isStatic() && + obj->setStatic(obj->mPos.isStatic() && obj->mSize.isStatic() && obj->mRound.isStatic()); return sharedRect; } @@ -912,13 +979,13 @@ LottieParserImpl::parseRectObject() /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/ellipse.json */ -std::shared_ptr -LottieParserImpl::parseEllipseObject() +std::shared_ptr LottieParserImpl::parseEllipseObject() { - std::shared_ptr sharedEllipse = std::make_shared(); + std::shared_ptr sharedEllipse = + std::make_shared(); LOTEllipseData *obj = sharedEllipse.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "p")) { parseProperty(obj->mPos); } else if (0 == strcmp(key, "s")) { @@ -929,28 +996,27 @@ LottieParserImpl::parseEllipseObject() Skip(key); } } - obj->setStatic(obj->mPos.isStatic() && - obj->mSize.isStatic()); + obj->setStatic(obj->mPos.isStatic() && obj->mSize.isStatic()); return sharedEllipse; } /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/shape.json */ -std::shared_ptr -LottieParserImpl::parseShapeObject() +std::shared_ptr LottieParserImpl::parseShapeObject() { - std::shared_ptr sharedShape = std::make_shared(); + std::shared_ptr sharedShape = + std::make_shared(); LOTShapeData *obj = sharedShape.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "ks")) { parseShapeProperty(obj->mShape); } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); } else { #ifdef DEBUG_PARSER - vDebug<<"Shape property ignored :"< -LottieParserImpl::parsePolystarObject() +std::shared_ptr LottieParserImpl::parsePolystarObject() { - std::shared_ptr sharedPolystar = std::make_shared(); + std::shared_ptr sharedPolystar = + std::make_shared(); LOTPolystarData *obj = sharedPolystar.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "p")) { parseProperty(obj->mPos); } else if (0 == strcmp(key, "pt")) { @@ -986,32 +1052,27 @@ LottieParserImpl::parsePolystarObject() parseProperty(obj->mRotation); } else if (0 == strcmp(key, "sy")) { int starType = GetInt(); - if (starType == 1) - obj->mType = LOTPolystarData::PolyType::Star; - if (starType == 2) - obj->mType = LOTPolystarData::PolyType::Polygon; + if (starType == 1) obj->mType = LOTPolystarData::PolyType::Star; + if (starType == 2) obj->mType = LOTPolystarData::PolyType::Polygon; } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); } else { #ifdef DEBUG_PARSER - vDebug<<"Polystar property ignored :"<setStatic(obj->mPos.isStatic() && - obj->mPointCount.isStatic() && - obj->mInnerRadius.isStatic() && - obj->mInnerRoundness.isStatic() && - obj->mOuterRadius.isStatic() && - obj->mOuterRoundness.isStatic() && - obj->mRotation.isStatic()); + obj->setStatic( + obj->mPos.isStatic() && obj->mPointCount.isStatic() && + obj->mInnerRadius.isStatic() && obj->mInnerRoundness.isStatic() && + obj->mOuterRadius.isStatic() && obj->mOuterRoundness.isStatic() && + obj->mRotation.isStatic()); return sharedPolystar; } -LOTTrimData::TrimType -LottieParserImpl::getTrimType() +LOTTrimData::TrimType LottieParserImpl::getTrimType() { RAPIDJSON_ASSERT(PeekType() == kNumberType); switch (GetInt()) { @@ -1030,42 +1091,40 @@ LottieParserImpl::getTrimType() /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/trim.json */ -std::shared_ptr -LottieParserImpl::parseTrimObject() +std::shared_ptr LottieParserImpl::parseTrimObject() { std::shared_ptr sharedTrim = std::make_shared(); - LOTTrimData *obj = sharedTrim.get(); + LOTTrimData * obj = sharedTrim.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "s")) { parseProperty(obj->mStart); } else if (0 == strcmp(key, "e")) { parseProperty(obj->mEnd); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOffset); - } else if (0 == strcmp(key, "m")) { + } else if (0 == strcmp(key, "m")) { obj->mTrimType = getTrimType(); } else { #ifdef DEBUG_PARSER - vDebug<<"Trim property ignored :"<setStatic(obj->mStart.isStatic() && - obj->mEnd.isStatic() && + obj->setStatic(obj->mStart.isStatic() && obj->mEnd.isStatic() && obj->mOffset.isStatic()); curLayerRef->mHasPathOperator = true; return sharedTrim; } -std::shared_ptr -LottieParserImpl::parseReapeaterObject() +std::shared_ptr LottieParserImpl::parseReapeaterObject() { - std::shared_ptr sharedRepeater = std::make_shared(); + std::shared_ptr sharedRepeater = + std::make_shared(); LOTRepeaterData *obj = sharedRepeater.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "c")) { parseProperty(obj->mCopies); } else if (0 == strcmp(key, "o")) { @@ -1074,29 +1133,27 @@ LottieParserImpl::parseReapeaterObject() obj->mTransform = parseTransformObject(); } else { #ifdef DEBUG_PARSER - vDebug<<"Repeater property ignored :"<setStatic(obj->mCopies.isStatic() && - obj->mOffset.isStatic() && + obj->setStatic(obj->mCopies.isStatic() && obj->mOffset.isStatic() && obj->mTransform->isStatic()); return sharedRepeater; } - /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/transform.json */ -std::shared_ptr -LottieParserImpl::parseTransformObject() +std::shared_ptr LottieParserImpl::parseTransformObject() { - std::shared_ptr sharedTransform = std::make_shared(); + std::shared_ptr sharedTransform = + std::make_shared(); LOTTransformData *obj = sharedTransform.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "a")) { parseProperty(obj->mAnchor); } else if (0 == strcmp(key, "p")) { @@ -1107,7 +1164,7 @@ LottieParserImpl::parseTransformObject() parseProperty(obj->mScale); } else if (0 == strcmp(key, "sk")) { parseProperty(obj->mSkew); - } else if (0 == strcmp(key, "sa")) { + } else if (0 == strcmp(key, "sa")) { parseProperty(obj->mSkewAxis); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); @@ -1115,16 +1172,12 @@ LottieParserImpl::parseTransformObject() Skip(key); } } - obj->mStaticMatrix = obj->mAnchor.isStatic() && - obj->mPosition.isStatic() && - obj->mRotation.isStatic() && - obj->mScale.isStatic() && - obj->mSkew.isStatic() && - obj->mSkewAxis.isStatic(); - obj->setStatic(obj->mStaticMatrix && obj->mOpacity.isStatic() ); + obj->mStaticMatrix = obj->mAnchor.isStatic() && obj->mPosition.isStatic() && + obj->mRotation.isStatic() && obj->mScale.isStatic() && + obj->mSkew.isStatic() && obj->mSkewAxis.isStatic(); + obj->setStatic(obj->mStaticMatrix && obj->mOpacity.isStatic()); - if (obj->mStaticMatrix) - obj->cacheMatrix(); + if (obj->mStaticMatrix) obj->cacheMatrix(); return sharedTransform; } @@ -1132,13 +1185,12 @@ LottieParserImpl::parseTransformObject() /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/fill.json */ -std::shared_ptr -LottieParserImpl::parseFillObject() +std::shared_ptr LottieParserImpl::parseFillObject() { std::shared_ptr sharedFill = std::make_shared(); - LOTFillData *obj = sharedFill.get(); + LOTFillData * obj = sharedFill.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "c")) { parseProperty(obj->mColor); } else if (0 == strcmp(key, "o")) { @@ -1149,13 +1201,12 @@ LottieParserImpl::parseFillObject() obj->mFillRule = getFillRule(); } else { #ifdef DEBUG_PARSER - vWarning<<"Fill property skipped = "<mColor); } else if (0 == strcmp(key, "o")) { @@ -1243,20 +1294,17 @@ LottieParserImpl::parseStrokeObject() parseDashProperty(obj->mDash); } else { #ifdef DEBUG_PARSER - vWarning<<"Stroke property skipped = "<mHighlightAngle); } else if (0 == strcmp(key, "g")) { EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "k")) { parseProperty(obj->mGradient); } else if (0 == strcmp(key, "p")) { obj->mColorPoints = GetInt(); - } else { + } else { Skip(nullptr); } } } else { #ifdef DEBUG_PARSER - vWarning<<"Gradient property skipped = "<mFillRule = getFillRule(); } else { @@ -1325,7 +1370,7 @@ void LottieParserImpl::parseDashProperty(LOTDashProperty &dash) while (NextArrayValue()) { RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "v")) { parseProperty(dash.mDashArray[dash.mDashCount++]); } else { @@ -1335,7 +1380,7 @@ void LottieParserImpl::parseDashProperty(LOTDashProperty &dash) } // update the staic proprty - for (int i = 0 ; i < dash.mDashCount ; i++) { + for (int i = 0; i < dash.mDashCount; i++) { if (!dash.mDashArray[i].isStatic()) { dash.mStatic = false; break; @@ -1346,13 +1391,13 @@ void LottieParserImpl::parseDashProperty(LOTDashProperty &dash) /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/gstroke.json */ -std::shared_ptr -LottieParserImpl::parseGStrokeObject() +std::shared_ptr LottieParserImpl::parseGStrokeObject() { - std::shared_ptr sharedGStroke = std::make_shared(); + std::shared_ptr sharedGStroke = + std::make_shared(); LOTGStrokeData *obj = sharedGStroke.get(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "w")) { parseProperty(obj->mWidth); } else if (0 == strcmp(key, "lc")) { @@ -1364,13 +1409,12 @@ LottieParserImpl::parseGStrokeObject() obj->mMeterLimit = GetDouble(); } else if (0 == strcmp(key, "d")) { parseDashProperty(obj->mDash); - } else { + } else { parseGradientProperty(obj, key); } } - obj->setStatic(obj->isStatic() && - obj->mWidth.isStatic() && + obj->setStatic(obj->isStatic() && obj->mWidth.isStatic() && obj->mDash.mStatic); return sharedGStroke; } @@ -1378,7 +1422,7 @@ LottieParserImpl::parseGStrokeObject() void LottieParserImpl::parseArrayValue(LottieColor &color) { float val[4]; - int i=0; + int i = 0; while (NextArrayValue()) { val[i++] = GetDouble(); } @@ -1391,7 +1435,7 @@ void LottieParserImpl::parseArrayValue(LottieColor &color) void LottieParserImpl::parseArrayValue(VPointF &pt) { float val[4]; - int i=0; + int i = 0; while (NextArrayValue()) { val[i++] = GetDouble(); } @@ -1427,7 +1471,7 @@ void LottieParserImpl::parseArrayValue(std::vector &v) void LottieParserImpl::getValue(VPointF &pt) { float val[4]; - int i=0; + int i = 0; RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { @@ -1454,7 +1498,7 @@ void LottieParserImpl::getValue(float &val) void LottieParserImpl::getValue(LottieColor &color) { float val[4]; - int i=0; + int i = 0; RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { @@ -1497,23 +1541,22 @@ void LottieParserImpl::getValue(int &val) void LottieParserImpl::getValue(LottieShapeData &obj) { - std::vector inPoint; /* "i" */ - std::vector outPoint; /* "o" */ - std::vector vertices; /* "v" */ - std::vector points; - bool closed=false; + std::vector inPoint; /* "i" */ + std::vector outPoint; /* "o" */ + std::vector vertices; /* "v" */ + std::vector points; + bool closed = false; /* * The shape object could be wrapped by a array * if its part of the keyframe object */ bool arrayWrapper = (PeekType() == kArrayType); - if (arrayWrapper) - EnterArray(); + if (arrayWrapper) EnterArray(); RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "i")) { parseArrayValue(inPoint); } else if (0 == strcmp(key, "o")) { @@ -1522,52 +1565,54 @@ void LottieParserImpl::getValue(LottieShapeData &obj) parseArrayValue(vertices); } else if (0 == strcmp(key, "c")) { closed = GetBool(); - }else { + } else { RAPIDJSON_ASSERT(0); Skip(nullptr); } } // exit properly from the array - if (arrayWrapper) - NextArrayValue(); + if (arrayWrapper) NextArrayValue(); - -/* - * Convert the AE shape format to - * list of bazier curves - * The final structure will be Move +size*Cubic + Cubic (if the path is closed one) - */ + /* + * Convert the AE shape format to + * list of bazier curves + * The final structure will be Move +size*Cubic + Cubic (if the path is + * closed one) + */ if (inPoint.size() != outPoint.size() || inPoint.size() != vertices.size()) { - vCritical<<"The Shape data are corrupted"; + vCritical << "The Shape data are corrupted"; points = std::vector(); } else { int size = vertices.size(); - points.reserve(3*size + 4); + points.reserve(3 * size + 4); points.push_back(vertices[0]); - for (int i =1; i -bool LottieParserImpl::parseKeyFrameValue(const char* key, LOTKeyFrameValue &value) +template +bool LottieParserImpl::parseKeyFrameValue(const char * key, + LOTKeyFrameValue &value) { if (0 == strcmp(key, "s")) { getValue(value.mStartValue); @@ -1607,8 +1653,9 @@ bool LottieParserImpl::parseKeyFrameValue(const char* key, LOTKeyFrameValue & return true; } -template<> -bool LottieParserImpl::parseKeyFrameValue(const char* key, LOTKeyFrameValue &value) +template <> +bool LottieParserImpl::parseKeyFrameValue(const char * key, + LOTKeyFrameValue &value) { if (0 == strcmp(key, "s")) { getValue(value.mStartValue); @@ -1629,74 +1676,75 @@ bool LottieParserImpl::parseKeyFrameValue(const char* key, LOTKeyFrameValue +template void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) { EnterObject(); LOTKeyFrame keyframe; - VPointF inTangent; - VPointF outTangent; - const char *interpolatorKey = nullptr; - bool hold = false; - while (const char* key = NextObjectKey()) { - if (0 == strcmp(key, "i")) { - inTangent = parseInperpolatorPoint(); - } else if (0 == strcmp(key, "o")) { - outTangent = parseInperpolatorPoint(); - } else if (0 == strcmp(key, "n")) { - if (PeekType() == kStringType) { + VPointF inTangent; + VPointF outTangent; + const char * interpolatorKey = nullptr; + bool hold = false; + while (const char *key = NextObjectKey()) { + if (0 == strcmp(key, "i")) { + inTangent = parseInperpolatorPoint(); + } else if (0 == strcmp(key, "o")) { + outTangent = parseInperpolatorPoint(); + } else if (0 == strcmp(key, "n")) { + if (PeekType() == kStringType) { interpolatorKey = GetString(); - } else { + } else { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { RAPIDJSON_ASSERT(PeekType() == kStringType); interpolatorKey = GetString(); } - } - continue; - } else if (0 == strcmp(key, "t")) { - keyframe.mStartFrame = GetDouble(); - } else if (parseKeyFrameValue(key, keyframe.mValue)) { - continue; - } else if (0 == strcmp(key, "h")) { - hold = GetInt(); - continue; - } else { + } + continue; + } else if (0 == strcmp(key, "t")) { + keyframe.mStartFrame = GetDouble(); + } else if (parseKeyFrameValue(key, keyframe.mValue)) { + continue; + } else if (0 == strcmp(key, "h")) { + hold = GetInt(); + continue; + } else { #ifdef DEBUG_PARSER - vDebug<<"key frame property skipped = "<mInterpolatorCache.find(interpolatorKey); - if (search != compRef->mInterpolatorCache.end()) { - keyframe.mInterpolator = search->second; - } else { - keyframe.mInterpolator = std::make_shared(VInterpolator(inTangent, outTangent)); - compRef->mInterpolatorCache[interpolatorKey] = keyframe.mInterpolator; - } - obj.mKeyFrames.push_back(keyframe); - } + // Try to find the interpolator from cache + if (interpolatorKey) { + auto search = compRef->mInterpolatorCache.find(interpolatorKey); + if (search != compRef->mInterpolatorCache.end()) { + keyframe.mInterpolator = search->second; + } else { + keyframe.mInterpolator = std::make_shared( + VInterpolator(inTangent, outTangent)); + compRef->mInterpolatorCache[interpolatorKey] = + keyframe.mInterpolator; + } + obj.mKeyFrames.push_back(keyframe); + } } - /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/properties/shapeKeyframed.json */ @@ -1704,18 +1752,18 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/properties/shape.json */ -void -LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) +void LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) { EnterObject(); - while (const char* key = NextObjectKey()) { + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "k")) { if (PeekType() == kArrayType) { EnterArray(); while (NextArrayValue()) { RAPIDJSON_ASSERT(PeekType() == kObjectType); if (!obj.mAnimInfo) - obj.mAnimInfo = std::make_unique>(); + obj.mAnimInfo = + std::make_unique>(); parseKeyFrame(*obj.mAnimInfo.get()); } } else { @@ -1723,7 +1771,7 @@ LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) } } else { #ifdef DEBUG_PARSER - vDebug<<"shape property ignored = "< &obj) } } } - } else if (0 == strcmp(key, "ix")){ + } else if (0 == strcmp(key, "ix")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); obj.mPropertyIndex = GetInt(); } else { @@ -1775,74 +1823,95 @@ void LottieParserImpl::parseProperty(LOTAnimatable &obj) } } -class LOTDataInspector : public LOTDataVisitor -{ +class LOTDataInspector : public LOTDataVisitor { public: - void visit(LOTCompositionData *obj) { - vDebug<<"[COMP_START:: static:"<isStatic()<<" v:"<mVersion<<" [{ stFm endFm fmRate } { "<mStartFrame<<" "<mEndFrame<<" }]\n"; + void visit(LOTCompositionData *obj) + { + vDebug << "[COMP_START:: static:" << obj->isStatic() + << " v:" << obj->mVersion << " [{ stFm endFm fmRate } { " + << obj->mStartFrame << " " << obj->mEndFrame << " }]\n"; } - void visit(LOTLayerData *obj) { - vDebug<<"[LAYER_START:: type:"<mLayerType)<<" id:"<mId<<" Pid:"<mParentId - <<" static:"<isStatic()<<"[{ stFm endFm stTm tmStrch } { " - <mInFrame<<" "<mOutFrame<<" "<mStartFrame<<" "<mTimeStreatch <<" }]"; + void visit(LOTLayerData *obj) + { + vDebug << "[LAYER_START:: type:" << layerType(obj->mLayerType) + << " id:" << obj->mId << " Pid:" << obj->mParentId + << " static:" << obj->isStatic() + << "[{ stFm endFm stTm tmStrch } { " << obj->mInFrame << " " + << obj->mOutFrame << " " << obj->mStartFrame << " " + << obj->mTimeStreatch << " }]"; } - void visit(LOTTransformData *t) { - vDebug<<"[TRANSFORM: static: "<isStatic()<<" ]"; + void visit(LOTTransformData *t) + { + vDebug << "[TRANSFORM: static: " << t->isStatic() << " ]"; } - void visit(LOTShapeGroupData *o) { - vDebug<<"[GROUP_START:: static:"<isStatic()<<"]"; + void visit(LOTShapeGroupData *o) + { + vDebug << "[GROUP_START:: static:" << o->isStatic() << "]"; } - void visit(LOTShapeData *s) { - vDebug<<"[SHAPE: static:"<isStatic()<<"]"; + void visit(LOTShapeData *s) + { + vDebug << "[SHAPE: static:" << s->isStatic() << "]"; } - void visit(LOTRectData *r) { - vDebug<<"[RECT: static:"<isStatic()<<"]"; + void visit(LOTRectData *r) + { + vDebug << "[RECT: static:" << r->isStatic() << "]"; } - void visit(LOTEllipseData *e) { - vDebug<<"[ELLIPSE: static:"<isStatic()<<"]"; + void visit(LOTEllipseData *e) + { + vDebug << "[ELLIPSE: static:" << e->isStatic() << "]"; } - void visit(LOTTrimData *t) { - vDebug<<"[TRIM: static: "<isStatic()<<" ]"; + void visit(LOTTrimData *t) + { + vDebug << "[TRIM: static: " << t->isStatic() << " ]"; } - void visit(LOTRepeaterData *r) { - vDebug<<"[REPEATER: static:"<isStatic()<<"]"; + void visit(LOTRepeaterData *r) + { + vDebug << "[REPEATER: static:" << r->isStatic() << "]"; } - void visit(LOTFillData *f) { - vDebug<<"[FILL: static:"<isStatic()<<"]"; + void visit(LOTFillData *f) + { + vDebug << "[FILL: static:" << f->isStatic() << "]"; } - void visit(LOTGFillData *f) { - vDebug<<"[GFILL: static:"<isStatic()<<" ty:"<mGradientType<<" s:"<mStartPoint.value(0)<<" e:"<mEndPoint.value(0)<<"]"; + void visit(LOTGFillData *f) + { + vDebug << "[GFILL: static:" << f->isStatic() + << " ty:" << f->mGradientType << " s:" << f->mStartPoint.value(0) + << " e:" << f->mEndPoint.value(0) << "]"; } - void visit(LOTGStrokeData *f) { - vDebug<<"[GSTROKE: static:"<isStatic()<<"]"; + void visit(LOTGStrokeData *f) + { + vDebug << "[GSTROKE: static:" << f->isStatic() << "]"; } - void visit(LOTStrokeData *s) { - vDebug<<"[STROKE: static:"<isStatic()<<"]"; + void visit(LOTStrokeData *s) + { + vDebug << "[STROKE: static:" << s->isStatic() << "]"; } - void visitChildren(LOTGroupData *obj) { - for(auto child :obj->mChildren) - child.get()->accept(this); + void visitChildren(LOTGroupData *obj) + { + for (auto child : obj->mChildren) child.get()->accept(this); switch (obj->type()) { - case LOTData::Type::Layer: - { + case LOTData::Type::Layer: { LOTLayerData *layer = static_cast(obj); - vDebug<<"[LAYER_END:: type:"<mLayerType).c_str()<<" id:"<mId<<"\n"; + vDebug << "[LAYER_END:: type:" + << layerType(layer->mLayerType).c_str() + << " id:" << layer->mId << "\n"; break; } case LOTData::Type::ShapeGroup: - vDebug<<"[GROUP_END]"; + vDebug << "[GROUP_END]"; break; case LOTData::Type::Composition: - vDebug<<"[COMP End ]\n"; + vDebug << "[COMP End ]\n"; break; case LOTData::Type::Repeater: - vDebug<<"[REPEATER End ]"; + vDebug << "[REPEATER End ]"; break; default: break; } } - std::string layerType(LayerType type) { + std::string layerType(LayerType type) + { switch (type) { case LayerType::Precomp: return "Precomp"; @@ -1874,24 +1943,24 @@ LottieParser::~LottieParser() delete d; } -LottieParser::LottieParser(char* str): d(new LottieParserImpl(str)) +LottieParser::LottieParser(char *str) : d(new LottieParserImpl(str)) { d->parseComposition(); } std::shared_ptr LottieParser::model() { - std::shared_ptr model= std::make_shared(); - model->mRoot = d->composition(); - model->mRoot->processPathOperatorObjects(); - model->mRoot->processRepeaterObjects(); + std::shared_ptr model = std::make_shared(); + model->mRoot = d->composition(); + model->mRoot->processPathOperatorObjects(); + model->mRoot->processRepeaterObjects(); #ifdef DEBUG_PARSER - LOTDataInspector inspector; - model->mRoot->accept(&inspector); + LOTDataInspector inspector; + model->mRoot->accept(&inspector); #endif - return model; + return model; } RAPIDJSON_DIAG_POP diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index f2264be686..4405290429 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -1,32 +1,32 @@ #include -#include "lottiemodel.h" -#include "lottieloader.h" #include "lottieitem.h" +#include "lottieloader.h" +#include "lottiemodel.h" -#include +#include - -class LOTPlayerPrivate -{ +class LOTPlayerPrivate { public: - LOTPlayerPrivate(); - bool setFilePath(std::string path); - void setSize(const VSize &sz); - void size(int &w, int &h) const; - float playTime() const; - bool setPos(float pos); - float pos(); - const std::vector& renderList()const; - bool render(float pos, const LOTBuffer &buffer); + LOTPlayerPrivate(); + bool setFilePath(std::string path); + void setSize(const VSize &sz); + void size(int &w, int &h) const; + float playTime() const; + bool setPos(float pos); + float pos(); + const std::vector &renderList() const; + bool render(float pos, const LOTBuffer &buffer); + public: - std::string mFilePath; - std::shared_ptr mModel; - std::unique_ptr mCompItem; - VSize mSize; - std::atomic mRenderInProgress; + std::string mFilePath; + std::shared_ptr mModel; + std::unique_ptr mCompItem; + VSize mSize; + std::atomic mRenderInProgress; + private: - float mPos; + float mPos; }; void LOTPlayerPrivate::setSize(const VSize &sz) @@ -52,10 +52,10 @@ void LOTPlayerPrivate::size(int &w, int &h) const h = size.height(); } -const std::vector& LOTPlayerPrivate::renderList() const +const std::vector &LOTPlayerPrivate::renderList() const { if (!mCompItem.get()) { - //FIXME: Reference is not good... + // FIXME: Reference is not good... } return mCompItem->renderList(); @@ -63,34 +63,34 @@ const std::vector& LOTPlayerPrivate::renderList() const float LOTPlayerPrivate::playTime() const { - if (mModel->isStatic()) return 0; - return float(mModel->frameDuration()) / float(mModel->frameRate()); + if (mModel->isStatic()) return 0; + return float(mModel->frameDuration()) / float(mModel->frameRate()); } bool LOTPlayerPrivate::setPos(float pos) { - if (!mModel || !mCompItem) return false; + if (!mModel || !mCompItem) return false; - if (pos > 1.0) pos = 1.0; - if (pos < 0) pos = 0; - if (mModel->isStatic()) pos = 0; + if (pos > 1.0) pos = 1.0; + if (pos < 0) pos = 0; + if (mModel->isStatic()) pos = 0; - if (vCompare(pos, mPos)) return true; + if (vCompare(pos, mPos)) return true; - int frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); - return mCompItem->update(frameNumber); + int frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); + return mCompItem->update(frameNumber); } float LOTPlayerPrivate::pos() { - return mPos; + return mPos; } bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) { bool renderInProgress = mRenderInProgress.load(); if (renderInProgress) - vCritical<<"Already Rendering Scheduled for this Player"; + vCritical << "Already Rendering Scheduled for this Player"; mRenderInProgress.store(true); @@ -107,27 +107,23 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) return result; } -LOTPlayerPrivate::LOTPlayerPrivate():mRenderInProgress(false), mPos(-1) +LOTPlayerPrivate::LOTPlayerPrivate() : mRenderInProgress(false), mPos(-1) {} + +bool LOTPlayerPrivate::setFilePath(std::string path) { + if (path.empty()) { + vWarning << "File path is empty"; + return false; + } -} - -bool -LOTPlayerPrivate::setFilePath(std::string path) -{ - if (path.empty()) { - vWarning << "File path is empty"; - return false; - } - - LottieLoader loader; - if (loader.load(path)) { - mModel = loader.model(); - mCompItem = std::make_unique(mModel.get()); - setPos(0); - return true; - } - return false; + LottieLoader loader; + if (loader.load(path)) { + mModel = loader.model(); + mCompItem = std::make_unique(mModel.get()); + setPos(0); + return true; + } + return false; } /* @@ -137,30 +133,28 @@ LOTPlayerPrivate::setFilePath(std::string path) * on the number of cores available in the system and does a simple fair * scheduling by assigning the task in a round-robin fashion. Each thread * in the threadpool has its own queue. once it finishes all the task on its - * own queue it goes through rest of the queue and looks for task if it founds one - * it steals the task from it and executes. if it couldn't find one then it just waits - * for new task on its own queue. + * own queue it goes through rest of the queue and looks for task if it founds + * one it steals the task from it and executes. if it couldn't find one then it + * just waits for new task on its own queue. */ -struct RenderTask -{ - RenderTask() { - receiver = sender.get_future(); - } - std::promise sender; - std::future receiver; - LOTPlayerPrivate *playerImpl; - float pos; - LOTBuffer buffer; +struct RenderTask { + RenderTask() { receiver = sender.get_future(); } + std::promise sender; + std::future receiver; + LOTPlayerPrivate * playerImpl; + float pos; + LOTBuffer buffer; }; -#include +#include class RenderTaskScheduler { - const unsigned _count{std::thread::hardware_concurrency()}; + const unsigned _count{std::thread::hardware_concurrency()}; std::vector _threads; std::vector> _q{_count}; - std::atomic _index{0}; + std::atomic _index{0}; - void run(unsigned i) { + void run(unsigned i) + { while (true) { RenderTask *task = nullptr; @@ -176,21 +170,22 @@ class RenderTaskScheduler { } public: - RenderTaskScheduler() { + RenderTaskScheduler() + { for (unsigned n = 0; n != _count; ++n) { _threads.emplace_back([&, n] { run(n); }); } } - ~RenderTaskScheduler() { - for (auto& e : _q) - e.done(); + ~RenderTaskScheduler() + { + for (auto &e : _q) e.done(); - for (auto& e : _threads) - e.join(); + for (auto &e : _threads) e.join(); } - std::future async(RenderTask *task) { + std::future async(RenderTask *task) + { auto receiver = std::move(task->receiver); auto i = _index++; @@ -203,8 +198,9 @@ public: return receiver; } - std::future render(LOTPlayerPrivate *impl, - float pos, LOTBuffer &buffer) { + std::future render(LOTPlayerPrivate *impl, float pos, + LOTBuffer &buffer) + { RenderTask *task = new RenderTask(); task->playerImpl = impl; task->pos = pos; @@ -214,17 +210,13 @@ public: }; static RenderTaskScheduler render_scheduler; -LOTPlayer::LOTPlayer():d(new LOTPlayerPrivate()) -{ - -} +LOTPlayer::LOTPlayer() : d(new LOTPlayerPrivate()) {} LOTPlayer::~LOTPlayer() { - delete d; + delete d; } - /** * \breif Brief abput the Api. * Description about the setFilePath Api @@ -233,35 +225,35 @@ LOTPlayer::~LOTPlayer() bool LOTPlayer::setFilePath(const char *filePath) { - return d->setFilePath(filePath); + return d->setFilePath(filePath); } void LOTPlayer::setSize(int width, int height) { - d->setSize(VSize(width, height)); + d->setSize(VSize(width, height)); } void LOTPlayer::size(int &width, int &height) const { - d->size(width, height); + d->size(width, height); } float LOTPlayer::playTime() const { - return d->playTime(); + return d->playTime(); } void LOTPlayer::setPos(float pos) { - d->setPos(pos); + d->setPos(pos); } float LOTPlayer::pos() { - return d->pos(); + return d->pos(); } -const std::vector& LOTPlayer::renderList()const +const std::vector &LOTPlayer::renderList() const { return d->renderList(); } @@ -276,13 +268,6 @@ bool LOTPlayer::renderSync(float pos, LOTBuffer &buffer) return d->render(pos, buffer); } -LOTNode::~LOTNode() -{ -} - -LOTNode::LOTNode() -{ -} - - +LOTNode::~LOTNode() {} +LOTNode::LOTNode() {} diff --git a/src/vector/freetype/v_ft_math.cpp b/src/vector/freetype/v_ft_math.cpp index e1c8ad46e2..381ab6c889 100644 --- a/src/vector/freetype/v_ft_math.cpp +++ b/src/vector/freetype/v_ft_math.cpp @@ -15,85 +15,69 @@ /* */ /***************************************************************************/ -#include #include "v_ft_math.h" +#include +#define SW_FT_MSB(x) (31 - __builtin_clz(x)) -#define SW_FT_MSB( x ) ( 31 - __builtin_clz( x ) ) +#define SW_FT_PAD_FLOOR(x, n) ((x) & ~((n)-1)) +#define SW_FT_PAD_ROUND(x, n) SW_FT_PAD_FLOOR((x) + ((n) / 2), n) +#define SW_FT_PAD_CEIL(x, n) SW_FT_PAD_FLOOR((x) + ((n)-1), n) -#define SW_FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) -#define SW_FT_PAD_ROUND( x, n ) SW_FT_PAD_FLOOR( (x) + ((n)/2), n ) -#define SW_FT_PAD_CEIL( x, n ) SW_FT_PAD_FLOOR( (x) + ((n)-1), n ) - - -#define SW_FT_BEGIN_STMNT do { -#define SW_FT_END_STMNT } while ( 0 ) +#define SW_FT_BEGIN_STMNT do { +#define SW_FT_END_STMNT \ + } \ + while (0) /* transfer sign leaving a positive number */ -#define SW_FT_MOVE_SIGN( x, s ) \ -SW_FT_BEGIN_STMNT \ - if ( x < 0 ) \ - { \ - x = -x; \ - s = -s; \ - } \ -SW_FT_END_STMNT +#define SW_FT_MOVE_SIGN(x, s) \ + SW_FT_BEGIN_STMNT \ + if (x < 0) { \ + x = -x; \ + s = -s; \ + } \ + SW_FT_END_STMNT - - - -SW_FT_Long -SW_FT_MulFix( SW_FT_Long a, - SW_FT_Long b ) +SW_FT_Long SW_FT_MulFix(SW_FT_Long a, SW_FT_Long b) { - SW_FT_Int s = 1; - SW_FT_Long c; + SW_FT_Int s = 1; + SW_FT_Long c; + SW_FT_MOVE_SIGN(a, s); + SW_FT_MOVE_SIGN(b, s); - SW_FT_MOVE_SIGN( a, s ); - SW_FT_MOVE_SIGN( b, s ); + c = (SW_FT_Long)(((SW_FT_Int64)a * b + 0x8000L) >> 16); - c = (SW_FT_Long)( ( (SW_FT_Int64)a * b + 0x8000L ) >> 16 ); - - return ( s > 0 ) ? c : -c; + return (s > 0) ? c : -c; } -SW_FT_Long -SW_FT_MulDiv( SW_FT_Long a, - SW_FT_Long b, - SW_FT_Long c ) +SW_FT_Long SW_FT_MulDiv(SW_FT_Long a, SW_FT_Long b, SW_FT_Long c) { - SW_FT_Int s = 1; - SW_FT_Long d; + SW_FT_Int s = 1; + SW_FT_Long d; + SW_FT_MOVE_SIGN(a, s); + SW_FT_MOVE_SIGN(b, s); + SW_FT_MOVE_SIGN(c, s); - SW_FT_MOVE_SIGN( a, s ); - SW_FT_MOVE_SIGN( b, s ); - SW_FT_MOVE_SIGN( c, s ); + d = (SW_FT_Long)(c > 0 ? ((SW_FT_Int64)a * b + (c >> 1)) / c : 0x7FFFFFFFL); - d = (SW_FT_Long)( c > 0 ? ( (SW_FT_Int64)a * b + ( c >> 1 ) ) / c - : 0x7FFFFFFFL ); - - return ( s > 0 ) ? d : -d; + return (s > 0) ? d : -d; } -SW_FT_Long -SW_FT_DivFix( SW_FT_Long a, - SW_FT_Long b ) +SW_FT_Long SW_FT_DivFix(SW_FT_Long a, SW_FT_Long b) { - SW_FT_Int s = 1; - SW_FT_Long q; + SW_FT_Int s = 1; + SW_FT_Long q; + SW_FT_MOVE_SIGN(a, s); + SW_FT_MOVE_SIGN(b, s); - SW_FT_MOVE_SIGN( a, s ); - SW_FT_MOVE_SIGN( b, s ); + q = (SW_FT_Long)(b > 0 ? (((SW_FT_UInt64)a << 16) + (b >> 1)) / b + : 0x7FFFFFFFL); - q = (SW_FT_Long)( b > 0 ? ( ( (SW_FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b - : 0x7FFFFFFFL ); - - return ( s < 0 ? -q : q ); + return (s < 0 ? -q : q); } - /*************************************************************************/ /* */ /* This is a fixed-point CORDIC implementation of trigonometric */ @@ -108,421 +92,334 @@ SW_FT_DivFix( SW_FT_Long a, /* */ /*************************************************************************/ - /* the Cordic shrink factor 0.858785336480436 * 2^32 */ -#define SW_FT_TRIG_SCALE 0xDBD95B16UL +/* the Cordic shrink factor 0.858785336480436 * 2^32 */ +#define SW_FT_TRIG_SCALE 0xDBD95B16UL - /* the highest bit in overflow-safe vector components, */ - /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ -#define SW_FT_TRIG_SAFE_MSB 29 +/* the highest bit in overflow-safe vector components, */ +/* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ +#define SW_FT_TRIG_SAFE_MSB 29 - /* this table was generated for SW_FT_PI = 180L << 16, i.e. degrees */ -#define SW_FT_TRIG_MAX_ITERS 23 +/* this table was generated for SW_FT_PI = 180L << 16, i.e. degrees */ +#define SW_FT_TRIG_MAX_ITERS 23 - static const SW_FT_Fixed - ft_trig_arctan_table[] = - { - 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, - 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, - 57L, 29L, 14L, 7L, 4L, 2L, 1L - }; +static const SW_FT_Fixed ft_trig_arctan_table[] = { + 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, 14668L, + 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, 57L, + 29L, 14L, 7L, 4L, 2L, 1L}; - /* multiply a given value by the CORDIC shrink factor */ - static SW_FT_Fixed - ft_trig_downscale( SW_FT_Fixed val ) - { - SW_FT_Fixed s; - SW_FT_Int64 v; +/* multiply a given value by the CORDIC shrink factor */ +static SW_FT_Fixed ft_trig_downscale(SW_FT_Fixed val) +{ + SW_FT_Fixed s; + SW_FT_Int64 v; + s = val; + val = SW_FT_ABS(val); - s = val; - val = SW_FT_ABS( val ); + v = (val * (SW_FT_Int64)SW_FT_TRIG_SCALE) + 0x100000000UL; + val = (SW_FT_Fixed)(v >> 32); - v = ( val * (SW_FT_Int64)SW_FT_TRIG_SCALE ) + 0x100000000UL; - val = (SW_FT_Fixed)( v >> 32 ); - - return ( s >= 0 ) ? val : -val; - } - - - - /* undefined and never called for zero vector */ - static SW_FT_Int - ft_trig_prenorm( SW_FT_Vector* vec ) - { - SW_FT_Pos x, y; - SW_FT_Int shift; + return (s >= 0) ? val : -val; +} +/* undefined and never called for zero vector */ +static SW_FT_Int ft_trig_prenorm(SW_FT_Vector* vec) +{ + SW_FT_Pos x, y; + SW_FT_Int shift; x = vec->x; y = vec->y; - shift = SW_FT_MSB( SW_FT_ABS( x ) | SW_FT_ABS( y ) ); + shift = SW_FT_MSB(SW_FT_ABS(x) | SW_FT_ABS(y)); - if ( shift <= SW_FT_TRIG_SAFE_MSB ) - { - shift = SW_FT_TRIG_SAFE_MSB - shift; - vec->x = (SW_FT_Pos)( (SW_FT_ULong)x << shift ); - vec->y = (SW_FT_Pos)( (SW_FT_ULong)y << shift ); - } - else - { - shift -= SW_FT_TRIG_SAFE_MSB; - vec->x = x >> shift; - vec->y = y >> shift; - shift = -shift; + if (shift <= SW_FT_TRIG_SAFE_MSB) { + shift = SW_FT_TRIG_SAFE_MSB - shift; + vec->x = (SW_FT_Pos)((SW_FT_ULong)x << shift); + vec->y = (SW_FT_Pos)((SW_FT_ULong)y << shift); + } else { + shift -= SW_FT_TRIG_SAFE_MSB; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; } return shift; - } - - - static void - ft_trig_pseudo_rotate( SW_FT_Vector* vec, - SW_FT_Angle theta ) - { - SW_FT_Int i; - SW_FT_Fixed x, y, xtemp, b; - const SW_FT_Fixed *arctanptr; +} +static void ft_trig_pseudo_rotate(SW_FT_Vector* vec, SW_FT_Angle theta) +{ + SW_FT_Int i; + SW_FT_Fixed x, y, xtemp, b; + const SW_FT_Fixed* arctanptr; x = vec->x; y = vec->y; /* Rotate inside [-PI/4,PI/4] sector */ - while ( theta < -SW_FT_ANGLE_PI4 ) - { - xtemp = y; - y = -x; - x = xtemp; - theta += SW_FT_ANGLE_PI2; + while (theta < -SW_FT_ANGLE_PI4) { + xtemp = y; + y = -x; + x = xtemp; + theta += SW_FT_ANGLE_PI2; } - while ( theta > SW_FT_ANGLE_PI4 ) - { - xtemp = -y; - y = x; - x = xtemp; - theta -= SW_FT_ANGLE_PI2; + while (theta > SW_FT_ANGLE_PI4) { + xtemp = -y; + y = x; + x = xtemp; + theta -= SW_FT_ANGLE_PI2; } arctanptr = ft_trig_arctan_table; /* Pseudorotations, with right shifts */ - for ( i = 1, b = 1; i < SW_FT_TRIG_MAX_ITERS; b <<= 1, i++ ) - { - if ( theta < 0 ) - { - xtemp = x + ( ( y + b ) >> i ); - y = y - ( ( x + b ) >> i ); - x = xtemp; - theta += *arctanptr++; - } - else - { - xtemp = x - ( ( y + b ) >> i ); - y = y + ( ( x + b ) >> i ); - x = xtemp; - theta -= *arctanptr++; - } + for (i = 1, b = 1; i < SW_FT_TRIG_MAX_ITERS; b <<= 1, i++) { + if (theta < 0) { + xtemp = x + ((y + b) >> i); + y = y - ((x + b) >> i); + x = xtemp; + theta += *arctanptr++; + } else { + xtemp = x - ((y + b) >> i); + y = y + ((x + b) >> i); + x = xtemp; + theta -= *arctanptr++; + } } vec->x = x; vec->y = y; - } - - - static void - ft_trig_pseudo_polarize( SW_FT_Vector* vec ) - { - SW_FT_Angle theta; - SW_FT_Int i; - SW_FT_Fixed x, y, xtemp, b; - const SW_FT_Fixed *arctanptr; +} +static void ft_trig_pseudo_polarize(SW_FT_Vector* vec) +{ + SW_FT_Angle theta; + SW_FT_Int i; + SW_FT_Fixed x, y, xtemp, b; + const SW_FT_Fixed* arctanptr; x = vec->x; y = vec->y; /* Get the vector into [-PI/4,PI/4] sector */ - if ( y > x ) - { - if ( y > -x ) - { - theta = SW_FT_ANGLE_PI2; - xtemp = y; - y = -x; - x = xtemp; - } - else - { - theta = y > 0 ? SW_FT_ANGLE_PI : -SW_FT_ANGLE_PI; - x = -x; - y = -y; - } - } - else - { - if ( y < -x ) - { - theta = -SW_FT_ANGLE_PI2; - xtemp = -y; - y = x; - x = xtemp; - } - else - { - theta = 0; - } + if (y > x) { + if (y > -x) { + theta = SW_FT_ANGLE_PI2; + xtemp = y; + y = -x; + x = xtemp; + } else { + theta = y > 0 ? SW_FT_ANGLE_PI : -SW_FT_ANGLE_PI; + x = -x; + y = -y; + } + } else { + if (y < -x) { + theta = -SW_FT_ANGLE_PI2; + xtemp = -y; + y = x; + x = xtemp; + } else { + theta = 0; + } } arctanptr = ft_trig_arctan_table; /* Pseudorotations, with right shifts */ - for ( i = 1, b = 1; i < SW_FT_TRIG_MAX_ITERS; b <<= 1, i++ ) - { - if ( y > 0 ) - { - xtemp = x + ( ( y + b ) >> i ); - y = y - ( ( x + b ) >> i ); - x = xtemp; - theta += *arctanptr++; - } - else - { - xtemp = x - ( ( y + b ) >> i ); - y = y + ( ( x + b ) >> i ); - x = xtemp; - theta -= *arctanptr++; - } + for (i = 1, b = 1; i < SW_FT_TRIG_MAX_ITERS; b <<= 1, i++) { + if (y > 0) { + xtemp = x + ((y + b) >> i); + y = y - ((x + b) >> i); + x = xtemp; + theta += *arctanptr++; + } else { + xtemp = x - ((y + b) >> i); + y = y + ((x + b) >> i); + x = xtemp; + theta -= *arctanptr++; + } } /* round theta */ - if ( theta >= 0 ) - theta = SW_FT_PAD_ROUND( theta, 32 ); + if (theta >= 0) + theta = SW_FT_PAD_ROUND(theta, 32); else - theta = -SW_FT_PAD_ROUND( -theta, 32 ); + theta = -SW_FT_PAD_ROUND(-theta, 32); vec->x = x; vec->y = theta; - } +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ - - SW_FT_Fixed - SW_FT_Cos( SW_FT_Angle angle ) - { - SW_FT_Vector v; - +SW_FT_Fixed SW_FT_Cos(SW_FT_Angle angle) +{ + SW_FT_Vector v; v.x = SW_FT_TRIG_SCALE >> 8; v.y = 0; - ft_trig_pseudo_rotate( &v, angle ); + ft_trig_pseudo_rotate(&v, angle); - return ( v.x + 0x80L ) >> 8; - } + return (v.x + 0x80L) >> 8; +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ +SW_FT_Fixed SW_FT_Sin(SW_FT_Angle angle) +{ + return SW_FT_Cos(SW_FT_ANGLE_PI2 - angle); +} - SW_FT_Fixed - SW_FT_Sin( SW_FT_Angle angle ) - { - return SW_FT_Cos( SW_FT_ANGLE_PI2 - angle ); - } - - - /* documentation is in fttrigon.h */ - - SW_FT_Fixed - SW_FT_Tan( SW_FT_Angle angle ) - { - SW_FT_Vector v; +/* documentation is in fttrigon.h */ +SW_FT_Fixed SW_FT_Tan(SW_FT_Angle angle) +{ + SW_FT_Vector v; v.x = SW_FT_TRIG_SCALE >> 8; v.y = 0; - ft_trig_pseudo_rotate( &v, angle ); + ft_trig_pseudo_rotate(&v, angle); - return SW_FT_DivFix( v.y, v.x ); - } + return SW_FT_DivFix(v.y, v.x); +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ +SW_FT_Angle SW_FT_Atan2(SW_FT_Fixed dx, SW_FT_Fixed dy) +{ + SW_FT_Vector v; - SW_FT_Angle - SW_FT_Atan2( SW_FT_Fixed dx, - SW_FT_Fixed dy ) - { - SW_FT_Vector v; - - - if ( dx == 0 && dy == 0 ) - return 0; + if (dx == 0 && dy == 0) return 0; v.x = dx; v.y = dy; - ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); + ft_trig_prenorm(&v); + ft_trig_pseudo_polarize(&v); return v.y; - } +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ - - void - SW_FT_Vector_Unit( SW_FT_Vector* vec, - SW_FT_Angle angle ) - { +void SW_FT_Vector_Unit(SW_FT_Vector* vec, SW_FT_Angle angle) +{ vec->x = SW_FT_TRIG_SCALE >> 8; vec->y = 0; - ft_trig_pseudo_rotate( vec, angle ); - vec->x = ( vec->x + 0x80L ) >> 8; - vec->y = ( vec->y + 0x80L ) >> 8; - } + ft_trig_pseudo_rotate(vec, angle); + vec->x = (vec->x + 0x80L) >> 8; + vec->y = (vec->y + 0x80L) >> 8; +} +/* these macros return 0 for positive numbers, + and -1 for negative ones */ +#define SW_FT_SIGN_LONG(x) ((x) >> (SW_FT_SIZEOF_LONG * 8 - 1)) +#define SW_FT_SIGN_INT(x) ((x) >> (SW_FT_SIZEOF_INT * 8 - 1)) +#define SW_FT_SIGN_INT32(x) ((x) >> 31) +#define SW_FT_SIGN_INT16(x) ((x) >> 15) - /* these macros return 0 for positive numbers, - and -1 for negative ones */ -#define SW_FT_SIGN_LONG( x ) ( (x) >> ( SW_FT_SIZEOF_LONG * 8 - 1 ) ) -#define SW_FT_SIGN_INT( x ) ( (x) >> ( SW_FT_SIZEOF_INT * 8 - 1 ) ) -#define SW_FT_SIGN_INT32( x ) ( (x) >> 31 ) -#define SW_FT_SIGN_INT16( x ) ( (x) >> 15 ) +/* documentation is in fttrigon.h */ +void SW_FT_Vector_Rotate(SW_FT_Vector* vec, SW_FT_Angle angle) +{ + SW_FT_Int shift; + SW_FT_Vector v; - /* documentation is in fttrigon.h */ + v.x = vec->x; + v.y = vec->y; - void - SW_FT_Vector_Rotate( SW_FT_Vector* vec, - SW_FT_Angle angle ) - { - SW_FT_Int shift; - SW_FT_Vector v; + if (angle && (v.x != 0 || v.y != 0)) { + shift = ft_trig_prenorm(&v); + ft_trig_pseudo_rotate(&v, angle); + v.x = ft_trig_downscale(v.x); + v.y = ft_trig_downscale(v.y); + if (shift > 0) { + SW_FT_Int32 half = (SW_FT_Int32)1L << (shift - 1); - v.x = vec->x; - v.y = vec->y; - - if ( angle && ( v.x != 0 || v.y != 0 ) ) - { - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_rotate( &v, angle ); - v.x = ft_trig_downscale( v.x ); - v.y = ft_trig_downscale( v.y ); - - if ( shift > 0 ) - { - SW_FT_Int32 half = (SW_FT_Int32)1L << ( shift - 1 ); - - - vec->x = ( v.x + half + SW_FT_SIGN_LONG( v.x ) ) >> shift; - vec->y = ( v.y + half + SW_FT_SIGN_LONG( v.y ) ) >> shift; - } - else - { - shift = -shift; - vec->x = (SW_FT_Pos)( (SW_FT_ULong)v.x << shift ); - vec->y = (SW_FT_Pos)( (SW_FT_ULong)v.y << shift ); - } + vec->x = (v.x + half + SW_FT_SIGN_LONG(v.x)) >> shift; + vec->y = (v.y + half + SW_FT_SIGN_LONG(v.y)) >> shift; + } else { + shift = -shift; + vec->x = (SW_FT_Pos)((SW_FT_ULong)v.x << shift); + vec->y = (SW_FT_Pos)((SW_FT_ULong)v.y << shift); + } } - } +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ - - SW_FT_Fixed - SW_FT_Vector_Length( SW_FT_Vector* vec ) - { - SW_FT_Int shift; - SW_FT_Vector v; - +SW_FT_Fixed SW_FT_Vector_Length(SW_FT_Vector* vec) +{ + SW_FT_Int shift; + SW_FT_Vector v; v = *vec; /* handle trivial cases */ - if ( v.x == 0 ) - { - return SW_FT_ABS( v.y ); - } - else if ( v.y == 0 ) - { - return SW_FT_ABS( v.x ); + if (v.x == 0) { + return SW_FT_ABS(v.y); + } else if (v.y == 0) { + return SW_FT_ABS(v.x); } /* general case */ - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); + shift = ft_trig_prenorm(&v); + ft_trig_pseudo_polarize(&v); - v.x = ft_trig_downscale( v.x ); + v.x = ft_trig_downscale(v.x); - if ( shift > 0 ) - return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; + if (shift > 0) return (v.x + (1 << (shift - 1))) >> shift; - return (SW_FT_Fixed)( (SW_FT_UInt32)v.x << -shift ); - } + return (SW_FT_Fixed)((SW_FT_UInt32)v.x << -shift); +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ - - void - SW_FT_Vector_Polarize( SW_FT_Vector* vec, - SW_FT_Fixed *length, - SW_FT_Angle *angle ) - { - SW_FT_Int shift; - SW_FT_Vector v; - +void SW_FT_Vector_Polarize(SW_FT_Vector* vec, SW_FT_Fixed* length, + SW_FT_Angle* angle) +{ + SW_FT_Int shift; + SW_FT_Vector v; v = *vec; - if ( v.x == 0 && v.y == 0 ) - return; + if (v.x == 0 && v.y == 0) return; - shift = ft_trig_prenorm( &v ); - ft_trig_pseudo_polarize( &v ); + shift = ft_trig_prenorm(&v); + ft_trig_pseudo_polarize(&v); - v.x = ft_trig_downscale( v.x ); + v.x = ft_trig_downscale(v.x); - *length = ( shift >= 0 ) ? ( v.x >> shift ) - : (SW_FT_Fixed)( (SW_FT_UInt32)v.x << -shift ); - *angle = v.y; - } + *length = (shift >= 0) ? (v.x >> shift) + : (SW_FT_Fixed)((SW_FT_UInt32)v.x << -shift); + *angle = v.y; +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ - - void - SW_FT_Vector_From_Polar( SW_FT_Vector* vec, - SW_FT_Fixed length, - SW_FT_Angle angle ) - { +void SW_FT_Vector_From_Polar(SW_FT_Vector* vec, SW_FT_Fixed length, + SW_FT_Angle angle) +{ vec->x = length; vec->y = 0; - SW_FT_Vector_Rotate( vec, angle ); - } + SW_FT_Vector_Rotate(vec, angle); +} +/* documentation is in fttrigon.h */ - /* documentation is in fttrigon.h */ - - SW_FT_Angle - SW_FT_Angle_Diff( SW_FT_Angle angle1, - SW_FT_Angle angle2 ) - { - SW_FT_Angle delta = angle2 - angle1; - +SW_FT_Angle SW_FT_Angle_Diff(SW_FT_Angle angle1, SW_FT_Angle angle2) +{ + SW_FT_Angle delta = angle2 - angle1; delta %= SW_FT_ANGLE_2PI; - if ( delta < 0 ) - delta += SW_FT_ANGLE_2PI; + if (delta < 0) delta += SW_FT_ANGLE_2PI; - if ( delta > SW_FT_ANGLE_PI ) - delta -= SW_FT_ANGLE_2PI; + if (delta > SW_FT_ANGLE_PI) delta -= SW_FT_ANGLE_2PI; return delta; - } - +} /* END */ - diff --git a/src/vector/freetype/v_ft_raster.cpp b/src/vector/freetype/v_ft_raster.cpp index 88f9d2636d..7e668f3ddb 100644 --- a/src/vector/freetype/v_ft_raster.cpp +++ b/src/vector/freetype/v_ft_raster.cpp @@ -15,176 +15,144 @@ /* */ /***************************************************************************/ - /*************************************************************************/ - /* */ - /* This is a new anti-aliasing scan-converter for FreeType 2. The */ - /* algorithm used here is _very_ different from the one in the standard */ - /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ - /* coverage of the outline on each pixel cell. */ - /* */ - /* It is based on ideas that I initially found in Raph Levien's */ - /* excellent LibArt graphics library (see http://www.levien.com/libart */ - /* for more information, though the web pages do not tell anything */ - /* about the renderer; you'll have to dive into the source code to */ - /* understand how it works). */ - /* */ - /* Note, however, that this is a _very_ different implementation */ - /* compared to Raph's. Coverage information is stored in a very */ - /* different way, and I don't use sorted vector paths. Also, it doesn't */ - /* use floating point values. */ - /* */ - /* This renderer has the following advantages: */ - /* */ - /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ - /* callback function that will be called by the renderer to draw gray */ - /* spans on any target surface. You can thus do direct composition on */ - /* any kind of bitmap, provided that you give the renderer the right */ - /* callback. */ - /* */ - /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ - /* each pixel cell. */ - /* */ - /* - It performs a single pass on the outline (the `standard' FT2 */ - /* renderer makes two passes). */ - /* */ - /* - It can easily be modified to render to _any_ number of gray levels */ - /* cheaply. */ - /* */ - /* - For small (< 20) pixel sizes, it is faster than the standard */ - /* renderer. */ - /* */ - /*************************************************************************/ - +/*************************************************************************/ +/* */ +/* This is a new anti-aliasing scan-converter for FreeType 2. The */ +/* algorithm used here is _very_ different from the one in the standard */ +/* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ +/* coverage of the outline on each pixel cell. */ +/* */ +/* It is based on ideas that I initially found in Raph Levien's */ +/* excellent LibArt graphics library (see http://www.levien.com/libart */ +/* for more information, though the web pages do not tell anything */ +/* about the renderer; you'll have to dive into the source code to */ +/* understand how it works). */ +/* */ +/* Note, however, that this is a _very_ different implementation */ +/* compared to Raph's. Coverage information is stored in a very */ +/* different way, and I don't use sorted vector paths. Also, it doesn't */ +/* use floating point values. */ +/* */ +/* This renderer has the following advantages: */ +/* */ +/* - It doesn't need an intermediate bitmap. Instead, one can supply a */ +/* callback function that will be called by the renderer to draw gray */ +/* spans on any target surface. You can thus do direct composition on */ +/* any kind of bitmap, provided that you give the renderer the right */ +/* callback. */ +/* */ +/* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ +/* each pixel cell. */ +/* */ +/* - It performs a single pass on the outline (the `standard' FT2 */ +/* renderer makes two passes). */ +/* */ +/* - It can easily be modified to render to _any_ number of gray levels */ +/* cheaply. */ +/* */ +/* - For small (< 20) pixel sizes, it is faster than the standard */ +/* renderer. */ +/* */ +/*************************************************************************/ #include "v_ft_raster.h" #include "v_ft_math.h" - /* Auxiliary macros for token concatenation. */ -#define SW_FT_ERR_XCAT( x, y ) x ## y -#define SW_FT_ERR_CAT( x, y ) SW_FT_ERR_XCAT( x, y ) - -#define SW_FT_BEGIN_STMNT do { -#define SW_FT_END_STMNT } while ( 0 ) +/* Auxiliary macros for token concatenation. */ +#define SW_FT_ERR_XCAT(x, y) x##y +#define SW_FT_ERR_CAT(x, y) SW_FT_ERR_XCAT(x, y) +#define SW_FT_BEGIN_STMNT do { +#define SW_FT_END_STMNT \ + } \ + while (0) +#include +#include #include #include -#include -#include -#define SW_FT_UINT_MAX UINT_MAX -#define SW_FT_INT_MAX INT_MAX -#define SW_FT_ULONG_MAX ULONG_MAX -#define SW_FT_CHAR_BIT CHAR_BIT +#define SW_FT_UINT_MAX UINT_MAX +#define SW_FT_INT_MAX INT_MAX +#define SW_FT_ULONG_MAX ULONG_MAX +#define SW_FT_CHAR_BIT CHAR_BIT -#define ft_memset memset +#define ft_memset memset -#define ft_setjmp setjmp -#define ft_longjmp longjmp -#define ft_jmp_buf jmp_buf +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf -typedef ptrdiff_t SW_FT_PtrDist; +typedef ptrdiff_t SW_FT_PtrDist; - -#define ErrRaster_Invalid_Mode -2 -#define ErrRaster_Invalid_Outline -1 -#define ErrRaster_Invalid_Argument -3 -#define ErrRaster_Memory_Overflow -4 +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 #define SW_FT_BEGIN_HEADER #define SW_FT_END_HEADER +/* This macro is used to indicate that a function parameter is unused. */ +/* Its purpose is simply to reduce compiler warnings. Note also that */ +/* simply defining it as `(void)x' doesn't avoid warnings with certain */ +/* ANSI compilers (e.g. LCC). */ +#define SW_FT_UNUSED(x) (x) = (x) - /* This macro is used to indicate that a function parameter is unused. */ - /* Its purpose is simply to reduce compiler warnings. Note also that */ - /* simply defining it as `(void)x' doesn't avoid warnings with certain */ - /* ANSI compilers (e.g. LCC). */ -#define SW_FT_UNUSED( x ) (x) = (x) +#define SW_FT_THROW(e) SW_FT_ERR_CAT(ErrRaster_, e) +/* The size in bytes of the render pool used by the scan-line converter */ +/* to do all of its work. */ +#define SW_FT_RENDER_POOL_SIZE 16384L -#define SW_FT_THROW( e ) SW_FT_ERR_CAT( ErrRaster_, e ) +typedef int (*SW_FT_Outline_MoveToFunc)(const SW_FT_Vector* to, void* user); - /* The size in bytes of the render pool used by the scan-line converter */ - /* to do all of its work. */ -#define SW_FT_RENDER_POOL_SIZE 16384L +#define SW_FT_Outline_MoveTo_Func SW_FT_Outline_MoveToFunc -typedef int -(*SW_FT_Outline_MoveToFunc)( const SW_FT_Vector* to, - void* user ); +typedef int (*SW_FT_Outline_LineToFunc)(const SW_FT_Vector* to, void* user); -#define SW_FT_Outline_MoveTo_Func SW_FT_Outline_MoveToFunc +#define SW_FT_Outline_LineTo_Func SW_FT_Outline_LineToFunc -typedef int -(*SW_FT_Outline_LineToFunc)( const SW_FT_Vector* to, - void* user ); +typedef int (*SW_FT_Outline_ConicToFunc)(const SW_FT_Vector* control, + const SW_FT_Vector* to, void* user); -#define SW_FT_Outline_LineTo_Func SW_FT_Outline_LineToFunc +#define SW_FT_Outline_ConicTo_Func SW_FT_Outline_ConicToFunc +typedef int (*SW_FT_Outline_CubicToFunc)(const SW_FT_Vector* control1, + const SW_FT_Vector* control2, + const SW_FT_Vector* to, void* user); -typedef int -(*SW_FT_Outline_ConicToFunc)( const SW_FT_Vector* control, - const SW_FT_Vector* to, - void* user ); +#define SW_FT_Outline_CubicTo_Func SW_FT_Outline_CubicToFunc -#define SW_FT_Outline_ConicTo_Func SW_FT_Outline_ConicToFunc +typedef struct SW_FT_Outline_Funcs_ { + SW_FT_Outline_MoveToFunc move_to; + SW_FT_Outline_LineToFunc line_to; + SW_FT_Outline_ConicToFunc conic_to; + SW_FT_Outline_CubicToFunc cubic_to; -typedef int -(*SW_FT_Outline_CubicToFunc)( const SW_FT_Vector* control1, - const SW_FT_Vector* control2, - const SW_FT_Vector* to, - void* user ); - -#define SW_FT_Outline_CubicTo_Func SW_FT_Outline_CubicToFunc - -typedef struct SW_FT_Outline_Funcs_ -{ - SW_FT_Outline_MoveToFunc move_to; - SW_FT_Outline_LineToFunc line_to; - SW_FT_Outline_ConicToFunc conic_to; - SW_FT_Outline_CubicToFunc cubic_to; - - int shift; - SW_FT_Pos delta; + int shift; + SW_FT_Pos delta; } SW_FT_Outline_Funcs; +#define SW_FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ + cubic_to_, shift_, delta_) \ + static const SW_FT_Outline_Funcs class_ = {move_to_, line_to_, conic_to_, \ + cubic_to_, shift_, delta_}; - -#define SW_FT_DEFINE_OUTLINE_FUNCS( class_, \ - move_to_, line_to_, \ - conic_to_, cubic_to_, \ - shift_, delta_ ) \ - static const SW_FT_Outline_Funcs class_ = \ - { \ - move_to_, \ - line_to_, \ - conic_to_, \ - cubic_to_, \ - shift_, \ - delta_ \ - }; - -#define SW_FT_DEFINE_RASTER_FUNCS( class_, \ - raster_new_, raster_reset_, \ - raster_render_, \ - raster_done_ ) \ - const SW_FT_Raster_Funcs class_ = \ - { \ - raster_new_, \ - raster_reset_, \ - raster_render_, \ - raster_done_ \ - }; - +#define SW_FT_DEFINE_RASTER_FUNCS(class_, raster_new_, raster_reset_, \ + raster_render_, raster_done_) \ + const SW_FT_Raster_Funcs class_ = {raster_new_, raster_reset_, \ + raster_render_, raster_done_}; #ifndef SW_FT_MEM_SET -#define SW_FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#define SW_FT_MEM_SET(d, s, c) ft_memset(d, s, c) #endif #ifndef SW_FT_MEM_ZERO -#define SW_FT_MEM_ZERO( dest, count ) SW_FT_MEM_SET( dest, 0, count ) +#define SW_FT_MEM_ZERO(dest, count) SW_FT_MEM_SET(dest, 0, count) #endif - /* as usual, for the speed hungry :-) */ +/* as usual, for the speed hungry :-) */ #undef RAS_ARG #undef RAS_ARG_ @@ -193,246 +161,222 @@ typedef struct SW_FT_Outline_Funcs_ #ifndef SW_FT_STATIC_RASTER -#define RAS_ARG gray_PWorker worker -#define RAS_ARG_ gray_PWorker worker, +#define RAS_ARG gray_PWorker worker +#define RAS_ARG_ gray_PWorker worker, -#define RAS_VAR worker -#define RAS_VAR_ worker, +#define RAS_VAR worker +#define RAS_VAR_ worker, #else /* SW_FT_STATIC_RASTER */ -#define RAS_ARG /* empty */ -#define RAS_ARG_ /* empty */ -#define RAS_VAR /* empty */ -#define RAS_VAR_ /* empty */ +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ #endif /* SW_FT_STATIC_RASTER */ - - /* must be at least 6 bits! */ -#define PIXEL_BITS 8 +/* must be at least 6 bits! */ +#define PIXEL_BITS 8 #undef FLOOR #undef CEILING #undef TRUNC #undef SCALED -#define ONE_PIXEL ( 1L << PIXEL_BITS ) -#define PIXEL_MASK ( -1L << PIXEL_BITS ) -#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) -#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) -#define FLOOR( x ) ( (x) & -ONE_PIXEL ) -#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) -#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) +#define ONE_PIXEL (1L << PIXEL_BITS) +#define PIXEL_MASK (-1L << PIXEL_BITS) +#define TRUNC(x) ((TCoord)((x) >> PIXEL_BITS)) +#define SUBPIXELS(x) ((TPos)(x) << PIXEL_BITS) +#define FLOOR(x) ((x) & -ONE_PIXEL) +#define CEILING(x) (((x) + ONE_PIXEL - 1) & -ONE_PIXEL) +#define ROUND(x) (((x) + ONE_PIXEL / 2) & -ONE_PIXEL) #if PIXEL_BITS >= 6 -#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) -#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#define UPSCALE(x) ((x) << (PIXEL_BITS - 6)) +#define DOWNSCALE(x) ((x) >> (PIXEL_BITS - 6)) #else -#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) -#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) +#define UPSCALE(x) ((x) >> (6 - PIXEL_BITS)) +#define DOWNSCALE(x) ((x) << (6 - PIXEL_BITS)) #endif +/* Compute `dividend / divisor' and return both its quotient and */ +/* remainder, cast to a specific type. This macro also ensures that */ +/* the remainder is always positive. */ +#define SW_FT_DIV_MOD(type, dividend, divisor, quotient, remainder) \ + SW_FT_BEGIN_STMNT(quotient) = (type)((dividend) / (divisor)); \ + (remainder) = (type)((dividend) % (divisor)); \ + if ((remainder) < 0) { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + SW_FT_END_STMNT - /* Compute `dividend / divisor' and return both its quotient and */ - /* remainder, cast to a specific type. This macro also ensures that */ - /* the remainder is always positive. */ -#define SW_FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ - SW_FT_BEGIN_STMNT \ - (quotient) = (type)( (dividend) / (divisor) ); \ - (remainder) = (type)( (dividend) % (divisor) ); \ - if ( (remainder) < 0 ) \ - { \ - (quotient)--; \ - (remainder) += (type)(divisor); \ - } \ - SW_FT_END_STMNT - -#ifdef __arm__ - /* Work around a bug specific to GCC which make the compiler fail to */ - /* optimize a division and modulo operation on the same parameters */ - /* into a single call to `__aeabi_idivmod'. See */ - /* */ - /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */ +#ifdef __arm__ +/* Work around a bug specific to GCC which make the compiler fail to */ +/* optimize a division and modulo operation on the same parameters */ +/* into a single call to `__aeabi_idivmod'. See */ +/* */ +/* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */ #undef SW_FT_DIV_MOD -#define SW_FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ - SW_FT_BEGIN_STMNT \ - (quotient) = (type)( (dividend) / (divisor) ); \ - (remainder) = (type)( (dividend) - (quotient) * (divisor) ); \ - if ( (remainder) < 0 ) \ - { \ - (quotient)--; \ - (remainder) += (type)(divisor); \ - } \ - SW_FT_END_STMNT +#define SW_FT_DIV_MOD(type, dividend, divisor, quotient, remainder) \ + SW_FT_BEGIN_STMNT(quotient) = (type)((dividend) / (divisor)); \ + (remainder) = (type)((dividend) - (quotient) * (divisor)); \ + if ((remainder) < 0) { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + SW_FT_END_STMNT #endif /* __arm__ */ - /* These macros speed up repetitive divisions by replacing them */ - /* with multiplications and right shifts. */ -#define SW_FT_UDIVPREP( b ) \ - long b ## _r = (long)( SW_FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) -#define SW_FT_UDIV( a, b ) \ - ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ - ( sizeof( long ) * SW_FT_CHAR_BIT - PIXEL_BITS ) ) +/* These macros speed up repetitive divisions by replacing them */ +/* with multiplications and right shifts. */ +#define SW_FT_UDIVPREP(b) \ + long b##_r = (long)(SW_FT_ULONG_MAX >> PIXEL_BITS) / (b) +#define SW_FT_UDIV(a, b) \ + (((unsigned long)(a) * (unsigned long)(b##_r)) >> \ + (sizeof(long) * SW_FT_CHAR_BIT - PIXEL_BITS)) +/*************************************************************************/ +/* */ +/* TYPE DEFINITIONS */ +/* */ - /*************************************************************************/ - /* */ - /* TYPE DEFINITIONS */ - /* */ +/* don't change the following types to SW_FT_Int or SW_FT_Pos, since we might */ +/* need to define them to "float" or "double" when experimenting with */ +/* new algorithms */ - /* don't change the following types to SW_FT_Int or SW_FT_Pos, since we might */ - /* need to define them to "float" or "double" when experimenting with */ - /* new algorithms */ +typedef long TCoord; /* integer scanline/pixel coordinate */ +typedef long TPos; /* sub-pixel coordinate */ - typedef long TCoord; /* integer scanline/pixel coordinate */ - typedef long TPos; /* sub-pixel coordinate */ - - /* determine the type used to store cell areas. This normally takes at */ - /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ - /* `long' instead of `int', otherwise bad things happen */ +/* determine the type used to store cell areas. This normally takes at */ +/* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ +/* `long' instead of `int', otherwise bad things happen */ #if PIXEL_BITS <= 7 - typedef int TArea; +typedef int TArea; #else /* PIXEL_BITS >= 8 */ - /* approximately determine the size of integers using an ANSI-C header */ +/* approximately determine the size of integers using an ANSI-C header */ #if SW_FT_UINT_MAX == 0xFFFFU - typedef long TArea; +typedef long TArea; #else - typedef int TArea; +typedef int TArea; #endif #endif /* PIXEL_BITS >= 8 */ +/* maximum number of gray spans in a call to the span callback */ +#define SW_FT_MAX_GRAY_SPANS 256 - /* maximum number of gray spans in a call to the span callback */ -#define SW_FT_MAX_GRAY_SPANS 256 +typedef struct TCell_* PCell; +typedef struct TCell_ { + TPos x; /* same with gray_TWorker.ex */ + TCoord cover; /* same with gray_TWorker.cover */ + TArea area; + PCell next; - typedef struct TCell_* PCell; +} TCell; - typedef struct TCell_ - { - TPos x; /* same with gray_TWorker.ex */ - TCoord cover; /* same with gray_TWorker.cover */ - TArea area; - PCell next; - - } TCell; - - -#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ - /* We disable the warning `structure was padded due to */ - /* __declspec(align())' in order to compile cleanly with */ - /* the maximum level of warnings. */ -#pragma warning( push ) -#pragma warning( disable : 4324 ) +#if defined(_MSC_VER) /* Visual C++ (and Intel C++) */ +/* We disable the warning `structure was padded due to */ +/* __declspec(align())' in order to compile cleanly with */ +/* the maximum level of warnings. */ +#pragma warning(push) +#pragma warning(disable : 4324) #endif /* _MSC_VER */ - typedef struct gray_TWorker_ - { - TCoord ex, ey; - TPos min_ex, max_ex; - TPos min_ey, max_ey; - TPos count_ex, count_ey; +typedef struct gray_TWorker_ { + TCoord ex, ey; + TPos min_ex, max_ex; + TPos min_ey, max_ey; + TPos count_ex, count_ey; - TArea area; - TCoord cover; - int invalid; + TArea area; + TCoord cover; + int invalid; - PCell cells; - SW_FT_PtrDist max_cells; - SW_FT_PtrDist num_cells; + PCell cells; + SW_FT_PtrDist max_cells; + SW_FT_PtrDist num_cells; - TPos x, y; + TPos x, y; + SW_FT_Vector bez_stack[32 * 3 + 1]; + int lev_stack[32]; - SW_FT_Vector bez_stack[32 * 3 + 1]; - int lev_stack[32]; + SW_FT_Outline outline; + SW_FT_BBox clip_box; - SW_FT_Outline outline; - SW_FT_BBox clip_box; + SW_FT_Span gray_spans[SW_FT_MAX_GRAY_SPANS]; + int num_gray_spans; - SW_FT_Span gray_spans[SW_FT_MAX_GRAY_SPANS]; - int num_gray_spans; + SW_FT_Raster_Span_Func render_span; + void* render_span_data; - SW_FT_Raster_Span_Func render_span; - void* render_span_data; + int band_size; + int band_shoot; - int band_size; - int band_shoot; + ft_jmp_buf jump_buffer; - ft_jmp_buf jump_buffer; + void* buffer; + long buffer_size; - void* buffer; - long buffer_size; + PCell* ycells; + TPos ycount; - PCell* ycells; - TPos ycount; +} gray_TWorker, *gray_PWorker; - } gray_TWorker, *gray_PWorker; - -#if defined( _MSC_VER ) -#pragma warning( pop ) +#if defined(_MSC_VER) +#pragma warning(pop) #endif - #ifndef SW_FT_STATIC_RASTER -#define ras (*worker) +#define ras (*worker) #else - static gray_TWorker ras; +static gray_TWorker ras; #endif +typedef struct gray_TRaster_ { + void* memory; - typedef struct gray_TRaster_ - { - void* memory; +} gray_TRaster, *gray_PRaster; - } gray_TRaster, *gray_PRaster; - - - - /*************************************************************************/ - /* */ - /* Initialize the cells table. */ - /* */ - static void - gray_init_cells( RAS_ARG_ void* buffer, - long byte_size ) - { - ras.buffer = buffer; +/*************************************************************************/ +/* */ +/* Initialize the cells table. */ +/* */ +static void gray_init_cells(RAS_ARG_ void* buffer, long byte_size) +{ + ras.buffer = buffer; ras.buffer_size = byte_size; - ras.ycells = (PCell*) buffer; - ras.cells = NULL; - ras.max_cells = 0; - ras.num_cells = 0; - ras.area = 0; - ras.cover = 0; - ras.invalid = 1; - } + ras.ycells = (PCell*)buffer; + ras.cells = NULL; + ras.max_cells = 0; + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; +} +/*************************************************************************/ +/* */ +/* Compute the outline bounding box. */ +/* */ +static void gray_compute_cbox(RAS_ARG) +{ + SW_FT_Outline* outline = &ras.outline; + SW_FT_Vector* vec = outline->points; + SW_FT_Vector* limit = vec + outline->n_points; - /*************************************************************************/ - /* */ - /* Compute the outline bounding box. */ - /* */ - static void - gray_compute_cbox( RAS_ARG ) - { - SW_FT_Outline* outline = &ras.outline; - SW_FT_Vector* vec = outline->points; - SW_FT_Vector* limit = vec + outline->n_points; - - - if ( outline->n_points <= 0 ) - { - ras.min_ex = ras.max_ex = 0; - ras.min_ey = ras.max_ey = 0; - return; + if (outline->n_points <= 0) { + ras.min_ex = ras.max_ex = 0; + ras.min_ey = ras.max_ey = 0; + return; } ras.min_ex = ras.max_ex = vec->x; @@ -440,91 +384,74 @@ typedef struct SW_FT_Outline_Funcs_ vec++; - for ( ; vec < limit; vec++ ) - { - TPos x = vec->x; - TPos y = vec->y; + for (; vec < limit; vec++) { + TPos x = vec->x; + TPos y = vec->y; - - if ( x < ras.min_ex ) ras.min_ex = x; - if ( x > ras.max_ex ) ras.max_ex = x; - if ( y < ras.min_ey ) ras.min_ey = y; - if ( y > ras.max_ey ) ras.max_ey = y; + if (x < ras.min_ex) ras.min_ex = x; + if (x > ras.max_ex) ras.max_ex = x; + if (y < ras.min_ey) ras.min_ey = y; + if (y > ras.max_ey) ras.max_ey = y; } /* truncate the bounding box to integer pixels */ ras.min_ex = ras.min_ex >> 6; ras.min_ey = ras.min_ey >> 6; - ras.max_ex = ( ras.max_ex + 63 ) >> 6; - ras.max_ey = ( ras.max_ey + 63 ) >> 6; - } + ras.max_ex = (ras.max_ex + 63) >> 6; + ras.max_ey = (ras.max_ey + 63) >> 6; +} +/*************************************************************************/ +/* */ +/* Record the current cell in the table. */ +/* */ +static PCell gray_find_cell(RAS_ARG) +{ + PCell *pcell, cell; + TPos x = ras.ex; - /*************************************************************************/ - /* */ - /* Record the current cell in the table. */ - /* */ - static PCell - gray_find_cell( RAS_ARG ) - { - PCell *pcell, cell; - TPos x = ras.ex; - - - if ( x > ras.count_ex ) - x = ras.count_ex; + if (x > ras.count_ex) x = ras.count_ex; pcell = &ras.ycells[ras.ey]; - for (;;) - { - cell = *pcell; - if ( cell == NULL || cell->x > x ) - break; + for (;;) { + cell = *pcell; + if (cell == NULL || cell->x > x) break; - if ( cell->x == x ) - goto Exit; + if (cell->x == x) goto Exit; - pcell = &cell->next; + pcell = &cell->next; } - if ( ras.num_cells >= ras.max_cells ) - ft_longjmp( ras.jump_buffer, 1 ); + if (ras.num_cells >= ras.max_cells) ft_longjmp(ras.jump_buffer, 1); - cell = ras.cells + ras.num_cells++; - cell->x = x; - cell->area = 0; + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = 0; cell->cover = 0; - cell->next = *pcell; - *pcell = cell; + cell->next = *pcell; + *pcell = cell; - Exit: +Exit: return cell; - } +} +static void gray_record_cell(RAS_ARG) +{ + if (ras.area | ras.cover) { + PCell cell = gray_find_cell(RAS_VAR); - static void - gray_record_cell( RAS_ARG ) - { - if ( ras.area | ras.cover ) - { - PCell cell = gray_find_cell( RAS_VAR ); - - - cell->area += ras.area; - cell->cover += ras.cover; + cell->area += ras.area; + cell->cover += ras.cover; } - } +} - - /*************************************************************************/ - /* */ - /* Set the current cell to a new position. */ - /* */ - static void - gray_set_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { +/*************************************************************************/ +/* */ +/* Set the current cell to a new position. */ +/* */ +static void gray_set_cell(RAS_ARG_ TCoord ex, TCoord ey) +{ /* Move the cell pointer to a new position. We set the `invalid' */ /* flag to indicate that the cell isn't part of those we're interested */ /* in during the render phase. This means that: */ @@ -539,326 +466,286 @@ typedef struct SW_FT_Outline_Funcs_ /* min_ex - 1 horizontal position. */ ey -= ras.min_ey; - if ( ex > ras.max_ex ) - ex = ras.max_ex; + if (ex > ras.max_ex) ex = ras.max_ex; ex -= ras.min_ex; - if ( ex < 0 ) - ex = -1; + if (ex < 0) ex = -1; /* are we moving to a different cell ? */ - if ( ex != ras.ex || ey != ras.ey ) - { - /* record the current one if it is valid */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); + if (ex != ras.ex || ey != ras.ey) { + /* record the current one if it is valid */ + if (!ras.invalid) gray_record_cell(RAS_VAR); - ras.area = 0; - ras.cover = 0; - ras.ex = ex; - ras.ey = ey; + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; } - ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || - ex >= ras.count_ex ); - } + ras.invalid = + ((unsigned)ey >= (unsigned)ras.count_ey || ex >= ras.count_ex); +} +/*************************************************************************/ +/* */ +/* Start a new contour at a given cell. */ +/* */ +static void gray_start_cell(RAS_ARG_ TCoord ex, TCoord ey) +{ + if (ex > ras.max_ex) ex = (TCoord)(ras.max_ex); - /*************************************************************************/ - /* */ - /* Start a new contour at a given cell. */ - /* */ - static void - gray_start_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { - if ( ex > ras.max_ex ) - ex = (TCoord)( ras.max_ex ); + if (ex < ras.min_ex) ex = (TCoord)(ras.min_ex - 1); - if ( ex < ras.min_ex ) - ex = (TCoord)( ras.min_ex - 1 ); - - ras.area = 0; - ras.cover = 0; - ras.ex = ex - ras.min_ex; - ras.ey = ey - ras.min_ey; + ras.area = 0; + ras.cover = 0; + ras.ex = ex - ras.min_ex; + ras.ey = ey - ras.min_ey; ras.invalid = 0; - gray_set_cell( RAS_VAR_ ex, ey ); - } + gray_set_cell(RAS_VAR_ ex, ey); +} - /*************************************************************************/ - /* */ - /* Render a straight line across multiple cells in any direction. */ - /* */ - static void - gray_render_line( RAS_ARG_ TPos to_x, - TPos to_y ) - { - TPos dx, dy, fx1, fy1, fx2, fy2; - TCoord ex1, ex2, ey1, ey2; +/*************************************************************************/ +/* */ +/* Render a straight line across multiple cells in any direction. */ +/* */ +static void gray_render_line(RAS_ARG_ TPos to_x, TPos to_y) +{ + TPos dx, dy, fx1, fy1, fx2, fy2; + TCoord ex1, ex2, ey1, ey2; - - ex1 = TRUNC( ras.x ); - ex2 = TRUNC( to_x ); - ey1 = TRUNC( ras.y ); - ey2 = TRUNC( to_y ); + ex1 = TRUNC(ras.x); + ex2 = TRUNC(to_x); + ey1 = TRUNC(ras.y); + ey2 = TRUNC(to_y); /* perform vertical clipping */ - if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) || - ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) - goto End; + if ((ey1 >= ras.max_ey && ey2 >= ras.max_ey) || + (ey1 < ras.min_ey && ey2 < ras.min_ey)) + goto End; dx = to_x - ras.x; dy = to_y - ras.y; - fx1 = ras.x - SUBPIXELS( ex1 ); - fy1 = ras.y - SUBPIXELS( ey1 ); + fx1 = ras.x - SUBPIXELS(ex1); + fy1 = ras.y - SUBPIXELS(ey1); - if ( ex1 == ex2 && ey1 == ey2 ) /* inside one cell */ - ; - else if ( dy == 0 ) /* ex1 != ex2 */ /* any horizontal line */ + if (ex1 == ex2 && ey1 == ey2) /* inside one cell */ + ; + else if (dy == 0) /* ex1 != ex2 */ /* any horizontal line */ { - ex1 = ex2; - gray_set_cell( RAS_VAR_ ex1, ey1 ); - } - else if ( dx == 0 ) + ex1 = ex2; + gray_set_cell(RAS_VAR_ ex1, ey1); + } else if (dx == 0) { + if (dy > 0) /* vertical line up */ + do { + fy2 = ONE_PIXEL; + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * fx1 * 2; + fy1 = 0; + ey1++; + gray_set_cell(RAS_VAR_ ex1, ey1); + } while (ey1 != ey2); + else /* vertical line down */ + do { + fy2 = 0; + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * fx1 * 2; + fy1 = ONE_PIXEL; + ey1--; + gray_set_cell(RAS_VAR_ ex1, ey1); + } while (ey1 != ey2); + } else /* any other line */ { - if ( dy > 0 ) /* vertical line up */ - do - { - fy2 = ONE_PIXEL; - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * fx1 * 2; - fy1 = 0; - ey1++; - gray_set_cell( RAS_VAR_ ex1, ey1 ); - } while ( ey1 != ey2 ); - else /* vertical line down */ - do - { - fy2 = 0; - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * fx1 * 2; - fy1 = ONE_PIXEL; - ey1--; - gray_set_cell( RAS_VAR_ ex1, ey1 ); - } while ( ey1 != ey2 ); - } - else /* any other line */ - { - TArea prod = dx * fy1 - dy * fx1; - SW_FT_UDIVPREP( dx ); - SW_FT_UDIVPREP( dy ); + TArea prod = dx * fy1 - dy * fx1; + SW_FT_UDIVPREP(dx); + SW_FT_UDIVPREP(dy); + /* The fundamental value `prod' determines which side and the */ + /* exact coordinate where the line exits current cell. It is */ + /* also easily updated when moving from one cell to the next. */ + do { + if (prod <= 0 && prod - dx * ONE_PIXEL > 0) /* left */ + { + fx2 = 0; + fy2 = (TPos)SW_FT_UDIV(-prod, -dx); + prod -= dy * ONE_PIXEL; + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * (fx1 + fx2); + fx1 = ONE_PIXEL; + fy1 = fy2; + ex1--; + } else if (prod - dx * ONE_PIXEL <= 0 && + prod - dx * ONE_PIXEL + dy * ONE_PIXEL > 0) /* up */ + { + prod -= dx * ONE_PIXEL; + fx2 = (TPos)SW_FT_UDIV(-prod, dy); + fy2 = ONE_PIXEL; + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * (fx1 + fx2); + fx1 = fx2; + fy1 = 0; + ey1++; + } else if (prod - dx * ONE_PIXEL + dy * ONE_PIXEL <= 0 && + prod + dy * ONE_PIXEL >= 0) /* right */ + { + prod += dy * ONE_PIXEL; + fx2 = ONE_PIXEL; + fy2 = (TPos)SW_FT_UDIV(prod, dx); + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * (fx1 + fx2); + fx1 = 0; + fy1 = fy2; + ex1++; + } else /* ( prod + dy * ONE_PIXEL < 0 && + prod > 0 ) down */ + { + fx2 = (TPos)SW_FT_UDIV(prod, -dy); + fy2 = 0; + prod += dx * ONE_PIXEL; + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * (fx1 + fx2); + fx1 = fx2; + fy1 = ONE_PIXEL; + ey1--; + } - /* The fundamental value `prod' determines which side and the */ - /* exact coordinate where the line exits current cell. It is */ - /* also easily updated when moving from one cell to the next. */ - do - { - if ( prod <= 0 && - prod - dx * ONE_PIXEL > 0 ) /* left */ - { - fx2 = 0; - fy2 = (TPos)SW_FT_UDIV( -prod, -dx ); - prod -= dy * ONE_PIXEL; - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); - fx1 = ONE_PIXEL; - fy1 = fy2; - ex1--; - } - else if ( prod - dx * ONE_PIXEL <= 0 && - prod - dx * ONE_PIXEL + dy * ONE_PIXEL > 0 ) /* up */ - { - prod -= dx * ONE_PIXEL; - fx2 = (TPos)SW_FT_UDIV( -prod, dy ); - fy2 = ONE_PIXEL; - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); - fx1 = fx2; - fy1 = 0; - ey1++; - } - else if ( prod - dx * ONE_PIXEL + dy * ONE_PIXEL <= 0 && - prod + dy * ONE_PIXEL >= 0 ) /* right */ - { - prod += dy * ONE_PIXEL; - fx2 = ONE_PIXEL; - fy2 = (TPos)SW_FT_UDIV( prod, dx ); - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); - fx1 = 0; - fy1 = fy2; - ex1++; - } - else /* ( prod + dy * ONE_PIXEL < 0 && - prod > 0 ) down */ - { - fx2 = (TPos)SW_FT_UDIV( prod, -dy ); - fy2 = 0; - prod += dx * ONE_PIXEL; - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); - fx1 = fx2; - fy1 = ONE_PIXEL; - ey1--; - } - - gray_set_cell( RAS_VAR_ ex1, ey1 ); - } while ( ex1 != ex2 || ey1 != ey2 ); + gray_set_cell(RAS_VAR_ ex1, ey1); + } while (ex1 != ex2 || ey1 != ey2); } - fx2 = to_x - SUBPIXELS( ex2 ); - fy2 = to_y - SUBPIXELS( ey2 ); + fx2 = to_x - SUBPIXELS(ex2); + fy2 = to_y - SUBPIXELS(ey2); - ras.cover += ( fy2 - fy1 ); - ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + ras.cover += (fy2 - fy1); + ras.area += (fy2 - fy1) * (fx1 + fx2); - End: - ras.x = to_x; - ras.y = to_y; - } - - static void - gray_split_conic( SW_FT_Vector* base ) - { - TPos a, b; +End: + ras.x = to_x; + ras.y = to_y; +} +static void gray_split_conic(SW_FT_Vector* base) +{ + TPos a, b; base[4].x = base[2].x; b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; + a = base[3].x = (base[2].x + b) / 2; + b = base[1].x = (base[0].x + b) / 2; + base[2].x = (a + b) / 2; base[4].y = base[2].y; b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - } - - - static void - gray_render_conic( RAS_ARG_ const SW_FT_Vector* control, - const SW_FT_Vector* to ) - { - TPos dx, dy; - TPos min, max, y; - int top, level; - int* levels; - SW_FT_Vector* arc; + a = base[3].y = (base[2].y + b) / 2; + b = base[1].y = (base[0].y + b) / 2; + base[2].y = (a + b) / 2; +} +static void gray_render_conic(RAS_ARG_ const SW_FT_Vector* control, + const SW_FT_Vector* to) +{ + TPos dx, dy; + TPos min, max, y; + int top, level; + int* levels; + SW_FT_Vector* arc; levels = ras.lev_stack; - arc = ras.bez_stack; - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control->x ); - arc[1].y = UPSCALE( control->y ); + arc = ras.bez_stack; + arc[0].x = UPSCALE(to->x); + arc[0].y = UPSCALE(to->y); + arc[1].x = UPSCALE(control->x); + arc[1].y = UPSCALE(control->y); arc[2].x = ras.x; arc[2].y = ras.y; - top = 0; + top = 0; - dx = SW_FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); - dy = SW_FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); - if ( dx < dy ) - dx = dy; + dx = SW_FT_ABS(arc[2].x + arc[0].x - 2 * arc[1].x); + dy = SW_FT_ABS(arc[2].y + arc[0].y - 2 * arc[1].y); + if (dx < dy) dx = dy; - if ( dx < ONE_PIXEL / 4 ) - goto Draw; + if (dx < ONE_PIXEL / 4) goto Draw; /* short-cut the arc that crosses the current band */ min = max = arc[0].y; y = arc[1].y; - if ( y < min ) min = y; - if ( y > max ) max = y; + if (y < min) min = y; + if (y > max) max = y; y = arc[2].y; - if ( y < min ) min = y; - if ( y > max ) max = y; + if (y < min) min = y; + if (y > max) max = y; - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) - goto Draw; + if (TRUNC(min) >= ras.max_ey || TRUNC(max) < ras.min_ey) goto Draw; level = 0; - do - { - dx >>= 2; - level++; - } while ( dx > ONE_PIXEL / 4 ); + do { + dx >>= 2; + level++; + } while (dx > ONE_PIXEL / 4); levels[0] = level; - do - { - level = levels[top]; - if ( level > 0 ) - { - gray_split_conic( arc ); - arc += 2; - top++; - levels[top] = levels[top - 1] = level - 1; - continue; - } + do { + level = levels[top]; + if (level > 0) { + gray_split_conic(arc); + arc += 2; + top++; + levels[top] = levels[top - 1] = level - 1; + continue; + } Draw: - gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); - top--; - arc -= 2; + gray_render_line(RAS_VAR_ arc[0].x, arc[0].y); + top--; + arc -= 2; - } while ( top >= 0 ); - } - - - static void - gray_split_cubic( SW_FT_Vector* base ) - { - TPos a, b, c, d; + } while (top >= 0); +} +static void gray_split_cubic(SW_FT_Vector* base) +{ + TPos a, b, c, d; base[6].x = base[3].x; c = base[1].x; d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; + base[1].x = a = (base[0].x + c) / 2; + base[5].x = b = (base[3].x + d) / 2; + c = (c + d) / 2; + base[2].x = a = (a + c) / 2; + base[4].x = b = (b + c) / 2; + base[3].x = (a + b) / 2; base[6].y = base[3].y; c = base[1].y; d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; - } + base[1].y = a = (base[0].y + c) / 2; + base[5].y = b = (base[3].y + d) / 2; + c = (c + d) / 2; + base[2].y = a = (a + c) / 2; + base[4].y = b = (b + c) / 2; + base[3].y = (a + b) / 2; +} +static void gray_render_cubic(RAS_ARG_ const SW_FT_Vector* control1, + const SW_FT_Vector* control2, + const SW_FT_Vector* to) +{ + SW_FT_Vector* arc; + TPos min, max, y; - static void - gray_render_cubic( RAS_ARG_ const SW_FT_Vector* control1, - const SW_FT_Vector* control2, - const SW_FT_Vector* to ) - { - SW_FT_Vector* arc; - TPos min, max, y; - - - arc = ras.bez_stack; - arc[0].x = UPSCALE( to->x ); - arc[0].y = UPSCALE( to->y ); - arc[1].x = UPSCALE( control2->x ); - arc[1].y = UPSCALE( control2->y ); - arc[2].x = UPSCALE( control1->x ); - arc[2].y = UPSCALE( control1->y ); + arc = ras.bez_stack; + arc[0].x = UPSCALE(to->x); + arc[0].y = UPSCALE(to->y); + arc[1].x = UPSCALE(control2->x); + arc[1].y = UPSCALE(control2->y); + arc[2].x = UPSCALE(control1->x); + arc[2].y = UPSCALE(control1->y); arc[3].x = ras.x; arc[3].y = ras.y; @@ -866,808 +753,684 @@ typedef struct SW_FT_Outline_Funcs_ min = max = arc[0].y; y = arc[1].y; - if ( y < min ) - min = y; - if ( y > max ) - max = y; + if (y < min) min = y; + if (y > max) max = y; y = arc[2].y; - if ( y < min ) - min = y; - if ( y > max ) - max = y; + if (y < min) min = y; + if (y > max) max = y; y = arc[3].y; - if ( y < min ) - min = y; - if ( y > max ) - max = y; + if (y < min) min = y; + if (y > max) max = y; - if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) - goto Draw; + if (TRUNC(min) >= ras.max_ey || TRUNC(max) < ras.min_ey) goto Draw; - for (;;) - { - /* Decide whether to split or draw. See `Rapid Termination */ - /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ - /* F. Hain, at */ - /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ + for (;;) { + /* Decide whether to split or draw. See `Rapid Termination */ + /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ + /* F. Hain, at */ + /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf + */ - { - TPos dx, dy, dx_, dy_; - TPos dx1, dy1, dx2, dy2; - TPos L, s, s_limit; + { + TPos dx, dy, dx_, dy_; + TPos dx1, dy1, dx2, dy2; + TPos L, s, s_limit; + /* dx and dy are x and y components of the P0-P3 chord vector. */ + dx = dx_ = arc[3].x - arc[0].x; + dy = dy_ = arc[3].y - arc[0].y; - /* dx and dy are x and y components of the P0-P3 chord vector. */ - dx = dx_ = arc[3].x - arc[0].x; - dy = dy_ = arc[3].y - arc[0].y; + L = SW_FT_HYPOT(dx_, dy_); - L = SW_FT_HYPOT( dx_, dy_ ); + /* Avoid possible arithmetic overflow below by splitting. */ + if (L > 32767) goto Split; - /* Avoid possible arithmetic overflow below by splitting. */ - if ( L > 32767 ) - goto Split; + /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ + s_limit = L * (TPos)(ONE_PIXEL / 6); - /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ - s_limit = L * (TPos)( ONE_PIXEL / 6 ); + /* s is L * the perpendicular distance from P1 to the line P0-P3. */ + dx1 = arc[1].x - arc[0].x; + dy1 = arc[1].y - arc[0].y; + s = SW_FT_ABS(dy * dx1 - dx * dy1); - /* s is L * the perpendicular distance from P1 to the line P0-P3. */ - dx1 = arc[1].x - arc[0].x; - dy1 = arc[1].y - arc[0].y; - s = SW_FT_ABS( dy * dx1 - dx * dy1 ); + if (s > s_limit) goto Split; - if ( s > s_limit ) - goto Split; + /* s is L * the perpendicular distance from P2 to the line P0-P3. */ + dx2 = arc[2].x - arc[0].x; + dy2 = arc[2].y - arc[0].y; + s = SW_FT_ABS(dy * dx2 - dx * dy2); - /* s is L * the perpendicular distance from P2 to the line P0-P3. */ - dx2 = arc[2].x - arc[0].x; - dy2 = arc[2].y - arc[0].y; - s = SW_FT_ABS( dy * dx2 - dx * dy2 ); + if (s > s_limit) goto Split; - if ( s > s_limit ) - goto Split; + /* Split super curvy segments where the off points are so far + from the chord that the angles P0-P1-P3 or P0-P2-P3 become + acute as detected by appropriate dot products. */ + if (dx1 * (dx1 - dx) + dy1 * (dy1 - dy) > 0 || + dx2 * (dx2 - dx) + dy2 * (dy2 - dy) > 0) + goto Split; - /* Split super curvy segments where the off points are so far - from the chord that the angles P0-P1-P3 or P0-P2-P3 become - acute as detected by appropriate dot products. */ - if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 || - dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 ) - goto Split; - - /* No reason to split. */ - goto Draw; - } + /* No reason to split. */ + goto Draw; + } Split: - gray_split_cubic( arc ); - arc += 3; - continue; + gray_split_cubic(arc); + arc += 3; + continue; Draw: - gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + gray_render_line(RAS_VAR_ arc[0].x, arc[0].y); - if ( arc == ras.bez_stack ) - return; + if (arc == ras.bez_stack) return; - arc -= 3; + arc -= 3; } - } - - - static int - gray_move_to( const SW_FT_Vector* to, - gray_PWorker worker ) - { - TPos x, y; +} +static int gray_move_to(const SW_FT_Vector* to, gray_PWorker worker) +{ + TPos x, y; /* record current cell, if any */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); + if (!ras.invalid) gray_record_cell(RAS_VAR); /* start to a new position */ - x = UPSCALE( to->x ); - y = UPSCALE( to->y ); + x = UPSCALE(to->x); + y = UPSCALE(to->y); - gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + gray_start_cell(RAS_VAR_ TRUNC(x), TRUNC(y)); worker->x = x; worker->y = y; return 0; - } +} - - static int - gray_line_to( const SW_FT_Vector* to, - gray_PWorker worker ) - { - gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); +static int gray_line_to(const SW_FT_Vector* to, gray_PWorker worker) +{ + gray_render_line(RAS_VAR_ UPSCALE(to->x), UPSCALE(to->y)); return 0; - } +} - - static int - gray_conic_to( const SW_FT_Vector* control, - const SW_FT_Vector* to, - gray_PWorker worker ) - { - gray_render_conic( RAS_VAR_ control, to ); +static int gray_conic_to(const SW_FT_Vector* control, const SW_FT_Vector* to, + gray_PWorker worker) +{ + gray_render_conic(RAS_VAR_ control, to); return 0; - } +} - - static int - gray_cubic_to( const SW_FT_Vector* control1, - const SW_FT_Vector* control2, - const SW_FT_Vector* to, - gray_PWorker worker ) - { - gray_render_cubic( RAS_VAR_ control1, control2, to ); +static int gray_cubic_to(const SW_FT_Vector* control1, + const SW_FT_Vector* control2, const SW_FT_Vector* to, + gray_PWorker worker) +{ + gray_render_cubic(RAS_VAR_ control1, control2, to); return 0; - } - - - static void - gray_hline( RAS_ARG_ TCoord x, - TCoord y, - TPos area, - TCoord acount ) - { - int coverage; +} +static void gray_hline(RAS_ARG_ TCoord x, TCoord y, TPos area, TCoord acount) +{ + int coverage; /* compute the coverage line's coverage, depending on the */ /* outline fill rule */ /* */ /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ /* */ - coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); - /* use range 0..256 */ - if ( coverage < 0 ) - coverage = -coverage; + coverage = (int)(area >> (PIXEL_BITS * 2 + 1 - 8)); + /* use range 0..256 */ + if (coverage < 0) coverage = -coverage; - if ( ras.outline.flags & SW_FT_OUTLINE_EVEN_ODD_FILL ) - { - coverage &= 511; + if (ras.outline.flags & SW_FT_OUTLINE_EVEN_ODD_FILL) { + coverage &= 511; - if ( coverage > 256 ) - coverage = 512 - coverage; - else if ( coverage == 256 ) - coverage = 255; - } - else - { - /* normal non-zero winding rule */ - if ( coverage >= 256 ) - coverage = 255; + if (coverage > 256) + coverage = 512 - coverage; + else if (coverage == 256) + coverage = 255; + } else { + /* normal non-zero winding rule */ + if (coverage >= 256) coverage = 255; } y += (TCoord)ras.min_ey; x += (TCoord)ras.min_ex; /* SW_FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ - if ( x >= 32767 ) - x = 32767; + if (x >= 32767) x = 32767; /* SW_FT_Span.y is an integer, so limit our coordinates appropriately */ - if ( y >= SW_FT_INT_MAX ) - y = SW_FT_INT_MAX; + if (y >= SW_FT_INT_MAX) y = SW_FT_INT_MAX; - if ( coverage ) - { - SW_FT_Span* span; - int count; + if (coverage) { + SW_FT_Span* span; + int count; + /* see whether we can add this span to the current list */ + count = ras.num_gray_spans; + span = ras.gray_spans + count - 1; + if (count > 0 && span->y == y && (int)span->x + span->len == (int)x && + span->coverage == coverage) { + span->len = (unsigned short)(span->len + acount); + return; + } - /* see whether we can add this span to the current list */ - count = ras.num_gray_spans; - span = ras.gray_spans + count - 1; - if ( count > 0 && - span->y == y && - (int)span->x + span->len == (int)x && - span->coverage == coverage ) - { - span->len = (unsigned short)( span->len + acount ); - return; - } + if (count >= SW_FT_MAX_GRAY_SPANS) { + if (ras.render_span && count > 0) + ras.render_span(count, ras.gray_spans, ras.render_span_data); - if ( count >= SW_FT_MAX_GRAY_SPANS ) - { - if ( ras.render_span && count > 0 ) - ras.render_span(count, ras.gray_spans, - ras.render_span_data ); +#ifdef DEBUG_GRAYS - #ifdef DEBUG_GRAYS + if (1) { + int n; - if ( 1 ) - { - int n; + fprintf(stderr, "count = %3d ", count); + span = ras.gray_spans; + for (n = 0; n < count; n++, span++) + fprintf(stderr, "[%d , %d..%d] : %d ", span->y, span->x, + span->x + span->len - 1, span->coverage); + fprintf(stderr, "\n"); + } +#endif /* DEBUG_GRAYS */ - fprintf( stderr, "count = %3d ", count ); - span = ras.gray_spans; - for ( n = 0; n < count; n++, span++ ) - fprintf( stderr, "[%d , %d..%d] : %d ", - span->y, span->x, span->x + span->len - 1, span->coverage ); - fprintf( stderr, "\n" ); - } + ras.num_gray_spans = 0; - #endif /* DEBUG_GRAYS */ + span = ras.gray_spans; + } else + span++; - ras.num_gray_spans = 0; + /* add a gray span to the current list */ + span->x = (short)x; + span->y = (short)y; + span->len = (unsigned short)acount; + span->coverage = (unsigned char)coverage; - span = ras.gray_spans; - } - else - span++; - - /* add a gray span to the current list */ - span->x = (short)x; - span->y = (short)y; - span->len = (unsigned short)acount; - span->coverage = (unsigned char)coverage; - - ras.num_gray_spans++; + ras.num_gray_spans++; } - } +} - static void - gray_sweep( RAS_ARG) - { - int yindex; +static void gray_sweep(RAS_ARG) +{ + int yindex; - if ( ras.num_cells == 0 ) - return; + if (ras.num_cells == 0) return; ras.num_gray_spans = 0; - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - { - PCell cell = ras.ycells[yindex]; - TCoord cover = 0; - TCoord x = 0; + for (yindex = 0; yindex < ras.ycount; yindex++) { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + for (; cell != NULL; cell = cell->next) { + TPos area; - for ( ; cell != NULL; cell = cell->next ) - { - TPos area; + if (cell->x > x && cover != 0) + gray_hline(RAS_VAR_ x, yindex, cover * (ONE_PIXEL * 2), + cell->x - x); + cover += cell->cover; + area = cover * (ONE_PIXEL * 2) - cell->area; - if ( cell->x > x && cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), - cell->x - x ); + if (area != 0 && cell->x >= 0) + gray_hline(RAS_VAR_ cell->x, yindex, area, 1); - cover += cell->cover; - area = cover * ( ONE_PIXEL * 2 ) - cell->area; + x = cell->x + 1; + } - if ( area != 0 && cell->x >= 0 ) - gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); - - x = cell->x + 1; - } - - if ( cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), - ras.count_ex - x ); + if (cover != 0) + gray_hline(RAS_VAR_ x, yindex, cover * (ONE_PIXEL * 2), + ras.count_ex - x); } - if ( ras.render_span && ras.num_gray_spans > 0 ) - ras.render_span(ras.num_gray_spans, - ras.gray_spans, ras.render_span_data ); - } + if (ras.render_span && ras.num_gray_spans > 0) + ras.render_span(ras.num_gray_spans, ras.gray_spans, + ras.render_span_data); +} +/*************************************************************************/ +/* */ +/* The following function should only compile in stand-alone mode, */ +/* i.e., when building this component without the rest of FreeType. */ +/* */ +/*************************************************************************/ - /*************************************************************************/ - /* */ - /* The following function should only compile in stand-alone mode, */ - /* i.e., when building this component without the rest of FreeType. */ - /* */ - /*************************************************************************/ - - /*************************************************************************/ - /* */ - /* */ - /* SW_FT_Outline_Decompose */ - /* */ - /* */ - /* Walk over an outline's structure to decompose it into individual */ - /* segments and Bézier arcs. This function is also able to emit */ - /* `move to' and `close to' operations to indicate the start and end */ - /* of new contours in the outline. */ - /* */ - /* */ - /* outline :: A pointer to the source target. */ - /* */ - /* func_interface :: A table of `emitters', i.e., function pointers */ - /* called during decomposition to indicate path */ - /* operations. */ - /* */ - /* */ - /* user :: A typeless pointer which is passed to each */ - /* emitter during the decomposition. It can be */ - /* used to store the state during the */ - /* decomposition. */ - /* */ - /* */ - /* Error code. 0 means success. */ - /* */ - static int - SW_FT_Outline_Decompose( const SW_FT_Outline* outline, - const SW_FT_Outline_Funcs* func_interface, - void* user ) - { +/*************************************************************************/ +/* */ +/* */ +/* SW_FT_Outline_Decompose */ +/* */ +/* */ +/* Walk over an outline's structure to decompose it into individual */ +/* segments and Bézier arcs. This function is also able to emit */ +/* `move to' and `close to' operations to indicate the start and end */ +/* of new contours in the outline. */ +/* */ +/* */ +/* outline :: A pointer to the source target. */ +/* */ +/* func_interface :: A table of `emitters', i.e., function pointers */ +/* called during decomposition to indicate path */ +/* operations. */ +/* */ +/* */ +/* user :: A typeless pointer which is passed to each */ +/* emitter during the decomposition. It can be */ +/* used to store the state during the */ +/* decomposition. */ +/* */ +/* */ +/* Error code. 0 means success. */ +/* */ +static int SW_FT_Outline_Decompose(const SW_FT_Outline* outline, + const SW_FT_Outline_Funcs* func_interface, + void* user) +{ #undef SCALED -#define SCALED( x ) ( ( (x) << shift ) - delta ) +#define SCALED(x) (((x) << shift) - delta) - SW_FT_Vector v_last; - SW_FT_Vector v_control; - SW_FT_Vector v_start; + SW_FT_Vector v_last; + SW_FT_Vector v_control; + SW_FT_Vector v_start; - SW_FT_Vector* point; - SW_FT_Vector* limit; - char* tags; + SW_FT_Vector* point; + SW_FT_Vector* limit; + char* tags; - int error; + int error; - int n; /* index of contour in outline */ - int first; /* index of first point in contour */ - char tag; /* current point's state */ + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + char tag; /* current point's state */ - int shift; - TPos delta; + int shift; + TPos delta; - - if ( !outline || !func_interface ) - return SW_FT_THROW( Invalid_Argument ); + if (!outline || !func_interface) return SW_FT_THROW(Invalid_Argument); shift = func_interface->shift; delta = func_interface->delta; first = 0; - for ( n = 0; n < outline->n_contours; n++ ) - { - int last; /* index of last point in contour */ + for (n = 0; n < outline->n_contours; n++) { + int last; /* index of last point in contour */ + last = outline->contours[n]; + if (last < 0) goto Invalid_Outline; + limit = outline->points + last; - last = outline->contours[n]; - if ( last < 0 ) - goto Invalid_Outline; - limit = outline->points + last; + v_start = outline->points[first]; + v_start.x = SCALED(v_start.x); + v_start.y = SCALED(v_start.y); - v_start = outline->points[first]; - v_start.x = SCALED( v_start.x ); - v_start.y = SCALED( v_start.y ); + v_last = outline->points[last]; + v_last.x = SCALED(v_last.x); + v_last.y = SCALED(v_last.y); - v_last = outline->points[last]; - v_last.x = SCALED( v_last.x ); - v_last.y = SCALED( v_last.y ); + v_control = v_start; - v_control = v_start; + point = outline->points + first; + tags = outline->tags + first; + tag = SW_FT_CURVE_TAG(tags[0]); - point = outline->points + first; - tags = outline->tags + first; - tag = SW_FT_CURVE_TAG( tags[0] ); + /* A contour cannot start with a cubic control point! */ + if (tag == SW_FT_CURVE_TAG_CUBIC) goto Invalid_Outline; - /* A contour cannot start with a cubic control point! */ - if ( tag == SW_FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == SW_FT_CURVE_TAG_CONIC ) - { - /* first point is conic control. Yes, this happens. */ - if ( SW_FT_CURVE_TAG( outline->tags[last] ) == SW_FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; + /* check first point to determine origin */ + if (tag == SW_FT_CURVE_TAG_CONIC) { + /* first point is conic control. Yes, this happens. */ + if (SW_FT_CURVE_TAG(outline->tags[last]) == SW_FT_CURVE_TAG_ON) { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } else { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = (v_start.x + v_last.x) / 2; + v_start.y = (v_start.y + v_last.y) / 2; + } + point--; + tags--; } - else - { - /* if both first and last points are conic, */ - /* start at their middle and record its position */ - /* for closure */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - } - point--; - tags--; - } - - error = func_interface->move_to( &v_start, user ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = SW_FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case SW_FT_CURVE_TAG_ON: /* emit a single line_to */ - { - SW_FT_Vector vec; - - - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - error = func_interface->line_to( &vec, user ); - if ( error ) - goto Exit; - continue; - } - - case SW_FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = SCALED( point->x ); - v_control.y = SCALED( point->y ); - - Do_Conic: - if ( point < limit ) - { - SW_FT_Vector vec; - SW_FT_Vector v_middle; + error = func_interface->move_to(&v_start, user); + if (error) goto Exit; + while (point < limit) { point++; tags++; - tag = SW_FT_CURVE_TAG( tags[0] ); - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); - - if ( tag == SW_FT_CURVE_TAG_ON ) + tag = SW_FT_CURVE_TAG(tags[0]); + switch (tag) { + case SW_FT_CURVE_TAG_ON: /* emit a single line_to */ { - error = func_interface->conic_to( &v_control, &vec, user ); - if ( error ) - goto Exit; - continue; + SW_FT_Vector vec; + + vec.x = SCALED(point->x); + vec.y = SCALED(point->y); + + error = func_interface->line_to(&vec, user); + if (error) goto Exit; + continue; } - if ( tag != SW_FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; + case SW_FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED(point->x); + v_control.y = SCALED(point->y); - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; + Do_Conic: + if (point < limit) { + SW_FT_Vector vec; + SW_FT_Vector v_middle; - error = func_interface->conic_to( &v_control, &v_middle, user ); - if ( error ) - goto Exit; + point++; + tags++; + tag = SW_FT_CURVE_TAG(tags[0]); - v_control = vec; - goto Do_Conic; - } + vec.x = SCALED(point->x); + vec.y = SCALED(point->y); - error = func_interface->conic_to( &v_control, &v_start, user ); - goto Close; + if (tag == SW_FT_CURVE_TAG_ON) { + error = + func_interface->conic_to(&v_control, &vec, user); + if (error) goto Exit; + continue; + } - default: /* SW_FT_CURVE_TAG_CUBIC */ - { - SW_FT_Vector vec1, vec2; + if (tag != SW_FT_CURVE_TAG_CONIC) goto Invalid_Outline; + v_middle.x = (v_control.x + vec.x) / 2; + v_middle.y = (v_control.y + vec.y) / 2; - if ( point + 1 > limit || - SW_FT_CURVE_TAG( tags[1] ) != SW_FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; + error = + func_interface->conic_to(&v_control, &v_middle, user); + if (error) goto Exit; - point += 2; - tags += 2; + v_control = vec; + goto Do_Conic; + } - vec1.x = SCALED( point[-2].x ); - vec1.y = SCALED( point[-2].y ); + error = func_interface->conic_to(&v_control, &v_start, user); + goto Close; - vec2.x = SCALED( point[-1].x ); - vec2.y = SCALED( point[-1].y ); - - if ( point <= limit ) + default: /* SW_FT_CURVE_TAG_CUBIC */ { - SW_FT_Vector vec; + SW_FT_Vector vec1, vec2; + if (point + 1 > limit || + SW_FT_CURVE_TAG(tags[1]) != SW_FT_CURVE_TAG_CUBIC) + goto Invalid_Outline; - vec.x = SCALED( point->x ); - vec.y = SCALED( point->y ); + point += 2; + tags += 2; - error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); - if ( error ) - goto Exit; - continue; + vec1.x = SCALED(point[-2].x); + vec1.y = SCALED(point[-2].y); + + vec2.x = SCALED(point[-1].x); + vec2.y = SCALED(point[-1].y); + + if (point <= limit) { + SW_FT_Vector vec; + + vec.x = SCALED(point->x); + vec.y = SCALED(point->y); + + error = func_interface->cubic_to(&vec1, &vec2, &vec, user); + if (error) goto Exit; + continue; + } + + error = func_interface->cubic_to(&vec1, &vec2, &v_start, user); + goto Close; + } } - - error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); - goto Close; - } } - } - /* close the contour with a line segment */ - error = func_interface->line_to( &v_start, user ); + /* close the contour with a line segment */ + error = func_interface->line_to(&v_start, user); - Close: - if ( error ) - goto Exit; + Close: + if (error) goto Exit; - first = last + 1; + first = last + 1; } return 0; - Exit: +Exit: return error; - Invalid_Outline: - return SW_FT_THROW( Invalid_Outline ); - } +Invalid_Outline: + return SW_FT_THROW(Invalid_Outline); +} +typedef struct gray_TBand_ { + TPos min, max; - typedef struct gray_TBand_ - { - TPos min, max; +} gray_TBand; - } gray_TBand; +SW_FT_DEFINE_OUTLINE_FUNCS(func_interface, + (SW_FT_Outline_MoveTo_Func)gray_move_to, + (SW_FT_Outline_LineTo_Func)gray_line_to, + (SW_FT_Outline_ConicTo_Func)gray_conic_to, + (SW_FT_Outline_CubicTo_Func)gray_cubic_to, 0, 0) +static int gray_convert_glyph_inner(RAS_ARG) +{ + volatile int error = 0; - - SW_FT_DEFINE_OUTLINE_FUNCS(func_interface, - (SW_FT_Outline_MoveTo_Func) gray_move_to, - (SW_FT_Outline_LineTo_Func) gray_line_to, - (SW_FT_Outline_ConicTo_Func)gray_conic_to, - (SW_FT_Outline_CubicTo_Func)gray_cubic_to, - 0, - 0 - ) - - static int - gray_convert_glyph_inner( RAS_ARG ) - { - - volatile int error = 0; - - if ( ft_setjmp( ras.jump_buffer ) == 0 ) - { - error = SW_FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - } - else - error = SW_FT_THROW( Memory_Overflow ); + if (ft_setjmp(ras.jump_buffer) == 0) { + error = SW_FT_Outline_Decompose(&ras.outline, &func_interface, &ras); + if (!ras.invalid) gray_record_cell(RAS_VAR); + } else + error = SW_FT_THROW(Memory_Overflow); return error; - } - - - static int - gray_convert_glyph( RAS_ARG ) - { - gray_TBand bands[40]; - gray_TBand* volatile band; - int volatile n, num_bands; - TPos volatile min, max, max_y; - SW_FT_BBox* clip; +} +static int gray_convert_glyph(RAS_ARG) +{ + gray_TBand bands[40]; + gray_TBand* volatile band; + int volatile n, num_bands; + TPos volatile min, max, max_y; + SW_FT_BBox* clip; /* Set up state in the raster object */ - gray_compute_cbox( RAS_VAR ); + gray_compute_cbox(RAS_VAR); /* clip to target bitmap, exit if nothing to do */ clip = &ras.clip_box; - if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || - ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) - return 0; + if (ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || + ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax) + return 0; - if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; - if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; + if (ras.min_ex < clip->xMin) ras.min_ex = clip->xMin; + if (ras.min_ey < clip->yMin) ras.min_ey = clip->yMin; - if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; - if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; + if (ras.max_ex > clip->xMax) ras.max_ex = clip->xMax; + if (ras.max_ey > clip->yMax) ras.max_ey = clip->yMax; ras.count_ex = ras.max_ex - ras.min_ex; ras.count_ey = ras.max_ey - ras.min_ey; /* set up vertical bands */ - num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); - if ( num_bands == 0 ) - num_bands = 1; - if ( num_bands >= 39 ) - num_bands = 39; + num_bands = (int)((ras.max_ey - ras.min_ey) / ras.band_size); + if (num_bands == 0) num_bands = 1; + if (num_bands >= 39) num_bands = 39; ras.band_shoot = 0; - min = ras.min_ey; + min = ras.min_ey; max_y = ras.max_ey; - for ( n = 0; n < num_bands; n++, min = max ) - { - max = min + ras.band_size; - if ( n == num_bands - 1 || max > max_y ) - max = max_y; + for (n = 0; n < num_bands; n++, min = max) { + max = min + ras.band_size; + if (n == num_bands - 1 || max > max_y) max = max_y; - bands[0].min = min; - bands[0].max = max; - band = bands; + bands[0].min = min; + bands[0].max = max; + band = bands; - while ( band >= bands ) - { - TPos bottom, top, middle; - int error; + while (band >= bands) { + TPos bottom, top, middle; + int error; - { - PCell cells_max; - int yindex; - long cell_start, cell_end, cell_mod; + { + PCell cells_max; + int yindex; + long cell_start, cell_end, cell_mod; + ras.ycells = (PCell*)ras.buffer; + ras.ycount = band->max - band->min; - ras.ycells = (PCell*)ras.buffer; - ras.ycount = band->max - band->min; + cell_start = sizeof(PCell) * ras.ycount; + cell_mod = cell_start % sizeof(TCell); + if (cell_mod > 0) cell_start += sizeof(TCell) - cell_mod; - cell_start = sizeof ( PCell ) * ras.ycount; - cell_mod = cell_start % sizeof ( TCell ); - if ( cell_mod > 0 ) - cell_start += sizeof ( TCell ) - cell_mod; + cell_end = ras.buffer_size; + cell_end -= cell_end % sizeof(TCell); - cell_end = ras.buffer_size; - cell_end -= cell_end % sizeof ( TCell ); + cells_max = (PCell)((char*)ras.buffer + cell_end); + ras.cells = (PCell)((char*)ras.buffer + cell_start); + if (ras.cells >= cells_max) goto ReduceBands; - cells_max = (PCell)( (char*)ras.buffer + cell_end ); - ras.cells = (PCell)( (char*)ras.buffer + cell_start ); - if ( ras.cells >= cells_max ) - goto ReduceBands; + ras.max_cells = cells_max - ras.cells; + if (ras.max_cells < 2) goto ReduceBands; - ras.max_cells = cells_max - ras.cells; - if ( ras.max_cells < 2 ) - goto ReduceBands; + for (yindex = 0; yindex < ras.ycount; yindex++) + ras.ycells[yindex] = NULL; + } - for ( yindex = 0; yindex < ras.ycount; yindex++ ) - ras.ycells[yindex] = NULL; + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + ras.count_ey = band->max - band->min; + + error = gray_convert_glyph_inner(RAS_VAR); + + if (!error) { + gray_sweep(RAS_VAR); + band--; + continue; + } else if (error != ErrRaster_Memory_Overflow) + return 1; + + ReduceBands: + /* render pool overflow; we will reduce the render band by half */ + bottom = band->min; + top = band->max; + middle = bottom + ((top - bottom) >> 1); + + /* This is too complex for a single scanline; there must */ + /* be some problems. */ + if (middle == bottom) { + return 1; + } + + if (bottom - top >= ras.band_size) ras.band_shoot++; + + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + band++; } - - ras.num_cells = 0; - ras.invalid = 1; - ras.min_ey = band->min; - ras.max_ey = band->max; - ras.count_ey = band->max - band->min; - - error = gray_convert_glyph_inner( RAS_VAR ); - - if ( !error ) - { - gray_sweep( RAS_VAR); - band--; - continue; - } - else if ( error != ErrRaster_Memory_Overflow ) - return 1; - - ReduceBands: - /* render pool overflow; we will reduce the render band by half */ - bottom = band->min; - top = band->max; - middle = bottom + ( ( top - bottom ) >> 1 ); - - /* This is too complex for a single scanline; there must */ - /* be some problems. */ - if ( middle == bottom ) - { - return 1; - } - - if ( bottom-top >= ras.band_size ) - ras.band_shoot++; - - band[1].min = bottom; - band[1].max = middle; - band[0].min = middle; - band[0].max = top; - band++; - } } - if ( ras.band_shoot > 8 && ras.band_size > 16 ) - ras.band_size = ras.band_size / 2; + if (ras.band_shoot > 8 && ras.band_size > 16) + ras.band_size = ras.band_size / 2; return 0; - } +} - static int - gray_raster_render( gray_PRaster raster, - const SW_FT_Raster_Params* params ) - { - SW_FT_UNUSED( raster ); - const SW_FT_Outline* outline = (const SW_FT_Outline*)params->source; +static int gray_raster_render(gray_PRaster raster, + const SW_FT_Raster_Params* params) +{ + SW_FT_UNUSED(raster); + const SW_FT_Outline* outline = (const SW_FT_Outline*)params->source; - gray_TWorker worker[1]; + gray_TWorker worker[1]; - TCell buffer[SW_FT_RENDER_POOL_SIZE / sizeof ( TCell )]; - long buffer_size = sizeof ( buffer ); - int band_size = (int)( buffer_size / - (long)( sizeof ( TCell ) * 8 ) ); + TCell buffer[SW_FT_RENDER_POOL_SIZE / sizeof(TCell)]; + long buffer_size = sizeof(buffer); + int band_size = (int)(buffer_size / (long)(sizeof(TCell) * 8)); - - if ( !outline ) - return SW_FT_THROW( Invalid_Outline ); + if (!outline) return SW_FT_THROW(Invalid_Outline); /* return immediately if the outline is empty */ - if ( outline->n_points == 0 || outline->n_contours <= 0 ) - return 0; + if (outline->n_points == 0 || outline->n_contours <= 0) return 0; - if ( !outline->contours || !outline->points ) - return SW_FT_THROW( Invalid_Outline ); + if (!outline->contours || !outline->points) + return SW_FT_THROW(Invalid_Outline); - if ( outline->n_points != - outline->contours[outline->n_contours - 1] + 1 ) - return SW_FT_THROW( Invalid_Outline ); + if (outline->n_points != outline->contours[outline->n_contours - 1] + 1) + return SW_FT_THROW(Invalid_Outline); /* this version does not support monochrome rendering */ - if ( !( params->flags & SW_FT_RASTER_FLAG_AA ) ) - return SW_FT_THROW( Invalid_Mode ); + if (!(params->flags & SW_FT_RASTER_FLAG_AA)) + return SW_FT_THROW(Invalid_Mode); - if ( params->flags & SW_FT_RASTER_FLAG_CLIP ) - ras.clip_box = params->clip_box; - else - { - ras.clip_box.xMin = -32768L; - ras.clip_box.yMin = -32768L; - ras.clip_box.xMax = 32767L; - ras.clip_box.yMax = 32767L; + if (params->flags & SW_FT_RASTER_FLAG_CLIP) + ras.clip_box = params->clip_box; + else { + ras.clip_box.xMin = -32768L; + ras.clip_box.yMin = -32768L; + ras.clip_box.xMax = 32767L; + ras.clip_box.yMax = 32767L; } - gray_init_cells( RAS_VAR_ buffer, buffer_size ); + gray_init_cells(RAS_VAR_ buffer, buffer_size); - ras.outline = *outline; - ras.num_cells = 0; - ras.invalid = 1; - ras.band_size = band_size; + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + ras.band_size = band_size; ras.num_gray_spans = 0; - ras.render_span = (SW_FT_Raster_Span_Func)params->gray_spans; + ras.render_span = (SW_FT_Raster_Span_Func)params->gray_spans; ras.render_span_data = params->user; - return gray_convert_glyph( RAS_VAR ); - } + return gray_convert_glyph(RAS_VAR); +} - /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ - /**** a static object. *****/ +/**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ +/**** a static object. *****/ - static int - gray_raster_new(SW_FT_Raster* araster ) - { - static gray_TRaster the_raster; +static int gray_raster_new(SW_FT_Raster* araster) +{ + static gray_TRaster the_raster; *araster = (SW_FT_Raster)&the_raster; - SW_FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + SW_FT_MEM_ZERO(&the_raster, sizeof(the_raster)); return 0; - } +} - - static void - gray_raster_done( SW_FT_Raster raster ) - { +static void gray_raster_done(SW_FT_Raster raster) +{ /* nothing */ - SW_FT_UNUSED( raster ); - } + SW_FT_UNUSED(raster); +} - static void - gray_raster_reset( SW_FT_Raster raster, - char* pool_base, - long pool_size ) - { - SW_FT_UNUSED( raster ); - SW_FT_UNUSED( pool_base ); - SW_FT_UNUSED( pool_size ); - } +static void gray_raster_reset(SW_FT_Raster raster, char* pool_base, + long pool_size) +{ + SW_FT_UNUSED(raster); + SW_FT_UNUSED(pool_base); + SW_FT_UNUSED(pool_size); +} +SW_FT_DEFINE_RASTER_FUNCS(sw_ft_grays_raster, - SW_FT_DEFINE_RASTER_FUNCS(sw_ft_grays_raster, - - (SW_FT_Raster_New_Func) gray_raster_new, - (SW_FT_Raster_Reset_Func) gray_raster_reset, - (SW_FT_Raster_Render_Func) gray_raster_render, - (SW_FT_Raster_Done_Func) gray_raster_done - ) - + (SW_FT_Raster_New_Func)gray_raster_new, + (SW_FT_Raster_Reset_Func)gray_raster_reset, + (SW_FT_Raster_Render_Func)gray_raster_render, + (SW_FT_Raster_Done_Func)gray_raster_done) /* END */ diff --git a/src/vector/freetype/v_ft_stroker.cpp b/src/vector/freetype/v_ft_stroker.cpp index 3315262c94..7192d5309f 100644 --- a/src/vector/freetype/v_ft_stroker.cpp +++ b/src/vector/freetype/v_ft_stroker.cpp @@ -16,157 +16,128 @@ /* */ /***************************************************************************/ - -#include "v_ft_math.h" #include "v_ft_stroker.h" #include -#include #include +#include +#include "v_ft_math.h" +/*************************************************************************/ +/*************************************************************************/ +/***** *****/ +/***** BEZIER COMPUTATIONS *****/ +/***** *****/ +/*************************************************************************/ +/*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** BEZIER COMPUTATIONS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ +#define SW_FT_SMALL_CONIC_THRESHOLD (SW_FT_ANGLE_PI / 6) +#define SW_FT_SMALL_CUBIC_THRESHOLD (SW_FT_ANGLE_PI / 8) -#define SW_FT_SMALL_CONIC_THRESHOLD ( SW_FT_ANGLE_PI / 6 ) -#define SW_FT_SMALL_CUBIC_THRESHOLD ( SW_FT_ANGLE_PI / 8 ) +#define SW_FT_EPSILON 2 -#define SW_FT_EPSILON 2 +#define SW_FT_IS_SMALL(x) ((x) > -SW_FT_EPSILON && (x) < SW_FT_EPSILON) -#define SW_FT_IS_SMALL( x ) ( (x) > -SW_FT_EPSILON && (x) < SW_FT_EPSILON ) - - - static SW_FT_Pos - ft_pos_abs( SW_FT_Pos x ) - { +static SW_FT_Pos ft_pos_abs(SW_FT_Pos x) +{ return x >= 0 ? x : -x; - } - - - static void - ft_conic_split( SW_FT_Vector* base ) - { - SW_FT_Pos a, b; +} +static void ft_conic_split(SW_FT_Vector* base) +{ + SW_FT_Pos a, b; base[4].x = base[2].x; b = base[1].x; - a = base[3].x = ( base[2].x + b ) / 2; - b = base[1].x = ( base[0].x + b ) / 2; - base[2].x = ( a + b ) / 2; + a = base[3].x = (base[2].x + b) / 2; + b = base[1].x = (base[0].x + b) / 2; + base[2].x = (a + b) / 2; base[4].y = base[2].y; b = base[1].y; - a = base[3].y = ( base[2].y + b ) / 2; - b = base[1].y = ( base[0].y + b ) / 2; - base[2].y = ( a + b ) / 2; - } - - - static SW_FT_Bool - ft_conic_is_small_enough( SW_FT_Vector* base, - SW_FT_Angle *angle_in, - SW_FT_Angle *angle_out ) - { - SW_FT_Vector d1, d2; - SW_FT_Angle theta; - SW_FT_Int close1, close2; + a = base[3].y = (base[2].y + b) / 2; + b = base[1].y = (base[0].y + b) / 2; + base[2].y = (a + b) / 2; +} +static SW_FT_Bool ft_conic_is_small_enough(SW_FT_Vector* base, + SW_FT_Angle* angle_in, + SW_FT_Angle* angle_out) +{ + SW_FT_Vector d1, d2; + SW_FT_Angle theta; + SW_FT_Int close1, close2; d1.x = base[1].x - base[2].x; d1.y = base[1].y - base[2].y; d2.x = base[0].x - base[1].x; d2.y = base[0].y - base[1].y; - close1 = SW_FT_IS_SMALL( d1.x ) && SW_FT_IS_SMALL( d1.y ); - close2 = SW_FT_IS_SMALL( d2.x ) && SW_FT_IS_SMALL( d2.y ); + close1 = SW_FT_IS_SMALL(d1.x) && SW_FT_IS_SMALL(d1.y); + close2 = SW_FT_IS_SMALL(d2.x) && SW_FT_IS_SMALL(d2.y); - if ( close1 ) + if (close1) { + if (close2) { + /* basically a point; */ + /* do nothing to retain original direction */ + } else { + *angle_in = *angle_out = SW_FT_Atan2(d2.x, d2.y); + } + } else /* !close1 */ { - if ( close2 ) - { - /* basically a point; */ - /* do nothing to retain original direction */ - } - else - { - *angle_in = - *angle_out = SW_FT_Atan2( d2.x, d2.y ); - } - } - else /* !close1 */ - { - if ( close2 ) - { - *angle_in = - *angle_out = SW_FT_Atan2( d1.x, d1.y ); - } - else - { - *angle_in = SW_FT_Atan2( d1.x, d1.y ); - *angle_out = SW_FT_Atan2( d2.x, d2.y ); - } + if (close2) { + *angle_in = *angle_out = SW_FT_Atan2(d1.x, d1.y); + } else { + *angle_in = SW_FT_Atan2(d1.x, d1.y); + *angle_out = SW_FT_Atan2(d2.x, d2.y); + } } - theta = ft_pos_abs( SW_FT_Angle_Diff( *angle_in, *angle_out ) ); + theta = ft_pos_abs(SW_FT_Angle_Diff(*angle_in, *angle_out)); - return SW_FT_BOOL( theta < SW_FT_SMALL_CONIC_THRESHOLD ); - } - - - static void - ft_cubic_split( SW_FT_Vector* base ) - { - SW_FT_Pos a, b, c, d; + return SW_FT_BOOL(theta < SW_FT_SMALL_CONIC_THRESHOLD); +} +static void ft_cubic_split(SW_FT_Vector* base) +{ + SW_FT_Pos a, b, c, d; base[6].x = base[3].x; c = base[1].x; d = base[2].x; - base[1].x = a = ( base[0].x + c ) / 2; - base[5].x = b = ( base[3].x + d ) / 2; - c = ( c + d ) / 2; - base[2].x = a = ( a + c ) / 2; - base[4].x = b = ( b + c ) / 2; - base[3].x = ( a + b ) / 2; + base[1].x = a = (base[0].x + c) / 2; + base[5].x = b = (base[3].x + d) / 2; + c = (c + d) / 2; + base[2].x = a = (a + c) / 2; + base[4].x = b = (b + c) / 2; + base[3].x = (a + b) / 2; base[6].y = base[3].y; c = base[1].y; d = base[2].y; - base[1].y = a = ( base[0].y + c ) / 2; - base[5].y = b = ( base[3].y + d ) / 2; - c = ( c + d ) / 2; - base[2].y = a = ( a + c ) / 2; - base[4].y = b = ( b + c ) / 2; - base[3].y = ( a + b ) / 2; - } + base[1].y = a = (base[0].y + c) / 2; + base[5].y = b = (base[3].y + d) / 2; + c = (c + d) / 2; + base[2].y = a = (a + c) / 2; + base[4].y = b = (b + c) / 2; + base[3].y = (a + b) / 2; +} +/* Return the average of `angle1' and `angle2'. */ +/* This gives correct result even if `angle1' and `angle2' */ +/* have opposite signs. */ +static SW_FT_Angle ft_angle_mean(SW_FT_Angle angle1, SW_FT_Angle angle2) +{ + return angle1 + SW_FT_Angle_Diff(angle1, angle2) / 2; +} - /* Return the average of `angle1' and `angle2'. */ - /* This gives correct result even if `angle1' and `angle2' */ - /* have opposite signs. */ - static SW_FT_Angle - ft_angle_mean( SW_FT_Angle angle1, - SW_FT_Angle angle2 ) - { - return angle1 + SW_FT_Angle_Diff( angle1, angle2 ) / 2; - } - - - static SW_FT_Bool - ft_cubic_is_small_enough( SW_FT_Vector* base, - SW_FT_Angle *angle_in, - SW_FT_Angle *angle_mid, - SW_FT_Angle *angle_out ) - { - SW_FT_Vector d1, d2, d3; - SW_FT_Angle theta1, theta2; - SW_FT_Int close1, close2, close3; - +static SW_FT_Bool ft_cubic_is_small_enough(SW_FT_Vector* base, + SW_FT_Angle* angle_in, + SW_FT_Angle* angle_mid, + SW_FT_Angle* angle_out) +{ + SW_FT_Vector d1, d2, d3; + SW_FT_Angle theta1, theta2; + SW_FT_Int close1, close2, close3; d1.x = base[2].x - base[3].x; d1.y = base[2].y - base[3].y; @@ -175,1642 +146,1376 @@ d3.x = base[0].x - base[1].x; d3.y = base[0].y - base[1].y; - close1 = SW_FT_IS_SMALL( d1.x ) && SW_FT_IS_SMALL( d1.y ); - close2 = SW_FT_IS_SMALL( d2.x ) && SW_FT_IS_SMALL( d2.y ); - close3 = SW_FT_IS_SMALL( d3.x ) && SW_FT_IS_SMALL( d3.y ); + close1 = SW_FT_IS_SMALL(d1.x) && SW_FT_IS_SMALL(d1.y); + close2 = SW_FT_IS_SMALL(d2.x) && SW_FT_IS_SMALL(d2.y); + close3 = SW_FT_IS_SMALL(d3.x) && SW_FT_IS_SMALL(d3.y); - if ( close1 ) + if (close1) { + if (close2) { + if (close3) { + /* basically a point; */ + /* do nothing to retain original direction */ + } else /* !close3 */ + { + *angle_in = *angle_mid = *angle_out = SW_FT_Atan2(d3.x, d3.y); + } + } else /* !close2 */ + { + if (close3) { + *angle_in = *angle_mid = *angle_out = SW_FT_Atan2(d2.x, d2.y); + } else /* !close3 */ + { + *angle_in = *angle_mid = SW_FT_Atan2(d2.x, d2.y); + *angle_out = SW_FT_Atan2(d3.x, d3.y); + } + } + } else /* !close1 */ { - if ( close2 ) - { - if ( close3 ) + if (close2) { + if (close3) { + *angle_in = *angle_mid = *angle_out = SW_FT_Atan2(d1.x, d1.y); + } else /* !close3 */ + { + *angle_in = SW_FT_Atan2(d1.x, d1.y); + *angle_out = SW_FT_Atan2(d3.x, d3.y); + *angle_mid = ft_angle_mean(*angle_in, *angle_out); + } + } else /* !close2 */ { - /* basically a point; */ - /* do nothing to retain original direction */ + if (close3) { + *angle_in = SW_FT_Atan2(d1.x, d1.y); + *angle_mid = *angle_out = SW_FT_Atan2(d2.x, d2.y); + } else /* !close3 */ + { + *angle_in = SW_FT_Atan2(d1.x, d1.y); + *angle_mid = SW_FT_Atan2(d2.x, d2.y); + *angle_out = SW_FT_Atan2(d3.x, d3.y); + } } - else /* !close3 */ - { - *angle_in = - *angle_mid = - *angle_out = SW_FT_Atan2( d3.x, d3.y ); - } - } - else /* !close2 */ - { - if ( close3 ) - { - *angle_in = - *angle_mid = - *angle_out = SW_FT_Atan2( d2.x, d2.y ); - } - else /* !close3 */ - { - *angle_in = - *angle_mid = SW_FT_Atan2( d2.x, d2.y ); - *angle_out = SW_FT_Atan2( d3.x, d3.y ); - } - } - } - else /* !close1 */ - { - if ( close2 ) - { - if ( close3 ) - { - *angle_in = - *angle_mid = - *angle_out = SW_FT_Atan2( d1.x, d1.y ); - } - else /* !close3 */ - { - *angle_in = SW_FT_Atan2( d1.x, d1.y ); - *angle_out = SW_FT_Atan2( d3.x, d3.y ); - *angle_mid = ft_angle_mean( *angle_in, *angle_out ); - } - } - else /* !close2 */ - { - if ( close3 ) - { - *angle_in = SW_FT_Atan2( d1.x, d1.y ); - *angle_mid = - *angle_out = SW_FT_Atan2( d2.x, d2.y ); - } - else /* !close3 */ - { - *angle_in = SW_FT_Atan2( d1.x, d1.y ); - *angle_mid = SW_FT_Atan2( d2.x, d2.y ); - *angle_out = SW_FT_Atan2( d3.x, d3.y ); - } - } } - theta1 = ft_pos_abs( SW_FT_Angle_Diff( *angle_in, *angle_mid ) ); - theta2 = ft_pos_abs( SW_FT_Angle_Diff( *angle_mid, *angle_out ) ); + theta1 = ft_pos_abs(SW_FT_Angle_Diff(*angle_in, *angle_mid)); + theta2 = ft_pos_abs(SW_FT_Angle_Diff(*angle_mid, *angle_out)); - return SW_FT_BOOL( theta1 < SW_FT_SMALL_CUBIC_THRESHOLD && - theta2 < SW_FT_SMALL_CUBIC_THRESHOLD ); - } + return SW_FT_BOOL(theta1 < SW_FT_SMALL_CUBIC_THRESHOLD && + theta2 < SW_FT_SMALL_CUBIC_THRESHOLD); +} +/*************************************************************************/ +/*************************************************************************/ +/***** *****/ +/***** STROKE BORDERS *****/ +/***** *****/ +/*************************************************************************/ +/*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STROKE BORDERS *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ +typedef enum SW_FT_StrokeTags_ { + SW_FT_STROKE_TAG_ON = 1, /* on-curve point */ + SW_FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + SW_FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + SW_FT_STROKE_TAG_END = 8 /* sub-path end */ - typedef enum SW_FT_StrokeTags_ - { - SW_FT_STROKE_TAG_ON = 1, /* on-curve point */ - SW_FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ - SW_FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ - SW_FT_STROKE_TAG_END = 8 /* sub-path end */ +} SW_FT_StrokeTags; - } SW_FT_StrokeTags; +#define SW_FT_STROKE_TAG_BEGIN_END \ + (SW_FT_STROKE_TAG_BEGIN | SW_FT_STROKE_TAG_END) -#define SW_FT_STROKE_TAG_BEGIN_END ( SW_FT_STROKE_TAG_BEGIN | SW_FT_STROKE_TAG_END ) +typedef struct SW_FT_StrokeBorderRec_ { + SW_FT_UInt num_points; + SW_FT_UInt max_points; + SW_FT_Vector* points; + SW_FT_Byte* tags; + SW_FT_Bool movable; /* TRUE for ends of lineto borders */ + SW_FT_Int start; /* index of current sub-path start point */ + SW_FT_Bool valid; - typedef struct SW_FT_StrokeBorderRec_ - { - SW_FT_UInt num_points; - SW_FT_UInt max_points; - SW_FT_Vector* points; - SW_FT_Byte* tags; - SW_FT_Bool movable; /* TRUE for ends of lineto borders */ - SW_FT_Int start; /* index of current sub-path start point */ - SW_FT_Bool valid; +} SW_FT_StrokeBorderRec, *SW_FT_StrokeBorder; - } SW_FT_StrokeBorderRec, *SW_FT_StrokeBorder; +SW_FT_Error SW_FT_Outline_Check(SW_FT_Outline* outline) +{ + if (outline) { + SW_FT_Int n_points = outline->n_points; + SW_FT_Int n_contours = outline->n_contours; + SW_FT_Int end0, end; + SW_FT_Int n; + /* empty glyph? */ + if (n_points == 0 && n_contours == 0) return 0; + /* check point and contour counts */ + if (n_points <= 0 || n_contours <= 0) goto Bad; - SW_FT_Error - SW_FT_Outline_Check( SW_FT_Outline* outline ) - { - if ( outline ) - { - SW_FT_Int n_points = outline->n_points; - SW_FT_Int n_contours = outline->n_contours; - SW_FT_Int end0, end; - SW_FT_Int n; + end0 = end = -1; + for (n = 0; n < n_contours; n++) { + end = outline->contours[n]; + /* note that we don't accept empty contours */ + if (end <= end0 || end >= n_points) goto Bad; - /* empty glyph? */ - if ( n_points == 0 && n_contours == 0 ) + end0 = end; + } + + if (end != n_points - 1) goto Bad; + + /* XXX: check the tags array */ return 0; - - /* check point and contour counts */ - if ( n_points <= 0 || n_contours <= 0 ) - goto Bad; - - end0 = end = -1; - for ( n = 0; n < n_contours; n++ ) - { - end = outline->contours[n]; - - /* note that we don't accept empty contours */ - if ( end <= end0 || end >= n_points ) - goto Bad; - - end0 = end; - } - - if ( end != n_points - 1 ) - goto Bad; - - /* XXX: check the tags array */ - return 0; } - Bad: - return -1;//SW_FT_THROW( Invalid_Argument ); - } +Bad: + return -1; // SW_FT_THROW( Invalid_Argument ); +} +void SW_FT_Outline_Get_CBox(const SW_FT_Outline* outline, SW_FT_BBox* acbox) +{ + SW_FT_Pos xMin, yMin, xMax, yMax; + if (outline && acbox) { + if (outline->n_points == 0) { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } else { + SW_FT_Vector* vec = outline->points; + SW_FT_Vector* limit = vec + outline->n_points; - void - SW_FT_Outline_Get_CBox( const SW_FT_Outline* outline, - SW_FT_BBox *acbox ) - { - SW_FT_Pos xMin, yMin, xMax, yMax; + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + for (; vec < limit; vec++) { + SW_FT_Pos x, y; - if ( outline && acbox ) - { - if ( outline->n_points == 0 ) - { - xMin = 0; - yMin = 0; - xMax = 0; - yMax = 0; - } - else - { - SW_FT_Vector* vec = outline->points; - SW_FT_Vector* limit = vec + outline->n_points; + x = vec->x; + if (x < xMin) xMin = x; + if (x > xMax) xMax = x; - - xMin = xMax = vec->x; - yMin = yMax = vec->y; - vec++; - - for ( ; vec < limit; vec++ ) - { - SW_FT_Pos x, y; - - - x = vec->x; - if ( x < xMin ) xMin = x; - if ( x > xMax ) xMax = x; - - y = vec->y; - if ( y < yMin ) yMin = y; - if ( y > yMax ) yMax = y; + y = vec->y; + if (y < yMin) yMin = y; + if (y > yMax) yMax = y; + } } - } - acbox->xMin = xMin; - acbox->xMax = xMax; - acbox->yMin = yMin; - acbox->yMax = yMax; + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; } - } +} +static SW_FT_Error ft_stroke_border_grow(SW_FT_StrokeBorder border, + SW_FT_UInt new_points) +{ + SW_FT_UInt old_max = border->max_points; + SW_FT_UInt new_max = border->num_points + new_points; + SW_FT_Error error = 0; + if (new_max > old_max) { + SW_FT_UInt cur_max = old_max; - static SW_FT_Error - ft_stroke_border_grow( SW_FT_StrokeBorder border, - SW_FT_UInt new_points ) - { - SW_FT_UInt old_max = border->max_points; - SW_FT_UInt new_max = border->num_points + new_points; - SW_FT_Error error = 0; + while (cur_max < new_max) cur_max += (cur_max >> 1) + 16; + border->points = (SW_FT_Vector*)realloc(border->points, + cur_max * sizeof(SW_FT_Vector)); + border->tags = + (SW_FT_Byte*)realloc(border->tags, cur_max * sizeof(SW_FT_Byte)); - if ( new_max > old_max ) - { - SW_FT_UInt cur_max = old_max; + if (!border->points || !border->tags) goto Exit; - - while ( cur_max < new_max ) - cur_max += ( cur_max >> 1 ) + 16; - - border->points = (SW_FT_Vector *) realloc(border->points, cur_max * sizeof(SW_FT_Vector)); - border->tags = (SW_FT_Byte *) realloc(border->tags, cur_max * sizeof(SW_FT_Byte)); - - if ( !border->points || !border->tags) - goto Exit; - - border->max_points = cur_max; + border->max_points = cur_max; } - Exit: +Exit: return error; - } +} +static void ft_stroke_border_close(SW_FT_StrokeBorder border, + SW_FT_Bool reverse) +{ + SW_FT_UInt start = border->start; + SW_FT_UInt count = border->num_points; - static void - ft_stroke_border_close( SW_FT_StrokeBorder border, - SW_FT_Bool reverse ) - { - SW_FT_UInt start = border->start; - SW_FT_UInt count = border->num_points; - - - assert( border->start >= 0 ); + assert(border->start >= 0); /* don't record empty paths! */ - if ( count <= start + 1U ) - border->num_points = start; - else - { - /* copy the last point to the start of this sub-path, since */ - /* it contains the `adjusted' starting coordinates */ - border->num_points = --count; - border->points[start] = border->points[count]; + if (count <= start + 1U) + border->num_points = start; + else { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; - if ( reverse ) - { - /* reverse the points */ - { - SW_FT_Vector* vec1 = border->points + start + 1; - SW_FT_Vector* vec2 = border->points + count - 1; + if (reverse) { + /* reverse the points */ + { + SW_FT_Vector* vec1 = border->points + start + 1; + SW_FT_Vector* vec2 = border->points + count - 1; + for (; vec1 < vec2; vec1++, vec2--) { + SW_FT_Vector tmp; - for ( ; vec1 < vec2; vec1++, vec2-- ) - { - SW_FT_Vector tmp; + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + /* then the tags */ + { + SW_FT_Byte* tag1 = border->tags + start + 1; + SW_FT_Byte* tag2 = border->tags + count - 1; - tmp = *vec1; - *vec1 = *vec2; - *vec2 = tmp; - } + for (; tag1 < tag2; tag1++, tag2--) { + SW_FT_Byte tmp; + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } } - /* then the tags */ - { - SW_FT_Byte* tag1 = border->tags + start + 1; - SW_FT_Byte* tag2 = border->tags + count - 1; - - - for ( ; tag1 < tag2; tag1++, tag2-- ) - { - SW_FT_Byte tmp; - - - tmp = *tag1; - *tag1 = *tag2; - *tag2 = tmp; - } - } - } - - border->tags[start ] |= SW_FT_STROKE_TAG_BEGIN; - border->tags[count - 1] |= SW_FT_STROKE_TAG_END; + border->tags[start] |= SW_FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= SW_FT_STROKE_TAG_END; } - border->start = -1; + border->start = -1; border->movable = FALSE; - } +} +static SW_FT_Error ft_stroke_border_lineto(SW_FT_StrokeBorder border, + SW_FT_Vector* to, SW_FT_Bool movable) +{ + SW_FT_Error error = 0; - static SW_FT_Error - ft_stroke_border_lineto( SW_FT_StrokeBorder border, - SW_FT_Vector* to, - SW_FT_Bool movable ) - { - SW_FT_Error error = 0; + assert(border->start >= 0); + if (border->movable) { + /* move last point */ + border->points[border->num_points - 1] = *to; + } else { + /* don't add zero-length lineto */ + if (border->num_points > 0 && + SW_FT_IS_SMALL(border->points[border->num_points - 1].x - to->x) && + SW_FT_IS_SMALL(border->points[border->num_points - 1].y - to->y)) + return error; - assert( border->start >= 0 ); + /* add one point */ + error = ft_stroke_border_grow(border, 1); + if (!error) { + SW_FT_Vector* vec = border->points + border->num_points; + SW_FT_Byte* tag = border->tags + border->num_points; - if ( border->movable ) - { - /* move last point */ - border->points[border->num_points - 1] = *to; - } - else - { - /* don't add zero-length lineto */ - if ( border->num_points > 0 && - SW_FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) && - SW_FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) ) - return error; + vec[0] = *to; + tag[0] = SW_FT_STROKE_TAG_ON; - /* add one point */ - error = ft_stroke_border_grow( border, 1 ); - if ( !error ) - { - SW_FT_Vector* vec = border->points + border->num_points; - SW_FT_Byte* tag = border->tags + border->num_points; - - - vec[0] = *to; - tag[0] = SW_FT_STROKE_TAG_ON; - - border->num_points += 1; - } + border->num_points += 1; + } } border->movable = movable; return error; - } +} +static SW_FT_Error ft_stroke_border_conicto(SW_FT_StrokeBorder border, + SW_FT_Vector* control, + SW_FT_Vector* to) +{ + SW_FT_Error error; - static SW_FT_Error - ft_stroke_border_conicto( SW_FT_StrokeBorder border, - SW_FT_Vector* control, - SW_FT_Vector* to ) - { - SW_FT_Error error; + assert(border->start >= 0); + error = ft_stroke_border_grow(border, 2); + if (!error) { + SW_FT_Vector* vec = border->points + border->num_points; + SW_FT_Byte* tag = border->tags + border->num_points; - assert( border->start >= 0 ); + vec[0] = *control; + vec[1] = *to; - error = ft_stroke_border_grow( border, 2 ); - if ( !error ) - { - SW_FT_Vector* vec = border->points + border->num_points; - SW_FT_Byte* tag = border->tags + border->num_points; + tag[0] = 0; + tag[1] = SW_FT_STROKE_TAG_ON; - - vec[0] = *control; - vec[1] = *to; - - tag[0] = 0; - tag[1] = SW_FT_STROKE_TAG_ON; - - border->num_points += 2; + border->num_points += 2; } border->movable = FALSE; return error; - } +} +static SW_FT_Error ft_stroke_border_cubicto(SW_FT_StrokeBorder border, + SW_FT_Vector* control1, + SW_FT_Vector* control2, + SW_FT_Vector* to) +{ + SW_FT_Error error; - static SW_FT_Error - ft_stroke_border_cubicto( SW_FT_StrokeBorder border, - SW_FT_Vector* control1, - SW_FT_Vector* control2, - SW_FT_Vector* to ) - { - SW_FT_Error error; + assert(border->start >= 0); + error = ft_stroke_border_grow(border, 3); + if (!error) { + SW_FT_Vector* vec = border->points + border->num_points; + SW_FT_Byte* tag = border->tags + border->num_points; - assert( border->start >= 0 ); + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; - error = ft_stroke_border_grow( border, 3 ); - if ( !error ) - { - SW_FT_Vector* vec = border->points + border->num_points; - SW_FT_Byte* tag = border->tags + border->num_points; + tag[0] = SW_FT_STROKE_TAG_CUBIC; + tag[1] = SW_FT_STROKE_TAG_CUBIC; + tag[2] = SW_FT_STROKE_TAG_ON; - - vec[0] = *control1; - vec[1] = *control2; - vec[2] = *to; - - tag[0] = SW_FT_STROKE_TAG_CUBIC; - tag[1] = SW_FT_STROKE_TAG_CUBIC; - tag[2] = SW_FT_STROKE_TAG_ON; - - border->num_points += 3; + border->num_points += 3; } border->movable = FALSE; return error; - } +} +#define SW_FT_ARC_CUBIC_ANGLE (SW_FT_ANGLE_PI / 2) -#define SW_FT_ARC_CUBIC_ANGLE ( SW_FT_ANGLE_PI / 2 ) - - - static SW_FT_Error - ft_stroke_border_arcto( SW_FT_StrokeBorder border, - SW_FT_Vector* center, - SW_FT_Fixed radius, - SW_FT_Angle angle_start, - SW_FT_Angle angle_diff ) - { - SW_FT_Angle total, angle, step, rotate, next, theta; - SW_FT_Vector a, b, a2, b2; - SW_FT_Fixed length; - SW_FT_Error error = 0; - +static SW_FT_Error ft_stroke_border_arcto(SW_FT_StrokeBorder border, + SW_FT_Vector* center, + SW_FT_Fixed radius, + SW_FT_Angle angle_start, + SW_FT_Angle angle_diff) +{ + SW_FT_Angle total, angle, step, rotate, next, theta; + SW_FT_Vector a, b, a2, b2; + SW_FT_Fixed length; + SW_FT_Error error = 0; /* compute start point */ - SW_FT_Vector_From_Polar( &a, radius, angle_start ); + SW_FT_Vector_From_Polar(&a, radius, angle_start); a.x += center->x; a.y += center->y; - total = angle_diff; - angle = angle_start; - rotate = ( angle_diff >= 0 ) ? SW_FT_ANGLE_PI2 : -SW_FT_ANGLE_PI2; + total = angle_diff; + angle = angle_start; + rotate = (angle_diff >= 0) ? SW_FT_ANGLE_PI2 : -SW_FT_ANGLE_PI2; - while ( total != 0 ) - { - step = total; - if ( step > SW_FT_ARC_CUBIC_ANGLE ) - step = SW_FT_ARC_CUBIC_ANGLE; + while (total != 0) { + step = total; + if (step > SW_FT_ARC_CUBIC_ANGLE) + step = SW_FT_ARC_CUBIC_ANGLE; - else if ( step < -SW_FT_ARC_CUBIC_ANGLE ) - step = -SW_FT_ARC_CUBIC_ANGLE; + else if (step < -SW_FT_ARC_CUBIC_ANGLE) + step = -SW_FT_ARC_CUBIC_ANGLE; - next = angle + step; - theta = step; - if ( theta < 0 ) - theta = -theta; + next = angle + step; + theta = step; + if (theta < 0) theta = -theta; - theta >>= 1; + theta >>= 1; - /* compute end point */ - SW_FT_Vector_From_Polar( &b, radius, next ); - b.x += center->x; - b.y += center->y; + /* compute end point */ + SW_FT_Vector_From_Polar(&b, radius, next); + b.x += center->x; + b.y += center->y; - /* compute first and second control points */ - length = SW_FT_MulDiv( radius, SW_FT_Sin( theta ) * 4, - ( 0x10000L + SW_FT_Cos( theta ) ) * 3 ); + /* compute first and second control points */ + length = SW_FT_MulDiv(radius, SW_FT_Sin(theta) * 4, + (0x10000L + SW_FT_Cos(theta)) * 3); - SW_FT_Vector_From_Polar( &a2, length, angle + rotate ); - a2.x += a.x; - a2.y += a.y; + SW_FT_Vector_From_Polar(&a2, length, angle + rotate); + a2.x += a.x; + a2.y += a.y; - SW_FT_Vector_From_Polar( &b2, length, next - rotate ); - b2.x += b.x; - b2.y += b.y; + SW_FT_Vector_From_Polar(&b2, length, next - rotate); + b2.x += b.x; + b2.y += b.y; - /* add cubic arc */ - error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); - if ( error ) - break; + /* add cubic arc */ + error = ft_stroke_border_cubicto(border, &a2, &b2, &b); + if (error) break; - /* process the rest of the arc ?? */ - a = b; - total -= step; - angle = next; + /* process the rest of the arc ?? */ + a = b; + total -= step; + angle = next; } return error; - } +} - - static SW_FT_Error - ft_stroke_border_moveto( SW_FT_StrokeBorder border, - SW_FT_Vector* to ) - { +static SW_FT_Error ft_stroke_border_moveto(SW_FT_StrokeBorder border, + SW_FT_Vector* to) +{ /* close current open path if any ? */ - if ( border->start >= 0 ) - ft_stroke_border_close( border, FALSE ); + if (border->start >= 0) ft_stroke_border_close(border, FALSE); border->start = border->num_points; border->movable = FALSE; - return ft_stroke_border_lineto( border, to, FALSE ); - } + return ft_stroke_border_lineto(border, to, FALSE); +} - - static void - ft_stroke_border_init( SW_FT_StrokeBorder border) - { +static void ft_stroke_border_init(SW_FT_StrokeBorder border) +{ border->points = NULL; - border->tags = NULL; + border->tags = NULL; border->num_points = 0; border->max_points = 0; - border->start = -1; - border->valid = FALSE; - } + border->start = -1; + border->valid = FALSE; +} - - static void - ft_stroke_border_reset( SW_FT_StrokeBorder border ) - { +static void ft_stroke_border_reset(SW_FT_StrokeBorder border) +{ border->num_points = 0; - border->start = -1; - border->valid = FALSE; - } + border->start = -1; + border->valid = FALSE; +} - - static void - ft_stroke_border_done( SW_FT_StrokeBorder border ) - { - - free( border->points ); - free( border->tags ); +static void ft_stroke_border_done(SW_FT_StrokeBorder border) +{ + free(border->points); + free(border->tags); border->num_points = 0; border->max_points = 0; - border->start = -1; - border->valid = FALSE; - } + border->start = -1; + border->valid = FALSE; +} +static SW_FT_Error ft_stroke_border_get_counts(SW_FT_StrokeBorder border, + SW_FT_UInt* anum_points, + SW_FT_UInt* anum_contours) +{ + SW_FT_Error error = 0; + SW_FT_UInt num_points = 0; + SW_FT_UInt num_contours = 0; - static SW_FT_Error - ft_stroke_border_get_counts( SW_FT_StrokeBorder border, - SW_FT_UInt *anum_points, - SW_FT_UInt *anum_contours ) - { - SW_FT_Error error = 0; - SW_FT_UInt num_points = 0; - SW_FT_UInt num_contours = 0; + SW_FT_UInt count = border->num_points; + SW_FT_Vector* point = border->points; + SW_FT_Byte* tags = border->tags; + SW_FT_Int in_contour = 0; - SW_FT_UInt count = border->num_points; - SW_FT_Vector* point = border->points; - SW_FT_Byte* tags = border->tags; - SW_FT_Int in_contour = 0; + for (; count > 0; count--, num_points++, point++, tags++) { + if (tags[0] & SW_FT_STROKE_TAG_BEGIN) { + if (in_contour != 0) goto Fail; + in_contour = 1; + } else if (in_contour == 0) + goto Fail; - for ( ; count > 0; count--, num_points++, point++, tags++ ) - { - if ( tags[0] & SW_FT_STROKE_TAG_BEGIN ) - { - if ( in_contour != 0 ) - goto Fail; - - in_contour = 1; - } - else if ( in_contour == 0 ) - goto Fail; - - if ( tags[0] & SW_FT_STROKE_TAG_END ) - { - in_contour = 0; - num_contours++; - } + if (tags[0] & SW_FT_STROKE_TAG_END) { + in_contour = 0; + num_contours++; + } } - if ( in_contour != 0 ) - goto Fail; + if (in_contour != 0) goto Fail; border->valid = TRUE; - Exit: - *anum_points = num_points; +Exit: + *anum_points = num_points; *anum_contours = num_contours; return error; - Fail: - num_points = 0; +Fail: + num_points = 0; num_contours = 0; goto Exit; - } +} - - static void - ft_stroke_border_export( SW_FT_StrokeBorder border, - SW_FT_Outline* outline ) - { +static void ft_stroke_border_export(SW_FT_StrokeBorder border, + SW_FT_Outline* outline) +{ /* copy point locations */ - memcpy( outline->points + outline->n_points, - border->points, - border->num_points * sizeof(SW_FT_Vector)); + memcpy(outline->points + outline->n_points, border->points, + border->num_points * sizeof(SW_FT_Vector)); /* copy tags */ { - SW_FT_UInt count = border->num_points; - SW_FT_Byte* read = border->tags; - SW_FT_Byte* write = (SW_FT_Byte*)outline->tags + outline->n_points; + SW_FT_UInt count = border->num_points; + SW_FT_Byte* read = border->tags; + SW_FT_Byte* write = (SW_FT_Byte*)outline->tags + outline->n_points; - - for ( ; count > 0; count--, read++, write++ ) - { - if ( *read & SW_FT_STROKE_TAG_ON ) - *write = SW_FT_CURVE_TAG_ON; - else if ( *read & SW_FT_STROKE_TAG_CUBIC ) - *write = SW_FT_CURVE_TAG_CUBIC; - else - *write = SW_FT_CURVE_TAG_CONIC; - } + for (; count > 0; count--, read++, write++) { + if (*read & SW_FT_STROKE_TAG_ON) + *write = SW_FT_CURVE_TAG_ON; + else if (*read & SW_FT_STROKE_TAG_CUBIC) + *write = SW_FT_CURVE_TAG_CUBIC; + else + *write = SW_FT_CURVE_TAG_CONIC; + } } /* copy contours */ { - SW_FT_UInt count = border->num_points; - SW_FT_Byte* tags = border->tags; - SW_FT_Short* write = outline->contours + outline->n_contours; - SW_FT_Short idx = (SW_FT_Short)outline->n_points; + SW_FT_UInt count = border->num_points; + SW_FT_Byte* tags = border->tags; + SW_FT_Short* write = outline->contours + outline->n_contours; + SW_FT_Short idx = (SW_FT_Short)outline->n_points; - - for ( ; count > 0; count--, tags++, idx++ ) - { - if ( *tags & SW_FT_STROKE_TAG_END ) - { - *write++ = idx; - outline->n_contours++; + for (; count > 0; count--, tags++, idx++) { + if (*tags & SW_FT_STROKE_TAG_END) { + *write++ = idx; + outline->n_contours++; + } } - } } - outline->n_points = (short)( outline->n_points + border->num_points ); + outline->n_points = (short)(outline->n_points + border->num_points); - assert( SW_FT_Outline_Check( outline ) == 0 ); - } + assert(SW_FT_Outline_Check(outline) == 0); +} +/*************************************************************************/ +/*************************************************************************/ +/***** *****/ +/***** STROKER *****/ +/***** *****/ +/*************************************************************************/ +/*************************************************************************/ - /*************************************************************************/ - /*************************************************************************/ - /***** *****/ - /***** STROKER *****/ - /***** *****/ - /*************************************************************************/ - /*************************************************************************/ +#define SW_FT_SIDE_TO_ROTATE(s) (SW_FT_ANGLE_PI2 - (s)*SW_FT_ANGLE_PI) -#define SW_FT_SIDE_TO_ROTATE( s ) ( SW_FT_ANGLE_PI2 - (s) * SW_FT_ANGLE_PI ) +typedef struct SW_FT_StrokerRec_ { + SW_FT_Angle angle_in; /* direction into curr join */ + SW_FT_Angle angle_out; /* direction out of join */ + SW_FT_Vector center; /* current position */ + SW_FT_Fixed line_length; /* length of last lineto */ + SW_FT_Bool first_point; /* is this the start? */ + SW_FT_Bool subpath_open; /* is the subpath open? */ + SW_FT_Angle subpath_angle; /* subpath start direction */ + SW_FT_Vector subpath_start; /* subpath start position */ + SW_FT_Fixed subpath_line_length; /* subpath start lineto len */ + SW_FT_Bool handle_wide_strokes; /* use wide strokes logic? */ - typedef struct SW_FT_StrokerRec_ - { - SW_FT_Angle angle_in; /* direction into curr join */ - SW_FT_Angle angle_out; /* direction out of join */ - SW_FT_Vector center; /* current position */ - SW_FT_Fixed line_length; /* length of last lineto */ - SW_FT_Bool first_point; /* is this the start? */ - SW_FT_Bool subpath_open; /* is the subpath open? */ - SW_FT_Angle subpath_angle; /* subpath start direction */ - SW_FT_Vector subpath_start; /* subpath start position */ - SW_FT_Fixed subpath_line_length; /* subpath start lineto len */ - SW_FT_Bool handle_wide_strokes; /* use wide strokes logic? */ + SW_FT_Stroker_LineCap line_cap; + SW_FT_Stroker_LineJoin line_join; + SW_FT_Stroker_LineJoin line_join_saved; + SW_FT_Fixed miter_limit; + SW_FT_Fixed radius; - SW_FT_Stroker_LineCap line_cap; - SW_FT_Stroker_LineJoin line_join; - SW_FT_Stroker_LineJoin line_join_saved; - SW_FT_Fixed miter_limit; - SW_FT_Fixed radius; + SW_FT_StrokeBorderRec borders[2]; +} SW_FT_StrokerRec; - SW_FT_StrokeBorderRec borders[2]; - } SW_FT_StrokerRec; +/* documentation is in ftstroke.h */ +SW_FT_Error SW_FT_Stroker_New(SW_FT_Stroker* astroker) +{ + SW_FT_Error error = 0; /* assigned in SW_FT_NEW */ + SW_FT_Stroker stroker = NULL; - /* documentation is in ftstroke.h */ - - SW_FT_Error - SW_FT_Stroker_New( SW_FT_Stroker *astroker ) - { - SW_FT_Error error = 0; /* assigned in SW_FT_NEW */ - SW_FT_Stroker stroker = NULL; - - - stroker = (SW_FT_StrokerRec *) calloc(1, sizeof(SW_FT_StrokerRec)); - if ( stroker ) - { - - ft_stroke_border_init( &stroker->borders[0]); - ft_stroke_border_init( &stroker->borders[1]); + stroker = (SW_FT_StrokerRec*)calloc(1, sizeof(SW_FT_StrokerRec)); + if (stroker) { + ft_stroke_border_init(&stroker->borders[0]); + ft_stroke_border_init(&stroker->borders[1]); } *astroker = stroker; return error; - } +} - void - SW_FT_Stroker_Rewind( SW_FT_Stroker stroker ) - { - if ( stroker ) - { - ft_stroke_border_reset( &stroker->borders[0] ); - ft_stroke_border_reset( &stroker->borders[1] ); +void SW_FT_Stroker_Rewind(SW_FT_Stroker stroker) +{ + if (stroker) { + ft_stroke_border_reset(&stroker->borders[0]); + ft_stroke_border_reset(&stroker->borders[1]); } - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ - - void - SW_FT_Stroker_Set( SW_FT_Stroker stroker, - SW_FT_Fixed radius, - SW_FT_Stroker_LineCap line_cap, - SW_FT_Stroker_LineJoin line_join, - SW_FT_Fixed miter_limit ) - { - stroker->radius = radius; - stroker->line_cap = line_cap; - stroker->line_join = line_join; +void SW_FT_Stroker_Set(SW_FT_Stroker stroker, SW_FT_Fixed radius, + SW_FT_Stroker_LineCap line_cap, + SW_FT_Stroker_LineJoin line_join, + SW_FT_Fixed miter_limit) +{ + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; stroker->miter_limit = miter_limit; /* ensure miter limit has sensible value */ - if ( stroker->miter_limit < 0x10000 ) - stroker->miter_limit = 0x10000; + if (stroker->miter_limit < 0x10000) stroker->miter_limit = 0x10000; /* save line join style: */ /* line join style can be temporarily changed when stroking curves */ stroker->line_join_saved = line_join; - SW_FT_Stroker_Rewind( stroker ); - } + SW_FT_Stroker_Rewind(stroker); +} - /* documentation is in ftstroke.h */ +/* documentation is in ftstroke.h */ - void - SW_FT_Stroker_Done( SW_FT_Stroker stroker ) - { - if ( stroker ) - { +void SW_FT_Stroker_Done(SW_FT_Stroker stroker) +{ + if (stroker) { + ft_stroke_border_done(&stroker->borders[0]); + ft_stroke_border_done(&stroker->borders[1]); - ft_stroke_border_done( &stroker->borders[0] ); - ft_stroke_border_done( &stroker->borders[1] ); - - free( stroker ); + free(stroker); } - } +} +/* create a circular arc at a corner or cap */ +static SW_FT_Error ft_stroker_arcto(SW_FT_Stroker stroker, SW_FT_Int side) +{ + SW_FT_Angle total, rotate; + SW_FT_Fixed radius = stroker->radius; + SW_FT_Error error = 0; + SW_FT_StrokeBorder border = stroker->borders + side; - /* create a circular arc at a corner or cap */ - static SW_FT_Error - ft_stroker_arcto( SW_FT_Stroker stroker, - SW_FT_Int side ) - { - SW_FT_Angle total, rotate; - SW_FT_Fixed radius = stroker->radius; - SW_FT_Error error = 0; - SW_FT_StrokeBorder border = stroker->borders + side; + rotate = SW_FT_SIDE_TO_ROTATE(side); + total = SW_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); + if (total == SW_FT_ANGLE_PI) total = -rotate * 2; - rotate = SW_FT_SIDE_TO_ROTATE( side ); - - total = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - if ( total == SW_FT_ANGLE_PI ) - total = -rotate * 2; - - error = ft_stroke_border_arcto( border, - &stroker->center, - radius, - stroker->angle_in + rotate, - total ); + error = ft_stroke_border_arcto(border, &stroker->center, radius, + stroker->angle_in + rotate, total); border->movable = FALSE; return error; - } +} +/* add a cap at the end of an opened path */ +static SW_FT_Error ft_stroker_cap(SW_FT_Stroker stroker, SW_FT_Angle angle, + SW_FT_Int side) +{ + SW_FT_Error error = 0; - /* add a cap at the end of an opened path */ - static SW_FT_Error - ft_stroker_cap( SW_FT_Stroker stroker, - SW_FT_Angle angle, - SW_FT_Int side ) - { - SW_FT_Error error = 0; + if (stroker->line_cap == SW_FT_STROKER_LINECAP_ROUND) { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + SW_FT_ANGLE_PI; + error = ft_stroker_arcto(stroker, side); + } else if (stroker->line_cap == SW_FT_STROKER_LINECAP_SQUARE) { + /* add a square cap */ + SW_FT_Vector delta, delta2; + SW_FT_Angle rotate = SW_FT_SIDE_TO_ROTATE(side); + SW_FT_Fixed radius = stroker->radius; + SW_FT_StrokeBorder border = stroker->borders + side; - if ( stroker->line_cap == SW_FT_STROKER_LINECAP_ROUND ) - { - /* add a round cap */ - stroker->angle_in = angle; - stroker->angle_out = angle + SW_FT_ANGLE_PI; + SW_FT_Vector_From_Polar(&delta2, radius, angle + rotate); + SW_FT_Vector_From_Polar(&delta, radius, angle); - error = ft_stroker_arcto( stroker, side ); - } - else if ( stroker->line_cap == SW_FT_STROKER_LINECAP_SQUARE ) - { - /* add a square cap */ - SW_FT_Vector delta, delta2; - SW_FT_Angle rotate = SW_FT_SIDE_TO_ROTATE( side ); - SW_FT_Fixed radius = stroker->radius; - SW_FT_StrokeBorder border = stroker->borders + side; + delta.x += stroker->center.x + delta2.x; + delta.y += stroker->center.y + delta2.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; - SW_FT_Vector_From_Polar( &delta2, radius, angle + rotate ); - SW_FT_Vector_From_Polar( &delta, radius, angle ); + SW_FT_Vector_From_Polar(&delta2, radius, angle - rotate); + SW_FT_Vector_From_Polar(&delta, radius, angle); - delta.x += stroker->center.x + delta2.x; - delta.y += stroker->center.y + delta2.y; + delta.x += delta2.x + stroker->center.x; + delta.y += delta2.y + stroker->center.y; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; + error = ft_stroke_border_lineto(border, &delta, FALSE); + } else if (stroker->line_cap == SW_FT_STROKER_LINECAP_BUTT) { + /* add a butt ending */ + SW_FT_Vector delta; + SW_FT_Angle rotate = SW_FT_SIDE_TO_ROTATE(side); + SW_FT_Fixed radius = stroker->radius; + SW_FT_StrokeBorder border = stroker->borders + side; - SW_FT_Vector_From_Polar( &delta2, radius, angle - rotate ); - SW_FT_Vector_From_Polar( &delta, radius, angle ); + SW_FT_Vector_From_Polar(&delta, radius, angle + rotate); - delta.x += delta2.x + stroker->center.x; - delta.y += delta2.y + stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - else if ( stroker->line_cap == SW_FT_STROKER_LINECAP_BUTT ) - { - /* add a butt ending */ - SW_FT_Vector delta; - SW_FT_Angle rotate = SW_FT_SIDE_TO_ROTATE( side ); - SW_FT_Fixed radius = stroker->radius; - SW_FT_StrokeBorder border = stroker->borders + side; - - - SW_FT_Vector_From_Polar( &delta, radius, angle + rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - SW_FT_Vector_From_Polar( &delta, radius, angle - rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - - Exit: - return error; - } - - - /* process an inside corner, i.e. compute intersection */ - static SW_FT_Error - ft_stroker_inside( SW_FT_Stroker stroker, - SW_FT_Int side, - SW_FT_Fixed line_length ) - { - SW_FT_StrokeBorder border = stroker->borders + side; - SW_FT_Angle phi, theta, rotate; - SW_FT_Fixed length, thcos; - SW_FT_Vector delta; - SW_FT_Error error = 0; - SW_FT_Bool intersect; /* use intersection of lines? */ - - - rotate = SW_FT_SIDE_TO_ROTATE( side ); - - theta = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; - - /* Only intersect borders if between two lineto's and both */ - /* lines are long enough (line_length is zero for curves). */ - if ( !border->movable || line_length == 0 ) - intersect = FALSE; - else - { - /* compute minimum required length of lines */ - SW_FT_Fixed min_length = ft_pos_abs( SW_FT_MulFix( stroker->radius, - SW_FT_Tan( theta ) ) ); - - - intersect = SW_FT_BOOL( stroker->line_length >= min_length && - line_length >= min_length ); - } - - if ( !intersect ) - { - SW_FT_Vector_From_Polar( &delta, stroker->radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - border->movable = FALSE; - } - else - { - /* compute median angle */ - phi = stroker->angle_in + theta; - - thcos = SW_FT_Cos( theta ); - - length = SW_FT_DivFix( stroker->radius, thcos ); - - SW_FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - } - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - - return error; - } - - - /* process an outside corner, i.e. compute bevel/miter/round */ - static SW_FT_Error - ft_stroker_outside( SW_FT_Stroker stroker, - SW_FT_Int side, - SW_FT_Fixed line_length ) - { - SW_FT_StrokeBorder border = stroker->borders + side; - SW_FT_Error error; - SW_FT_Angle rotate; - - - if ( stroker->line_join == SW_FT_STROKER_LINEJOIN_ROUND ) - error = ft_stroker_arcto( stroker, side ); - else - { - /* this is a mitered (pointed) or beveled (truncated) corner */ - SW_FT_Fixed sigma = 0, radius = stroker->radius; - SW_FT_Angle theta = 0, phi = 0; - SW_FT_Fixed thcos = 0; - SW_FT_Bool bevel, fixed_bevel; - - - rotate = SW_FT_SIDE_TO_ROTATE( side ); - - bevel = - SW_FT_BOOL( stroker->line_join == SW_FT_STROKER_LINEJOIN_BEVEL ); - - fixed_bevel = - SW_FT_BOOL( stroker->line_join != SW_FT_STROKER_LINEJOIN_MITER_VARIABLE ); - - if ( !bevel ) - { - theta = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); - - if ( theta == SW_FT_ANGLE_PI ) - { - theta = rotate; - phi = stroker->angle_in; - } - else - { - theta /= 2; - phi = stroker->angle_in + theta + rotate; - } - - thcos = SW_FT_Cos( theta ); - sigma = SW_FT_MulFix( stroker->miter_limit, thcos ); - - /* is miter limit exceeded? */ - if ( sigma < 0x10000L ) - { - /* don't create variable bevels for very small deviations; */ - /* SW_FT_Sin(x) = 0 for x <= 57 */ - if ( fixed_bevel || ft_pos_abs( theta ) > 57 ) - bevel = TRUE; - } - } - - if ( bevel ) /* this is a bevel (broken angle) */ - { - if ( fixed_bevel ) - { - /* the outer corners are simply joined together */ - SW_FT_Vector delta; - - - /* add bevel */ - SW_FT_Vector_From_Polar( &delta, - radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - border->movable = FALSE; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - else /* variable bevel */ - { - /* the miter is truncated */ - SW_FT_Vector middle, delta; - SW_FT_Fixed length; - - - /* compute middle point */ - SW_FT_Vector_From_Polar( &middle, - SW_FT_MulFix( radius, stroker->miter_limit ), - phi ); - middle.x += stroker->center.x; - middle.y += stroker->center.y; - - /* compute first angle point */ - length = SW_FT_MulDiv( radius, 0x10000L - sigma, - ft_pos_abs( SW_FT_Sin( theta ) ) ); - - SW_FT_Vector_From_Polar( &delta, length, phi + rotate ); - delta.x += middle.x; - delta.y += middle.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* compute second angle point */ - SW_FT_Vector_From_Polar( &delta, length, phi - rotate ); - delta.x += middle.x; - delta.y += middle.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - - /* finally, add an end point; only needed if not lineto */ - /* (line_length is zero for curves) */ - if ( line_length == 0 ) - { - SW_FT_Vector_From_Polar( &delta, - radius, - stroker->angle_out + rotate ); - - delta.x += stroker->center.x; - delta.y += stroker->center.y; - - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - } - } - else /* this is a miter (intersection) */ - { - SW_FT_Fixed length; - SW_FT_Vector delta; - - - length = SW_FT_DivFix( stroker->radius, thcos ); - - SW_FT_Vector_From_Polar( &delta, length, phi ); delta.x += stroker->center.x; delta.y += stroker->center.y; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; - /* now add an end point; only needed if not lineto */ - /* (line_length is zero for curves) */ - if ( line_length == 0 ) - { - SW_FT_Vector_From_Polar( &delta, - stroker->radius, - stroker->angle_out + rotate ); - delta.x += stroker->center.x; - delta.y += stroker->center.y; + SW_FT_Vector_From_Polar(&delta, radius, angle - rotate); - error = ft_stroke_border_lineto( border, &delta, FALSE ); - } - } + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto(border, &delta, FALSE); } - Exit: +Exit: return error; - } +} +/* process an inside corner, i.e. compute intersection */ +static SW_FT_Error ft_stroker_inside(SW_FT_Stroker stroker, SW_FT_Int side, + SW_FT_Fixed line_length) +{ + SW_FT_StrokeBorder border = stroker->borders + side; + SW_FT_Angle phi, theta, rotate; + SW_FT_Fixed length, thcos; + SW_FT_Vector delta; + SW_FT_Error error = 0; + SW_FT_Bool intersect; /* use intersection of lines? */ - static SW_FT_Error - ft_stroker_process_corner( SW_FT_Stroker stroker, - SW_FT_Fixed line_length ) - { - SW_FT_Error error = 0; - SW_FT_Angle turn; - SW_FT_Int inside_side; + rotate = SW_FT_SIDE_TO_ROTATE(side); + theta = SW_FT_Angle_Diff(stroker->angle_in, stroker->angle_out) / 2; - turn = SW_FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + /* Only intersect borders if between two lineto's and both */ + /* lines are long enough (line_length is zero for curves). */ + if (!border->movable || line_length == 0) + intersect = FALSE; + else { + /* compute minimum required length of lines */ + SW_FT_Fixed min_length = + ft_pos_abs(SW_FT_MulFix(stroker->radius, SW_FT_Tan(theta))); + + intersect = SW_FT_BOOL(stroker->line_length >= min_length && + line_length >= min_length); + } + + if (!intersect) { + SW_FT_Vector_From_Polar(&delta, stroker->radius, + stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + } else { + /* compute median angle */ + phi = stroker->angle_in + theta; + + thcos = SW_FT_Cos(theta); + + length = SW_FT_DivFix(stroker->radius, thcos); + + SW_FT_Vector_From_Polar(&delta, length, phi + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto(border, &delta, FALSE); + + return error; +} + +/* process an outside corner, i.e. compute bevel/miter/round */ +static SW_FT_Error ft_stroker_outside(SW_FT_Stroker stroker, SW_FT_Int side, + SW_FT_Fixed line_length) +{ + SW_FT_StrokeBorder border = stroker->borders + side; + SW_FT_Error error; + SW_FT_Angle rotate; + + if (stroker->line_join == SW_FT_STROKER_LINEJOIN_ROUND) + error = ft_stroker_arcto(stroker, side); + else { + /* this is a mitered (pointed) or beveled (truncated) corner */ + SW_FT_Fixed sigma = 0, radius = stroker->radius; + SW_FT_Angle theta = 0, phi = 0; + SW_FT_Fixed thcos = 0; + SW_FT_Bool bevel, fixed_bevel; + + rotate = SW_FT_SIDE_TO_ROTATE(side); + + bevel = SW_FT_BOOL(stroker->line_join == SW_FT_STROKER_LINEJOIN_BEVEL); + + fixed_bevel = SW_FT_BOOL(stroker->line_join != + SW_FT_STROKER_LINEJOIN_MITER_VARIABLE); + + if (!bevel) { + theta = SW_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); + + if (theta == SW_FT_ANGLE_PI) { + theta = rotate; + phi = stroker->angle_in; + } else { + theta /= 2; + phi = stroker->angle_in + theta + rotate; + } + + thcos = SW_FT_Cos(theta); + sigma = SW_FT_MulFix(stroker->miter_limit, thcos); + + /* is miter limit exceeded? */ + if (sigma < 0x10000L) { + /* don't create variable bevels for very small deviations; */ + /* SW_FT_Sin(x) = 0 for x <= 57 */ + if (fixed_bevel || ft_pos_abs(theta) > 57) bevel = TRUE; + } + } + + if (bevel) /* this is a bevel (broken angle) */ + { + if (fixed_bevel) { + /* the outer corners are simply joined together */ + SW_FT_Vector delta; + + /* add bevel */ + SW_FT_Vector_From_Polar(&delta, radius, + stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + error = ft_stroke_border_lineto(border, &delta, FALSE); + } else /* variable bevel */ + { + /* the miter is truncated */ + SW_FT_Vector middle, delta; + SW_FT_Fixed length; + + /* compute middle point */ + SW_FT_Vector_From_Polar( + &middle, SW_FT_MulFix(radius, stroker->miter_limit), phi); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + + /* compute first angle point */ + length = SW_FT_MulDiv(radius, 0x10000L - sigma, + ft_pos_abs(SW_FT_Sin(theta))); + + SW_FT_Vector_From_Polar(&delta, length, phi + rotate); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; + + /* compute second angle point */ + SW_FT_Vector_From_Polar(&delta, length, phi - rotate); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; + + /* finally, add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if (line_length == 0) { + SW_FT_Vector_From_Polar(&delta, radius, + stroker->angle_out + rotate); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto(border, &delta, FALSE); + } + } + } else /* this is a miter (intersection) */ + { + SW_FT_Fixed length; + SW_FT_Vector delta; + + length = SW_FT_DivFix(stroker->radius, thcos); + + SW_FT_Vector_From_Polar(&delta, length, phi); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; + + /* now add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if (line_length == 0) { + SW_FT_Vector_From_Polar(&delta, stroker->radius, + stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto(border, &delta, FALSE); + } + } + } + +Exit: + return error; +} + +static SW_FT_Error ft_stroker_process_corner(SW_FT_Stroker stroker, + SW_FT_Fixed line_length) +{ + SW_FT_Error error = 0; + SW_FT_Angle turn; + SW_FT_Int inside_side; + + turn = SW_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); /* no specific corner processing is required if the turn is 0 */ - if ( turn == 0 ) - goto Exit; + if (turn == 0) goto Exit; /* when we turn to the right, the inside side is 0 */ inside_side = 0; /* otherwise, the inside side is 1 */ - if ( turn < 0 ) - inside_side = 1; + if (turn < 0) inside_side = 1; /* process the inside side */ - error = ft_stroker_inside( stroker, inside_side, line_length ); - if ( error ) - goto Exit; + error = ft_stroker_inside(stroker, inside_side, line_length); + if (error) goto Exit; /* process the outside side */ - error = ft_stroker_outside( stroker, 1 - inside_side, line_length ); + error = ft_stroker_outside(stroker, 1 - inside_side, line_length); - Exit: +Exit: return error; - } +} +/* add two points to the left and right borders corresponding to the */ +/* start of the subpath */ +static SW_FT_Error ft_stroker_subpath_start(SW_FT_Stroker stroker, + SW_FT_Angle start_angle, + SW_FT_Fixed line_length) +{ + SW_FT_Vector delta; + SW_FT_Vector point; + SW_FT_Error error; + SW_FT_StrokeBorder border; - /* add two points to the left and right borders corresponding to the */ - /* start of the subpath */ - static SW_FT_Error - ft_stroker_subpath_start( SW_FT_Stroker stroker, - SW_FT_Angle start_angle, - SW_FT_Fixed line_length ) - { - SW_FT_Vector delta; - SW_FT_Vector point; - SW_FT_Error error; - SW_FT_StrokeBorder border; - - - SW_FT_Vector_From_Polar( &delta, stroker->radius, - start_angle + SW_FT_ANGLE_PI2 ); + SW_FT_Vector_From_Polar(&delta, stroker->radius, + start_angle + SW_FT_ANGLE_PI2); point.x = stroker->center.x + delta.x; point.y = stroker->center.y + delta.y; border = stroker->borders; - error = ft_stroke_border_moveto( border, &point ); - if ( error ) - goto Exit; + error = ft_stroke_border_moveto(border, &point); + if (error) goto Exit; point.x = stroker->center.x - delta.x; point.y = stroker->center.y - delta.y; border++; - error = ft_stroke_border_moveto( border, &point ); + error = ft_stroke_border_moveto(border, &point); /* save angle, position, and line length for last join */ /* (line_length is zero for curves) */ - stroker->subpath_angle = start_angle; - stroker->first_point = FALSE; + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; stroker->subpath_line_length = line_length; - Exit: +Exit: return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ - - SW_FT_Error - SW_FT_Stroker_LineTo( SW_FT_Stroker stroker, - SW_FT_Vector* to ) - { - SW_FT_Error error = 0; - SW_FT_StrokeBorder border; - SW_FT_Vector delta; - SW_FT_Angle angle; - SW_FT_Int side; - SW_FT_Fixed line_length; - +SW_FT_Error SW_FT_Stroker_LineTo(SW_FT_Stroker stroker, SW_FT_Vector* to) +{ + SW_FT_Error error = 0; + SW_FT_StrokeBorder border; + SW_FT_Vector delta; + SW_FT_Angle angle; + SW_FT_Int side; + SW_FT_Fixed line_length; delta.x = to->x - stroker->center.x; delta.y = to->y - stroker->center.y; /* a zero-length lineto is a no-op; avoid creating a spurious corner */ - if ( delta.x == 0 && delta.y == 0 ) - goto Exit; + if (delta.x == 0 && delta.y == 0) goto Exit; /* compute length of line */ - line_length = SW_FT_Vector_Length( &delta ); + line_length = SW_FT_Vector_Length(&delta); - angle = SW_FT_Atan2( delta.x, delta.y ); - SW_FT_Vector_From_Polar( &delta, stroker->radius, angle + SW_FT_ANGLE_PI2 ); + angle = SW_FT_Atan2(delta.x, delta.y); + SW_FT_Vector_From_Polar(&delta, stroker->radius, angle + SW_FT_ANGLE_PI2); /* process corner if necessary */ - if ( stroker->first_point ) - { - /* This is the first segment of a subpath. We need to */ - /* add a point to each border at their respective starting */ - /* point locations. */ - error = ft_stroker_subpath_start( stroker, angle, line_length ); - if ( error ) - goto Exit; - } - else - { - /* process the current corner */ - stroker->angle_out = angle; - error = ft_stroker_process_corner( stroker, line_length ); - if ( error ) - goto Exit; + if (stroker->first_point) { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start(stroker, angle, line_length); + if (error) goto Exit; + } else { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner(stroker, line_length); + if (error) goto Exit; } /* now add a line segment to both the `inside' and `outside' paths */ - for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) - { - SW_FT_Vector point; + for (border = stroker->borders, side = 1; side >= 0; side--, border++) { + SW_FT_Vector point; + point.x = to->x + delta.x; + point.y = to->y + delta.y; - point.x = to->x + delta.x; - point.y = to->y + delta.y; + /* the ends of lineto borders are movable */ + error = ft_stroke_border_lineto(border, &point, TRUE); + if (error) goto Exit; - /* the ends of lineto borders are movable */ - error = ft_stroke_border_lineto( border, &point, TRUE ); - if ( error ) - goto Exit; - - delta.x = -delta.x; - delta.y = -delta.y; + delta.x = -delta.x; + delta.y = -delta.y; } - stroker->angle_in = angle; - stroker->center = *to; + stroker->angle_in = angle; + stroker->center = *to; stroker->line_length = line_length; - Exit: +Exit: return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ - - SW_FT_Error - SW_FT_Stroker_ConicTo( SW_FT_Stroker stroker, - SW_FT_Vector* control, - SW_FT_Vector* to ) - { - SW_FT_Error error = 0; - SW_FT_Vector bez_stack[34]; - SW_FT_Vector* arc; - SW_FT_Vector* limit = bez_stack + 30; - SW_FT_Bool first_arc = TRUE; - +SW_FT_Error SW_FT_Stroker_ConicTo(SW_FT_Stroker stroker, SW_FT_Vector* control, + SW_FT_Vector* to) +{ + SW_FT_Error error = 0; + SW_FT_Vector bez_stack[34]; + SW_FT_Vector* arc; + SW_FT_Vector* limit = bez_stack + 30; + SW_FT_Bool first_arc = TRUE; /* if all control points are coincident, this is a no-op; */ /* avoid creating a spurious corner */ - if ( SW_FT_IS_SMALL( stroker->center.x - control->x ) && - SW_FT_IS_SMALL( stroker->center.y - control->y ) && - SW_FT_IS_SMALL( control->x - to->x ) && - SW_FT_IS_SMALL( control->y - to->y ) ) - { - stroker->center = *to; - goto Exit; + if (SW_FT_IS_SMALL(stroker->center.x - control->x) && + SW_FT_IS_SMALL(stroker->center.y - control->y) && + SW_FT_IS_SMALL(control->x - to->x) && + SW_FT_IS_SMALL(control->y - to->y)) { + stroker->center = *to; + goto Exit; } - arc = bez_stack; + arc = bez_stack; arc[0] = *to; arc[1] = *control; arc[2] = stroker->center; - while ( arc >= bez_stack ) - { - SW_FT_Angle angle_in, angle_out; + while (arc >= bez_stack) { + SW_FT_Angle angle_in, angle_out; + /* initialize with current direction */ + angle_in = angle_out = stroker->angle_in; - /* initialize with current direction */ - angle_in = angle_out = stroker->angle_in; + if (arc < limit && + !ft_conic_is_small_enough(arc, &angle_in, &angle_out)) { + if (stroker->first_point) stroker->angle_in = angle_in; - if ( arc < limit && - !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) - { - if ( stroker->first_point ) - stroker->angle_in = angle_in; - - ft_conic_split( arc ); - arc += 2; - continue; - } - - if ( first_arc ) - { - first_arc = FALSE; - - /* process corner if necessary */ - if ( stroker->first_point ) - error = ft_stroker_subpath_start( stroker, angle_in, 0 ); - else - { - stroker->angle_out = angle_in; - error = ft_stroker_process_corner( stroker, 0 ); + ft_conic_split(arc); + arc += 2; + continue; } - } - else if ( ft_pos_abs( SW_FT_Angle_Diff( stroker->angle_in, angle_in ) ) > - SW_FT_SMALL_CONIC_THRESHOLD / 4 ) - { - /* if the deviation from one arc to the next is too great, */ - /* add a round corner */ - stroker->center = arc[2]; - stroker->angle_out = angle_in; - stroker->line_join = SW_FT_STROKER_LINEJOIN_ROUND; - error = ft_stroker_process_corner( stroker, 0 ); + if (first_arc) { + first_arc = FALSE; - /* reinstate line join style */ - stroker->line_join = stroker->line_join_saved; - } - - if ( error ) - goto Exit; - - /* the arc's angle is small enough; we can add it directly to each */ - /* border */ - { - SW_FT_Vector ctrl, end; - SW_FT_Angle theta, phi, rotate, alpha0 = 0; - SW_FT_Fixed length; - SW_FT_StrokeBorder border; - SW_FT_Int side; - - - theta = SW_FT_Angle_Diff( angle_in, angle_out ) / 2; - phi = angle_in + theta; - length = SW_FT_DivFix( stroker->radius, SW_FT_Cos( theta ) ); - - /* compute direction of original arc */ - if ( stroker->handle_wide_strokes ) - alpha0 = SW_FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y ); - - for ( border = stroker->borders, side = 0; - side <= 1; - side++, border++ ) - { - rotate = SW_FT_SIDE_TO_ROTATE( side ); - - /* compute control point */ - SW_FT_Vector_From_Polar( &ctrl, length, phi + rotate ); - ctrl.x += arc[1].x; - ctrl.y += arc[1].y; - - /* compute end point */ - SW_FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); - end.x += arc[0].x; - end.y += arc[0].y; - - if ( stroker->handle_wide_strokes ) - { - SW_FT_Vector start; - SW_FT_Angle alpha1; - - - /* determine whether the border radius is greater than the */ - /* radius of curvature of the original arc */ - start = border->points[border->num_points - 1]; - - alpha1 = SW_FT_Atan2( end.x - start.x, end.y - start.y ); - - /* is the direction of the border arc opposite to */ - /* that of the original arc? */ - if ( ft_pos_abs( SW_FT_Angle_Diff( alpha0, alpha1 ) ) > - SW_FT_ANGLE_PI / 2 ) - { - SW_FT_Angle beta, gamma; - SW_FT_Vector bvec, delta; - SW_FT_Fixed blen, sinA, sinB, alen; - - - /* use the sine rule to find the intersection point */ - beta = SW_FT_Atan2( arc[2].x - start.x, arc[2].y - start.y ); - gamma = SW_FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); - - bvec.x = end.x - start.x; - bvec.y = end.y - start.y; - - blen = SW_FT_Vector_Length( &bvec ); - - sinA = ft_pos_abs( SW_FT_Sin( alpha1 - gamma ) ); - sinB = ft_pos_abs( SW_FT_Sin( beta - gamma ) ); - - alen = SW_FT_MulDiv( blen, sinA, sinB ); - - SW_FT_Vector_From_Polar( &delta, alen, beta ); - delta.x += start.x; - delta.y += start.y; - - /* circumnavigate the negative sector backwards */ - border->movable = FALSE; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_conicto( border, &ctrl, &start ); - if ( error ) - goto Exit; - /* and then move to the endpoint */ - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - - continue; + /* process corner if necessary */ + if (stroker->first_point) + error = ft_stroker_subpath_start(stroker, angle_in, 0); + else { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner(stroker, 0); } + } else if (ft_pos_abs(SW_FT_Angle_Diff(stroker->angle_in, angle_in)) > + SW_FT_SMALL_CONIC_THRESHOLD / 4) { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[2]; + stroker->angle_out = angle_in; + stroker->line_join = SW_FT_STROKER_LINEJOIN_ROUND; - /* else fall through */ - } + error = ft_stroker_process_corner(stroker, 0); - /* simply add an arc */ - error = ft_stroke_border_conicto( border, &ctrl, &end ); - if ( error ) - goto Exit; + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; } - } - arc -= 2; + if (error) goto Exit; - stroker->angle_in = angle_out; + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + SW_FT_Vector ctrl, end; + SW_FT_Angle theta, phi, rotate, alpha0 = 0; + SW_FT_Fixed length; + SW_FT_StrokeBorder border; + SW_FT_Int side; + + theta = SW_FT_Angle_Diff(angle_in, angle_out) / 2; + phi = angle_in + theta; + length = SW_FT_DivFix(stroker->radius, SW_FT_Cos(theta)); + + /* compute direction of original arc */ + if (stroker->handle_wide_strokes) + alpha0 = SW_FT_Atan2(arc[0].x - arc[2].x, arc[0].y - arc[2].y); + + for (border = stroker->borders, side = 0; side <= 1; + side++, border++) { + rotate = SW_FT_SIDE_TO_ROTATE(side); + + /* compute control point */ + SW_FT_Vector_From_Polar(&ctrl, length, phi + rotate); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + SW_FT_Vector_From_Polar(&end, stroker->radius, + angle_out + rotate); + end.x += arc[0].x; + end.y += arc[0].y; + + if (stroker->handle_wide_strokes) { + SW_FT_Vector start; + SW_FT_Angle alpha1; + + /* determine whether the border radius is greater than the + */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = SW_FT_Atan2(end.x - start.x, end.y - start.y); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if (ft_pos_abs(SW_FT_Angle_Diff(alpha0, alpha1)) > + SW_FT_ANGLE_PI / 2) { + SW_FT_Angle beta, gamma; + SW_FT_Vector bvec, delta; + SW_FT_Fixed blen, sinA, sinB, alen; + + /* use the sine rule to find the intersection point */ + beta = + SW_FT_Atan2(arc[2].x - start.x, arc[2].y - start.y); + gamma = SW_FT_Atan2(arc[0].x - end.x, arc[0].y - end.y); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = SW_FT_Vector_Length(&bvec); + + sinA = ft_pos_abs(SW_FT_Sin(alpha1 - gamma)); + sinB = ft_pos_abs(SW_FT_Sin(beta - gamma)); + + alen = SW_FT_MulDiv(blen, sinA, sinB); + + SW_FT_Vector_From_Polar(&delta, alen, beta); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; + error = ft_stroke_border_lineto(border, &end, FALSE); + if (error) goto Exit; + error = ft_stroke_border_conicto(border, &ctrl, &start); + if (error) goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto(border, &end, FALSE); + if (error) goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_conicto(border, &ctrl, &end); + if (error) goto Exit; + } + } + + arc -= 2; + + stroker->angle_in = angle_out; } stroker->center = *to; - Exit: +Exit: return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ - - SW_FT_Error - SW_FT_Stroker_CubicTo( SW_FT_Stroker stroker, - SW_FT_Vector* control1, - SW_FT_Vector* control2, - SW_FT_Vector* to ) - { - SW_FT_Error error = 0; - SW_FT_Vector bez_stack[37]; - SW_FT_Vector* arc; - SW_FT_Vector* limit = bez_stack + 32; - SW_FT_Bool first_arc = TRUE; - +SW_FT_Error SW_FT_Stroker_CubicTo(SW_FT_Stroker stroker, SW_FT_Vector* control1, + SW_FT_Vector* control2, SW_FT_Vector* to) +{ + SW_FT_Error error = 0; + SW_FT_Vector bez_stack[37]; + SW_FT_Vector* arc; + SW_FT_Vector* limit = bez_stack + 32; + SW_FT_Bool first_arc = TRUE; /* if all control points are coincident, this is a no-op; */ /* avoid creating a spurious corner */ - if ( SW_FT_IS_SMALL( stroker->center.x - control1->x ) && - SW_FT_IS_SMALL( stroker->center.y - control1->y ) && - SW_FT_IS_SMALL( control1->x - control2->x ) && - SW_FT_IS_SMALL( control1->y - control2->y ) && - SW_FT_IS_SMALL( control2->x - to->x ) && - SW_FT_IS_SMALL( control2->y - to->y ) ) - { - stroker->center = *to; - goto Exit; + if (SW_FT_IS_SMALL(stroker->center.x - control1->x) && + SW_FT_IS_SMALL(stroker->center.y - control1->y) && + SW_FT_IS_SMALL(control1->x - control2->x) && + SW_FT_IS_SMALL(control1->y - control2->y) && + SW_FT_IS_SMALL(control2->x - to->x) && + SW_FT_IS_SMALL(control2->y - to->y)) { + stroker->center = *to; + goto Exit; } - arc = bez_stack; + arc = bez_stack; arc[0] = *to; arc[1] = *control2; arc[2] = *control1; arc[3] = stroker->center; - while ( arc >= bez_stack ) - { - SW_FT_Angle angle_in, angle_mid, angle_out; + while (arc >= bez_stack) { + SW_FT_Angle angle_in, angle_mid, angle_out; + /* initialize with current direction */ + angle_in = angle_out = angle_mid = stroker->angle_in; - /* initialize with current direction */ - angle_in = angle_out = angle_mid = stroker->angle_in; + if (arc < limit && + !ft_cubic_is_small_enough(arc, &angle_in, &angle_mid, &angle_out)) { + if (stroker->first_point) stroker->angle_in = angle_in; - if ( arc < limit && - !ft_cubic_is_small_enough( arc, &angle_in, - &angle_mid, &angle_out ) ) - { - if ( stroker->first_point ) - stroker->angle_in = angle_in; - - ft_cubic_split( arc ); - arc += 3; - continue; - } - - if ( first_arc ) - { - first_arc = FALSE; - - /* process corner if necessary */ - if ( stroker->first_point ) - error = ft_stroker_subpath_start( stroker, angle_in, 0 ); - else - { - stroker->angle_out = angle_in; - error = ft_stroker_process_corner( stroker, 0 ); + ft_cubic_split(arc); + arc += 3; + continue; } - } - else if ( ft_pos_abs( SW_FT_Angle_Diff( stroker->angle_in, angle_in ) ) > - SW_FT_SMALL_CUBIC_THRESHOLD / 4 ) - { - /* if the deviation from one arc to the next is too great, */ - /* add a round corner */ - stroker->center = arc[3]; - stroker->angle_out = angle_in; - stroker->line_join = SW_FT_STROKER_LINEJOIN_ROUND; - error = ft_stroker_process_corner( stroker, 0 ); + if (first_arc) { + first_arc = FALSE; - /* reinstate line join style */ - stroker->line_join = stroker->line_join_saved; - } - - if ( error ) - goto Exit; - - /* the arc's angle is small enough; we can add it directly to each */ - /* border */ - { - SW_FT_Vector ctrl1, ctrl2, end; - SW_FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; - SW_FT_Fixed length1, length2; - SW_FT_StrokeBorder border; - SW_FT_Int side; - - - theta1 = SW_FT_Angle_Diff( angle_in, angle_mid ) / 2; - theta2 = SW_FT_Angle_Diff( angle_mid, angle_out ) / 2; - phi1 = ft_angle_mean( angle_in, angle_mid ); - phi2 = ft_angle_mean( angle_mid, angle_out ); - length1 = SW_FT_DivFix( stroker->radius, SW_FT_Cos( theta1 ) ); - length2 = SW_FT_DivFix( stroker->radius, SW_FT_Cos( theta2 ) ); - - /* compute direction of original arc */ - if ( stroker->handle_wide_strokes ) - alpha0 = SW_FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y ); - - for ( border = stroker->borders, side = 0; - side <= 1; - side++, border++ ) - { - rotate = SW_FT_SIDE_TO_ROTATE( side ); - - /* compute control points */ - SW_FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); - ctrl1.x += arc[2].x; - ctrl1.y += arc[2].y; - - SW_FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); - ctrl2.x += arc[1].x; - ctrl2.y += arc[1].y; - - /* compute end point */ - SW_FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); - end.x += arc[0].x; - end.y += arc[0].y; - - if ( stroker->handle_wide_strokes ) - { - SW_FT_Vector start; - SW_FT_Angle alpha1; - - - /* determine whether the border radius is greater than the */ - /* radius of curvature of the original arc */ - start = border->points[border->num_points - 1]; - - alpha1 = SW_FT_Atan2( end.x - start.x, end.y - start.y ); - - /* is the direction of the border arc opposite to */ - /* that of the original arc? */ - if ( ft_pos_abs( SW_FT_Angle_Diff( alpha0, alpha1 ) ) > - SW_FT_ANGLE_PI / 2 ) - { - SW_FT_Angle beta, gamma; - SW_FT_Vector bvec, delta; - SW_FT_Fixed blen, sinA, sinB, alen; - - - /* use the sine rule to find the intersection point */ - beta = SW_FT_Atan2( arc[3].x - start.x, arc[3].y - start.y ); - gamma = SW_FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); - - bvec.x = end.x - start.x; - bvec.y = end.y - start.y; - - blen = SW_FT_Vector_Length( &bvec ); - - sinA = ft_pos_abs( SW_FT_Sin( alpha1 - gamma ) ); - sinB = ft_pos_abs( SW_FT_Sin( beta - gamma ) ); - - alen = SW_FT_MulDiv( blen, sinA, sinB ); - - SW_FT_Vector_From_Polar( &delta, alen, beta ); - delta.x += start.x; - delta.y += start.y; - - /* circumnavigate the negative sector backwards */ - border->movable = FALSE; - error = ft_stroke_border_lineto( border, &delta, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - error = ft_stroke_border_cubicto( border, - &ctrl2, - &ctrl1, - &start ); - if ( error ) - goto Exit; - /* and then move to the endpoint */ - error = ft_stroke_border_lineto( border, &end, FALSE ); - if ( error ) - goto Exit; - - continue; + /* process corner if necessary */ + if (stroker->first_point) + error = ft_stroker_subpath_start(stroker, angle_in, 0); + else { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner(stroker, 0); } + } else if (ft_pos_abs(SW_FT_Angle_Diff(stroker->angle_in, angle_in)) > + SW_FT_SMALL_CUBIC_THRESHOLD / 4) { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[3]; + stroker->angle_out = angle_in; + stroker->line_join = SW_FT_STROKER_LINEJOIN_ROUND; - /* else fall through */ - } + error = ft_stroker_process_corner(stroker, 0); - /* simply add an arc */ - error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end ); - if ( error ) - goto Exit; + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; } - } - arc -= 3; + if (error) goto Exit; - stroker->angle_in = angle_out; + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + SW_FT_Vector ctrl1, ctrl2, end; + SW_FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; + SW_FT_Fixed length1, length2; + SW_FT_StrokeBorder border; + SW_FT_Int side; + + theta1 = SW_FT_Angle_Diff(angle_in, angle_mid) / 2; + theta2 = SW_FT_Angle_Diff(angle_mid, angle_out) / 2; + phi1 = ft_angle_mean(angle_in, angle_mid); + phi2 = ft_angle_mean(angle_mid, angle_out); + length1 = SW_FT_DivFix(stroker->radius, SW_FT_Cos(theta1)); + length2 = SW_FT_DivFix(stroker->radius, SW_FT_Cos(theta2)); + + /* compute direction of original arc */ + if (stroker->handle_wide_strokes) + alpha0 = SW_FT_Atan2(arc[0].x - arc[3].x, arc[0].y - arc[3].y); + + for (border = stroker->borders, side = 0; side <= 1; + side++, border++) { + rotate = SW_FT_SIDE_TO_ROTATE(side); + + /* compute control points */ + SW_FT_Vector_From_Polar(&ctrl1, length1, phi1 + rotate); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + SW_FT_Vector_From_Polar(&ctrl2, length2, phi2 + rotate); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + SW_FT_Vector_From_Polar(&end, stroker->radius, + angle_out + rotate); + end.x += arc[0].x; + end.y += arc[0].y; + + if (stroker->handle_wide_strokes) { + SW_FT_Vector start; + SW_FT_Angle alpha1; + + /* determine whether the border radius is greater than the + */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = SW_FT_Atan2(end.x - start.x, end.y - start.y); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if (ft_pos_abs(SW_FT_Angle_Diff(alpha0, alpha1)) > + SW_FT_ANGLE_PI / 2) { + SW_FT_Angle beta, gamma; + SW_FT_Vector bvec, delta; + SW_FT_Fixed blen, sinA, sinB, alen; + + /* use the sine rule to find the intersection point */ + beta = + SW_FT_Atan2(arc[3].x - start.x, arc[3].y - start.y); + gamma = SW_FT_Atan2(arc[0].x - end.x, arc[0].y - end.y); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = SW_FT_Vector_Length(&bvec); + + sinA = ft_pos_abs(SW_FT_Sin(alpha1 - gamma)); + sinB = ft_pos_abs(SW_FT_Sin(beta - gamma)); + + alen = SW_FT_MulDiv(blen, sinA, sinB); + + SW_FT_Vector_From_Polar(&delta, alen, beta); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if (error) goto Exit; + error = ft_stroke_border_lineto(border, &end, FALSE); + if (error) goto Exit; + error = ft_stroke_border_cubicto(border, &ctrl2, &ctrl1, + &start); + if (error) goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto(border, &end, FALSE); + if (error) goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_cubicto(border, &ctrl1, &ctrl2, &end); + if (error) goto Exit; + } + } + + arc -= 3; + + stroker->angle_in = angle_out; } stroker->center = *to; - Exit: +Exit: return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ - - SW_FT_Error - SW_FT_Stroker_BeginSubPath( SW_FT_Stroker stroker, - SW_FT_Vector* to, - SW_FT_Bool open ) - { +SW_FT_Error SW_FT_Stroker_BeginSubPath(SW_FT_Stroker stroker, SW_FT_Vector* to, + SW_FT_Bool open) +{ /* We cannot process the first point, because there is not enough */ /* information regarding its corner/cap. The latter will be processed */ /* in the `SW_FT_Stroker_EndSubPath' routine. */ /* */ - stroker->first_point = TRUE; - stroker->center = *to; + stroker->first_point = TRUE; + stroker->center = *to; stroker->subpath_open = open; /* Determine if we need to check whether the border radius is greater */ @@ -1819,9 +1524,9 @@ /* be created, because round & miter joins and round & square caps */ /* cover the negative sector created with wide strokes. */ stroker->handle_wide_strokes = - SW_FT_BOOL( stroker->line_join != SW_FT_STROKER_LINEJOIN_ROUND || - ( stroker->subpath_open && - stroker->line_cap == SW_FT_STROKER_LINECAP_BUTT ) ); + SW_FT_BOOL(stroker->line_join != SW_FT_STROKER_LINEJOIN_ROUND || + (stroker->subpath_open && + stroker->line_cap == SW_FT_STROKER_LINECAP_BUTT)); /* record the subpath start point for each border */ stroker->subpath_start = *to; @@ -1829,464 +1534,385 @@ stroker->angle_in = 0; return 0; - } +} +static SW_FT_Error ft_stroker_add_reverse_left(SW_FT_Stroker stroker, + SW_FT_Bool open) +{ + SW_FT_StrokeBorder right = stroker->borders + 0; + SW_FT_StrokeBorder left = stroker->borders + 1; + SW_FT_Int new_points; + SW_FT_Error error = 0; - static SW_FT_Error - ft_stroker_add_reverse_left( SW_FT_Stroker stroker, - SW_FT_Bool open ) - { - SW_FT_StrokeBorder right = stroker->borders + 0; - SW_FT_StrokeBorder left = stroker->borders + 1; - SW_FT_Int new_points; - SW_FT_Error error = 0; - - - assert( left->start >= 0 ); + assert(left->start >= 0); new_points = left->num_points - left->start; - if ( new_points > 0 ) - { - error = ft_stroke_border_grow( right, (SW_FT_UInt)new_points ); - if ( error ) - goto Exit; + if (new_points > 0) { + error = ft_stroke_border_grow(right, (SW_FT_UInt)new_points); + if (error) goto Exit; - { - SW_FT_Vector* dst_point = right->points + right->num_points; - SW_FT_Byte* dst_tag = right->tags + right->num_points; - SW_FT_Vector* src_point = left->points + left->num_points - 1; - SW_FT_Byte* src_tag = left->tags + left->num_points - 1; - - - while ( src_point >= left->points + left->start ) { - *dst_point = *src_point; - *dst_tag = *src_tag; + SW_FT_Vector* dst_point = right->points + right->num_points; + SW_FT_Byte* dst_tag = right->tags + right->num_points; + SW_FT_Vector* src_point = left->points + left->num_points - 1; + SW_FT_Byte* src_tag = left->tags + left->num_points - 1; - if ( open ) - dst_tag[0] &= ~SW_FT_STROKE_TAG_BEGIN_END; - else - { - SW_FT_Byte ttag = - (SW_FT_Byte)( dst_tag[0] & SW_FT_STROKE_TAG_BEGIN_END ); + while (src_point >= left->points + left->start) { + *dst_point = *src_point; + *dst_tag = *src_tag; + if (open) + dst_tag[0] &= ~SW_FT_STROKE_TAG_BEGIN_END; + else { + SW_FT_Byte ttag = + (SW_FT_Byte)(dst_tag[0] & SW_FT_STROKE_TAG_BEGIN_END); - /* switch begin/end tags if necessary */ - if ( ttag == SW_FT_STROKE_TAG_BEGIN || - ttag == SW_FT_STROKE_TAG_END ) - dst_tag[0] ^= SW_FT_STROKE_TAG_BEGIN_END; - } + /* switch begin/end tags if necessary */ + if (ttag == SW_FT_STROKE_TAG_BEGIN || + ttag == SW_FT_STROKE_TAG_END) + dst_tag[0] ^= SW_FT_STROKE_TAG_BEGIN_END; + } - src_point--; - src_tag--; - dst_point++; - dst_tag++; + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } } - } - left->num_points = left->start; - right->num_points += new_points; + left->num_points = left->start; + right->num_points += new_points; - right->movable = FALSE; - left->movable = FALSE; + right->movable = FALSE; + left->movable = FALSE; } - Exit: +Exit: return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ +/* there's a lot of magic in this function! */ +SW_FT_Error SW_FT_Stroker_EndSubPath(SW_FT_Stroker stroker) +{ + SW_FT_Error error = 0; - /* there's a lot of magic in this function! */ - SW_FT_Error - SW_FT_Stroker_EndSubPath( SW_FT_Stroker stroker ) - { - SW_FT_Error error = 0; + if (stroker->subpath_open) { + SW_FT_StrokeBorder right = stroker->borders; + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap(stroker, stroker->angle_in, 0); + if (error) goto Exit; - if ( stroker->subpath_open ) - { - SW_FT_StrokeBorder right = stroker->borders; + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left(stroker, TRUE); + if (error) goto Exit; + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = + ft_stroker_cap(stroker, stroker->subpath_angle + SW_FT_ANGLE_PI, 0); + if (error) goto Exit; - /* All right, this is an opened path, we need to add a cap between */ - /* right & left, add the reverse of left, then add a final cap */ - /* between left & right. */ - error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); - if ( error ) - goto Exit; + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close(right, FALSE); + } else { + SW_FT_Angle turn; + SW_FT_Int inside_side; - /* add reversed points from `left' to `right' */ - error = ft_stroker_add_reverse_left( stroker, TRUE ); - if ( error ) - goto Exit; + /* close the path if needed */ + if (stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y) { + error = SW_FT_Stroker_LineTo(stroker, &stroker->subpath_start); + if (error) goto Exit; + } - /* now add the final cap */ - stroker->center = stroker->subpath_start; - error = ft_stroker_cap( stroker, - stroker->subpath_angle + SW_FT_ANGLE_PI, 0 ); - if ( error ) - goto Exit; + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + turn = SW_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); - /* Now end the right subpath accordingly. The left one is */ - /* rewind and doesn't need further processing. */ - ft_stroke_border_close( right, FALSE ); - } - else - { - SW_FT_Angle turn; - SW_FT_Int inside_side; + /* no specific corner processing is required if the turn is 0 */ + if (turn != 0) { + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + /* otherwise, the inside side is 1 */ + if (turn < 0) inside_side = 1; - /* close the path if needed */ - if ( stroker->center.x != stroker->subpath_start.x || - stroker->center.y != stroker->subpath_start.y ) - { - error = SW_FT_Stroker_LineTo( stroker, &stroker->subpath_start ); - if ( error ) - goto Exit; - } + error = ft_stroker_inside(stroker, inside_side, + stroker->subpath_line_length); + if (error) goto Exit; - /* process the corner */ - stroker->angle_out = stroker->subpath_angle; - turn = SW_FT_Angle_Diff( stroker->angle_in, - stroker->angle_out ); + /* process the outside side */ + error = ft_stroker_outside(stroker, 1 - inside_side, + stroker->subpath_line_length); + if (error) goto Exit; + } - /* no specific corner processing is required if the turn is 0 */ - if ( turn != 0 ) - { - /* when we turn to the right, the inside side is 0 */ - inside_side = 0; - - /* otherwise, the inside side is 1 */ - if ( turn < 0 ) - inside_side = 1; - - error = ft_stroker_inside( stroker, - inside_side, - stroker->subpath_line_length ); - if ( error ) - goto Exit; - - /* process the outside side */ - error = ft_stroker_outside( stroker, - 1 - inside_side, - stroker->subpath_line_length ); - if ( error ) - goto Exit; - } - - /* then end our two subpaths */ - ft_stroke_border_close( stroker->borders + 0, FALSE ); - ft_stroke_border_close( stroker->borders + 1, TRUE ); + /* then end our two subpaths */ + ft_stroke_border_close(stroker->borders + 0, FALSE); + ft_stroke_border_close(stroker->borders + 1, TRUE); } - Exit: +Exit: return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ +SW_FT_Error SW_FT_Stroker_GetBorderCounts(SW_FT_Stroker stroker, + SW_FT_StrokerBorder border, + SW_FT_UInt* anum_points, + SW_FT_UInt* anum_contours) +{ + SW_FT_UInt num_points = 0, num_contours = 0; + SW_FT_Error error; - SW_FT_Error - SW_FT_Stroker_GetBorderCounts( SW_FT_Stroker stroker, - SW_FT_StrokerBorder border, - SW_FT_UInt *anum_points, - SW_FT_UInt *anum_contours ) - { - SW_FT_UInt num_points = 0, num_contours = 0; - SW_FT_Error error; - - - if ( !stroker || border > 1 ) - { - error = -1;//SW_FT_THROW( Invalid_Argument ); - goto Exit; + if (!stroker || border > 1) { + error = -1; // SW_FT_THROW( Invalid_Argument ); + goto Exit; } - error = ft_stroke_border_get_counts( stroker->borders + border, - &num_points, &num_contours ); - Exit: - if ( anum_points ) - *anum_points = num_points; + error = ft_stroke_border_get_counts(stroker->borders + border, &num_points, + &num_contours); +Exit: + if (anum_points) *anum_points = num_points; - if ( anum_contours ) - *anum_contours = num_contours; + if (anum_contours) *anum_contours = num_contours; return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ +SW_FT_Error SW_FT_Stroker_GetCounts(SW_FT_Stroker stroker, + SW_FT_UInt* anum_points, + SW_FT_UInt* anum_contours) +{ + SW_FT_UInt count1, count2, num_points = 0; + SW_FT_UInt count3, count4, num_contours = 0; + SW_FT_Error error; - SW_FT_Error - SW_FT_Stroker_GetCounts( SW_FT_Stroker stroker, - SW_FT_UInt *anum_points, - SW_FT_UInt *anum_contours ) - { - SW_FT_UInt count1, count2, num_points = 0; - SW_FT_UInt count3, count4, num_contours = 0; - SW_FT_Error error; + error = ft_stroke_border_get_counts(stroker->borders + 0, &count1, &count2); + if (error) goto Exit; + error = ft_stroke_border_get_counts(stroker->borders + 1, &count3, &count4); + if (error) goto Exit; - error = ft_stroke_border_get_counts( stroker->borders + 0, - &count1, &count2 ); - if ( error ) - goto Exit; - - error = ft_stroke_border_get_counts( stroker->borders + 1, - &count3, &count4 ); - if ( error ) - goto Exit; - - num_points = count1 + count3; + num_points = count1 + count3; num_contours = count2 + count4; - Exit: - *anum_points = num_points; +Exit: + *anum_points = num_points; *anum_contours = num_contours; return error; - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ +void SW_FT_Stroker_ExportBorder(SW_FT_Stroker stroker, + SW_FT_StrokerBorder border, + SW_FT_Outline* outline) +{ + if (border == SW_FT_STROKER_BORDER_LEFT || + border == SW_FT_STROKER_BORDER_RIGHT) { + SW_FT_StrokeBorder sborder = &stroker->borders[border]; - void - SW_FT_Stroker_ExportBorder( SW_FT_Stroker stroker, - SW_FT_StrokerBorder border, - SW_FT_Outline* outline ) - { - if ( border == SW_FT_STROKER_BORDER_LEFT || - border == SW_FT_STROKER_BORDER_RIGHT ) - { - SW_FT_StrokeBorder sborder = & stroker->borders[border]; - - - if ( sborder->valid ) - ft_stroke_border_export( sborder, outline ); + if (sborder->valid) ft_stroke_border_export(sborder, outline); } - } +} +/* documentation is in ftstroke.h */ - /* documentation is in ftstroke.h */ +void SW_FT_Stroker_Export(SW_FT_Stroker stroker, SW_FT_Outline* outline) +{ + SW_FT_Stroker_ExportBorder(stroker, SW_FT_STROKER_BORDER_LEFT, outline); + SW_FT_Stroker_ExportBorder(stroker, SW_FT_STROKER_BORDER_RIGHT, outline); +} - void - SW_FT_Stroker_Export( SW_FT_Stroker stroker, - SW_FT_Outline* outline ) - { - SW_FT_Stroker_ExportBorder( stroker, SW_FT_STROKER_BORDER_LEFT, outline ); - SW_FT_Stroker_ExportBorder( stroker, SW_FT_STROKER_BORDER_RIGHT, outline ); - } +/* documentation is in ftstroke.h */ +/* + * The following is very similar to SW_FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ +SW_FT_Error SW_FT_Stroker_ParseOutline(SW_FT_Stroker stroker, + const SW_FT_Outline* outline, + SW_FT_Bool opened) +{ + SW_FT_Vector v_last; + SW_FT_Vector v_control; + SW_FT_Vector v_start; - /* documentation is in ftstroke.h */ + SW_FT_Vector* point; + SW_FT_Vector* limit; + char* tags; - /* - * The following is very similar to SW_FT_Outline_Decompose, except - * that we do support opened paths, and do not scale the outline. - */ - SW_FT_Error - SW_FT_Stroker_ParseOutline( SW_FT_Stroker stroker, - const SW_FT_Outline* outline, - SW_FT_Bool opened ) - { - SW_FT_Vector v_last; - SW_FT_Vector v_control; - SW_FT_Vector v_start; + SW_FT_Error error; - SW_FT_Vector* point; - SW_FT_Vector* limit; - char* tags; + SW_FT_Int n; /* index of contour in outline */ + SW_FT_UInt first; /* index of first point in contour */ + SW_FT_Int tag; /* current point's state */ - SW_FT_Error error; + if (!outline || !stroker) return -1; // SW_FT_THROW( Invalid_Argument ); - SW_FT_Int n; /* index of contour in outline */ - SW_FT_UInt first; /* index of first point in contour */ - SW_FT_Int tag; /* current point's state */ - - - if ( !outline || !stroker ) - return -1;//SW_FT_THROW( Invalid_Argument ); - - SW_FT_Stroker_Rewind( stroker ); + SW_FT_Stroker_Rewind(stroker); first = 0; - for ( n = 0; n < outline->n_contours; n++ ) - { - SW_FT_UInt last; /* index of last point in contour */ + for (n = 0; n < outline->n_contours; n++) { + SW_FT_UInt last; /* index of last point in contour */ + last = outline->contours[n]; + limit = outline->points + last; - last = outline->contours[n]; - limit = outline->points + last; - - /* skip empty points; we don't stroke these */ - if ( last <= first ) - { - first = last + 1; - continue; - } - - v_start = outline->points[first]; - v_last = outline->points[last]; - - v_control = v_start; - - point = outline->points + first; - tags = outline->tags + first; - tag = SW_FT_CURVE_TAG( tags[0] ); - - /* A contour cannot start with a cubic control point! */ - if ( tag == SW_FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; - - /* check first point to determine origin */ - if ( tag == SW_FT_CURVE_TAG_CONIC ) - { - /* First point is conic control. Yes, this happens. */ - if ( SW_FT_CURVE_TAG( outline->tags[last] ) == SW_FT_CURVE_TAG_ON ) - { - /* start at last point if it is on the curve */ - v_start = v_last; - limit--; - } - else - { - /* if both first and last points are conic, */ - /* start at their middle */ - v_start.x = ( v_start.x + v_last.x ) / 2; - v_start.y = ( v_start.y + v_last.y ) / 2; - } - point--; - tags--; - } - - error = SW_FT_Stroker_BeginSubPath( stroker, &v_start, opened ); - if ( error ) - goto Exit; - - while ( point < limit ) - { - point++; - tags++; - - tag = SW_FT_CURVE_TAG( tags[0] ); - switch ( tag ) - { - case SW_FT_CURVE_TAG_ON: /* emit a single line_to */ - { - SW_FT_Vector vec; - - - vec.x = point->x; - vec.y = point->y; - - error = SW_FT_Stroker_LineTo( stroker, &vec ); - if ( error ) - goto Exit; + /* skip empty points; we don't stroke these */ + if (last <= first) { + first = last + 1; continue; - } + } - case SW_FT_CURVE_TAG_CONIC: /* consume conic arcs */ - v_control.x = point->x; - v_control.y = point->y; + v_start = outline->points[first]; + v_last = outline->points[last]; - Do_Conic: - if ( point < limit ) - { - SW_FT_Vector vec; - SW_FT_Vector v_middle; + v_control = v_start; + point = outline->points + first; + tags = outline->tags + first; + tag = SW_FT_CURVE_TAG(tags[0]); + /* A contour cannot start with a cubic control point! */ + if (tag == SW_FT_CURVE_TAG_CUBIC) goto Invalid_Outline; + + /* check first point to determine origin */ + if (tag == SW_FT_CURVE_TAG_CONIC) { + /* First point is conic control. Yes, this happens. */ + if (SW_FT_CURVE_TAG(outline->tags[last]) == SW_FT_CURVE_TAG_ON) { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } else { + /* if both first and last points are conic, */ + /* start at their middle */ + v_start.x = (v_start.x + v_last.x) / 2; + v_start.y = (v_start.y + v_last.y) / 2; + } + point--; + tags--; + } + + error = SW_FT_Stroker_BeginSubPath(stroker, &v_start, opened); + if (error) goto Exit; + + while (point < limit) { point++; tags++; - tag = SW_FT_CURVE_TAG( tags[0] ); - vec = point[0]; - - if ( tag == SW_FT_CURVE_TAG_ON ) + tag = SW_FT_CURVE_TAG(tags[0]); + switch (tag) { + case SW_FT_CURVE_TAG_ON: /* emit a single line_to */ { - error = SW_FT_Stroker_ConicTo( stroker, &v_control, &vec ); - if ( error ) - goto Exit; - continue; + SW_FT_Vector vec; + + vec.x = point->x; + vec.y = point->y; + + error = SW_FT_Stroker_LineTo(stroker, &vec); + if (error) goto Exit; + continue; } - if ( tag != SW_FT_CURVE_TAG_CONIC ) - goto Invalid_Outline; + case SW_FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; - v_middle.x = ( v_control.x + vec.x ) / 2; - v_middle.y = ( v_control.y + vec.y ) / 2; + Do_Conic: + if (point < limit) { + SW_FT_Vector vec; + SW_FT_Vector v_middle; - error = SW_FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); - if ( error ) - goto Exit; + point++; + tags++; + tag = SW_FT_CURVE_TAG(tags[0]); - v_control = vec; - goto Do_Conic; - } + vec = point[0]; - error = SW_FT_Stroker_ConicTo( stroker, &v_control, &v_start ); - goto Close; + if (tag == SW_FT_CURVE_TAG_ON) { + error = + SW_FT_Stroker_ConicTo(stroker, &v_control, &vec); + if (error) goto Exit; + continue; + } - default: /* SW_FT_CURVE_TAG_CUBIC */ - { - SW_FT_Vector vec1, vec2; + if (tag != SW_FT_CURVE_TAG_CONIC) goto Invalid_Outline; + v_middle.x = (v_control.x + vec.x) / 2; + v_middle.y = (v_control.y + vec.y) / 2; - if ( point + 1 > limit || - SW_FT_CURVE_TAG( tags[1] ) != SW_FT_CURVE_TAG_CUBIC ) - goto Invalid_Outline; + error = + SW_FT_Stroker_ConicTo(stroker, &v_control, &v_middle); + if (error) goto Exit; - point += 2; - tags += 2; + v_control = vec; + goto Do_Conic; + } - vec1 = point[-2]; - vec2 = point[-1]; + error = SW_FT_Stroker_ConicTo(stroker, &v_control, &v_start); + goto Close; - if ( point <= limit ) + default: /* SW_FT_CURVE_TAG_CUBIC */ { - SW_FT_Vector vec; + SW_FT_Vector vec1, vec2; + if (point + 1 > limit || + SW_FT_CURVE_TAG(tags[1]) != SW_FT_CURVE_TAG_CUBIC) + goto Invalid_Outline; - vec = point[0]; + point += 2; + tags += 2; - error = SW_FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); - if ( error ) - goto Exit; - continue; + vec1 = point[-2]; + vec2 = point[-1]; + + if (point <= limit) { + SW_FT_Vector vec; + + vec = point[0]; + + error = SW_FT_Stroker_CubicTo(stroker, &vec1, &vec2, &vec); + if (error) goto Exit; + continue; + } + + error = SW_FT_Stroker_CubicTo(stroker, &vec1, &vec2, &v_start); + goto Close; + } } - - error = SW_FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); - goto Close; - } } - } Close: - if ( error ) - goto Exit; + if (error) goto Exit; - /* don't try to end the path if no segments have been generated */ - if ( !stroker->first_point ) - { - error = SW_FT_Stroker_EndSubPath( stroker ); - if ( error ) - goto Exit; - } + /* don't try to end the path if no segments have been generated */ + if (!stroker->first_point) { + error = SW_FT_Stroker_EndSubPath(stroker); + if (error) goto Exit; + } - first = last + 1; + first = last + 1; } return 0; - Exit: +Exit: return error; - Invalid_Outline: - return -2;//SW_FT_THROW( Invalid_Outline ); - } - +Invalid_Outline: + return -2; // SW_FT_THROW( Invalid_Outline ); +} /* END */ diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index c3874f4c0a..3651bc7b97 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -1,22 +1,21 @@ #include "vbezier.h" -#include +#include V_BEGIN_NAMESPACE // Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. // This uses alpha = 1, beta = 3/8, which results in a maximum error of less // than 7% compared to the correct value. -static inline float -lineLength(float x1, float y1, float x2, float y2) +static inline float lineLength(float x1, float y1, float x2, float y2) { - float x = x2 - x1; - float y = y2 - y1; + float x = x2 - x1; + float y = y2 - y1; - x = x < 0 ? -x : x; - y = y < 0 ? -y : y; + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; - return (x > y ? x + 0.375 * y : y + 0.375 * x); + return (x > y ? x + 0.375 * y : y + 0.375 * x); } VBezier VBezier::fromPoints(const VPointF &p1, const VPointF &p2, @@ -34,42 +33,39 @@ VBezier VBezier::fromPoints(const VPointF &p1, const VPointF &p2, return b; } -float -VBezier::length()const +float VBezier::length() const { - VBezier left, right; /* bez poly splits */ - float len = 0.0; /* arc length */ - float chord; /* chord length */ - float length; + VBezier left, right; /* bez poly splits */ + float len = 0.0; /* arc length */ + float chord; /* chord length */ + float length; - len = len + lineLength(x1, y1, x2, y2); - len = len + lineLength(x2, y2, x3, y3); - len = len + lineLength(x3, y3, x4, y4); + len = len + lineLength(x1, y1, x2, y2); + len = len + lineLength(x2, y2, x3, y3); + len = len + lineLength(x3, y3, x4, y4); - chord = lineLength(x1, y1, x4, y4); + chord = lineLength(x1, y1, x4, y4); - if (!vCompare(len, chord)) { - split(&left, &right); /* split in two */ - length = - left.length() + /* try left side */ - right.length(); /* try right side */ + if (!vCompare(len, chord)) { + split(&left, &right); /* split in two */ + length = left.length() + /* try left side */ + right.length(); /* try right side */ - return length; - } + return length; + } - return len; + return len; } VBezier VBezier::onInterval(float t0, float t1) const { - if (t0 == 0 && t1 == 1) - return *this; + if (t0 == 0 && t1 == 1) return *this; VBezier bezier = *this; VBezier result; bezier.parameterSplitLeft(t0, &result); - float trueT = (t1-t0)/(1-t0); + float trueT = (t1 - t0) / (1 - t0); bezier.parameterSplitLeft(trueT, &result); return result; @@ -77,11 +73,10 @@ VBezier VBezier::onInterval(float t0, float t1) const float VBezier::tAtLength(float l) const { - float len = length(); - float t = 1.0; + float len = length(); + float t = 1.0; const float error = 0.01; - if (l > len || vCompare(l, len)) - return t; + if (l > len || vCompare(l, len)) return t; t *= 0.5; @@ -91,8 +86,7 @@ float VBezier::tAtLength(float l) const VBezier left; right.parameterSplitLeft(t, &left); float lLen = left.length(); - if (fabs(lLen - l) < error) - break; + if (fabs(lLen - l) < error) break; if (lLen < l) { t += (lastBigger - t) * 0.5; @@ -104,15 +98,13 @@ float VBezier::tAtLength(float l) const return t; } -void -VBezier::splitAtLength(float len, VBezier *left, VBezier *right) +void VBezier::splitAtLength(float len, VBezier *left, VBezier *right) { - float t; + float t; - *right = *this; - t = right->tAtLength(len); - right->parameterSplitLeft(t, left); + *right = *this; + t = right->tAtLength(len); + right->parameterSplitLeft(t, left); } V_END_NAMESPACE - diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index dd3f4cf869..ccb573374a 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -5,29 +5,31 @@ V_BEGIN_NAMESPACE -class VBezier -{ +class VBezier { public: - VBezier(){} - VPointF pointAt(float t)const; - VBezier onInterval(float t0, float t1)const; - float length()const; - static void coefficients(float t, float &a, float &b, float &c, float &d); - static VBezier fromPoints(const VPointF &start, const VPointF &cp1, const VPointF &cp2, const VPointF &end); - inline void parameterSplitLeft(float t, VBezier *left); - inline void split(VBezier *firstHalf, VBezier *secondHalf) const; - float tAtLength(float len) const; - void splitAtLength(float len, VBezier *left, VBezier *right); - VPointF pt1() const { return VPointF(x1, y1); } - VPointF pt2() const { return VPointF(x2, y2); } - VPointF pt3() const { return VPointF(x3, y3); } - VPointF pt4() const { return VPointF(x4, y4); } + VBezier() {} + VPointF pointAt(float t) const; + VBezier onInterval(float t0, float t1) const; + float length() const; + static void coefficients(float t, float &a, float &b, float &c, float &d); + static VBezier fromPoints(const VPointF &start, const VPointF &cp1, + const VPointF &cp2, const VPointF &end); + inline void parameterSplitLeft(float t, VBezier *left); + inline void split(VBezier *firstHalf, VBezier *secondHalf) const; + float tAtLength(float len) const; + void splitAtLength(float len, VBezier *left, VBezier *right); + VPointF pt1() const { return VPointF(x1, y1); } + VPointF pt2() const { return VPointF(x2, y2); } + VPointF pt3() const { return VPointF(x3, y3); } + VPointF pt4() const { return VPointF(x4, y4); } + private: - VPointF derivative(float t)const; - float x1,y1,x2,y2,x3,y3,x4,y4; + VPointF derivative(float t) const; + float x1, y1, x2, y2, x3, y3, x4, y4; }; -inline void VBezier::coefficients(float t, float &a, float &b, float &c, float &d) +inline void VBezier::coefficients(float t, float &a, float &b, float &c, + float &d) { float m_t = 1. - t; b = m_t * m_t; @@ -45,20 +47,20 @@ inline VPointF VBezier::pointAt(float t) const float m_t = 1. - t; { - float a = x1*m_t + x2*t; - float b = x2*m_t + x3*t; - float c = x3*m_t + x4*t; - a = a*m_t + b*t; - b = b*m_t + c*t; - x = a*m_t + b*t; + float a = x1 * m_t + x2 * t; + float b = x2 * m_t + x3 * t; + float c = x3 * m_t + x4 * t; + a = a * m_t + b * t; + b = b * m_t + c * t; + x = a * m_t + b * t; } { - float a = y1*m_t + y2*t; - float b = y2*m_t + y3*t; - float c = y3*m_t + y4*t; - a = a*m_t + b*t; - b = b*m_t + c*t; - y = a*m_t + b*t; + float a = y1 * m_t + y2 * t; + float b = y2 * m_t + y3 * t; + float c = y3 * m_t + y4 * t; + a = a * m_t + b * t; + b = b * m_t + c * t; + y = a * m_t + b * t; } return VPointF(x, y); } @@ -68,20 +70,20 @@ inline void VBezier::parameterSplitLeft(float t, VBezier *left) left->x1 = x1; left->y1 = y1; - left->x2 = x1 + t * ( x2 - x1 ); - left->y2 = y1 + t * ( y2 - y1 ); + left->x2 = x1 + t * (x2 - x1); + left->y2 = y1 + t * (y2 - y1); - left->x3 = x2 + t * ( x3 - x2 ); // temporary holding spot - left->y3 = y2 + t * ( y3 - y2 ); // temporary holding spot + left->x3 = x2 + t * (x3 - x2); // temporary holding spot + left->y3 = y2 + t * (y3 - y2); // temporary holding spot - x3 = x3 + t * ( x4 - x3 ); - y3 = y3 + t * ( y4 - y3 ); + x3 = x3 + t * (x4 - x3); + y3 = y3 + t * (y4 - y3); - x2 = left->x3 + t * ( x3 - left->x3); - y2 = left->y3 + t * ( y3 - left->y3); + x2 = left->x3 + t * (x3 - left->x3); + y2 = left->y3 + t * (y3 - left->y3); - left->x3 = left->x2 + t * ( left->x3 - left->x2 ); - left->y3 = left->y2 + t * ( left->y3 - left->y2 ); + left->x3 = left->x2 + t * (left->x3 - left->x2); + left->y3 = left->y2 + t * (left->y3 - left->y2); left->x4 = x1 = left->x3 + t * (x2 - left->x3); left->y4 = y1 = left->y3 + t * (y2 - left->y3); @@ -89,25 +91,25 @@ inline void VBezier::parameterSplitLeft(float t, VBezier *left) inline void VBezier::split(VBezier *firstHalf, VBezier *secondHalf) const { - float c = (x2 + x3)*.5; - firstHalf->x2 = (x1 + x2)*.5; - secondHalf->x3 = (x3 + x4)*.5; + float c = (x2 + x3) * .5; + firstHalf->x2 = (x1 + x2) * .5; + secondHalf->x3 = (x3 + x4) * .5; firstHalf->x1 = x1; secondHalf->x4 = x4; - firstHalf->x3 = (firstHalf->x2 + c)*.5; - secondHalf->x2 = (secondHalf->x3 + c)*.5; - firstHalf->x4 = secondHalf->x1 = (firstHalf->x3 + secondHalf->x2)*.5; + firstHalf->x3 = (firstHalf->x2 + c) * .5; + secondHalf->x2 = (secondHalf->x3 + c) * .5; + firstHalf->x4 = secondHalf->x1 = (firstHalf->x3 + secondHalf->x2) * .5; - c = (y2 + y3)/2; - firstHalf->y2 = (y1 + y2)*.5; - secondHalf->y3 = (y3 + y4)*.5; + c = (y2 + y3) / 2; + firstHalf->y2 = (y1 + y2) * .5; + secondHalf->y3 = (y3 + y4) * .5; firstHalf->y1 = y1; secondHalf->y4 = y4; - firstHalf->y3 = (firstHalf->y2 + c)*.5; - secondHalf->y2 = (secondHalf->y3 + c)*.5; - firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2)*.5; + firstHalf->y3 = (firstHalf->y2 + c) * .5; + secondHalf->y2 = (secondHalf->y3 + c) * .5; + firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2) * .5; } V_END_NAMESPACE -#endif //VBEZIER_H +#endif // VBEZIER_H diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index f92c9ca42a..5e18fdef7a 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -1,45 +1,50 @@ #include "vbitmap.h" +#include #include "vglobal.h" -#include V_BEGIN_NAMESPACE -struct VBitmapData -{ +struct VBitmapData { ~VBitmapData(); VBitmapData(); static VBitmapData *create(int width, int height, VBitmap::Format format); - RefCount ref; - int width; - int height; - int depth; - int stride; - int nBytes; - VBitmap::Format format; - uchar *data; - VBitmapCleanupFunction cleanupFunction; - void* cleanupInfo; - uint ownData : 1; - uint roData : 1; + RefCount ref; + int width; + int height; + int depth; + int stride; + int nBytes; + VBitmap::Format format; + uchar * data; + VBitmapCleanupFunction cleanupFunction; + void * cleanupInfo; + uint ownData : 1; + uint roData : 1; }; VBitmapData::~VBitmapData() { - if (cleanupFunction) - cleanupFunction(cleanupInfo); - if (data && ownData) - free(data); + if (cleanupFunction) cleanupFunction(cleanupInfo); + if (data && ownData) free(data); data = 0; } VBitmapData::VBitmapData() - : ref(0), width(0), height(0), depth(0), stride(0), - format(VBitmap::Format::ARGB32), data(nullptr), - cleanupFunction(0), cleanupInfo(0), ownData(true), roData(false) + : ref(0), + width(0), + height(0), + depth(0), + stride(0), + format(VBitmap::Format::ARGB32), + data(nullptr), + cleanupFunction(0), + cleanupInfo(0), + ownData(true), + roData(false) { } -VBitmapData * VBitmapData::create(int width, int height, VBitmap::Format format) +VBitmapData *VBitmapData::create(int width, int height, VBitmap::Format format) { if ((width <= 0) || (height <= 0) || format == VBitmap::Format::Invalid) return nullptr; @@ -56,7 +61,8 @@ VBitmapData * VBitmapData::create(int width, int height, VBitmap::Format format) break; } - const int stride = ((width * depth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4) + const int stride = ((width * depth + 31) >> 5) + << 2; // bytes per scanline (must be multiple of 4) VBitmapData *d = new VBitmapData; @@ -65,8 +71,8 @@ VBitmapData * VBitmapData::create(int width, int height, VBitmap::Format format) d->depth = depth; d->format = format; d->stride = stride; - d->nBytes = d->stride*height; - d->data = (uchar *)malloc(d->nBytes); + d->nBytes = d->stride * height; + d->data = (uchar *)malloc(d->nBytes); if (!d->data) { delete d; @@ -84,8 +90,7 @@ inline void VBitmap::cleanUp(VBitmapData *d) void VBitmap::detach() { if (d) { - if (d->ref.isShared() || d->roData) - *this = copy(); + if (d->ref.isShared() || d->roData) *this = copy(); } } @@ -93,24 +98,18 @@ VBitmap::~VBitmap() { if (!d) return; - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); } -VBitmap::VBitmap() - : d(nullptr) -{ - -} +VBitmap::VBitmap() : d(nullptr) {} VBitmap::VBitmap(const VBitmap &other) { d = other.d; - if (d) - d->ref.ref(); + if (d) d->ref.ref(); } -VBitmap::VBitmap(VBitmap &&other): d(other.d) +VBitmap::VBitmap(VBitmap &&other) : d(other.d) { other.d = nullptr; } @@ -119,11 +118,9 @@ VBitmap &VBitmap::operator=(const VBitmap &other) { if (!d) { d = other.d; - if (d) - d->ref.ref(); + if (d) d->ref.ref(); } else { - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); other.d->ref.ref(); d = other.d; } @@ -133,18 +130,15 @@ VBitmap &VBitmap::operator=(const VBitmap &other) inline VBitmap &VBitmap::operator=(VBitmap &&other) { - if (d && !d->ref.deref()) - cleanUp(d); + if (d && !d->ref.deref()) cleanUp(d); d = other.d; return *this; } -VBitmap::VBitmap(int w, int h, VBitmap::Format format) -{ - -} -VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap::Format format, - VBitmapCleanupFunction f, void *cleanupInfo) +VBitmap::VBitmap(int w, int h, VBitmap::Format format) {} +VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, + VBitmap::Format format, VBitmapCleanupFunction f, + void *cleanupInfo) { d = new VBitmapData; d->data = data; @@ -159,15 +153,13 @@ VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap::Format fo d->ref.setOwned(); } -VBitmap VBitmap::copy(const VRect& r) const +VBitmap VBitmap::copy(const VRect &r) const { - if (!d) - return VBitmap(); + if (!d) return VBitmap(); if (r.isNull()) { VBitmap image(d->width, d->height, d->format); - if (image.isNull()) - return image; + if (image.isNull()) return image; if (image.d->nBytes != d->nBytes) { int bpl = vMin(stride(), image.stride()); @@ -185,12 +177,10 @@ VBitmap VBitmap::copy(const VRect& r) const int dx = 0; int dy = 0; - if (w <= 0 || h <= 0) - return VBitmap(); + if (w <= 0 || h <= 0) return VBitmap(); VBitmap image(w, h, d->format); - if (image.isNull()) - return image; + if (image.isNull()) return image; if (x < 0 || y < 0 || x + w > d->width || y + h > d->height) { // bitBlt will not cover entire image - clear it. @@ -204,9 +194,8 @@ VBitmap VBitmap::copy(const VRect& r) const y = 0; } } - //TODO implement properly. + // TODO implement properly. return image; - } int VBitmap::stride() const @@ -226,13 +215,11 @@ int VBitmap::height() const uchar *VBitmap::bits() { - if (!d) - return 0; + if (!d) return 0; detach(); // In case detach ran out of memory... - if (!d) - return 0; + if (!d) return 0; return d->data; } @@ -249,39 +236,33 @@ bool VBitmap::isNull() const uchar *VBitmap::scanLine(int i) { - if (!d) - return 0; + if (!d) return 0; detach(); // In case detach() ran out of memory - if (!d) - return 0; + if (!d) return 0; return d->data + i * d->stride; } const uchar *VBitmap::scanLine(int i) const { - if (!d) - return 0; + if (!d) return 0; - //assert(i >= 0 && i < height()); + // assert(i >= 0 && i < height()); return d->data + i * d->stride; } VBitmap::Format VBitmap::format() const { - if (!d) - return VBitmap::Format::Invalid; + if (!d) return VBitmap::Format::Invalid; return d->format; } - void VBitmap::fill(uint pixel) { - if (!d) - return; + if (!d) return; } V_END_NAMESPACE diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index ca3f2a1ef2..a5223d934d 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -7,16 +7,9 @@ V_BEGIN_NAMESPACE struct VBitmapData; typedef void (*VBitmapCleanupFunction)(void *); -class VBitmap -{ +class VBitmap { public: - enum class Format { - Invalid, - Alpha8, - ARGB32, - ARGB32_Premultiplied, - Last - }; + enum class Format { Invalid, Alpha8, ARGB32, ARGB32_Premultiplied, Last }; ~VBitmap(); VBitmap(); VBitmap(const VBitmap &other); @@ -29,23 +22,24 @@ public: VBitmapCleanupFunction f = nullptr, void *cleanupInfo = nullptr); VBitmap copy(const VRect &rect = VRect()) const; - void fill(uint pixel); + void fill(uint pixel); - int width() const; - int height() const; - uchar *bits(); - const uchar *bits() const; - uchar *scanLine(int); - const uchar *scanLine(int) const; - int stride() const; - bool isNull() const; + int width() const; + int height() const; + uchar * bits(); + const uchar * bits() const; + uchar * scanLine(int); + const uchar * scanLine(int) const; + int stride() const; + bool isNull() const; VBitmap::Format format() const; + private: - void detach(); - void cleanUp(VBitmapData *x); - VBitmapData *d; + void detach(); + void cleanUp(VBitmapData *x); + VBitmapData *d; }; V_END_NAMESPACE -#endif // VBITMAP_H +#endif // VBITMAP_H diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index 55b015dff0..def67978a3 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -1,10 +1,12 @@ -#include"vbrush.h" +#include "vbrush.h" V_BEGIN_NAMESPACE -VGradient::VGradient(VGradient::Type type):mType(type), mSpread(VGradient::Spread::Pad), mMode(VGradient::Mode::Absolute) +VGradient::VGradient(VGradient::Type type) + : mType(type), + mSpread(VGradient::Spread::Pad), + mMode(VGradient::Mode::Absolute) { - } void VGradient::setStops(const VGradientStops &stops) @@ -12,8 +14,8 @@ void VGradient::setStops(const VGradientStops &stops) mStops = stops; } -VLinearGradient::VLinearGradient(const VPointF &start, - const VPointF &stop):VGradient(VGradient::Type::Linear) +VLinearGradient::VLinearGradient(const VPointF &start, const VPointF &stop) + : VGradient(VGradient::Type::Linear) { linear.x1 = start.x(); linear.y1 = start.y(); @@ -21,8 +23,9 @@ VLinearGradient::VLinearGradient(const VPointF &start, linear.y1 = stop.y(); } -VLinearGradient::VLinearGradient(float xStart, float yStart, - float xStop, float yStop):VGradient(VGradient::Type::Linear) +VLinearGradient::VLinearGradient(float xStart, float yStart, float xStop, + float yStop) + : VGradient(VGradient::Type::Linear) { linear.x1 = xStart; linear.y1 = yStart; @@ -31,7 +34,8 @@ VLinearGradient::VLinearGradient(float xStart, float yStart, } VRadialGradient::VRadialGradient(const VPointF ¢er, float cradius, - const VPointF &focalPoint, float fradius):VGradient(VGradient::Type::Radial) + const VPointF &focalPoint, float fradius) + : VGradient(VGradient::Type::Radial) { radial.cx = center.x(); radial.cy = center.y(); @@ -41,8 +45,9 @@ VRadialGradient::VRadialGradient(const VPointF ¢er, float cradius, radial.fradius = fradius; } -VRadialGradient::VRadialGradient(float cx, float cy, float cradius, - float fx, float fy, float fradius):VGradient(VGradient::Type::Radial) +VRadialGradient::VRadialGradient(float cx, float cy, float cradius, float fx, + float fy, float fradius) + : VGradient(VGradient::Type::Radial) { radial.cx = cx; radial.cy = cy; @@ -52,20 +57,17 @@ VRadialGradient::VRadialGradient(float cx, float cy, float cradius, radial.fradius = fradius; } -VBrush::VBrush(const VColor &color):mType(VBrush::Type::Solid), - mColor(color) +VBrush::VBrush(const VColor &color) : mType(VBrush::Type::Solid), mColor(color) { - } -VBrush::VBrush(int r, int g, int b, int a):mType(VBrush::Type::Solid), - mColor(r, g, b, a) +VBrush::VBrush(int r, int g, int b, int a) + : mType(VBrush::Type::Solid), mColor(r, g, b, a) { - } -VBrush::VBrush(const VGradient *gradient):mType(VBrush::Type::NoBrush) +VBrush::VBrush(const VGradient *gradient) : mType(VBrush::Type::NoBrush) { if (!gradient) return; diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index 772019f40c..29711f9537 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -1,40 +1,30 @@ #ifndef VBRUSH_H #define VBRUSH_H -#include"vglobal.h" -#include"vpoint.h" -#include"vmatrix.h" -#include +#include +#include "vglobal.h" +#include "vmatrix.h" +#include "vpoint.h" V_BEGIN_NAMESPACE -typedef std::pair VGradientStop; +typedef std::pair VGradientStop; typedef std::vector VGradientStops; -class VGradient -{ +class VGradient { public: - enum class Mode { - Absolute, - Relative - }; - enum class Spread { - Pad, - Repeat, - Reflect - }; - enum class Type { - Linear, - Radial - }; + enum class Mode { Absolute, Relative }; + enum class Spread { Pad, Repeat, Reflect }; + enum class Type { Linear, Radial }; VGradient(VGradient::Type type); void setStops(const VGradientStops &stops); - VGradient(){} + VGradient() {} + public: - static constexpr int colorTableSize = 1024; - VGradient::Type mType; - VGradient::Spread mSpread; - VGradient::Mode mMode; - VGradientStops mStops; + static constexpr int colorTableSize = 1024; + VGradient::Type mType; + VGradient::Spread mSpread; + VGradient::Mode mMode; + VGradientStops mStops; union { struct { float x1, y1, x2, y2; @@ -46,41 +36,35 @@ public: VMatrix mMatrix; }; -class VLinearGradient : public VGradient -{ +class VLinearGradient : public VGradient { public: VLinearGradient(const VPointF &start, const VPointF &stop); VLinearGradient(float xStart, float yStart, float xStop, float yStop); }; -class VRadialGradient : public VGradient -{ +class VRadialGradient : public VGradient { public: - VRadialGradient(const VPointF ¢er, float cradius, const VPointF &focalPoint, float fradius); - VRadialGradient(float cx, float cy, float cradius, float fx, float fy, float fradius); + VRadialGradient(const VPointF ¢er, float cradius, + const VPointF &focalPoint, float fradius); + VRadialGradient(float cx, float cy, float cradius, float fx, float fy, + float fradius); }; -class VBrush -{ +class VBrush { public: - enum class Type { - NoBrush, - Solid, - LinearGradient, - RadialGradient, - Texture - }; - VBrush():mType(Type::NoBrush){} + enum class Type { NoBrush, Solid, LinearGradient, RadialGradient, Texture }; + VBrush() : mType(Type::NoBrush) {} VBrush(const VColor &color); VBrush(const VGradient *gradient); VBrush(int r, int g, int b, int a); - inline VBrush::Type type() const{return mType;} + inline VBrush::Type type() const { return mType; } + public: - VBrush::Type mType; - VColor mColor; - const VGradient *mGradient; + VBrush::Type mType; + VColor mColor; + const VGradient *mGradient; }; V_END_NAMESPACE -#endif // VBRUSH_H +#endif // VBRUSH_H diff --git a/src/vector/vcompositionfunctions.cpp b/src/vector/vcompositionfunctions.cpp index 5122210a6d..b55cf66768 100644 --- a/src/vector/vcompositionfunctions.cpp +++ b/src/vector/vcompositionfunctions.cpp @@ -1,24 +1,22 @@ -#include"vdrawhelper.h" +#include "vdrawhelper.h" /* result = s dest = s * ca + d * cia */ -void comp_func_solid_Source(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +void comp_func_solid_Source(uint32_t *dest, int length, uint32_t color, + uint32_t const_alpha) { int ialpha, i; - if (const_alpha == 255) - { - memfill32(dest, color, length); - } - else - { - ialpha = 255 - const_alpha; - color = BYTE_MUL(color, const_alpha); - for (i = 0; i < length; ++i) - dest[i] = color + BYTE_MUL(dest[i], ialpha); - } + if (const_alpha == 255) { + memfill32(dest, color, length); + } else { + ialpha = 255 - const_alpha; + color = BYTE_MUL(color, const_alpha); + for (i = 0; i < length; ++i) + dest[i] = color + BYTE_MUL(dest[i], ialpha); + } } /* @@ -29,26 +27,26 @@ void comp_func_solid_Source(uint32_t *dest, int length, uint32_t color, uint32_t = s * ca + d * (1 - sa*ca) = s' + d ( 1 - s'a) */ -void comp_func_solid_SourceOver(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +void comp_func_solid_SourceOver(uint32_t *dest, int length, uint32_t color, + uint32_t const_alpha) { int ialpha, i; - if (const_alpha != 255) - color = BYTE_MUL(color, const_alpha); + if (const_alpha != 255) color = BYTE_MUL(color, const_alpha); ialpha = 255 - vAlpha(color); - for (i = 0; i < length; ++i) - dest[i] = color + BYTE_MUL(dest[i], ialpha); + for (i = 0; i < length; ++i) dest[i] = color + BYTE_MUL(dest[i], ialpha); } - -void comp_func_Source(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +void comp_func_Source(uint32_t *dest, const uint32_t *src, int length, + uint32_t const_alpha) { if (const_alpha == 255) { memcpy(dest, src, size_t(length) * sizeof(uint)); } else { uint ialpha = 255 - const_alpha; for (int i = 0; i < length; ++i) { - dest[i] = INTERPOLATE_PIXEL_255(src[i], const_alpha, dest[i], ialpha); + dest[i] = + INTERPOLATE_PIXEL_255(src[i], const_alpha, dest[i], ialpha); } } } @@ -56,7 +54,8 @@ void comp_func_Source(uint32_t *dest, const uint32_t *src, int length, uint32_t /* s' = s * ca * d' = s' + d (1 - s'a) */ -void comp_func_SourceOver(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +void comp_func_SourceOver(uint32_t *dest, const uint32_t *src, int length, + uint32_t const_alpha) { uint s, sia; @@ -66,8 +65,8 @@ void comp_func_SourceOver(uint32_t *dest, const uint32_t *src, int length, uint3 if (s >= 0xff000000) dest[i] = s; else if (s != 0) { - sia = vAlpha(~s); - dest[i] = s + BYTE_MUL(dest[i], sia); + sia = vAlpha(~s); + dest[i] = s + BYTE_MUL(dest[i], sia); } } } else { @@ -82,18 +81,10 @@ void comp_func_SourceOver(uint32_t *dest, const uint32_t *src, int length, uint3 } } - CompositionFunctionSolid COMP_functionForModeSolid_C[] = { - comp_func_solid_Source, - comp_func_solid_SourceOver -}; + comp_func_solid_Source, comp_func_solid_SourceOver}; -CompositionFunction COMP_functionForMode_C[] = { - comp_func_Source, - comp_func_SourceOver -}; - -void vInitBlendFunctions() -{ -} +CompositionFunction COMP_functionForMode_C[] = {comp_func_Source, + comp_func_SourceOver}; +void vInitBlendFunctions() {} diff --git a/src/vector/vcowptr.h b/src/vector/vcowptr.h index 8e947039b7..64aa554964 100644 --- a/src/vector/vcowptr.h +++ b/src/vector/vcowptr.h @@ -1,7 +1,8 @@ #ifndef VCOWPTR_H #define VCOWPTR_H -#include +#include +#include "vglobal.h" template class vcow_ptr { @@ -11,42 +12,52 @@ class vcow_ptr { model() = default; template - explicit model(Args&&... args) : mValue(std::forward(args)...) {} + explicit model(Args&&... args) : mValue(std::forward(args)...) + { + } T mValue; }; model* mModel; + public: using element_type = T; - vcow_ptr() { + vcow_ptr() + { static model default_s; mModel = &default_s; ++mModel->mRef; } - ~vcow_ptr() { + ~vcow_ptr() + { if (mModel && (--mModel->mRef == 0)) delete mModel; } template - vcow_ptr(Args&&... args) - : mModel(new model(std::forward(args)...)) {} + vcow_ptr(Args&&... args) : mModel(new model(std::forward(args)...)) + { + } - vcow_ptr(const vcow_ptr& x) noexcept : mModel(x.mModel) { + vcow_ptr(const vcow_ptr& x) noexcept : mModel(x.mModel) + { assert(mModel); ++mModel->mRef; } - vcow_ptr(vcow_ptr&& x) noexcept : mModel(x.mModel) { + vcow_ptr(vcow_ptr&& x) noexcept : mModel(x.mModel) + { assert(mModel); x.mModel = nullptr; } - auto operator=(const vcow_ptr& x) noexcept -> vcow_ptr& { + auto operator=(const vcow_ptr& x) noexcept -> vcow_ptr& + { return *this = vcow_ptr(x); } - auto operator=(vcow_ptr&& x) noexcept -> vcow_ptr& { + auto operator=(vcow_ptr&& x) noexcept -> vcow_ptr& + { auto tmp = std::move(x); swap(*this, tmp); return *this; @@ -56,27 +67,31 @@ public: auto operator-> () const noexcept -> const element_type* { return &read(); } - bool unique() const noexcept { + bool unique() const noexcept + { assert(mModel); return mModel->mRef == 1; } - auto write() -> element_type& { + auto write() -> element_type& + { if (!unique()) *this = vcow_ptr(read()); return mModel->mValue; } - auto read() const noexcept -> const element_type& { + auto read() const noexcept -> const element_type& + { assert(mModel); return mModel->mValue; } - friend inline void swap(vcow_ptr& x, vcow_ptr& y) noexcept { + friend inline void swap(vcow_ptr& x, vcow_ptr& y) noexcept + { std::swap(x.mModel, y.mModel); } }; -#endif // VCOWPTR_H +#endif // VCOWPTR_H diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index f3d7f882bf..7fa920d7aa 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -1,18 +1,24 @@ -#include"vdasher.h" -#include"vbezier.h" +#include "vdasher.h" +#include "vbezier.h" V_BEGIN_NAMESPACE -class VLine -{ +class VLine { public: - VLine():mX1(0),mY1(0),mX2(0),mY2(0){} - VLine(float x1, float y1, float x2, float y2):mX1(x1),mY1(y1),mX2(x2),mY2(y2){} - VLine(const VPointF &p1, const VPointF &p2):mX1(p1.x()),mY1(p1.y()),mX2(p2.x()),mY2(p2.y()){} - float length() const; - void splitAtLength(float length, VLine &left, VLine &right) const; - VPointF p1() const {return VPointF(mX1, mY1);} - VPointF p2() const {return VPointF(mX2, mY2);} + VLine() : mX1(0), mY1(0), mX2(0), mY2(0) {} + VLine(float x1, float y1, float x2, float y2) + : mX1(x1), mY1(y1), mX2(x2), mY2(y2) + { + } + VLine(const VPointF &p1, const VPointF &p2) + : mX1(p1.x()), mY1(p1.y()), mX2(p2.x()), mY2(p2.y()) + { + } + float length() const; + void splitAtLength(float length, VLine &left, VLine &right) const; + VPointF p1() const { return VPointF(mX1, mY1); } + VPointF p2() const { return VPointF(mX2, mY2); } + private: float mX1; float mY1; @@ -23,42 +29,39 @@ private: // approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. // With alpha = 1, beta = 3/8, giving results with the largest error less // than 7% compared to the exact value. -float -VLine::length() const +float VLine::length() const { - float x = mX2 - mX1; - float y = mY2 - mY1; - x = x < 0 ? -x : x; - y = y < 0 ? -y : y; - return (x > y ? x + 0.375 * y : y + 0.375 * x); + float x = mX2 - mX1; + float y = mY2 - mY1; + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; + return (x > y ? x + 0.375 * y : y + 0.375 * x); } -void -VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const +void VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const { - float len = length(); - double dx = ((mX2 - mX1)/len) *lengthAt; - double dy = ((mY2 - mY1)/len) *lengthAt; + float len = length(); + double dx = ((mX2 - mX1) / len) * lengthAt; + double dy = ((mY2 - mY1) / len) * lengthAt; - left.mX1 = mX1; - left.mY1 = mY1; - left.mX2 = left.mX1 + dx; - left.mY2 = left.mY1 + dy; + left.mX1 = mX1; + left.mY1 = mY1; + left.mX2 = left.mX1 + dx; + left.mY2 = left.mY1 + dy; - right.mX1 = left.mX2; - right.mY1 = left.mY2; - right.mX2 = mX2; - right.mY2 = mY2; + right.mX1 = left.mX2; + right.mY1 = left.mY2; + right.mX2 = mX2; + right.mY2 = mY2; } VDasher::VDasher(const float *dashArray, int size) { - if (!(size % 2)) - vCritical<<"invalid dashArray format"; + if (!(size % 2)) vCritical << "invalid dashArray format"; mDashArray = reinterpret_cast(dashArray); - mArraySize = size/2; - mDashOffset = dashArray[size-1]; + mArraySize = size / 2; + mDashOffset = dashArray[size - 1]; mCurrentDashIndex = 0; mCurrentDashLength = 0; mIsCurrentOperationGap = false; @@ -72,11 +75,11 @@ void VDasher::moveTo(const VPointF &p) if (!vCompare(mDashOffset, 0.0f)) { float totalLength = 0.0; - for (int i = 0; i < mArraySize ; i++) { + for (int i = 0; i < mArraySize; i++) { totalLength = mDashArray[i].length + mDashArray[i].gap; } float normalizeLen = fmod(mDashOffset, totalLength); - if (normalizeLen < 0.0 ) { + if (normalizeLen < 0.0) { normalizeLen = totalLength + normalizeLen; } // now the length is less than total length and +ve @@ -109,44 +112,44 @@ void VDasher::lineTo(const VPointF &p) VLine line(mCurPt, p); float length = line.length(); if (length < mCurrentDashLength) { - mCurrentDashLength -= length; - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(mCurPt); - mDashedPath.lineTo(p); - } + mCurrentDashLength -= length; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(mCurPt); + mDashedPath.lineTo(p); + } } else { - while (length > mCurrentDashLength) { - length -= mCurrentDashLength; - line.splitAtLength(mCurrentDashLength, left, right); - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(left.p1()); - mDashedPath.lineTo(left.p2()); - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } else { - mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize ; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } - mIsCurrentOperationGap = !mIsCurrentOperationGap; - line = right; - mCurPt = line.p1(); - } - // remainder - mCurrentDashLength -= length; - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(line.p1()); - mDashedPath.lineTo(line.p2()); - } - if (mCurrentDashLength < 1.0) { - // move to next dash - if (!mIsCurrentOperationGap) { - mIsCurrentOperationGap = true; - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } else { - mIsCurrentOperationGap = false; - mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } - } + while (length > mCurrentDashLength) { + length -= mCurrentDashLength; + line.splitAtLength(mCurrentDashLength, left, right); + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(left.p1()); + mDashedPath.lineTo(left.p2()); + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + mIsCurrentOperationGap = !mIsCurrentOperationGap; + line = right; + mCurPt = line.p1(); + } + // remainder + mCurrentDashLength -= length; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(line.p1()); + mDashedPath.lineTo(line.p2()); + } + if (mCurrentDashLength < 1.0) { + // move to next dash + if (!mIsCurrentOperationGap) { + mIsCurrentOperationGap = true; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mIsCurrentOperationGap = false; + mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + } } mCurPt = p; } @@ -154,87 +157,84 @@ void VDasher::lineTo(const VPointF &p) void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) { VBezier left, right; - float bezLen = 0.0; + float bezLen = 0.0; VBezier b = VBezier::fromPoints(mCurPt, cp1, cp2, e); bezLen = b.length(); if (bezLen < mCurrentDashLength) { - mCurrentDashLength -= bezLen; - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(mCurPt); - mDashedPath.cubicTo(cp1, cp2, e); - } + mCurrentDashLength -= bezLen; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(mCurPt); + mDashedPath.cubicTo(cp1, cp2, e); + } } else { - while (bezLen > mCurrentDashLength) { - bezLen -= mCurrentDashLength; - b.splitAtLength(mCurrentDashLength, &left, &right); - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(left.pt1()); - mDashedPath.cubicTo(left.pt2(), left.pt3(), left.pt4());; - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } else { - mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize ; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } - mIsCurrentOperationGap = !mIsCurrentOperationGap; - b = right; - mCurPt = b.pt1(); + while (bezLen > mCurrentDashLength) { + bezLen -= mCurrentDashLength; + b.splitAtLength(mCurrentDashLength, &left, &right); + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(left.pt1()); + mDashedPath.cubicTo(left.pt2(), left.pt3(), left.pt4()); + ; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } + mIsCurrentOperationGap = !mIsCurrentOperationGap; + b = right; + mCurPt = b.pt1(); + } + // remainder + mCurrentDashLength -= bezLen; + if (!mIsCurrentOperationGap) { + mDashedPath.moveTo(b.pt1()); + mDashedPath.cubicTo(b.pt2(), b.pt3(), b.pt4()); + } + if (mCurrentDashLength < 1.0) { + // move to next dash + if (!mIsCurrentOperationGap) { + mIsCurrentOperationGap = true; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mIsCurrentOperationGap = false; + mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } } - // remainder - mCurrentDashLength -= bezLen; - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(b.pt1()); - mDashedPath.cubicTo(b.pt2(), b.pt3(), b.pt4()); - } - if (mCurrentDashLength < 1.0) { - // move to next dash - if (!mIsCurrentOperationGap) - { - mIsCurrentOperationGap = true; - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } - else - { - mIsCurrentOperationGap = false; - mCurrentDashIndex = (mCurrentDashIndex +1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } - } } mCurPt = e; } - VPath VDasher::dashed(const VPath &path) { if (path.isEmpty()) return VPath(); mDashedPath = VPath(); const std::vector &elms = path.elements(); - const std::vector &pts = path.points(); - const VPointF *ptPtr = pts.data(); + const std::vector & pts = path.points(); + const VPointF * ptPtr = pts.data(); for (auto i : elms) { switch (i) { - case VPath::Element::MoveTo: { - moveTo(*ptPtr++); - break; - } - case VPath::Element::LineTo: { - lineTo(*ptPtr++); - break; - } - case VPath::Element::CubicTo: { - cubicTo(*ptPtr, *(ptPtr + 1), *(ptPtr + 2)); - ptPtr += 3; - break; - } - case VPath::Element::Close: { - // The point is already joined to start point in VPath - // no need to do anything here. - break; - } - default: - break; + case VPath::Element::MoveTo: { + moveTo(*ptPtr++); + break; + } + case VPath::Element::LineTo: { + lineTo(*ptPtr++); + break; + } + case VPath::Element::CubicTo: { + cubicTo(*ptPtr, *(ptPtr + 1), *(ptPtr + 2)); + ptPtr += 3; + break; + } + case VPath::Element::Close: { + // The point is already joined to start point in VPath + // no need to do anything here. + break; + } + default: + break; } } return mDashedPath; diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index c2007880d1..833e8c9e60 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -4,32 +4,33 @@ V_BEGIN_NAMESPACE -class VDasher -{ - public: +class VDasher { +public: VDasher(const float *dashArray, int size); VPath dashed(const VPath &path); - private: + +private: void moveTo(const VPointF &p); void lineTo(const VPointF &p); void cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e); void close(); + private: struct Dash { - float length; - float gap; + float length; + float gap; }; - const VDasher::Dash *mDashArray; - int mArraySize; - VPointF mStartPt; - VPointF mCurPt; - int mCurrentDashIndex; - float mCurrentDashLength; - bool mIsCurrentOperationGap; - float mDashOffset; - VPath mDashedPath; + const VDasher::Dash *mDashArray; + int mArraySize; + VPointF mStartPt; + VPointF mCurPt; + int mCurrentDashIndex; + float mCurrentDashLength; + bool mIsCurrentOperationGap; + float mDashOffset; + VPath mDashedPath; }; V_END_NAMESPACE -#endif // VDASHER_H +#endif // VDASHER_H diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index de0fe79948..bc2fc3b9a4 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -1,68 +1,70 @@ #include "vdebug.h" -#include +#include #include +#include #include +#include +#include +#include #include #include -#include -#include -#include -#include -namespace +namespace { + +/* Returns microseconds since epoch */ +uint64_t timestamp_now() { + return std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count(); +} - /* Returns microseconds since epoch */ - uint64_t timestamp_now() - { - return std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); - } - - /* I want [2016-10-13 00:01:23.528514] */ - void format_timestamp(std::ostream & os, uint64_t timestamp) - { +/* I want [2016-10-13 00:01:23.528514] */ +void format_timestamp(std::ostream& os, uint64_t timestamp) +{ // The next 3 lines do not work on MSVC! // auto duration = std::chrono::microseconds(timestamp); // std::chrono::high_resolution_clock::time_point time_point(duration); - // std::time_t time_t = std::chrono::high_resolution_clock::to_time_t(time_point); + // std::time_t time_t = + // std::chrono::high_resolution_clock::to_time_t(time_point); std::time_t time_t = timestamp / 1000000; - auto gmtime = std::gmtime(&time_t); - char buffer[32]; + auto gmtime = std::gmtime(&time_t); + char buffer[32]; strftime(buffer, 32, "%Y-%m-%d %T.", gmtime); char microseconds[7]; sprintf(microseconds, "%06llu", timestamp % 1000000); os << '[' << buffer << microseconds << ']'; - } +} - std::thread::id this_thread_id() - { +std::thread::id this_thread_id() +{ static thread_local const std::thread::id id = std::this_thread::get_id(); return id; - } +} - template < typename T, typename Tuple > - struct TupleIndex; +template +struct TupleIndex; - template < typename T,typename ... Types > - struct TupleIndex < T, std::tuple < T, Types... > > - { +template +struct TupleIndex > { static constexpr const std::size_t value = 0; - }; +}; - template < typename T, typename U, typename ... Types > - struct TupleIndex < T, std::tuple < U, Types... > > - { - static constexpr const std::size_t value = 1 + TupleIndex < T, std::tuple < Types... > >::value; - }; +template +struct TupleIndex > { + static constexpr const std::size_t value = + 1 + TupleIndex >::value; +}; -} // anonymous namespace +} // anonymous namespace - typedef std::tuple < char, uint32_t, uint64_t, int32_t, int64_t, double, VDebug::string_literal_t, char * > SupportedTypes; +typedef std::tuple + SupportedTypes; - char const * to_string(LogLevel loglevel) - { - switch (loglevel) - { +char const* to_string(LogLevel loglevel) +{ + switch (loglevel) { case LogLevel::OFF: return "OFF"; case LogLevel::INFO: @@ -73,206 +75,244 @@ namespace return "CRIT"; } return "XXXX"; - } +} - template < typename Arg > - void VDebug::encode(Arg arg) - { +template +void VDebug::encode(Arg arg) +{ *reinterpret_cast(buffer()) = arg; m_bytes_used += sizeof(Arg); - } +} - template < typename Arg > - void VDebug::encode(Arg arg, uint8_t type_id) - { +template +void VDebug::encode(Arg arg, uint8_t type_id) +{ resize_buffer_if_needed(sizeof(Arg) + sizeof(uint8_t)); - encode < uint8_t >(type_id); - encode < Arg >(arg); - } + encode(type_id); + encode(arg); +} - VDebug::VDebug(LogLevel level, char const * file, char const * function, uint32_t line) - : m_bytes_used(0) - , m_buffer_size(sizeof(m_stack_buffer)) - { - encode < uint64_t >(timestamp_now()); - encode < std::thread::id >(this_thread_id()); - encode < string_literal_t >(string_literal_t(file)); - encode < string_literal_t >(string_literal_t(function)); - encode < uint32_t >(line); - encode < LogLevel >(level); +VDebug::VDebug(LogLevel level, char const* file, char const* function, + uint32_t line) + : m_bytes_used(0), m_buffer_size(sizeof(m_stack_buffer)) +{ + encode(timestamp_now()); + encode(this_thread_id()); + encode(string_literal_t(file)); + encode(string_literal_t(function)); + encode(line); + encode(level); if (level == LogLevel::INFO) { m_logAll = true; - }else { + } else { m_logAll = true; } - } +} - VDebug::~VDebug() = default; +VDebug::~VDebug() = default; - void VDebug::stringify(std::ostream & os) - { - char * b = !m_heap_buffer ? m_stack_buffer : m_heap_buffer.get(); - char const * const end = b + m_bytes_used; - uint64_t timestamp = *reinterpret_cast < uint64_t * >(b); b += sizeof(uint64_t); - std::thread::id threadid = *reinterpret_cast < std::thread::id * >(b); b += sizeof(std::thread::id); - string_literal_t file = *reinterpret_cast < string_literal_t * >(b); b += sizeof(string_literal_t); - string_literal_t function = *reinterpret_cast < string_literal_t * >(b); b += sizeof(string_literal_t); - uint32_t line = *reinterpret_cast < uint32_t * >(b); b += sizeof(uint32_t); - LogLevel loglevel = *reinterpret_cast < LogLevel * >(b); b += sizeof(LogLevel); +void VDebug::stringify(std::ostream& os) +{ + char* b = !m_heap_buffer ? m_stack_buffer : m_heap_buffer.get(); + char const* const end = b + m_bytes_used; + uint64_t timestamp = *reinterpret_cast(b); + b += sizeof(uint64_t); + std::thread::id threadid = *reinterpret_cast(b); + b += sizeof(std::thread::id); + string_literal_t file = *reinterpret_cast(b); + b += sizeof(string_literal_t); + string_literal_t function = *reinterpret_cast(b); + b += sizeof(string_literal_t); + uint32_t line = *reinterpret_cast(b); + b += sizeof(uint32_t); + LogLevel loglevel = *reinterpret_cast(b); + b += sizeof(LogLevel); if (m_logAll) { - format_timestamp(os, timestamp); - - os << '[' << to_string(loglevel) << ']' - << '[' << threadid << ']' - << '[' << file.m_s << ':' << function.m_s << ':' << line << "] "; + format_timestamp(os, timestamp); + os << '[' << to_string(loglevel) << ']' << '[' << threadid << ']' << '[' + << file.m_s << ':' << function.m_s << ':' << line << "] "; } stringify(os, b, end); os << std::endl; - if (loglevel >= LogLevel::CRIT) - os.flush(); - } + if (loglevel >= LogLevel::CRIT) os.flush(); +} - template < typename Arg > - char * decode(std::ostream & os, char * b, Arg * dummy) - { - Arg arg = *reinterpret_cast < Arg * >(b); +template +char* decode(std::ostream& os, char* b, Arg* dummy) +{ + Arg arg = *reinterpret_cast(b); os << arg; return b + sizeof(Arg); - } +} - template <> - char * decode(std::ostream & os, char * b, VDebug::string_literal_t * dummy) - { - VDebug::string_literal_t s = *reinterpret_cast < VDebug::string_literal_t * >(b); +template <> +char* decode(std::ostream& os, char* b, VDebug::string_literal_t* dummy) +{ + VDebug::string_literal_t s = + *reinterpret_cast(b); os << s.m_s; return b + sizeof(VDebug::string_literal_t); - } +} - template <> - char * decode(std::ostream & os, char * b, char ** dummy) - { - while (*b != '\0') - { +template <> +char* decode(std::ostream& os, char* b, char** dummy) +{ + while (*b != '\0') { os << *b; ++b; } return ++b; - } +} - void VDebug::stringify(std::ostream & os, char * start, char const * const end) - { - if (start == end) - return; +void VDebug::stringify(std::ostream& os, char* start, char const* const end) +{ + if (start == end) return; - int type_id = static_cast < int >(*start); start++; + int type_id = static_cast(*start); + start++; - switch (type_id) - { + switch (type_id) { case 0: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 1: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 2: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 3: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 4: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 5: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 6: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; case 7: - stringify(os, decode(os, start, static_cast::type*>(nullptr)), end); + stringify( + os, + decode(os, start, + static_cast::type*>( + nullptr)), + end); return; } - } +} - char * VDebug::buffer() - { - return !m_heap_buffer ? &m_stack_buffer[m_bytes_used] : &(m_heap_buffer.get())[m_bytes_used]; - } +char* VDebug::buffer() +{ + return !m_heap_buffer ? &m_stack_buffer[m_bytes_used] + : &(m_heap_buffer.get())[m_bytes_used]; +} - void VDebug::resize_buffer_if_needed(size_t additional_bytes) - { +void VDebug::resize_buffer_if_needed(size_t additional_bytes) +{ size_t const required_size = m_bytes_used + additional_bytes; - if (required_size <= m_buffer_size) - return; + if (required_size <= m_buffer_size) return; - if (!m_heap_buffer) - { + if (!m_heap_buffer) { m_buffer_size = std::max(static_cast(512), required_size); m_heap_buffer.reset(new char[m_buffer_size]); memcpy(m_heap_buffer.get(), m_stack_buffer, m_bytes_used); return; - } - else - { - m_buffer_size = std::max(static_cast(2 * m_buffer_size), required_size); - std::unique_ptr < char [] > new_heap_buffer(new char[m_buffer_size]); + } else { + m_buffer_size = + std::max(static_cast(2 * m_buffer_size), required_size); + std::unique_ptr new_heap_buffer(new char[m_buffer_size]); memcpy(new_heap_buffer.get(), m_heap_buffer.get(), m_bytes_used); m_heap_buffer.swap(new_heap_buffer); } - } +} - void VDebug::encode(char const * arg) - { - if (arg != nullptr) - encode_c_string(arg, strlen(arg)); - } +void VDebug::encode(char const* arg) +{ + if (arg != nullptr) encode_c_string(arg, strlen(arg)); +} - void VDebug::encode(char * arg) - { - if (arg != nullptr) - encode_c_string(arg, strlen(arg)); - } +void VDebug::encode(char* arg) +{ + if (arg != nullptr) encode_c_string(arg, strlen(arg)); +} - void VDebug::encode_c_string(char const * arg, size_t length) - { - if (length == 0) - return; +void VDebug::encode_c_string(char const* arg, size_t length) +{ + if (length == 0) return; resize_buffer_if_needed(1 + length + 1); - char * b = buffer(); - auto type_id = TupleIndex < char *, SupportedTypes >::value; + char* b = buffer(); + auto type_id = TupleIndex::value; *reinterpret_cast(b++) = static_cast(type_id); memcpy(b, arg, length + 1); m_bytes_used += 1 + length + 1; - } +} - void VDebug::encode(string_literal_t arg) - { - encode < string_literal_t >(arg, TupleIndex < string_literal_t, SupportedTypes >::value); - } +void VDebug::encode(string_literal_t arg) +{ + encode( + arg, TupleIndex::value); +} - VDebug& VDebug::operator<<(std::string const & arg) - { +VDebug& VDebug::operator<<(std::string const& arg) +{ encode_c_string(arg.c_str(), arg.length()); return *this; - } +} - VDebug& VDebug::operator<<(int32_t arg) - { - encode < int32_t >(arg, TupleIndex < int32_t, SupportedTypes >::value); +VDebug& VDebug::operator<<(int32_t arg) +{ + encode(arg, TupleIndex::value); return *this; - } +} - VDebug& VDebug::operator<<(uint32_t arg) - { - encode < uint32_t >(arg, TupleIndex < uint32_t, SupportedTypes >::value); +VDebug& VDebug::operator<<(uint32_t arg) +{ + encode(arg, TupleIndex::value); return *this; - } +} // VDebug& VDebug::operator<<(int64_t arg) // { @@ -285,297 +325,281 @@ namespace // encode < uint64_t >(arg, TupleIndex < uint64_t, SupportedTypes >::value); // return *this; // } - VDebug& VDebug::operator<<(unsigned long arg) - { - encode < uint64_t >(arg, TupleIndex < uint64_t, SupportedTypes >::value); - return *this; - } - - VDebug& VDebug::operator<<(long arg) - { - encode < int64_t >(arg, TupleIndex < int64_t, SupportedTypes >::value); - return *this; - } - - VDebug& VDebug::operator<<(double arg) - { - encode < double >(arg, TupleIndex < double, SupportedTypes >::value); +VDebug& VDebug::operator<<(unsigned long arg) +{ + encode(arg, TupleIndex::value); return *this; - } +} - VDebug& VDebug::operator<<(char arg) - { - encode < char >(arg, TupleIndex < char, SupportedTypes >::value); +VDebug& VDebug::operator<<(long arg) +{ + encode(arg, TupleIndex::value); return *this; - } +} - struct BufferBase - { +VDebug& VDebug::operator<<(double arg) +{ + encode(arg, TupleIndex::value); + return *this; +} + +VDebug& VDebug::operator<<(char arg) +{ + encode(arg, TupleIndex::value); + return *this; +} + +struct BufferBase { virtual ~BufferBase() = default; - virtual void push(VDebug && logline) = 0; - virtual bool try_pop(VDebug & logline) = 0; - }; + virtual void push(VDebug&& logline) = 0; + virtual bool try_pop(VDebug& logline) = 0; +}; - struct SpinLock +struct SpinLock { + SpinLock(std::atomic_flag& flag) : m_flag(flag) { - SpinLock(std::atomic_flag & flag) : m_flag(flag) - { - while (m_flag.test_and_set(std::memory_order_acquire)); + while (m_flag.test_and_set(std::memory_order_acquire)) + ; } - ~SpinLock() - { - m_flag.clear(std::memory_order_release); - } + ~SpinLock() { m_flag.clear(std::memory_order_release); } - private: - std::atomic_flag & m_flag; - }; +private: + std::atomic_flag& m_flag; +}; - /* Multi Producer Single Consumer Ring Buffer */ - class RingBuffer : public BufferBase - { - public: - struct alignas(64) Item - { +/* Multi Producer Single Consumer Ring Buffer */ +class RingBuffer : public BufferBase { +public: + struct alignas(64) Item { Item() - : flag() - , written(0) - , logline(LogLevel::INFO, nullptr, nullptr, 0) + : flag(), written(0), logline(LogLevel::INFO, nullptr, nullptr, 0) { } std::atomic_flag flag; - char written; - char padding[256 - sizeof(std::atomic_flag) - sizeof(char) - sizeof(VDebug)]; - VDebug logline; - }; + char written; + char padding[256 - sizeof(std::atomic_flag) - sizeof(char) - + sizeof(VDebug)]; + VDebug logline; + }; - RingBuffer(size_t const size) - : m_size(size) - , m_ring(static_cast(std::malloc(size * sizeof(Item)))) - , m_write_index(0) - , m_read_index(0) - { - for (size_t i = 0; i < m_size; ++i) - { + RingBuffer(size_t const size) + : m_size(size), + m_ring(static_cast(std::malloc(size * sizeof(Item)))), + m_write_index(0), + m_read_index(0) + { + for (size_t i = 0; i < m_size; ++i) { new (&m_ring[i]) Item(); - } + } static_assert(sizeof(Item) == 256, "Unexpected size != 256"); - } + } - ~RingBuffer() - { - for (size_t i = 0; i < m_size; ++i) - { + ~RingBuffer() + { + for (size_t i = 0; i < m_size; ++i) { m_ring[i].~Item(); - } - std::free(m_ring); } + std::free(m_ring); + } - void push(VDebug && logline) override - { - unsigned int write_index = m_write_index.fetch_add(1, std::memory_order_relaxed) % m_size; - Item & item = m_ring[write_index]; - SpinLock spinlock(item.flag); + void push(VDebug&& logline) override + { + unsigned int write_index = + m_write_index.fetch_add(1, std::memory_order_relaxed) % m_size; + Item& item = m_ring[write_index]; + SpinLock spinlock(item.flag); item.logline = std::move(logline); item.written = 1; - } + } - bool try_pop(VDebug & logline) override - { - Item & item = m_ring[m_read_index % m_size]; - SpinLock spinlock(item.flag); - if (item.written == 1) - { + bool try_pop(VDebug& logline) override + { + Item& item = m_ring[m_read_index % m_size]; + SpinLock spinlock(item.flag); + if (item.written == 1) { logline = std::move(item.logline); item.written = 0; - ++m_read_index; + ++m_read_index; return true; - } - return false; - } - - RingBuffer(RingBuffer const &) = delete; - RingBuffer& operator=(RingBuffer const &) = delete; - - private: - size_t const m_size; - Item * m_ring; - std::atomic < unsigned int > m_write_index; - char pad[64]; - unsigned int m_read_index; - }; - - - class Buffer - { - public: - struct Item - { - Item(VDebug && logline) : logline(std::move(logline)) {} - char padding[256 - sizeof(VDebug)]; - VDebug logline; - }; - - static constexpr const size_t size = 32768; // 8MB. Helps reduce memory fragmentation - - Buffer() : m_buffer(static_cast(std::malloc(size * sizeof(Item)))) - { - for (size_t i = 0; i <= size; ++i) - { - m_write_state[i].store(0, std::memory_order_relaxed); - } - static_assert(sizeof(Item) == 256, "Unexpected size != 256"); - } - - ~Buffer() - { - unsigned int write_count = m_write_state[size].load(); - for (size_t i = 0; i < write_count; ++i) - { - m_buffer[i].~Item(); - } - std::free(m_buffer); - } - - // Returns true if we need to switch to next buffer - bool push(VDebug && logline, unsigned int const write_index) - { - new (&m_buffer[write_index]) Item(std::move(logline)); - m_write_state[write_index].store(1, std::memory_order_release); - return m_write_state[size].fetch_add(1, std::memory_order_acquire) + 1 == size; - } - - bool try_pop(VDebug & logline, unsigned int const read_index) - { - if (m_write_state[read_index].load(std::memory_order_acquire)) - { - Item & item = m_buffer[read_index]; - logline = std::move(item.logline); - return true; } return false; - } + } - Buffer(Buffer const &) = delete; - Buffer& operator=(Buffer const &) = delete; + RingBuffer(RingBuffer const&) = delete; + RingBuffer& operator=(RingBuffer const&) = delete; - private: - Item * m_buffer; - std::atomic < unsigned int > m_write_state[size + 1]; +private: + size_t const m_size; + Item* m_ring; + std::atomic m_write_index; + char pad[64]; + unsigned int m_read_index; +}; + +class Buffer { +public: + struct Item { + Item(VDebug&& logline) : logline(std::move(logline)) {} + char padding[256 - sizeof(VDebug)]; + VDebug logline; }; - class QueueBuffer : public BufferBase - { - public: - QueueBuffer(QueueBuffer const &) = delete; - QueueBuffer& operator=(QueueBuffer const &) = delete; + static constexpr const size_t size = + 32768; // 8MB. Helps reduce memory fragmentation - QueueBuffer() : m_current_read_buffer{nullptr} - , m_write_index(0) - , m_flag() - , m_read_index(0) + Buffer() : m_buffer(static_cast(std::malloc(size * sizeof(Item)))) + { + for (size_t i = 0; i <= size; ++i) { + m_write_state[i].store(0, std::memory_order_relaxed); + } + static_assert(sizeof(Item) == 256, "Unexpected size != 256"); + } + + ~Buffer() + { + unsigned int write_count = m_write_state[size].load(); + for (size_t i = 0; i < write_count; ++i) { + m_buffer[i].~Item(); + } + std::free(m_buffer); + } + + // Returns true if we need to switch to next buffer + bool push(VDebug&& logline, unsigned int const write_index) + { + new (&m_buffer[write_index]) Item(std::move(logline)); + m_write_state[write_index].store(1, std::memory_order_release); + return m_write_state[size].fetch_add(1, std::memory_order_acquire) + + 1 == + size; + } + + bool try_pop(VDebug& logline, unsigned int const read_index) + { + if (m_write_state[read_index].load(std::memory_order_acquire)) { + Item& item = m_buffer[read_index]; + logline = std::move(item.logline); + return true; + } + return false; + } + + Buffer(Buffer const&) = delete; + Buffer& operator=(Buffer const&) = delete; + +private: + Item* m_buffer; + std::atomic m_write_state[size + 1]; +}; + +class QueueBuffer : public BufferBase { +public: + QueueBuffer(QueueBuffer const&) = delete; + QueueBuffer& operator=(QueueBuffer const&) = delete; + + QueueBuffer() + : m_current_read_buffer{nullptr}, + m_write_index(0), + m_flag(), + m_read_index(0) { setup_next_write_buffer(); } - void push(VDebug && logline) override - { - unsigned int write_index = m_write_index.fetch_add(1, std::memory_order_relaxed); - if (write_index < Buffer::size) - { - if (m_current_write_buffer.load(std::memory_order_acquire)->push(std::move(logline), write_index)) - { - setup_next_write_buffer(); - } - } - else - { - while (m_write_index.load(std::memory_order_acquire) >= Buffer::size); - push(std::move(logline)); - } + void push(VDebug&& logline) override + { + unsigned int write_index = + m_write_index.fetch_add(1, std::memory_order_relaxed); + if (write_index < Buffer::size) { + if (m_current_write_buffer.load(std::memory_order_acquire) + ->push(std::move(logline), write_index)) { + setup_next_write_buffer(); + } + } else { + while (m_write_index.load(std::memory_order_acquire) >= + Buffer::size) + ; + push(std::move(logline)); } + } - bool try_pop(VDebug & logline) override + bool try_pop(VDebug& logline) override { if (m_current_read_buffer == nullptr) - m_current_read_buffer = get_next_read_buffer(); + m_current_read_buffer = get_next_read_buffer(); - Buffer * read_buffer = m_current_read_buffer; + Buffer* read_buffer = m_current_read_buffer; - if (read_buffer == nullptr) - return false; + if (read_buffer == nullptr) return false; - if (bool success = read_buffer->try_pop(logline, m_read_index)) - { - m_read_index++; - if (m_read_index == Buffer::size) - { - m_read_index = 0; - m_current_read_buffer = nullptr; - SpinLock spinlock(m_flag); - m_buffers.pop(); - } - return true; + if (bool success = read_buffer->try_pop(logline, m_read_index)) { + m_read_index++; + if (m_read_index == Buffer::size) { + m_read_index = 0; + m_current_read_buffer = nullptr; + SpinLock spinlock(m_flag); + m_buffers.pop(); + } + return true; } return false; } - private: +private: void setup_next_write_buffer() { - std::unique_ptr < Buffer > next_write_buffer(new Buffer()); - m_current_write_buffer.store(next_write_buffer.get(), std::memory_order_release); + std::unique_ptr next_write_buffer(new Buffer()); + m_current_write_buffer.store(next_write_buffer.get(), + std::memory_order_release); SpinLock spinlock(m_flag); m_buffers.push(std::move(next_write_buffer)); m_write_index.store(0, std::memory_order_relaxed); } - Buffer * get_next_read_buffer() + Buffer* get_next_read_buffer() { SpinLock spinlock(m_flag); return m_buffers.empty() ? nullptr : m_buffers.front().get(); } - private: - std::queue < std::unique_ptr < Buffer > > m_buffers; - std::atomic < Buffer * > m_current_write_buffer; - Buffer * m_current_read_buffer; - std::atomic < unsigned int > m_write_index; - std::atomic_flag m_flag; - unsigned int m_read_index; - }; +private: + std::queue > m_buffers; + std::atomic m_current_write_buffer; + Buffer* m_current_read_buffer; + std::atomic m_write_index; + std::atomic_flag m_flag; + unsigned int m_read_index; +}; - class FileWriter - { - public: - FileWriter(std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) - : m_log_file_roll_size_bytes(log_file_roll_size_mb * 1024 * 1024) - , m_name(log_directory + log_file_name) +class FileWriter { +public: + FileWriter(std::string const& log_directory, + std::string const& log_file_name, uint32_t log_file_roll_size_mb) + : m_log_file_roll_size_bytes(log_file_roll_size_mb * 1024 * 1024), + m_name(log_directory + log_file_name) { roll_file(); } - void write(VDebug & logline) + void write(VDebug& logline) { auto pos = m_os->tellp(); logline.stringify(*m_os); m_bytes_written += m_os->tellp() - pos; - if (m_bytes_written > m_log_file_roll_size_bytes) - { - roll_file(); + if (m_bytes_written > m_log_file_roll_size_bytes) { + roll_file(); } } - private: +private: void roll_file() { - if (m_os) - { - m_os->flush(); - m_os->close(); + if (m_os) { + m_os->flush(); + m_os->close(); } m_bytes_written = 0; @@ -588,31 +612,35 @@ namespace m_os->open(log_file_name, std::ofstream::out | std::ofstream::trunc); } - private: - uint32_t m_file_number = 0; - std::streamoff m_bytes_written = 0; - uint32_t const m_log_file_roll_size_bytes; - std::string const m_name; - std::unique_ptr < std::ofstream > m_os; - }; +private: + uint32_t m_file_number = 0; + std::streamoff m_bytes_written = 0; + uint32_t const m_log_file_roll_size_bytes; + std::string const m_name; + std::unique_ptr m_os; +}; - class NanoLogger - { - public: - NanoLogger(NonGuaranteedLogger ngl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) - : m_state(State::INIT) - , m_buffer_base(new RingBuffer(std::max(1u, ngl.ring_buffer_size_mb) * 1024 * 4)) - , m_file_writer(log_directory, log_file_name, std::max(1u, log_file_roll_size_mb)) - , m_thread(&NanoLogger::pop, this) +class NanoLogger { +public: + NanoLogger(NonGuaranteedLogger ngl, std::string const& log_directory, + std::string const& log_file_name, uint32_t log_file_roll_size_mb) + : m_state(State::INIT), + m_buffer_base( + new RingBuffer(std::max(1u, ngl.ring_buffer_size_mb) * 1024 * 4)), + m_file_writer(log_directory, log_file_name, + std::max(1u, log_file_roll_size_mb)), + m_thread(&NanoLogger::pop, this) { m_state.store(State::READY, std::memory_order_release); } - NanoLogger(GuaranteedLogger gl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) - : m_state(State::INIT) - , m_buffer_base(new QueueBuffer()) - , m_file_writer(log_directory, log_file_name, std::max(1u, log_file_roll_size_mb)) - , m_thread(&NanoLogger::pop, this) + NanoLogger(GuaranteedLogger gl, std::string const& log_directory, + std::string const& log_file_name, uint32_t log_file_roll_size_mb) + : m_state(State::INIT), + m_buffer_base(new QueueBuffer()), + m_file_writer(log_directory, log_file_name, + std::max(1u, log_file_roll_size_mb)), + m_thread(&NanoLogger::pop, this) { m_state.store(State::READY, std::memory_order_release); } @@ -623,97 +651,94 @@ namespace m_thread.join(); } - void add(VDebug && logline) - { - m_buffer_base->push(std::move(logline)); - } + void add(VDebug&& logline) { m_buffer_base->push(std::move(logline)); } void pop() { - // Wait for constructor to complete and pull all stores done there to this thread / core. + // Wait for constructor to complete and pull all stores done there to + // this thread / core. while (m_state.load(std::memory_order_acquire) == State::INIT) - std::this_thread::sleep_for(std::chrono::microseconds(50)); + std::this_thread::sleep_for(std::chrono::microseconds(50)); VDebug logline(LogLevel::INFO, nullptr, nullptr, 0); - while (m_state.load() == State::READY) - { - if (m_buffer_base->try_pop(logline)) - m_file_writer.write(logline); - else - std::this_thread::sleep_for(std::chrono::microseconds(50)); + while (m_state.load() == State::READY) { + if (m_buffer_base->try_pop(logline)) + m_file_writer.write(logline); + else + std::this_thread::sleep_for(std::chrono::microseconds(50)); } // Pop and log all remaining entries - while (m_buffer_base->try_pop(logline)) - { - m_file_writer.write(logline); + while (m_buffer_base->try_pop(logline)) { + m_file_writer.write(logline); } } - private: - enum class State - { - INIT, - READY, - SHUTDOWN - }; +private: + enum class State { INIT, READY, SHUTDOWN }; - std::atomic < State > m_state; - std::unique_ptr < BufferBase > m_buffer_base; - FileWriter m_file_writer; - std::thread m_thread; - }; + std::atomic m_state; + std::unique_ptr m_buffer_base; + FileWriter m_file_writer; + std::thread m_thread; +}; - std::unique_ptr < NanoLogger > nanologger; - std::atomic < NanoLogger * > atomic_nanologger; +std::unique_ptr nanologger; +std::atomic atomic_nanologger; - bool VDebugServer::operator==(VDebug & logline) - { +bool VDebugServer::operator==(VDebug& logline) +{ atomic_nanologger.load(std::memory_order_acquire)->add(std::move(logline)); return true; - } +} - void initialize(NonGuaranteedLogger ngl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) - { - nanologger.reset(new NanoLogger(ngl, log_directory, log_file_name, log_file_roll_size_mb)); +void initialize(NonGuaranteedLogger ngl, std::string const& log_directory, + std::string const& log_file_name, + uint32_t log_file_roll_size_mb) +{ + nanologger.reset(new NanoLogger(ngl, log_directory, log_file_name, + log_file_roll_size_mb)); atomic_nanologger.store(nanologger.get(), std::memory_order_seq_cst); - } +} - void initialize(GuaranteedLogger gl, std::string const & log_directory, std::string const & log_file_name, uint32_t log_file_roll_size_mb) - { - nanologger.reset(new NanoLogger(gl, log_directory, log_file_name, log_file_roll_size_mb)); +void initialize(GuaranteedLogger gl, std::string const& log_directory, + std::string const& log_file_name, + uint32_t log_file_roll_size_mb) +{ + nanologger.reset(new NanoLogger(gl, log_directory, log_file_name, + log_file_roll_size_mb)); atomic_nanologger.store(nanologger.get(), std::memory_order_seq_cst); - } +} - std::atomic < unsigned int > loglevel = {0}; +std::atomic loglevel = {0}; - void set_log_level(LogLevel level) - { +void set_log_level(LogLevel level) +{ loglevel.store(static_cast(level), std::memory_order_release); - } +} - bool is_logged(LogLevel level) - { - return static_cast(level) >= loglevel.load(std::memory_order_relaxed); - } +bool is_logged(LogLevel level) +{ + return static_cast(level) >= + loglevel.load(std::memory_order_relaxed); +} - void initDebug() - { - initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); - set_log_level(LogLevel::INFO); - } +void initDebug() +{ + initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); + set_log_level(LogLevel::INFO); +} #ifndef DEBUG_CONSTRUCTOR_FUNCTION -# define DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) \ - namespace { \ - static const struct AFUNC ## _ctor_class_ { \ - inline AFUNC ## _ctor_class_() { AFUNC(); } \ - } AFUNC ## _ctor_instance_; \ +#define DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) \ + namespace { \ + static const struct AFUNC##_ctor_class_ { \ + inline AFUNC##_ctor_class_() { AFUNC(); } \ + } AFUNC##_ctor_instance_; \ } -# define DEBUG_CONSTRUCTOR_FUNCTION(AFUNC) DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) +#define DEBUG_CONSTRUCTOR_FUNCTION(AFUNC) DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) #endif - DEBUG_CONSTRUCTOR_FUNCTION(initDebug) - +DEBUG_CONSTRUCTOR_FUNCTION(initDebug) diff --git a/src/vector/vdebug.h b/src/vector/vdebug.h index 536bc48e72..c1ae239e92 100644 --- a/src/vector/vdebug.h +++ b/src/vector/vdebug.h @@ -1,103 +1,103 @@ #ifndef VDEBUG_H #define VDEBUG_H #include +#include #include #include -#include #include - - enum class LogLevel : uint8_t { INFO, WARN, CRIT, OFF }; - -class VDebug -{ +class VDebug { public: VDebug(); - VDebug& debug() {return *this;} - VDebug(LogLevel level, char const * file, char const * function, uint32_t line); + VDebug& debug() { return *this; } + VDebug(LogLevel level, char const* file, char const* function, + uint32_t line); ~VDebug(); - VDebug(VDebug &&) = default; - VDebug& operator=(VDebug &&) = default; + VDebug(VDebug&&) = default; + VDebug& operator=(VDebug&&) = default; - void stringify(std::ostream & os); + void stringify(std::ostream& os); VDebug& operator<<(char arg); VDebug& operator<<(int32_t arg); VDebug& operator<<(uint32_t arg); - //VDebug& operator<<(int64_t arg); - //VDebug& operator<<(uint64_t arg); + // VDebug& operator<<(int64_t arg); + // VDebug& operator<<(uint64_t arg); VDebug& operator<<(long arg); VDebug& operator<<(unsigned long arg); VDebug& operator<<(double arg); - VDebug& operator<<(std::string const & arg); + VDebug& operator<<(std::string const& arg); - template < size_t N > - VDebug& operator<<(const char (&arg)[N]) { + template + VDebug& operator<<(const char (&arg)[N]) + { encode(string_literal_t(arg)); return *this; } - template < typename Arg > - typename std::enable_if < std::is_same < Arg, char const * >::value, VDebug& >::type - operator<<(Arg const & arg) { + template + typename std::enable_if::value, + VDebug&>::type + operator<<(Arg const& arg) + { encode(arg); return *this; } - template < typename Arg > - typename std::enable_if < std::is_same < Arg, char * >::value, VDebug& >::type - operator<<(Arg const & arg) { + template + typename std::enable_if::value, VDebug&>::type + operator<<(Arg const& arg) + { encode(arg); return *this; } struct string_literal_t { - explicit string_literal_t(char const * s) : m_s(s) {} - char const * m_s; + explicit string_literal_t(char const* s) : m_s(s) {} + char const* m_s; }; private: - char * buffer(); + char* buffer(); - template < typename Arg > + template void encode(Arg arg); - template < typename Arg > + template void encode(Arg arg, uint8_t type_id); - void encode(char * arg); - void encode(char const * arg); + void encode(char* arg); + void encode(char const* arg); void encode(string_literal_t arg); - void encode_c_string(char const * arg, size_t length); + void encode_c_string(char const* arg, size_t length); void resize_buffer_if_needed(size_t additional_bytes); - void stringify(std::ostream & os, char * start, char const * const end); + void stringify(std::ostream& os, char* start, char const* const end); private: - size_t m_bytes_used; - size_t m_buffer_size; - std::unique_ptr < char [] > m_heap_buffer; - bool m_logAll; - char m_stack_buffer[256 - sizeof(bool) - 2 * sizeof(size_t) - sizeof(decltype(m_heap_buffer)) - 8 /* Reserved */]; + size_t m_bytes_used; + size_t m_buffer_size; + std::unique_ptr m_heap_buffer; + bool m_logAll; + char m_stack_buffer[256 - sizeof(bool) - 2 * sizeof(size_t) - + sizeof(decltype(m_heap_buffer)) - 8 /* Reserved */]; }; -struct VDebugServer -{ +struct VDebugServer { /* * Ideally this should have been operator+= * Could not get that to compile, so here we are... */ - bool operator==(VDebug &); + bool operator==(VDebug&); }; void set_log_level(LogLevel level); bool is_logged(LogLevel level); - /* * Non guaranteed logging. Uses a ring buffer to hold log lines. * When the ring gets full, the previous log line in the slot will be dropped. @@ -106,17 +106,18 @@ bool is_logged(LogLevel level); * is determined by this parameter. Since each LogLine is 256 bytes, * ring_buffer_size = ring_buffer_size_mb * 1024 * 1024 / 256 */ -struct NonGuaranteedLogger -{ - NonGuaranteedLogger(uint32_t ring_buffer_size_mb_) : ring_buffer_size_mb(ring_buffer_size_mb_) {} +struct NonGuaranteedLogger { + NonGuaranteedLogger(uint32_t ring_buffer_size_mb_) + : ring_buffer_size_mb(ring_buffer_size_mb_) + { + } uint32_t ring_buffer_size_mb; }; /* * Provides a guarantee log lines will not be dropped. */ -struct GuaranteedLogger -{ +struct GuaranteedLogger { }; /* @@ -129,15 +130,17 @@ struct GuaranteedLogger * etc. * log_file_roll_size_mb - mega bytes after which we roll to next log file. */ -void initialize(GuaranteedLogger gl, std::string const & log_directory, - std::string const & log_file_name, uint32_t log_file_roll_size_mb); -void initialize(NonGuaranteedLogger ngl, std::string const & log_directory, - std::string const & log_file_name, uint32_t log_file_roll_size_mb); +void initialize(GuaranteedLogger gl, std::string const& log_directory, + std::string const& log_file_name, + uint32_t log_file_roll_size_mb); +void initialize(NonGuaranteedLogger ngl, std::string const& log_directory, + std::string const& log_file_name, + uint32_t log_file_roll_size_mb); - -#define VDEBUG_LOG(LEVEL) VDebugServer() == VDebug(LEVEL, __FILE__, __func__, __LINE__).debug() +#define VDEBUG_LOG(LEVEL) \ + VDebugServer() == VDebug(LEVEL, __FILE__, __func__, __LINE__).debug() #define vDebug is_logged(LogLevel::INFO) && VDEBUG_LOG(LogLevel::INFO) #define vWarning is_logged(LogLevel::WARN) && VDEBUG_LOG(LogLevel::WARN) #define vCritical is_logged(LogLevel::CRIT) && VDEBUG_LOG(LogLevel::CRIT) -#endif // VDEBUG_H +#endif // VDEBUG_H diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index f057c1f4ab..89be798842 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -1,6 +1,6 @@ #include "vdrawable.h" -#include"vdasher.h" -#include"vraster.h" +#include "vdasher.h" +#include "vraster.h" void VDrawable::preprocess() { @@ -11,8 +11,9 @@ void VDrawable::preprocess() VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); newPath = dasher.dashed(mPath); } - mRleTask = VRaster::instance().generateStrokeInfo(newPath, mStroke.cap, mStroke.join, - mStroke.width, mStroke.meterLimit); + mRleTask = VRaster::instance().generateStrokeInfo( + newPath, mStroke.cap, mStroke.join, mStroke.width, + mStroke.meterLimit); } else { mRleTask = VRaster::instance().generateFillInfo(mPath, mFillRule); } @@ -28,7 +29,8 @@ VRle VDrawable::rle() return mRle; } -void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) +void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, + float strokeWidth) { mStroke.enable = true; mStroke.cap = cap; diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index 8e8b3ac487..a518cd4959 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -1,19 +1,18 @@ #ifndef VDRAWABLE_H #define VDRAWABLE_H +#include #include "vbrush.h" #include "vpath.h" #include "vrle.h" -#include -class VDrawable -{ +class VDrawable { public: enum class DirtyState { - None = 0x00000000, - Path = 0x00000001, - Stroke = 0x00000010, - Brush = 0x00000100, - All = (None | Path | Stroke | Brush) + None = 0x00000000, + Path = 0x00000001, + Stroke = 0x00000010, + Brush = 0x00000100, + All = (None | Path | Stroke | Brush) }; enum class Type { Fill, @@ -22,29 +21,31 @@ public: typedef vFlag DirtyFlag; VDrawable() = default; void setPath(const VPath &path); - void setFillRule(FillRule rule){mFillRule = rule;} - void setBrush(const VBrush &brush){mBrush = brush;} - void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); + void setFillRule(FillRule rule) { mFillRule = rule; } + void setBrush(const VBrush &brush) { mBrush = brush; } + void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, + float strokeWidth); void setDashInfo(float *array, int size); void preprocess(); VRle rle(); + public: - DirtyFlag mFlag {DirtyState::All}; - VDrawable::Type mType {Type::Fill}; - VBrush mBrush; - VPath mPath; - FillRule mFillRule{FillRule::Winding}; - std::future mRleTask; - VRle mRle; - struct { - bool enable {false}; - float width {0.0}; - CapStyle cap {CapStyle::Flat}; - JoinStyle join {JoinStyle::Bevel}; - float meterLimit {10}; - float *dashArray {nullptr}; - int dashArraySize {0}; - }mStroke; + DirtyFlag mFlag{DirtyState::All}; + VDrawable::Type mType{Type::Fill}; + VBrush mBrush; + VPath mPath; + FillRule mFillRule{FillRule::Winding}; + std::future mRleTask; + VRle mRle; + struct { + bool enable{false}; + float width{0.0}; + CapStyle cap{CapStyle::Flat}; + JoinStyle join{JoinStyle::Bevel}; + float meterLimit{10}; + float * dashArray{nullptr}; + int dashArraySize{0}; + } mStroke; }; -#endif // VDRAWABLE_H +#endif // VDRAWABLE_H diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 69b13b2ef3..bec2410436 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -1,27 +1,26 @@ -#include"vdrawhelper.h" -#include -#include -#include -#include +#include "vdrawhelper.h" +#include +#include +#include +#include - -class VGradientCache -{ +class VGradientCache { public: - struct CacheInfo : public VSpanData::Pinnable - { - inline CacheInfo(VGradientStops s):stops(s) {} - uint32_t buffer32[VGradient::colorTableSize]; + struct CacheInfo : public VSpanData::Pinnable { + inline CacheInfo(VGradientStops s) : stops(s) {} + uint32_t buffer32[VGradient::colorTableSize]; VGradientStops stops; bool alpha; }; - typedef std::unordered_multimap> VGradientColorTableHash; + typedef std::unordered_multimap> + VGradientColorTableHash; bool generateGradientColorTable(const VGradientStops &stops, uint32_t *colorTable, int size); - inline const std::shared_ptr getBuffer(const VGradient &gradient) + inline const std::shared_ptr getBuffer( + const VGradient &gradient) { - uint64_t hash_val = 0; + uint64_t hash_val = 0; std::shared_ptr info; const VGradientStops &stops = gradient.mStops; @@ -33,14 +32,14 @@ public: int count = cache.count(hash_val); if (!count) { // key is not present in the hash - info = addCacheElement(hash_val, gradient); + info = addCacheElement(hash_val, gradient); } else if (count == 1) { VGradientColorTableHash::const_iterator it = cache.find(hash_val); if (it->second->stops == stops) { info = it->second; } else { // didn't find an exact match - info = addCacheElement(hash_val, gradient); + info = addCacheElement(hash_val, gradient); } } else { // we have a multiple data with same key @@ -53,7 +52,7 @@ public: } if (!info) { // didn't find an exact match - info = addCacheElement(hash_val, gradient); + info = addCacheElement(hash_val, gradient); } } cacheAccess.unlock(); @@ -61,8 +60,9 @@ public: } protected: - inline uint maxCacheSize() const { return 60; } - const std::shared_ptr addCacheElement(uint64_t hash_val, const VGradient &gradient) + inline uint maxCacheSize() const { return 60; } + const std::shared_ptr addCacheElement( + uint64_t hash_val, const VGradient &gradient) { if (cache.size() == maxCacheSize()) { int count = rand() % maxCacheSize(); @@ -71,25 +71,25 @@ protected: } } auto cache_entry = std::make_shared(gradient.mStops); - cache_entry->alpha = generateGradientColorTable(gradient.mStops, cache_entry->buffer32, VGradient::colorTableSize); + cache_entry->alpha = generateGradientColorTable( + gradient.mStops, cache_entry->buffer32, VGradient::colorTableSize); cache.insert(std::make_pair(hash_val, cache_entry)); return cache_entry; } VGradientColorTableHash cache; - std::mutex cacheAccess; + std::mutex cacheAccess; }; -bool -VGradientCache::generateGradientColorTable(const VGradientStops &stops, - uint32_t *colorTable, int size) +bool VGradientCache::generateGradientColorTable(const VGradientStops &stops, + uint32_t *colorTable, int size) { - int dist, idist, pos = 0, i; - bool alpha = false; - int stopCount = stops.size(); + int dist, idist, pos = 0, i; + bool alpha = false; + int stopCount = stops.size(); const VGradientStop *curr, *next, *start; - uint32_t curColor, nextColor; - float delta, t, incr, fpos; + uint32_t curColor, nextColor; + float delta, t, incr, fpos; start = stops.data(); curr = start; @@ -106,40 +106,39 @@ VGradientCache::generateGradientColorTable(const VGradientStops &stops, fpos += incr; } - for (i = 0; i < stopCount - 1; ++i) { + for (i = 0; i < stopCount - 1; ++i) { curr = (start + i); next = (start + i + 1); - delta = 1/(next->first - curr->first); + delta = 1 / (next->first - curr->first); if (!next->second.isOpaque()) alpha = true; nextColor = next->second.premulARGB(); - while (fpos < next->first && pos < size) - { - t = (fpos - curr->first) * delta; - dist = (int)(255 * t); - idist = 255 - dist; - colorTable[pos] = INTERPOLATE_PIXEL_255(curColor, idist, nextColor, dist); - ++pos; - fpos += incr; - } + while (fpos < next->first && pos < size) { + t = (fpos - curr->first) * delta; + dist = (int)(255 * t); + idist = 255 - dist; + colorTable[pos] = + INTERPOLATE_PIXEL_255(curColor, idist, nextColor, dist); + ++pos; + fpos += incr; + } curColor = nextColor; - } + } - for (;pos < size; ++pos) - colorTable[pos] = curColor; + for (; pos < size; ++pos) colorTable[pos] = curColor; - // Make sure the last color stop is represented at the end of the table - colorTable[size-1] = curColor; - return alpha; + // Make sure the last color stop is represented at the end of the table + colorTable[size - 1] = curColor; + return alpha; } -static VGradientCache VGradientCacheInstance; +static VGradientCache VGradientCacheInstance; void VRasterBuffer::init() { - mBuffer = nullptr; - mWidth = 0; - mHeight = 0; - mCompositionMode = VPainter::CompModeSrcOver; + mBuffer = nullptr; + mWidth = 0; + mHeight = 0; + mCompositionMode = VPainter::CompModeSrcOver; } void VRasterBuffer::clear() @@ -156,23 +155,24 @@ VBitmap::Format VRasterBuffer::prepare(VBitmap *image) mBytesPerLine = image->stride(); mFormat = image->format(); - //drawHelper = qDrawHelper + format; + // drawHelper = qDrawHelper + format; return mFormat; } -void VSpanData::init(VRasterBuffer* image) +void VSpanData::init(VRasterBuffer *image) { mRasterBuffer = image; - mSystemClip = VRect(0,0, image->width(), image->height()); + mSystemClip = VRect(0, 0, image->width(), image->height()); mType = VSpanData::Type::None; mBlendFunc = nullptr; mUnclippedBlendFunc = nullptr; } -extern CompositionFunction COMP_functionForMode_C[]; -extern CompositionFunctionSolid COMP_functionForModeSolid_C[]; -static const CompositionFunction *functionForMode = COMP_functionForMode_C; -static const CompositionFunctionSolid *functionForModeSolid = COMP_functionForModeSolid_C; +extern CompositionFunction COMP_functionForMode_C[]; +extern CompositionFunctionSolid COMP_functionForModeSolid_C[]; +static const CompositionFunction * functionForMode = COMP_functionForMode_C; +static const CompositionFunctionSolid *functionForModeSolid = + COMP_functionForModeSolid_C; /* * Gradient Draw routines @@ -180,9 +180,9 @@ static const CompositionFunctionSolid *functionForModeSolid = COMP_functionForMo */ #define FIXPT_BITS 8 -#define FIXPT_SIZE (1<mGradient; v->dx = grad->linear.x2 - grad->linear.x1; @@ -196,8 +196,8 @@ getLinearGradientValues(LinearGradientValues *v, const VSpanData *data) } } -static inline void -getRadialGradientValues(RadialGradientValues *v, const VSpanData *data) +static inline void getRadialGradientValues(RadialGradientValues *v, + const VSpanData * data) { const VGradientData &gradient = data->mGradient; v->dx = gradient.radial.cx - gradient.radial.fx; @@ -206,68 +206,63 @@ getRadialGradientValues(RadialGradientValues *v, const VSpanData *data) v->dr = gradient.radial.cradius - gradient.radial.fradius; v->sqrfr = gradient.radial.fradius * gradient.radial.fradius; - v->a = v->dr * v->dr - v->dx*v->dx - v->dy*v->dy; + v->a = v->dr * v->dr - v->dx * v->dx - v->dy * v->dy; v->inv2a = 1 / (2 * v->a); v->extended = !vIsZero(gradient.radial.fradius) || v->a <= 0; } -static inline int -gradientClamp(const VGradientData *grad, int ipos) +static inline int gradientClamp(const VGradientData *grad, int ipos) { - int limit; + int limit; - if (grad->mSpread == VGradient::Spread::Repeat) - { + if (grad->mSpread == VGradient::Spread::Repeat) { ipos = ipos % VGradient::colorTableSize; ipos = ipos < 0 ? VGradient::colorTableSize + ipos : ipos; - } - else if (grad->mSpread == VGradient::Spread::Reflect) - { + } else if (grad->mSpread == VGradient::Spread::Reflect) { limit = VGradient::colorTableSize * 2; ipos = ipos % limit; ipos = ipos < 0 ? limit + ipos : ipos; ipos = ipos >= VGradient::colorTableSize ? limit - 1 - ipos : ipos; - } - else - { - if (ipos < 0) ipos = 0; + } else { + if (ipos < 0) + ipos = 0; else if (ipos >= VGradient::colorTableSize) - ipos = VGradient::colorTableSize - 1; - } - return ipos; + ipos = VGradient::colorTableSize - 1; + } + return ipos; } -static uint32_t -gradientPixelFixed(const VGradientData *grad, int fixed_pos) +static uint32_t gradientPixelFixed(const VGradientData *grad, int fixed_pos) { - int ipos = (fixed_pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS; + int ipos = (fixed_pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS; - return grad->mColorTable[gradientClamp(grad, ipos)]; + return grad->mColorTable[gradientClamp(grad, ipos)]; } -static inline uint32_t -gradientPixel(const VGradientData *grad, float pos) +static inline uint32_t gradientPixel(const VGradientData *grad, float pos) { - int ipos = (int)(pos * (VGradient::colorTableSize - 1) + (float)(0.5)); + int ipos = (int)(pos * (VGradient::colorTableSize - 1) + (float)(0.5)); - return grad->mColorTable[gradientClamp(grad, ipos)]; + return grad->mColorTable[gradientClamp(grad, ipos)]; } -void -fetch_linear_gradient(uint32_t *buffer, const Operator *op, const VSpanData *data, int y, int x, int length) +void fetch_linear_gradient(uint32_t *buffer, const Operator *op, + const VSpanData *data, int y, int x, int length) { - float t, inc; + float t, inc; const VGradientData *gradient = &data->mGradient; - bool affine = true; - float rx=0, ry=0; + bool affine = true; + float rx = 0, ry = 0; if (op->linear.l == 0) { t = inc = 0; } else { - rx = data->m21 * (y + float(0.5)) + data->m11 * (x + float(0.5)) + data->dx; - ry = data->m22 * (y + float(0.5)) + data->m12 * (x + float(0.5)) + data->dy; - t = op->linear.dx*rx + op->linear.dy*ry + op->linear.off; + rx = data->m21 * (y + float(0.5)) + data->m11 * (x + float(0.5)) + + data->dx; + ry = data->m22 * (y + float(0.5)) + data->m12 * (x + float(0.5)) + + data->dy; + t = op->linear.dx * rx + op->linear.dy * ry + op->linear.off; inc = op->linear.dx * data->m11 + op->linear.dy * data->m12; affine = !data->m13 && !data->m23; @@ -280,10 +275,11 @@ fetch_linear_gradient(uint32_t *buffer, const Operator *op, const VSpanData *dat const uint32_t *end = buffer + length; if (affine) { if (inc > float(-1e-5) && inc < float(1e-5)) { - memfill32(buffer, gradientPixelFixed(gradient, int(t * FIXPT_SIZE)), length); + memfill32(buffer, gradientPixelFixed(gradient, int(t * FIXPT_SIZE)), + length); } else { - if (t+inc*length < float(INT_MAX >> (FIXPT_BITS + 1)) && - t+inc*length > float(INT_MIN >> (FIXPT_BITS + 1))) { + if (t + inc * length < float(INT_MAX >> (FIXPT_BITS + 1)) && + t + inc * length > float(INT_MIN >> (FIXPT_BITS + 1))) { // we can use fixed point math int t_fixed = int(t * FIXPT_SIZE); int inc_fixed = int(inc * FIXPT_SIZE); @@ -295,18 +291,20 @@ fetch_linear_gradient(uint32_t *buffer, const Operator *op, const VSpanData *dat } else { // we have to fall back to float math while (buffer < end) { - *buffer = gradientPixel(gradient, t/VGradient::colorTableSize); + *buffer = + gradientPixel(gradient, t / VGradient::colorTableSize); t += inc; ++buffer; } } } - } else { // fall back to float math here as well - float rw = data->m23 * (y + float(0.5)) + data->m13 * (x + float(0.5)) + data->m33; + } else { // fall back to float math here as well + float rw = data->m23 * (y + float(0.5)) + data->m13 * (x + float(0.5)) + + data->m33; while (buffer < end) { - float x = rx/rw; - float y = ry/rw; - t = (op->linear.dx*x + op->linear.dy *y) + op->linear.off; + float x = rx / rw; + float y = ry / rw; + t = (op->linear.dx * x + op->linear.dy * y) + op->linear.off; *buffer = gradientPixel(gradient, t); rx += data->m11; @@ -325,9 +323,9 @@ static inline float radialDeterminant(float a, float b, float c) return (b * b) - (4 * a * c); } -static void fetch(uint32_t *buffer, uint32_t *end, - const Operator *op, const VSpanData *data, float det, - float delta_det, float delta_delta_det, float b, float delta_b) +static void fetch(uint32_t *buffer, uint32_t *end, const Operator *op, + const VSpanData *data, float det, float delta_det, + float delta_delta_det, float b, float delta_b) { if (op->radial.extended) { while (buffer < end) { @@ -357,7 +355,8 @@ static void fetch(uint32_t *buffer, uint32_t *end, } } -void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData *data, int y, int x, int length) +void fetch_radial_gradient(uint32_t *buffer, const Operator *op, + const VSpanData *data, int y, int x, int length) { // avoid division by zero if (vIsZero(op->radial.a)) { @@ -365,10 +364,10 @@ void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData return; } - float rx = data->m21 * (y + float(0.5)) - + data->dx + data->m11 * (x + float(0.5)); - float ry = data->m22 * (y + float(0.5)) - + data->dy + data->m12 * (x + float(0.5)); + float rx = + data->m21 * (y + float(0.5)) + data->dx + data->m11 * (x + float(0.5)); + float ry = + data->m22 * (y + float(0.5)) + data->dy + data->m12 * (x + float(0.5)); bool affine = !data->m13 && !data->m23; uint32_t *end = buffer + length; @@ -381,8 +380,10 @@ void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData const float delta_rx = data->m11; const float delta_ry = data->m12; - float b = 2*(op->radial.dr*data->mGradient.radial.fradius + rx * op->radial.dx + ry * op->radial.dy); - float delta_b = 2*(delta_rx * op->radial.dx + delta_ry * op->radial.dy); + float b = 2 * (op->radial.dr * data->mGradient.radial.fradius + + rx * op->radial.dx + ry * op->radial.dy); + float delta_b = + 2 * (delta_rx * op->radial.dx + delta_ry * op->radial.dy); const float b_delta_b = 2 * b * delta_b; const float delta_b_delta_b = 2 * delta_b * delta_b; @@ -394,19 +395,24 @@ void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData const float rxrxryry = rx * rx + ry * ry; const float delta_rxrxryry = delta_rx * delta_rx + delta_ry * delta_ry; - const float rx_plus_ry = 2*(rx * delta_rx + ry * delta_ry); + const float rx_plus_ry = 2 * (rx * delta_rx + ry * delta_ry); const float delta_rx_plus_ry = 2 * delta_rxrxryry; inv_a *= inv_a; - float det = (bb - 4 * op->radial.a * (op->radial.sqrfr - rxrxryry)) * inv_a; - float delta_det = (b_delta_b + delta_bb + 4 * op->radial.a * (rx_plus_ry + delta_rxrxryry)) * inv_a; - const float delta_delta_det = (delta_b_delta_b + 4 * op->radial.a * delta_rx_plus_ry) * inv_a; + float det = + (bb - 4 * op->radial.a * (op->radial.sqrfr - rxrxryry)) * inv_a; + float delta_det = (b_delta_b + delta_bb + + 4 * op->radial.a * (rx_plus_ry + delta_rxrxryry)) * + inv_a; + const float delta_delta_det = + (delta_b_delta_b + 4 * op->radial.a * delta_rx_plus_ry) * inv_a; - fetch(buffer, end, op, data, det, delta_det, delta_delta_det, b, delta_b); + fetch(buffer, end, op, data, det, delta_det, delta_delta_det, b, + delta_b); } else { - float rw = data->m23 * (y + float(0.5)) - + data->m33 + data->m13 * (x + float(0.5)); + float rw = data->m23 * (y + float(0.5)) + data->m33 + + data->m13 * (x + float(0.5)); while (buffer < end) { if (rw == 0) { @@ -415,8 +421,10 @@ void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData float invRw = 1 / rw; float gx = rx * invRw - data->mGradient.radial.fx; float gy = ry * invRw - data->mGradient.radial.fy; - float b = 2*(op->radial.dr*data->mGradient.radial.fradius + gx*op->radial.dx + gy*op->radial.dy); - float det = radialDeterminant(op->radial.a, b, op->radial.sqrfr - (gx*gx + gy*gy)); + float b = 2 * (op->radial.dr * data->mGradient.radial.fradius + + gx * op->radial.dx + gy * op->radial.dy); + float det = radialDeterminant( + op->radial.a, b, op->radial.sqrfr - (gx * gx + gy * gy)); uint32_t result = 0; if (det >= 0) { @@ -443,13 +451,13 @@ void fetch_radial_gradient(uint32_t *buffer, const Operator *op, const VSpanData } } - -static inline Operator getOperator(const VSpanData *data, const VRle::Span *spans, int spanCount) +static inline Operator getOperator(const VSpanData * data, + const VRle::Span *spans, int spanCount) { Operator op; - bool solidSource = false; + bool solidSource = false; - switch(data->mType) { + switch (data->mType) { case VSpanData::Type::Solid: solidSource = vAlpha(data->mSolid) & 0xFF; op.srcFetch = nullptr; @@ -478,22 +486,22 @@ static inline Operator getOperator(const VSpanData *data, const VRle::Span *span return op; } -static void -blendColorARGB(int count, const VRle::Span *spans, void *userData) +static void blendColorARGB(int count, const VRle::Span *spans, void *userData) { VSpanData *data = (VSpanData *)(userData); - Operator op = getOperator(data, spans, count); + Operator op = getOperator(data, spans, count); const uint color = data->mSolid; if (op.mode == VPainter::CompModeSrc) { // inline for performance while (count--) { - uint *target = ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + uint *target = + ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; if (spans->coverage == 255) { memfill32(target, color, spans->len); } else { uint c = BYTE_MUL(color, spans->coverage); - int ialpha = 255 - spans->coverage; + int ialpha = 255 - spans->coverage; for (int i = 0; i < spans->len; ++i) target[i] = c + BYTE_MUL(target[i], ialpha); } @@ -503,26 +511,27 @@ blendColorARGB(int count, const VRle::Span *spans, void *userData) } while (count--) { - uint *target = ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + uint *target = + ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; op.funcSolid(target, spans->len, color, spans->coverage); ++spans; } } #define BLEND_GRADIENT_BUFFER_SIZE 2048 -static void -blendGradientARGB(int count, const VRle::Span *spans, void *userData) +static void blendGradientARGB(int count, const VRle::Span *spans, + void *userData) { VSpanData *data = (VSpanData *)(userData); - Operator op = getOperator(data, spans, count); + Operator op = getOperator(data, spans, count); unsigned int buffer[BLEND_GRADIENT_BUFFER_SIZE]; - if (!op.srcFetch) - return; + if (!op.srcFetch) return; while (count--) { - uint *target = ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + uint *target = + ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; int length = spans->len; while (length) { int l = std::min(length, BLEND_GRADIENT_BUFFER_SIZE); @@ -535,8 +544,8 @@ blendGradientARGB(int count, const VRle::Span *spans, void *userData) } } -void -VSpanData::setup(const VBrush &brush, VPainter::CompositionMode mode, int alpha) +void VSpanData::setup(const VBrush &brush, VPainter::CompositionMode mode, + int alpha) { switch (brush.type()) { case VBrush::Type::NoBrush: @@ -593,16 +602,15 @@ void VSpanData::setupMatrix(const VMatrix &matrix) dx = inv.mtx; dy = inv.mty; - //const bool affine = inv.isAffine(); -// fast_matrix = affine -// && m11 * m11 + m21 * m21 < 1e4 -// && m12 * m12 + m22 * m22 < 1e4 -// && fabs(dx) < 1e4 -// && fabs(dy) < 1e4; + // const bool affine = inv.isAffine(); + // fast_matrix = affine + // && m11 * m11 + m21 * m21 < 1e4 + // && m12 * m12 + m22 * m22 < 1e4 + // && fabs(dx) < 1e4 + // && fabs(dy) < 1e4; } -void -VSpanData::updateSpanFunc() +void VSpanData::updateSpanFunc() { switch (mType) { case VSpanData::Type::None: @@ -622,37 +630,43 @@ VSpanData::updateSpanFunc() } #if !defined(__SSE2__) && !defined(__ARM_NEON__) -void -memfill32(uint32_t *dest, uint32_t value, int length) +void memfill32(uint32_t *dest, uint32_t value, int length) { - int n; + int n; - if (length <= 0) - return; + if (length <= 0) return; - // Cute hack to align future memcopy operation - // and do unroll the loop a bit. Not sure it is - // the most efficient, but will do for now. - n = (length + 7) / 8; - switch (length & 0x07) - { - case 0: do { *dest++ = value; - VECTOR_FALLTHROUGH; - case 7: *dest++ = value; - VECTOR_FALLTHROUGH; - case 6: *dest++ = value; - VECTOR_FALLTHROUGH; - case 5: *dest++ = value; - VECTOR_FALLTHROUGH; - case 4: *dest++ = value; - VECTOR_FALLTHROUGH; - case 3: *dest++ = value; - VECTOR_FALLTHROUGH; - case 2: *dest++ = value; - VECTOR_FALLTHROUGH; - case 1: *dest++ = value; + // Cute hack to align future memcopy operation + // and do unroll the loop a bit. Not sure it is + // the most efficient, but will do for now. + n = (length + 7) / 8; + switch (length & 0x07) { + case 0: + do { + *dest++ = value; + VECTOR_FALLTHROUGH; + case 7: + *dest++ = value; + VECTOR_FALLTHROUGH; + case 6: + *dest++ = value; + VECTOR_FALLTHROUGH; + case 5: + *dest++ = value; + VECTOR_FALLTHROUGH; + case 4: + *dest++ = value; + VECTOR_FALLTHROUGH; + case 3: + *dest++ = value; + VECTOR_FALLTHROUGH; + case 2: + *dest++ = value; + VECTOR_FALLTHROUGH; + case 1: + *dest++ = value; } while (--n > 0); - } + } } #endif @@ -662,27 +676,37 @@ void vInitDrawhelperFunctions() #if defined(__ARM_NEON__) // update fast path for NEON - extern void comp_func_solid_SourceOver_neon(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); - extern void comp_func_solid_Source_neon(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_solid_SourceOver_neon( + uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_solid_Source_neon( + uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); - COMP_functionForModeSolid_C[VPainter::CompModeSrc] = comp_func_solid_Source_neon; - COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = comp_func_solid_SourceOver_neon; + COMP_functionForModeSolid_C[VPainter::CompModeSrc] = + comp_func_solid_Source_neon; + COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = + comp_func_solid_SourceOver_neon; #endif #if defined(__SSE2__) // update fast path for SSE2 - extern void comp_func_solid_SourceOver_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); - extern void comp_func_solid_Source_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); - extern void comp_func_Source_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha); - extern void comp_func_SourceOver_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha); + extern void comp_func_solid_SourceOver_sse2( + uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_solid_Source_sse2( + uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_Source_sse2(uint32_t * dest, const uint32_t *src, + int length, uint32_t const_alpha); + extern void comp_func_SourceOver_sse2(uint32_t * dest, const uint32_t *src, + int length, uint32_t const_alpha); - COMP_functionForModeSolid_C[VPainter::CompModeSrc] = comp_func_solid_Source_sse2; - COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = comp_func_solid_SourceOver_sse2; + COMP_functionForModeSolid_C[VPainter::CompModeSrc] = + comp_func_solid_Source_sse2; + COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = + comp_func_solid_SourceOver_sse2; COMP_functionForMode_C[VPainter::CompModeSrc] = comp_func_Source_sse2; - //COMP_functionForMode_C[VPainter::CompModeSrcOver] = comp_func_SourceOver_sse2; + // COMP_functionForMode_C[VPainter::CompModeSrcOver] = + // comp_func_SourceOver_sse2; #endif } V_CONSTRUCTOR_FUNCTION(vInitDrawhelperFunctions) - diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index b480705921..3ca9c43723 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -1,71 +1,76 @@ #ifndef VDRAWHELPER_H #define VDRAWHELPER_H -#include"vrect.h" -#include"vbrush.h" -#include"vrle.h" -#include"vpainter.h" -#include"vbitmap.h" -#include"assert.h" -#include +#include +#include "assert.h" +#include "vbitmap.h" +#include "vbrush.h" +#include "vpainter.h" +#include "vrect.h" +#include "vrle.h" V_USE_NAMESPACE struct VSpanData; struct Operator; -typedef void (*CompositionFunctionSolid)(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha); -typedef void (*CompositionFunction)(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha); -typedef void (*SourceFetchProc)(uint32_t *buffer, const Operator *o, const VSpanData *data, int y, int x, int length); -typedef void (*ProcessRleSpan)(int count, const VRle::Span *spans, void *userData); +typedef void (*CompositionFunctionSolid)(uint32_t *dest, int length, + uint32_t color, uint32_t const_alpha); +typedef void (*CompositionFunction)(uint32_t *dest, const uint32_t *src, + int length, uint32_t const_alpha); +typedef void (*SourceFetchProc)(uint32_t *buffer, const Operator *o, + const VSpanData *data, int y, int x, + int length); +typedef void (*ProcessRleSpan)(int count, const VRle::Span *spans, + void *userData); extern void memfill32(uint32_t *dest, uint32_t value, int count); - -struct LinearGradientValues -{ +struct LinearGradientValues { float dx; float dy; float l; float off; }; -struct RadialGradientValues -{ +struct RadialGradientValues { float dx; float dy; float dr; float sqrfr; float a; float inv2a; - bool extended; + bool extended; }; -struct Operator -{ +struct Operator { VPainter::CompositionMode mode; - SourceFetchProc srcFetch; - CompositionFunctionSolid funcSolid; - CompositionFunction func; + SourceFetchProc srcFetch; + CompositionFunctionSolid funcSolid; + CompositionFunction func; union { LinearGradientValues linear; RadialGradientValues radial; }; }; -class VRasterBuffer -{ +class VRasterBuffer { public: - VRasterBuffer(){ init();} - void init(); + VRasterBuffer() { init(); } + void init(); VBitmap::Format prepare(VBitmap *image); - void prepare(int w, int h); - void prepareBuffer(int w, int h); - void clear(); + void prepare(int w, int h); + void prepareBuffer(int w, int h); + void clear(); - void resetBuffer(int val=0); + void resetBuffer(int val = 0); - inline uchar *scanLine(int y) { assert(y>=0); assert(y= 0); + assert(y < mHeight); + return mBuffer + y * mBytesPerLine; + } int width() const { return mWidth; } int height() const { return mHeight; } @@ -74,18 +79,18 @@ public: uchar *buffer() const { return mBuffer; } - VBitmap::Format mFormat; + VBitmap::Format mFormat; VPainter::CompositionMode mCompositionMode; + private: - int mWidth; - int mHeight; - int mBytesPerLine; - int mBytesPerPixel; + int mWidth; + int mHeight; + int mBytesPerLine; + int mBytesPerPixel; uchar *mBuffer; }; -struct VGradientData -{ +struct VGradientData { VGradient::Spread mSpread; union { struct { @@ -95,90 +100,91 @@ struct VGradientData float cx, cy, fx, fy, cradius, fradius; } radial; }; - const uint32_t *mColorTable; - bool mColorTableAlpha; + const uint32_t *mColorTable; + bool mColorTableAlpha; }; -struct VSpanData -{ +struct VSpanData { class Pinnable { protected: ~Pinnable() {} }; - enum class Type { - None, - Solid, - LinearGradient, - RadialGradient - }; + enum class Type { None, Solid, LinearGradient, RadialGradient }; void updateSpanFunc(); - void init(VRasterBuffer* image); - void setup(const VBrush &brush, VPainter::CompositionMode mode=VPainter::CompModeSrcOver, int alpha=255); + void init(VRasterBuffer *image); + void setup(const VBrush & brush, + VPainter::CompositionMode mode = VPainter::CompModeSrcOver, + int alpha = 255); void setupMatrix(const VMatrix &matrix); - VRasterBuffer *mRasterBuffer; - ProcessRleSpan mBlendFunc; - ProcessRleSpan mUnclippedBlendFunc; - VRect mSystemClip; - VSpanData::Type mType; + VRasterBuffer * mRasterBuffer; + ProcessRleSpan mBlendFunc; + ProcessRleSpan mUnclippedBlendFunc; + VRect mSystemClip; + VSpanData::Type mType; std::shared_ptr mCachedGradient; union { - uint32_t mSolid; - VGradientData mGradient; + uint32_t mSolid; + VGradientData mGradient; }; - float m11, m12, m13, m21, m22, m23, m33, dx, dy; // inverse xform matrix + float m11, m12, m13, m21, m22, m23, m33, dx, dy; // inverse xform matrix }; -void vInitDrawhelperFunctions(); +void vInitDrawhelperFunctions(); extern void vInitBlendFunctions(); -#define BYTE_MUL(c, a) \ - ( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \ - (((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) ) +#define BYTE_MUL(c, a) \ + ((((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \ + (((((c)&0x00ff00ff) * (a)) >> 8) & 0x00ff00ff)) inline constexpr int vRed(uint32_t c) -{ return ((c >> 16) & 0xff); } - -inline constexpr int vGreen(uint32_t c) -{ return ((c >> 8) & 0xff); } - -inline constexpr int vBlue(uint32_t c) -{ return (c & 0xff); } - -inline constexpr int vAlpha(uint32_t c) -{ return c >> 24; } - -static inline uint -INTERPOLATE_PIXEL_255(uint x, uint a, uint y, uint b) { - uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; - t >>= 8; - t &= 0xff00ff; - x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; - x &= 0xff00ff00; - x |= t; - return x; + return ((c >> 16) & 0xff); } +inline constexpr int vGreen(uint32_t c) +{ + return ((c >> 8) & 0xff); +} +inline constexpr int vBlue(uint32_t c) +{ + return (c & 0xff); +} + +inline constexpr int vAlpha(uint32_t c) +{ + return c >> 24; +} + +static inline uint INTERPOLATE_PIXEL_255(uint x, uint a, uint y, uint b) +{ + uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; + t >>= 8; + t &= 0xff00ff; + x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; + x &= 0xff00ff00; + x |= t; + return x; +} #define LOOP_ALIGNED_U1_A4(DEST, LENGTH, UOP, A4OP) \ - { \ - while((uintptr_t)DEST & 0xF && LENGTH) UOP \ - \ - while(LENGTH) { \ - switch(LENGTH) { \ - case 3: \ - case 2: \ - case 1: \ - UOP \ - break; \ - default: \ - A4OP \ - break; \ - } \ - } \ - } + { \ + while ((uintptr_t)DEST & 0xF && LENGTH) \ + UOP \ + \ + while (LENGTH) \ + { \ + switch (LENGTH) { \ + case 3: \ + case 2: \ + case 1: \ + UOP break; \ + default: \ + A4OP break; \ + } \ + } \ + } -#endif //QDRAWHELPER_P_H +#endif // QDRAWHELPER_P_H diff --git a/src/vector/vdrawhelper_sse2.cpp b/src/vector/vdrawhelper_sse2.cpp index fe7f5da0a3..c2133d31fa 100644 --- a/src/vector/vdrawhelper_sse2.cpp +++ b/src/vector/vdrawhelper_sse2.cpp @@ -1,558 +1,498 @@ #if defined(__SSE2__) -#include"vdrawhelper.h" +#include "vdrawhelper.h" -#include /* for _mm_shuffle_pi16 and _MM_SHUFFLE */ #include /* for SSE2 intrinsics */ +#include /* for _mm_shuffle_pi16 and _MM_SHUFFLE */ // Each 32bits components of alphaChannel must be in the form 0x00AA00AA -inline static __m128i -v4_byte_mul_sse2(__m128i c, __m128i a) +inline static __m128i v4_byte_mul_sse2(__m128i c, __m128i a) { - const __m128i ag_mask = _mm_set1_epi32(0xFF00FF00); - const __m128i rb_mask = _mm_set1_epi32(0x00FF00FF); + const __m128i ag_mask = _mm_set1_epi32(0xFF00FF00); + const __m128i rb_mask = _mm_set1_epi32(0x00FF00FF); - /* for AG */ - __m128i v_ag = _mm_and_si128(ag_mask, c); - v_ag = _mm_srli_epi32(v_ag, 8); - v_ag = _mm_mullo_epi16(a, v_ag); - v_ag = _mm_and_si128(ag_mask, v_ag); + /* for AG */ + __m128i v_ag = _mm_and_si128(ag_mask, c); + v_ag = _mm_srli_epi32(v_ag, 8); + v_ag = _mm_mullo_epi16(a, v_ag); + v_ag = _mm_and_si128(ag_mask, v_ag); - /* for RB */ - __m128i v_rb = _mm_and_si128(rb_mask, c); - v_rb = _mm_mullo_epi16(a, v_rb); - v_rb = _mm_srli_epi32(v_rb, 8); - v_rb = _mm_and_si128(rb_mask, v_rb); + /* for RB */ + __m128i v_rb = _mm_and_si128(rb_mask, c); + v_rb = _mm_mullo_epi16(a, v_rb); + v_rb = _mm_srli_epi32(v_rb, 8); + v_rb = _mm_and_si128(rb_mask, v_rb); - /* combine */ - return _mm_add_epi32(v_ag, v_rb); + /* combine */ + return _mm_add_epi32(v_ag, v_rb); } -static inline __m128i -v4_ialpha_sse2(__m128i c) +static inline __m128i v4_ialpha_sse2(__m128i c) { - __m128i a = _mm_srli_epi32(c, 24); + __m128i a = _mm_srli_epi32(c, 24); - return _mm_sub_epi32(_mm_set1_epi32(0xff), a); + return _mm_sub_epi32(_mm_set1_epi32(0xff), a); } -static inline __m128i -v4_interpolate_color_sse2(__m128i a, __m128i c0, __m128i c1) +static inline __m128i v4_interpolate_color_sse2(__m128i a, __m128i c0, + __m128i c1) { - const __m128i rb_mask = _mm_set1_epi32(0xFF00FF00); - const __m128i zero = _mm_setzero_si128(); + const __m128i rb_mask = _mm_set1_epi32(0xFF00FF00); + const __m128i zero = _mm_setzero_si128(); - __m128i a_l = a; - __m128i a_h = a; - a_l = _mm_unpacklo_epi16(a_l, a_l); - a_h = _mm_unpackhi_epi16(a_h, a_h); + __m128i a_l = a; + __m128i a_h = a; + a_l = _mm_unpacklo_epi16(a_l, a_l); + a_h = _mm_unpackhi_epi16(a_h, a_h); - __m128i a_t = _mm_slli_epi64(a_l, 32); - __m128i a_t0 = _mm_slli_epi64(a_h, 32); + __m128i a_t = _mm_slli_epi64(a_l, 32); + __m128i a_t0 = _mm_slli_epi64(a_h, 32); - a_l = _mm_add_epi32(a_l, a_t); - a_h = _mm_add_epi32(a_h, a_t0); + a_l = _mm_add_epi32(a_l, a_t); + a_h = _mm_add_epi32(a_h, a_t0); - __m128i c0_l = c0; - __m128i c0_h = c0; + __m128i c0_l = c0; + __m128i c0_h = c0; - c0_l = _mm_unpacklo_epi8(c0_l, zero); - c0_h = _mm_unpackhi_epi8(c0_h, zero); + c0_l = _mm_unpacklo_epi8(c0_l, zero); + c0_h = _mm_unpackhi_epi8(c0_h, zero); - __m128i c1_l = c1; - __m128i c1_h = c1; + __m128i c1_l = c1; + __m128i c1_h = c1; - c1_l = _mm_unpacklo_epi8(c1_l, zero); - c1_h = _mm_unpackhi_epi8(c1_h, zero); + c1_l = _mm_unpacklo_epi8(c1_l, zero); + c1_h = _mm_unpackhi_epi8(c1_h, zero); - __m128i cl_sub = _mm_sub_epi16(c0_l, c1_l); - __m128i ch_sub = _mm_sub_epi16(c0_h, c1_h); + __m128i cl_sub = _mm_sub_epi16(c0_l, c1_l); + __m128i ch_sub = _mm_sub_epi16(c0_h, c1_h); - cl_sub = _mm_mullo_epi16(cl_sub, a_l); - ch_sub = _mm_mullo_epi16(ch_sub, a_h); + cl_sub = _mm_mullo_epi16(cl_sub, a_l); + ch_sub = _mm_mullo_epi16(ch_sub, a_h); - __m128i c1ls = _mm_slli_epi16(c1_l, 8); - __m128i c1hs = _mm_slli_epi16(c1_h, 8); + __m128i c1ls = _mm_slli_epi16(c1_l, 8); + __m128i c1hs = _mm_slli_epi16(c1_h, 8); - cl_sub = _mm_add_epi16(cl_sub, c1ls); - ch_sub = _mm_add_epi16(ch_sub, c1hs); + cl_sub = _mm_add_epi16(cl_sub, c1ls); + ch_sub = _mm_add_epi16(ch_sub, c1hs); - cl_sub = _mm_and_si128(cl_sub, rb_mask); - ch_sub = _mm_and_si128(ch_sub, rb_mask); + cl_sub = _mm_and_si128(cl_sub, rb_mask); + ch_sub = _mm_and_si128(ch_sub, rb_mask); - cl_sub = _mm_srli_epi64(cl_sub, 8); - ch_sub = _mm_srli_epi64(ch_sub, 8); + cl_sub = _mm_srli_epi64(cl_sub, 8); + ch_sub = _mm_srli_epi64(ch_sub, 8); - cl_sub = _mm_packus_epi16(cl_sub, cl_sub); - ch_sub = _mm_packus_epi16(ch_sub, ch_sub); + cl_sub = _mm_packus_epi16(cl_sub, cl_sub); + ch_sub = _mm_packus_epi16(ch_sub, ch_sub); - return (__m128i) _mm_shuffle_ps( (__m128)cl_sub, (__m128)ch_sub, 0x44); + return (__m128i)_mm_shuffle_ps((__m128)cl_sub, (__m128)ch_sub, 0x44); } - - // Load src and dest vector -#define V4_FETCH_SRC_DEST \ - __m128i v_src = _mm_loadu_si128((__m128i *)src); \ - __m128i v_dest = _mm_load_si128((__m128i *)dest); +#define V4_FETCH_SRC_DEST \ + __m128i v_src = _mm_loadu_si128((__m128i*)src); \ + __m128i v_dest = _mm_load_si128((__m128i*)dest); -#define V4_FETCH_SRC \ - __m128i v_src = _mm_loadu_si128((__m128i *)src); +#define V4_FETCH_SRC __m128i v_src = _mm_loadu_si128((__m128i*)src); -#define V4_STORE_DEST \ - _mm_store_si128((__m128i *)dest, v_src); +#define V4_STORE_DEST _mm_store_si128((__m128i*)dest, v_src); #define V4_SRC_DEST_LEN_INC \ - dest += 4; src +=4; length -= 4; + dest += 4; \ + src += 4; \ + length -= 4; // Multiply src color with const_alpha -#define V4_ALPHA_MULTIPLY \ - v_src = v4_byte_mul_sse2(v_src, v_alpha); +#define V4_ALPHA_MULTIPLY v_src = v4_byte_mul_sse2(v_src, v_alpha); // dest = src + dest * sia -#define V4_COMP_OP_SRC_OVER \ - __m128i v_sia = v4_ialpha_sse2(v_src); \ - v_sia = _mm_add_epi32(v_sia, _mm_slli_epi32(v_sia, 16)); \ - v_dest = v4_byte_mul_sse2(v_dest, v_sia); \ - v_src = _mm_add_epi32(v_src, v_dest); +#define V4_COMP_OP_SRC_OVER \ + __m128i v_sia = v4_ialpha_sse2(v_src); \ + v_sia = _mm_add_epi32(v_sia, _mm_slli_epi32(v_sia, 16)); \ + v_dest = v4_byte_mul_sse2(v_dest, v_sia); \ + v_src = _mm_add_epi32(v_src, v_dest); // dest = src + dest * sia #define V4_COMP_OP_SRC \ - v_src = v4_interpolate_color_sse2(v_alpha, v_src, v_dest); + v_src = v4_interpolate_color_sse2(v_alpha, v_src, v_dest); - -void -memfill32(uint32_t *dest, uint32_t value, int length) +void memfill32(uint32_t* dest, uint32_t value, int length) { __m128i vector_data = _mm_set_epi32(value, value, value, value); // run till memory alligned to 16byte memory - while (length && ((uintptr_t)dest & 0xf)) - { + while (length && ((uintptr_t)dest & 0xf)) { *dest++ = value; length--; } - while (length >= 32) - { - _mm_store_si128 ((__m128i*)(dest), vector_data); - _mm_store_si128 ((__m128i*)(dest + 4), vector_data); - _mm_store_si128 ((__m128i*)(dest + 8), vector_data); - _mm_store_si128 ((__m128i*)(dest + 12), vector_data); - _mm_store_si128 ((__m128i*)(dest + 16), vector_data); - _mm_store_si128 ((__m128i*)(dest + 20), vector_data); - _mm_store_si128 ((__m128i*)(dest + 24), vector_data); - _mm_store_si128 ((__m128i*)(dest + 28), vector_data); + while (length >= 32) { + _mm_store_si128((__m128i*)(dest), vector_data); + _mm_store_si128((__m128i*)(dest + 4), vector_data); + _mm_store_si128((__m128i*)(dest + 8), vector_data); + _mm_store_si128((__m128i*)(dest + 12), vector_data); + _mm_store_si128((__m128i*)(dest + 16), vector_data); + _mm_store_si128((__m128i*)(dest + 20), vector_data); + _mm_store_si128((__m128i*)(dest + 24), vector_data); + _mm_store_si128((__m128i*)(dest + 28), vector_data); dest += 32; length -= 32; } - if (length >= 16) - { - _mm_store_si128 ((__m128i*)(dest), vector_data); - _mm_store_si128 ((__m128i*)(dest + 4), vector_data); - _mm_store_si128 ((__m128i*)(dest + 8), vector_data); - _mm_store_si128 ((__m128i*)(dest + 12), vector_data); + if (length >= 16) { + _mm_store_si128((__m128i*)(dest), vector_data); + _mm_store_si128((__m128i*)(dest + 4), vector_data); + _mm_store_si128((__m128i*)(dest + 8), vector_data); + _mm_store_si128((__m128i*)(dest + 12), vector_data); dest += 16; length -= 16; } - if (length >= 8) - { - _mm_store_si128 ((__m128i*)(dest), vector_data); - _mm_store_si128 ((__m128i*)(dest + 4), vector_data); + if (length >= 8) { + _mm_store_si128((__m128i*)(dest), vector_data); + _mm_store_si128((__m128i*)(dest + 4), vector_data); dest += 8; length -= 8; } - if (length >= 4) - { - _mm_store_si128 ((__m128i*)(dest), vector_data); + if (length >= 4) { + _mm_store_si128((__m128i*)(dest), vector_data); dest += 4; length -= 4; } - while (length) - { + while (length) { *dest++ = value; length--; } } // dest = color + (dest * alpha) -inline static void -comp_func_helper_sse2(uint32_t *dest, int length, uint32_t color, uint32_t alpha) +inline static void comp_func_helper_sse2(uint32_t* dest, int length, + uint32_t color, uint32_t alpha) { - const __m128i v_color = _mm_set1_epi32(color); - const __m128i v_a = _mm_set1_epi16(alpha); + const __m128i v_color = _mm_set1_epi32(color); + const __m128i v_a = _mm_set1_epi16(alpha); - LOOP_ALIGNED_U1_A4(dest, length, - { /* UOP */ - *dest = color + BYTE_MUL(*dest, alpha); - dest++; length--; - }, - { /* A4OP */ - __m128i v_dest = _mm_load_si128((__m128i *)dest); + LOOP_ALIGNED_U1_A4(dest, length, + { /* UOP */ + *dest = color + BYTE_MUL(*dest, alpha); + dest++; + length--; + }, + { /* A4OP */ + __m128i v_dest = _mm_load_si128((__m128i*)dest); - v_dest = v4_byte_mul_sse2(v_dest, v_a); - v_dest = _mm_add_epi32(v_dest, v_color); + v_dest = v4_byte_mul_sse2(v_dest, v_a); + v_dest = _mm_add_epi32(v_dest, v_color); - _mm_store_si128((__m128i *)dest, v_dest); + _mm_store_si128((__m128i*)dest, v_dest); - dest += 4; length -= 4; - }) + dest += 4; + length -= 4; + }) } -void -comp_func_solid_Source_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +void comp_func_solid_Source_sse2(uint32_t* dest, int length, uint32_t color, + uint32_t const_alpha) { - if (const_alpha == 255) - { + if (const_alpha == 255) { memfill32(dest, color, length); - } - else - { + } else { int ialpha; ialpha = 255 - const_alpha; color = BYTE_MUL(color, const_alpha); comp_func_helper_sse2(dest, length, color, ialpha); - } + } } -void -comp_func_solid_SourceOver_sse2(uint32_t *dest, int length, uint32_t color, uint32_t const_alpha) +void comp_func_solid_SourceOver_sse2(uint32_t* dest, int length, uint32_t color, + uint32_t const_alpha) { - int ialpha; + int ialpha; - if (const_alpha != 255) - color = BYTE_MUL(color, const_alpha); - ialpha = 255 - vAlpha(color); - comp_func_helper_sse2(dest, length, color, ialpha); + if (const_alpha != 255) color = BYTE_MUL(color, const_alpha); + ialpha = 255 - vAlpha(color); + comp_func_helper_sse2(dest, length, color, ialpha); } -void comp_func_Source_sse2(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +void comp_func_Source_sse2(uint32_t* dest, const uint32_t* src, int length, + uint32_t const_alpha) { int ialpha; if (const_alpha == 255) { - memcpy(dest, src, length * sizeof(uint32_t)); + memcpy(dest, src, length * sizeof(uint32_t)); } else { ialpha = 255 - const_alpha; __m128i v_alpha = _mm_set1_epi32(const_alpha); LOOP_ALIGNED_U1_A4(dest, length, - { /* UOP */ - *dest = INTERPOLATE_PIXEL_255(*src, const_alpha, *dest, ialpha); - dest++; src++; length--; - }, - { /* A4OP */ - V4_FETCH_SRC_DEST - V4_COMP_OP_SRC - V4_STORE_DEST - V4_SRC_DEST_LEN_INC - }) + { /* UOP */ + *dest = INTERPOLATE_PIXEL_255(*src, const_alpha, + *dest, ialpha); + dest++; + src++; + length--; + }, + {/* A4OP */ + V4_FETCH_SRC_DEST V4_COMP_OP_SRC V4_STORE_DEST + V4_SRC_DEST_LEN_INC}) } } -void comp_func_SourceOver_sse2_1(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) +void comp_func_SourceOver_sse2_1(uint32_t* dest, const uint32_t* src, + int length, uint32_t const_alpha) { uint32_t s, sia; if (const_alpha == 255) { LOOP_ALIGNED_U1_A4(dest, length, - { /* UOP */ - s = *src; - sia = vAlpha(~s); - *dest = s + BYTE_MUL(*dest, sia); - dest++; src++; length--; - }, - { /* A4OP */ - V4_FETCH_SRC_DEST - V4_COMP_OP_SRC_OVER - V4_STORE_DEST - V4_SRC_DEST_LEN_INC - }) + { /* UOP */ + s = *src; + sia = vAlpha(~s); + *dest = s + BYTE_MUL(*dest, sia); + dest++; + src++; + length--; + }, + {/* A4OP */ + V4_FETCH_SRC_DEST V4_COMP_OP_SRC_OVER V4_STORE_DEST + V4_SRC_DEST_LEN_INC}) } else { __m128i v_alpha = _mm_set1_epi32(const_alpha); - LOOP_ALIGNED_U1_A4(dest, length, - { /* UOP */ - s = BYTE_MUL(*src, const_alpha); - sia = vAlpha(~s); - *dest = s + BYTE_MUL(*dest, sia); - dest++; src++; length--; - }, - { /* A4OP */ - V4_FETCH_SRC_DEST - V4_ALPHA_MULTIPLY - V4_COMP_OP_SRC_OVER - V4_STORE_DEST - V4_SRC_DEST_LEN_INC - }) + LOOP_ALIGNED_U1_A4( + dest, length, + { /* UOP */ + s = BYTE_MUL(*src, const_alpha); + sia = vAlpha(~s); + *dest = s + BYTE_MUL(*dest, sia); + dest++; + src++; + length--; + }, + {/* A4OP */ + V4_FETCH_SRC_DEST V4_ALPHA_MULTIPLY V4_COMP_OP_SRC_OVER + V4_STORE_DEST V4_SRC_DEST_LEN_INC}) } } // Pixman implementation #define force_inline inline -static force_inline __m128i -unpack_32_1x128 (uint32_t data) +static force_inline __m128i unpack_32_1x128(uint32_t data) { - return _mm_unpacklo_epi8 (_mm_cvtsi32_si128 (data), _mm_setzero_si128 ()); + return _mm_unpacklo_epi8(_mm_cvtsi32_si128(data), _mm_setzero_si128()); } -static force_inline void -unpack_128_2x128 (__m128i data, __m128i* data_lo, __m128i* data_hi) +static force_inline void unpack_128_2x128(__m128i data, __m128i* data_lo, + __m128i* data_hi) { - *data_lo = _mm_unpacklo_epi8 (data, _mm_setzero_si128 ()); - *data_hi = _mm_unpackhi_epi8 (data, _mm_setzero_si128 ()); + *data_lo = _mm_unpacklo_epi8(data, _mm_setzero_si128()); + *data_hi = _mm_unpackhi_epi8(data, _mm_setzero_si128()); } -static force_inline uint32_t -pack_1x128_32 (__m128i data) +static force_inline uint32_t pack_1x128_32(__m128i data) { - return _mm_cvtsi128_si32 (_mm_packus_epi16 (data, _mm_setzero_si128 ())); + return _mm_cvtsi128_si32(_mm_packus_epi16(data, _mm_setzero_si128())); } -static force_inline __m128i -pack_2x128_128 (__m128i lo, __m128i hi) +static force_inline __m128i pack_2x128_128(__m128i lo, __m128i hi) { - return _mm_packus_epi16 (lo, hi); + return _mm_packus_epi16(lo, hi); } /* load 4 pixels from a 16-byte boundary aligned address */ -static force_inline __m128i -load_128_aligned (__m128i* src) +static force_inline __m128i load_128_aligned(__m128i* src) { - return _mm_load_si128 (src); + return _mm_load_si128(src); } /* load 4 pixels from a unaligned address */ -static force_inline __m128i -load_128_unaligned (const __m128i* src) +static force_inline __m128i load_128_unaligned(const __m128i* src) { - return _mm_loadu_si128 (src); + return _mm_loadu_si128(src); } /* save 4 pixels on a 16-byte boundary aligned address */ -static force_inline void -save_128_aligned (__m128i* dst, - __m128i data) +static force_inline void save_128_aligned(__m128i* dst, __m128i data) { - _mm_store_si128 (dst, data); + _mm_store_si128(dst, data); } -static force_inline int -is_opaque (__m128i x) +static force_inline int is_opaque(__m128i x) { - __m128i ffs = _mm_cmpeq_epi8 (x, x); + __m128i ffs = _mm_cmpeq_epi8(x, x); - return (_mm_movemask_epi8 (_mm_cmpeq_epi8 (x, ffs)) & 0x8888) == 0x8888; + return (_mm_movemask_epi8(_mm_cmpeq_epi8(x, ffs)) & 0x8888) == 0x8888; } -static force_inline int -is_zero (__m128i x) +static force_inline int is_zero(__m128i x) { - return _mm_movemask_epi8 ( - _mm_cmpeq_epi8 (x, _mm_setzero_si128 ())) == 0xffff; + return _mm_movemask_epi8(_mm_cmpeq_epi8(x, _mm_setzero_si128())) == 0xffff; } -static force_inline __m128i -expand_alpha_1x128 (__m128i data) +static force_inline __m128i expand_alpha_1x128(__m128i data) { - return _mm_shufflehi_epi16 (_mm_shufflelo_epi16 (data, - _MM_SHUFFLE (3, 3, 3, 3)), - _MM_SHUFFLE (3, 3, 3, 3)); + return _mm_shufflehi_epi16( + _mm_shufflelo_epi16(data, _MM_SHUFFLE(3, 3, 3, 3)), + _MM_SHUFFLE(3, 3, 3, 3)); } -static force_inline __m128i -create_mask_16_128 (uint16_t mask) +static force_inline __m128i create_mask_16_128(uint16_t mask) { - return _mm_set1_epi16 (mask); + return _mm_set1_epi16(mask); } -static __m128i mask_0080 = create_mask_16_128 (0x0080); -static __m128i mask_00ff = create_mask_16_128 (0x00ff); -static __m128i mask_0101 = create_mask_16_128 (0x0101); +static __m128i mask_0080 = create_mask_16_128(0x0080); +static __m128i mask_00ff = create_mask_16_128(0x00ff); +static __m128i mask_0101 = create_mask_16_128(0x0101); -static force_inline __m128i -negate_1x128 (__m128i data) +static force_inline __m128i negate_1x128(__m128i data) { - return _mm_xor_si128 (data, mask_00ff); + return _mm_xor_si128(data, mask_00ff); } -static force_inline void -negate_2x128 (__m128i data_lo, - __m128i data_hi, - __m128i* neg_lo, - __m128i* neg_hi) +static force_inline void negate_2x128(__m128i data_lo, __m128i data_hi, + __m128i* neg_lo, __m128i* neg_hi) { - *neg_lo = _mm_xor_si128 (data_lo, mask_00ff); - *neg_hi = _mm_xor_si128 (data_hi, mask_00ff); + *neg_lo = _mm_xor_si128(data_lo, mask_00ff); + *neg_hi = _mm_xor_si128(data_hi, mask_00ff); } -static force_inline __m128i -pix_multiply_1x128 (__m128i data, - __m128i alpha) +static force_inline __m128i pix_multiply_1x128(__m128i data, __m128i alpha) { - return _mm_mulhi_epu16 (_mm_adds_epu16 (_mm_mullo_epi16 (data, alpha), - mask_0080), - mask_0101); + return _mm_mulhi_epu16( + _mm_adds_epu16(_mm_mullo_epi16(data, alpha), mask_0080), mask_0101); } -static force_inline void -pix_multiply_2x128 (__m128i* data_lo, - __m128i* data_hi, - __m128i* alpha_lo, - __m128i* alpha_hi, - __m128i* ret_lo, - __m128i* ret_hi) +static force_inline void pix_multiply_2x128(__m128i* data_lo, __m128i* data_hi, + __m128i* alpha_lo, + __m128i* alpha_hi, __m128i* ret_lo, + __m128i* ret_hi) { __m128i lo, hi; - lo = _mm_mullo_epi16 (*data_lo, *alpha_lo); - hi = _mm_mullo_epi16 (*data_hi, *alpha_hi); - lo = _mm_adds_epu16 (lo, mask_0080); - hi = _mm_adds_epu16 (hi, mask_0080); - *ret_lo = _mm_mulhi_epu16 (lo, mask_0101); - *ret_hi = _mm_mulhi_epu16 (hi, mask_0101); + lo = _mm_mullo_epi16(*data_lo, *alpha_lo); + hi = _mm_mullo_epi16(*data_hi, *alpha_hi); + lo = _mm_adds_epu16(lo, mask_0080); + hi = _mm_adds_epu16(hi, mask_0080); + *ret_lo = _mm_mulhi_epu16(lo, mask_0101); + *ret_hi = _mm_mulhi_epu16(hi, mask_0101); } -static force_inline __m128i -over_1x128 (__m128i src, __m128i alpha, __m128i dst) +static force_inline __m128i over_1x128(__m128i src, __m128i alpha, __m128i dst) { - return _mm_adds_epu8 (src, pix_multiply_1x128 (dst, negate_1x128 (alpha))); + return _mm_adds_epu8(src, pix_multiply_1x128(dst, negate_1x128(alpha))); } -static force_inline void -expand_alpha_2x128 (__m128i data_lo, - __m128i data_hi, - __m128i* alpha_lo, - __m128i* alpha_hi) +static force_inline void expand_alpha_2x128(__m128i data_lo, __m128i data_hi, + __m128i* alpha_lo, + __m128i* alpha_hi) { __m128i lo, hi; - lo = _mm_shufflelo_epi16 (data_lo, _MM_SHUFFLE (3, 3, 3, 3)); - hi = _mm_shufflelo_epi16 (data_hi, _MM_SHUFFLE (3, 3, 3, 3)); + lo = _mm_shufflelo_epi16(data_lo, _MM_SHUFFLE(3, 3, 3, 3)); + hi = _mm_shufflelo_epi16(data_hi, _MM_SHUFFLE(3, 3, 3, 3)); - *alpha_lo = _mm_shufflehi_epi16 (lo, _MM_SHUFFLE (3, 3, 3, 3)); - *alpha_hi = _mm_shufflehi_epi16 (hi, _MM_SHUFFLE (3, 3, 3, 3)); + *alpha_lo = _mm_shufflehi_epi16(lo, _MM_SHUFFLE(3, 3, 3, 3)); + *alpha_hi = _mm_shufflehi_epi16(hi, _MM_SHUFFLE(3, 3, 3, 3)); } -static force_inline void -over_2x128 (__m128i* src_lo, - __m128i* src_hi, - __m128i* alpha_lo, - __m128i* alpha_hi, - __m128i* dst_lo, - __m128i* dst_hi) +static force_inline void over_2x128(__m128i* src_lo, __m128i* src_hi, + __m128i* alpha_lo, __m128i* alpha_hi, + __m128i* dst_lo, __m128i* dst_hi) { __m128i t1, t2; - negate_2x128 (*alpha_lo, *alpha_hi, &t1, &t2); + negate_2x128(*alpha_lo, *alpha_hi, &t1, &t2); - pix_multiply_2x128 (dst_lo, dst_hi, &t1, &t2, dst_lo, dst_hi); + pix_multiply_2x128(dst_lo, dst_hi, &t1, &t2, dst_lo, dst_hi); - *dst_lo = _mm_adds_epu8 (*src_lo, *dst_lo); - *dst_hi = _mm_adds_epu8 (*src_hi, *dst_hi); + *dst_lo = _mm_adds_epu8(*src_lo, *dst_lo); + *dst_hi = _mm_adds_epu8(*src_hi, *dst_hi); } -static force_inline uint32_t -core_combine_over_u_pixel_sse2 (uint32_t src, uint32_t dst) +static force_inline uint32_t core_combine_over_u_pixel_sse2(uint32_t src, + uint32_t dst) { uint8_t a; __m128i xmms; a = src >> 24; - if (a == 0xff) - { - return src; - } - else if (src) - { - xmms = unpack_32_1x128 (src); - return pack_1x128_32 ( - over_1x128 (xmms, expand_alpha_1x128 (xmms), - unpack_32_1x128 (dst))); + if (a == 0xff) { + return src; + } else if (src) { + xmms = unpack_32_1x128(src); + return pack_1x128_32( + over_1x128(xmms, expand_alpha_1x128(xmms), unpack_32_1x128(dst))); } return dst; } -//static force_inline void -//core_combine_over_u_sse2_no_mask (uint32_t * pd, +// static force_inline void +// core_combine_over_u_sse2_no_mask (uint32_t * pd, // const uint32_t* ps, // int w) -void comp_func_SourceOver_sse2(uint32_t *pd, const uint32_t *ps, int w, uint32_t) +void comp_func_SourceOver_sse2(uint32_t* pd, const uint32_t* ps, int w, + uint32_t) { uint32_t s, d; /* Align dst on a 16-byte boundary */ - while (w && ((uintptr_t)pd & 15)) - { - d = *pd; - s = *ps; + while (w && ((uintptr_t)pd & 15)) { + d = *pd; + s = *ps; - if (s) - *pd = core_combine_over_u_pixel_sse2 (s, d); - pd++; - ps++; - w--; + if (s) *pd = core_combine_over_u_pixel_sse2(s, d); + pd++; + ps++; + w--; } - while (w >= 4) - { - __m128i src; - __m128i src_hi, src_lo, dst_hi, dst_lo; - __m128i alpha_hi, alpha_lo; + while (w >= 4) { + __m128i src; + __m128i src_hi, src_lo, dst_hi, dst_lo; + __m128i alpha_hi, alpha_lo; - src = load_128_unaligned ((__m128i *)ps); + src = load_128_unaligned((__m128i*)ps); - if (!is_zero (src)) - { - if (is_opaque (src)) - { - save_128_aligned ((__m128i *)pd, src); + if (!is_zero(src)) { + if (is_opaque(src)) { + save_128_aligned((__m128i*)pd, src); + } else { + __m128i dst = load_128_aligned((__m128i*)pd); + + unpack_128_2x128(src, &src_lo, &src_hi); + unpack_128_2x128(dst, &dst_lo, &dst_hi); + + expand_alpha_2x128(src_lo, src_hi, &alpha_lo, &alpha_hi); + over_2x128(&src_lo, &src_hi, &alpha_lo, &alpha_hi, &dst_lo, + &dst_hi); + + save_128_aligned((__m128i*)pd, pack_2x128_128(dst_lo, dst_hi)); + } } - else - { - __m128i dst = load_128_aligned ((__m128i *)pd); - unpack_128_2x128 (src, &src_lo, &src_hi); - unpack_128_2x128 (dst, &dst_lo, &dst_hi); - - expand_alpha_2x128 (src_lo, src_hi, - &alpha_lo, &alpha_hi); - over_2x128 (&src_lo, &src_hi, &alpha_lo, &alpha_hi, - &dst_lo, &dst_hi); - - save_128_aligned ( - (__m128i *)pd, - pack_2x128_128 (dst_lo, dst_hi)); - } + ps += 4; + pd += 4; + w -= 4; } + while (w) { + d = *pd; + s = *ps; - ps += 4; - pd += 4; - w -= 4; - } - while (w) - { - d = *pd; - s = *ps; + if (s) *pd = core_combine_over_u_pixel_sse2(s, d); + pd++; + ps++; - if (s) - *pd = core_combine_over_u_pixel_sse2 (s, d); - pd++; - ps++; - - w--; + w--; } } - #endif diff --git a/src/vector/velapsedtimer.cpp b/src/vector/velapsedtimer.cpp index e4d516c6fb..59cdcedfb8 100644 --- a/src/vector/velapsedtimer.cpp +++ b/src/vector/velapsedtimer.cpp @@ -1,4 +1,4 @@ -#include"velapsedtimer.h" +#include "velapsedtimer.h" void VElapsedTimer::start() { @@ -16,14 +16,14 @@ double VElapsedTimer::restart() double VElapsedTimer::elapsed() const { if (!isValid()) return 0; - return std::chrono::duration(std::chrono::high_resolution_clock::now()-clock).count(); + return std::chrono::duration( + std::chrono::high_resolution_clock::now() - clock) + .count(); } bool VElapsedTimer::hasExpired(double time) { double elapsedTime = elapsed(); - if (elapsedTime > time) - return true; + if (elapsedTime > time) return true; return false; } - diff --git a/src/vector/velapsedtimer.h b/src/vector/velapsedtimer.h index 070c7d8326..f8d2f9a8e7 100644 --- a/src/vector/velapsedtimer.h +++ b/src/vector/velapsedtimer.h @@ -1,20 +1,20 @@ #ifndef VELAPSEDTIMER_H #define VELAPSEDTIMER_H +#include #include "vglobal.h" -#include -class VElapsedTimer -{ +class VElapsedTimer { public: - VElapsedTimer():m_valid(false){} - double elapsed() const; - bool hasExpired(double millsec); - void start(); - double restart(); - inline bool isValid() const {return m_valid;} + VElapsedTimer() : m_valid(false) {} + double elapsed() const; + bool hasExpired(double millsec); + void start(); + double restart(); + inline bool isValid() const { return m_valid; } + private: std::chrono::high_resolution_clock::time_point clock; - bool m_valid; + bool m_valid; }; -#endif // VELAPSEDTIMER_H +#endif // VELAPSEDTIMER_H diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 0585955991..df6ae1d26f 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -1,59 +1,59 @@ #ifndef VGLOBAL_H #define VGLOBAL_H -#include #include -#include -#include -#include - -typedef uint32_t uint; -typedef uint16_t ushort; -typedef uint8_t uchar; +#include +#include +#include +#include +typedef uint32_t uint; +typedef uint16_t ushort; +typedef uint8_t uchar; #if !defined(V_NAMESPACE) -# define V_USE_NAMESPACE -# define V_BEGIN_NAMESPACE -# define V_END_NAMESPACE +#define V_USE_NAMESPACE +#define V_BEGIN_NAMESPACE +#define V_END_NAMESPACE #else /* user namespace */ -# define V_USE_NAMESPACE using namespace ::V_NAMESPACE; -# define V_BEGIN_NAMESPACE namespace V_NAMESPACE { -# define V_END_NAMESPACE } +#define V_USE_NAMESPACE using namespace ::V_NAMESPACE; +#define V_BEGIN_NAMESPACE namespace V_NAMESPACE { +#define V_END_NAMESPACE } #endif #define V_UNUSED __attribute__((__unused__)) -#define V_REQUIRED_RESULT __attribute__ ((__warn_unused_result__)) +#define V_REQUIRED_RESULT __attribute__((__warn_unused_result__)) #define V_CONSTEXPR constexpr -#define V_NOTHROW noexcept +#define V_NOTHROW noexcept -#include"vdebug.h" +#include "vdebug.h" #define VECTOR_FALLTHROUGH -#include -class RefCount -{ +#include +class RefCount { public: - inline RefCount(int i):atomic(i){} - inline bool ref() { + inline RefCount(int i) : atomic(i) {} + inline bool ref() + { int count = atomic.load(); - if (count == 0) // !isSharable + if (count == 0) // !isSharable return false; - if (count != -1) // !isStatic + if (count != -1) // !isStatic atomic.fetch_add(1); return true; } - inline bool deref() { + inline bool deref() + { int count = atomic.load(); - if (count == 0) // !isSharable + if (count == 0) // !isSharable return false; - if (count == -1) // isStatic + if (count == -1) // isStatic return true; atomic.fetch_sub(1); return --count; @@ -69,21 +69,26 @@ public: int count = atomic.load(); return count == -1; } - inline int count()const{return atomic;} - void setOwned() { atomic.store(1); } + inline int count() const { return atomic; } + void setOwned() { atomic.store(1); } + private: std::atomic atomic; }; template -V_CONSTEXPR inline const T &vMin(const T &a, const T &b) { return (a < b) ? a : b; } +V_CONSTEXPR inline const T &vMin(const T &a, const T &b) +{ + return (a < b) ? a : b; +} template -V_CONSTEXPR inline const T &vMax(const T &a, const T &b) { return (a < b) ? b : a; } - - +V_CONSTEXPR inline const T &vMax(const T &a, const T &b) +{ + return (a < b) ? b : a; +} static const double EPSILON_DOUBLE = 0.000000000001f; -static const float EPSILON_FLOAT = 0.000001f; +static const float EPSILON_FLOAT = 0.000001f; static inline bool vCompare(double p1, double p2) { @@ -108,21 +113,20 @@ static inline bool vIsZero(double f) // Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. // This uses alpha = 1, beta = 3/8, which results in a maximum error of less // than 7% compared to the correct value. -static inline float -vLineLength(float x1, float y1, float x2, float y2) +static inline float vLineLength(float x1, float y1, float x2, float y2) { - float x = x2 - x1; - float y = y2 - y1; + float x = x2 - x1; + float y = y2 - y1; - x = x < 0 ? -x : x; - y = y < 0 ? -y : y; + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; - return (x > y ? x + 0.375 * y : y + 0.375 * x); + return (x > y ? x + 0.375 * y : y + 0.375 * x); } -class vFlagHelper -{ +class vFlagHelper { int i; + public: constexpr inline vFlagHelper(int ai) noexcept : i(ai) {} constexpr inline operator int() const noexcept { return i; } @@ -133,19 +137,18 @@ public: constexpr inline operator uint() const noexcept { return uint(i); } }; -template -class vFlag -{ +template +class vFlag { public: - static_assert((sizeof(Enum) <= sizeof(int)), - "vFlag only supports int as storage so bigger type will overflow"); - static_assert((std::is_enum::value), "vFlag is only usable on enumeration types."); + static_assert( + (sizeof(Enum) <= sizeof(int)), + "vFlag only supports int as storage so bigger type will overflow"); + static_assert((std::is_enum::value), + "vFlag is only usable on enumeration types."); typedef typename std::conditional< - std::is_unsigned::type>::value, - unsigned int, - signed int - >::type Int; + std::is_unsigned::type>::value, + unsigned int, signed int>::type Int; typedef Enum enum_type; // compiler-generated copy/move ctor/assignment operators are fine! @@ -154,28 +157,83 @@ public: constexpr inline vFlag() noexcept : i(0) {} constexpr inline vFlag(vFlagHelper f) noexcept : i(f) {} - inline vFlag &operator&=(int mask) noexcept { i &= mask; return *this; } - inline vFlag &operator&=(uint mask) noexcept { i &= mask; return *this; } - inline vFlag &operator&=(Enum mask) noexcept { i &= Int(mask); return *this; } - inline vFlag &operator|=(vFlag f) noexcept { i |= f.i; return *this; } - inline vFlag &operator|=(Enum f) noexcept { i |= Int(f); return *this; } - inline vFlag &operator^=(vFlag f) noexcept { i ^= f.i; return *this; } - inline vFlag &operator^=(Enum f) noexcept { i ^= Int(f); return *this; } + inline vFlag &operator&=(int mask) noexcept + { + i &= mask; + return *this; + } + inline vFlag &operator&=(uint mask) noexcept + { + i &= mask; + return *this; + } + inline vFlag &operator&=(Enum mask) noexcept + { + i &= Int(mask); + return *this; + } + inline vFlag &operator|=(vFlag f) noexcept + { + i |= f.i; + return *this; + } + inline vFlag &operator|=(Enum f) noexcept + { + i |= Int(f); + return *this; + } + inline vFlag &operator^=(vFlag f) noexcept + { + i ^= f.i; + return *this; + } + inline vFlag &operator^=(Enum f) noexcept + { + i ^= Int(f); + return *this; + } constexpr inline operator Int() const noexcept { return i; } - constexpr inline vFlag operator|(vFlag f) const { return vFlag(vFlagHelper(i | f.i)); } - constexpr inline vFlag operator|(Enum f) const noexcept { return vFlag(vFlagHelper(i | Int(f))); } - constexpr inline vFlag operator^(vFlag f) const noexcept { return vFlag(vFlagHelper(i ^ f.i)); } - constexpr inline vFlag operator^(Enum f) const noexcept { return vFlag(vFlagHelper(i ^ Int(f))); } - constexpr inline vFlag operator&(int mask) const noexcept { return vFlag(vFlagHelper(i & mask)); } - constexpr inline vFlag operator&(uint mask) const noexcept { return vFlag(vFlagHelper(i & mask)); } - constexpr inline vFlag operator&(Enum f) const noexcept { return vFlag(vFlagHelper(i & Int(f))); } - constexpr inline vFlag operator~() const noexcept { return vFlag(vFlagHelper(~i)); } + constexpr inline vFlag operator|(vFlag f) const + { + return vFlag(vFlagHelper(i | f.i)); + } + constexpr inline vFlag operator|(Enum f) const noexcept + { + return vFlag(vFlagHelper(i | Int(f))); + } + constexpr inline vFlag operator^(vFlag f) const noexcept + { + return vFlag(vFlagHelper(i ^ f.i)); + } + constexpr inline vFlag operator^(Enum f) const noexcept + { + return vFlag(vFlagHelper(i ^ Int(f))); + } + constexpr inline vFlag operator&(int mask) const noexcept + { + return vFlag(vFlagHelper(i & mask)); + } + constexpr inline vFlag operator&(uint mask) const noexcept + { + return vFlag(vFlagHelper(i & mask)); + } + constexpr inline vFlag operator&(Enum f) const noexcept + { + return vFlag(vFlagHelper(i & Int(f))); + } + constexpr inline vFlag operator~() const noexcept + { + return vFlag(vFlagHelper(~i)); + } constexpr inline bool operator!() const noexcept { return !i; } - constexpr inline bool testFlag(Enum f) const noexcept { return (i & Int(f)) == Int(f) && (Int(f) != 0 || i == Int(f) ); } + constexpr inline bool testFlag(Enum f) const noexcept + { + return (i & Int(f)) == Int(f) && (Int(f) != 0 || i == Int(f)); + } inline vFlag &setFlag(Enum f, bool on = true) noexcept { return on ? (*this |= f) : (*this &= ~f); @@ -184,28 +242,37 @@ public: Int i; }; - -class VColor -{ +class VColor { public: - inline VColor() noexcept {a = r = g = b = 0;} - inline VColor(int red, int green, int blue, int alpha = 255) noexcept { r = red; g = green; b = blue; a = alpha; } - inline int red() const noexcept {return r;} - inline int green() const noexcept{return g;} - inline int blue() const noexcept{return b;} - inline int alpha() const noexcept{return a;} - inline void setRed(int red) noexcept {r = red;} - inline void setGreen(int green)noexcept {g = green;} - inline void setBlue(int blue)noexcept {b = blue;} - inline void setAlpha(int alpha)noexcept {a = alpha;} - inline bool isOpaque() const{return a == 255;} - inline bool operator==(const VColor &o) const { return ((a==o.a) && (r==o.r) && (g == o.g) && (b == o.b));} - uint premulARGB() const { - int pr= (r * a)/255; - int pg= (g * a)/255; - int pb= (b * a)/255; - return uint((a<<24) | (pr<<16) | (pg<<8) | (pb)); + inline VColor() noexcept { a = r = g = b = 0; } + inline VColor(int red, int green, int blue, int alpha = 255) noexcept + { + r = red; + g = green; + b = blue; + a = alpha; } + inline int red() const noexcept { return r; } + inline int green() const noexcept { return g; } + inline int blue() const noexcept { return b; } + inline int alpha() const noexcept { return a; } + inline void setRed(int red) noexcept { r = red; } + inline void setGreen(int green) noexcept { g = green; } + inline void setBlue(int blue) noexcept { b = blue; } + inline void setAlpha(int alpha) noexcept { a = alpha; } + inline bool isOpaque() const { return a == 255; } + inline bool operator==(const VColor &o) const + { + return ((a == o.a) && (r == o.r) && (g == o.g) && (b == o.b)); + } + uint premulARGB() const + { + int pr = (r * a) / 255; + int pg = (g * a) / 255; + int pb = (b * a) / 255; + return uint((a << 24) | (pr << 16) | (pg << 8) | (pb)); + } + public: ushort a; ushort r; @@ -213,32 +280,20 @@ public: ushort b; }; -enum class FillRule { - EvenOdd, - Winding -}; - -enum class JoinStyle { - Miter, - Bevel, - Round -}; -enum class CapStyle { - Flat, - Square, - Round -}; +enum class FillRule { EvenOdd, Winding }; +enum class JoinStyle { Miter, Bevel, Round }; +enum class CapStyle { Flat, Square, Round }; #ifndef V_CONSTRUCTOR_FUNCTION -# define V_CONSTRUCTOR_FUNCTION0(AFUNC) \ - namespace { \ - static const struct AFUNC ## _ctor_class_ { \ - inline AFUNC ## _ctor_class_() { AFUNC(); } \ - } AFUNC ## _ctor_instance_; \ +#define V_CONSTRUCTOR_FUNCTION0(AFUNC) \ + namespace { \ + static const struct AFUNC##_ctor_class_ { \ + inline AFUNC##_ctor_class_() { AFUNC(); } \ + } AFUNC##_ctor_instance_; \ } -# define V_CONSTRUCTOR_FUNCTION(AFUNC) V_CONSTRUCTOR_FUNCTION0(AFUNC) +#define V_CONSTRUCTOR_FUNCTION(AFUNC) V_CONSTRUCTOR_FUNCTION0(AFUNC) #endif -#endif //VGLOBAL_H +#endif // VGLOBAL_H diff --git a/src/vector/vinterpolator.cpp b/src/vector/vinterpolator.cpp index 90f0936264..58c2d14201 100644 --- a/src/vector/vinterpolator.cpp +++ b/src/vector/vinterpolator.cpp @@ -1,134 +1,118 @@ -#include"vinterpolator.h" -#include +#include "vinterpolator.h" +#include V_BEGIN_NAMESPACE -#define NEWTON_ITERATIONS 4 -#define NEWTON_MIN_SLOPE 0.02 -#define SUBDIVISION_PRECISION 0.0000001 +#define NEWTON_ITERATIONS 4 +#define NEWTON_MIN_SLOPE 0.02 +#define SUBDIVISION_PRECISION 0.0000001 #define SUBDIVISION_MAX_ITERATIONS 10 const float VInterpolator::kSampleStepSize = - 1.0 / float(VInterpolator::kSplineTableSize - 1); + 1.0 / float(VInterpolator::kSplineTableSize - 1); -void -VInterpolator::init(float aX1, float aY1, float aX2, float aY2) +void VInterpolator::init(float aX1, float aY1, float aX2, float aY2) { mX1 = aX1; mY1 = aY1; mX2 = aX2; mY2 = aY2; - if (mX1 != mY1 || mX2 != mY2) - CalcSampleValues(); + if (mX1 != mY1 || mX2 != mY2) CalcSampleValues(); } -/*static*/ float -VInterpolator::CalcBezier(float aT, - float aA1, - float aA2) +/*static*/ float VInterpolator::CalcBezier(float aT, float aA1, float aA2) { - // use Horner's scheme to evaluate the Bezier polynomial - return ((A(aA1, aA2)*aT + B(aA1, aA2))*aT + C(aA1))*aT; + // use Horner's scheme to evaluate the Bezier polynomial + return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } -void -VInterpolator::CalcSampleValues() +void VInterpolator::CalcSampleValues() { for (int i = 0; i < kSplineTableSize; ++i) { mSampleValues[i] = CalcBezier(float(i) * kSampleStepSize, mX1, mX2); } } -float -VInterpolator::GetSlope(float aT, - float aA1, - float aA2) +float VInterpolator::GetSlope(float aT, float aA1, float aA2) { - return 3.0 * A(aA1, aA2)*aT*aT + 2.0 * B(aA1, aA2) * aT + C(aA1); + return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); } - -float -VInterpolator::value(float aX) const +float VInterpolator::value(float aX) const { - if (mX1 == mY1 && mX2 == mY2) - return aX; + if (mX1 == mY1 && mX2 == mY2) return aX; - return CalcBezier(GetTForX(aX), mY1, mY2); + return CalcBezier(GetTForX(aX), mY1, mY2); } -float -VInterpolator::GetTForX(float aX) const +float VInterpolator::GetTForX(float aX) const { - // Find interval where t lies - float intervalStart = 0.0; - const float* currentSample = &mSampleValues[1]; - const float* const lastSample = &mSampleValues[kSplineTableSize - 1]; - for (; currentSample != lastSample && *currentSample <= aX; - ++currentSample) { - intervalStart += kSampleStepSize; - } - --currentSample; // t now lies between *currentSample and *currentSample+1 - - // Interpolate to provide an initial guess for t - float dist = (aX - *currentSample) / - (*(currentSample+1) - *currentSample); - float guessForT = intervalStart + dist * kSampleStepSize; - - // Check the slope to see what strategy to use. If the slope is too small - // Newton-Raphson iteration won't converge on a root so we use bisection - // instead. - float initialSlope = GetSlope(guessForT, mX1, mX2); - if (initialSlope >= NEWTON_MIN_SLOPE) { - return NewtonRaphsonIterate(aX, guessForT); - } else if (initialSlope == 0.0) { - return guessForT; - } else { - return BinarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize); - } -} - -float -VInterpolator::NewtonRaphsonIterate(float aX, float aGuessT) const -{ - // Refine guess with Newton-Raphson iteration - for (int i = 0; i < NEWTON_ITERATIONS; ++i) { - // We're trying to find where f(t) = aX, - // so we're actually looking for a root for: CalcBezier(t) - aX - float currentX = CalcBezier(aGuessT, mX1, mX2) - aX; - float currentSlope = GetSlope(aGuessT, mX1, mX2); - - if (currentSlope == 0.0) - return aGuessT; - - aGuessT -= currentX / currentSlope; - } - - return aGuessT; -} - -float -VInterpolator::BinarySubdivide(float aX, float aA, float aB) const -{ - float currentX; - float currentT; - int i = 0; - - do - { - currentT = aA + (aB - aA) / 2.0; - currentX = CalcBezier(currentT, mX1, mX2) - aX; - - if (currentX > 0.0) { - aB = currentT; - } else { - aA = currentT; + // Find interval where t lies + float intervalStart = 0.0; + const float* currentSample = &mSampleValues[1]; + const float* const lastSample = &mSampleValues[kSplineTableSize - 1]; + for (; currentSample != lastSample && *currentSample <= aX; + ++currentSample) { + intervalStart += kSampleStepSize; } - } while (fabs(currentX) > SUBDIVISION_PRECISION - && ++i < SUBDIVISION_MAX_ITERATIONS); + --currentSample; // t now lies between *currentSample and *currentSample+1 - return currentT; + // Interpolate to provide an initial guess for t + float dist = + (aX - *currentSample) / (*(currentSample + 1) - *currentSample); + float guessForT = intervalStart + dist * kSampleStepSize; + + // Check the slope to see what strategy to use. If the slope is too small + // Newton-Raphson iteration won't converge on a root so we use bisection + // instead. + float initialSlope = GetSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return NewtonRaphsonIterate(aX, guessForT); + } else if (initialSlope == 0.0) { + return guessForT; + } else { + return BinarySubdivide(aX, intervalStart, + intervalStart + kSampleStepSize); + } +} + +float VInterpolator::NewtonRaphsonIterate(float aX, float aGuessT) const +{ + // Refine guess with Newton-Raphson iteration + for (int i = 0; i < NEWTON_ITERATIONS; ++i) { + // We're trying to find where f(t) = aX, + // so we're actually looking for a root for: CalcBezier(t) - aX + float currentX = CalcBezier(aGuessT, mX1, mX2) - aX; + float currentSlope = GetSlope(aGuessT, mX1, mX2); + + if (currentSlope == 0.0) return aGuessT; + + aGuessT -= currentX / currentSlope; + } + + return aGuessT; +} + +float VInterpolator::BinarySubdivide(float aX, float aA, float aB) const +{ + float currentX; + float currentT; + int i = 0; + + do { + currentT = aA + (aB - aA) / 2.0; + currentX = CalcBezier(currentT, mX1, mX2) - aX; + + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (fabs(currentX) > SUBDIVISION_PRECISION && + ++i < SUBDIVISION_MAX_ITERATIONS); + + return currentT; } V_END_NAMESPACE diff --git a/src/vector/vinterpolator.h b/src/vector/vinterpolator.h index f609d0ce4d..0d3b60ea18 100644 --- a/src/vector/vinterpolator.h +++ b/src/vector/vinterpolator.h @@ -5,80 +5,62 @@ V_BEGIN_NAMESPACE -class VInterpolator -{ +class VInterpolator { public: - VInterpolator() { /* caller must call Init later */ } + VInterpolator() + { /* caller must call Init later */ + } - VInterpolator(float aX1, float aY1, - float aX2, float aY2) + VInterpolator(float aX1, float aY1, float aX2, float aY2) { - init(aX1, aY1, aX2, aY2); + init(aX1, aY1, aX2, aY2); } VInterpolator(VPointF pt1, VPointF pt2) { - init(pt1.x(), pt1.y(), pt2.x(), pt2.y()); + init(pt1.x(), pt1.y(), pt2.x(), pt2.y()); } - void init(float aX1, float aY1, - float aX2, float aY2); + void init(float aX1, float aY1, float aX2, float aY2); float value(float aX) const; void GetSplineDerivativeValues(float aX, float& aDX, float& aDY) const; + private: - void - CalcSampleValues(); + void CalcSampleValues(); - /** - * Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. - */ - static float - CalcBezier(float aT, float aA1, float aA2); + /** + * Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. + */ + static float CalcBezier(float aT, float aA1, float aA2); - /** - * Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. - */ - static float - GetSlope(float aT, float aA1, float aA2); + /** + * Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + */ + static float GetSlope(float aT, float aA1, float aA2); - float - GetTForX(float aX) const; + float GetTForX(float aX) const; - float - NewtonRaphsonIterate(float aX, float aGuessT) const; + float NewtonRaphsonIterate(float aX, float aGuessT) const; - float - BinarySubdivide(float aX, float aA, float aB) const; + float BinarySubdivide(float aX, float aA, float aB) const; - static float - A(float aA1, float aA2) - { - return 1.0 - 3.0 * aA2 + 3.0 * aA1; - } + static float A(float aA1, float aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } - static float - B(float aA1, float aA2) - { - return 3.0 * aA2 - 6.0 * aA1; - } + static float B(float aA1, float aA2) { return 3.0 * aA2 - 6.0 * aA1; } - static float - C(float aA1) - { - return 3.0 * aA1; - } + static float C(float aA1) { return 3.0 * aA1; } float mX1; float mY1; float mX2; float mY2; enum { kSplineTableSize = 11 }; - float mSampleValues[kSplineTableSize]; + float mSampleValues[kSplineTableSize]; static const float kSampleStepSize; }; V_END_NAMESPACE -#endif // VINTERPOLATOR_H +#endif // VINTERPOLATOR_H diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 688b27342f..5fff287249 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -1,8 +1,8 @@ -#include"vmatrix.h" -#include -#include -#include -#include +#include "vmatrix.h" +#include +#include +#include +#include V_BEGIN_NAMESPACE @@ -13,8 +13,8 @@ V_BEGIN_NAMESPACE inline float VMatrix::determinant() const { - return m11*(m33*m22 - mty*m23) - - m21*(m33*m12 - mty*m13)+mtx*(m23*m12 - m22*m13); + return m11 * (m33 * m22 - mty * m23) - m21 * (m33 * m12 - mty * m13) + + mtx * (m23 * m12 - m22 * m13); } bool VMatrix::isAffine() const @@ -48,8 +48,7 @@ bool VMatrix::isTranslating() const VMatrix &VMatrix::operator*=(float num) { - if (num == 1.) - return *this; + if (num == 1.) return *this; m11 *= num; m12 *= num; @@ -60,31 +59,28 @@ VMatrix &VMatrix::operator*=(float num) mtx *= num; mty *= num; m33 *= num; - if (dirty < MatrixType::Scale) - dirty = MatrixType::Scale; + if (dirty < MatrixType::Scale) dirty = MatrixType::Scale; return *this; } VMatrix &VMatrix::operator/=(float div) { - if (div == 0) - return *this; + if (div == 0) return *this; - div = 1/div; + div = 1 / div; return operator*=(div); } VMatrix::MatrixType VMatrix::type() const { - if(dirty == MatrixType::None || dirty < mType) - return mType; + if (dirty == MatrixType::None || dirty < mType) return mType; switch (dirty) { case MatrixType::Project: if (!vIsZero(m13) || !vIsZero(m23) || !vIsZero(m33 - 1)) { - mType = MatrixType::Project; - break; + mType = MatrixType::Project; + break; } case MatrixType::Shear: case MatrixType::Rotate: @@ -115,13 +111,11 @@ VMatrix::MatrixType VMatrix::type() const return mType; } - VMatrix &VMatrix::translate(float dx, float dy) { - if (dx == 0 && dy == 0) - return *this; + if (dx == 0 && dy == 0) return *this; - switch(type()) { + switch (type()) { case MatrixType::None: mtx = dx; mty = dy; @@ -131,28 +125,26 @@ VMatrix &VMatrix::translate(float dx, float dy) mty += dy; break; case MatrixType::Scale: - mtx += dx* m11; - mty += dy* m22; + mtx += dx * m11; + mty += dy * m22; break; case MatrixType::Project: m33 += dx * m13 + dy * m23; case MatrixType::Shear: case MatrixType::Rotate: - mtx += dx*m11 + dy*m21; - mty += dy*m22 + dx*m12; + mtx += dx * m11 + dy * m21; + mty += dy * m22 + dx * m12; break; } - if (dirty < MatrixType::Translate) - dirty = MatrixType::Translate; + if (dirty < MatrixType::Translate) dirty = MatrixType::Translate; return *this; } -VMatrix & VMatrix::scale(float sx, float sy) +VMatrix &VMatrix::scale(float sx, float sy) { - if (sx == 1 && sy == 1) - return *this; + if (sx == 1 && sy == 1) return *this; - switch(type()) { + switch (type()) { case MatrixType::None: case MatrixType::Translate: m11 = sx; @@ -170,56 +162,53 @@ VMatrix & VMatrix::scale(float sx, float sy) m22 *= sy; break; } - if (dirty < MatrixType::Scale) - dirty = MatrixType::Scale; + if (dirty < MatrixType::Scale) dirty = MatrixType::Scale; return *this; } -VMatrix & VMatrix::shear(float sh, float sv) +VMatrix &VMatrix::shear(float sh, float sv) { - if (sh == 0 && sv == 0) - return *this; + if (sh == 0 && sv == 0) return *this; - switch(type()) { + switch (type()) { case MatrixType::None: case MatrixType::Translate: m12 = sv; m21 = sh; break; case MatrixType::Scale: - m12 = sv*m22; - m21 = sh*m11; + m12 = sv * m22; + m21 = sh * m11; break; case MatrixType::Project: { - float tm13 = sv*m23; - float tm23 = sh*m13; + float tm13 = sv * m23; + float tm23 = sh * m13; m13 += tm13; m23 += tm23; } case MatrixType::Rotate: case MatrixType::Shear: { - float tm11 = sv*m21; - float tm22 = sh*m12; - float tm12 = sv*m22; - float tm21 = sh*m11; - m11 += tm11; m12 += tm12; - m21 += tm21; m22 += tm22; + float tm11 = sv * m21; + float tm22 = sh * m12; + float tm12 = sv * m22; + float tm21 = sh * m11; + m11 += tm11; + m12 += tm12; + m21 += tm21; + m22 += tm22; break; } } - if (dirty < MatrixType::Shear) - dirty = MatrixType::Shear; + if (dirty < MatrixType::Shear) dirty = MatrixType::Shear; return *this; } - static const float deg2rad = float(0.017453292519943295769); // pi/180 static const float inv_dist_to_plane = 1. / 1024.; -VMatrix & VMatrix::rotate(float a, Axis axis) +VMatrix &VMatrix::rotate(float a, Axis axis) { - if (a == 0) - return *this; + if (a == 0) return *this; float sina = 0; float cosa = 0; @@ -229,14 +218,14 @@ VMatrix & VMatrix::rotate(float a, Axis axis) sina = -1.; else if (a == 180.) cosa = -1.; - else{ - float b = deg2rad*a; // convert to radians - sina = std::sin(b); // fast and convenient + else { + float b = deg2rad * a; // convert to radians + sina = std::sin(b); // fast and convenient cosa = std::cos(b); } if (axis == Axis::Z) { - switch(type()) { + switch (type()) { case MatrixType::None: case MatrixType::Translate: m11 = cosa; @@ -245,33 +234,36 @@ VMatrix & VMatrix::rotate(float a, Axis axis) m22 = cosa; break; case MatrixType::Scale: { - float tm11 = cosa*m11; - float tm12 = sina*m22; - float tm21 = -sina*m11; - float tm22 = cosa*m22; - m11 = tm11; m12 = tm12; - m21 = tm21; m22 = tm22; + float tm11 = cosa * m11; + float tm12 = sina * m22; + float tm21 = -sina * m11; + float tm22 = cosa * m22; + m11 = tm11; + m12 = tm12; + m21 = tm21; + m22 = tm22; break; } case MatrixType::Project: { - float tm13 = cosa*m13 + sina*m23; - float tm23 = -sina*m13 + cosa*m23; + float tm13 = cosa * m13 + sina * m23; + float tm23 = -sina * m13 + cosa * m23; m13 = tm13; m23 = tm23; } case MatrixType::Rotate: case MatrixType::Shear: { - float tm11 = cosa*m11 + sina*m21; - float tm12 = cosa*m12 + sina*m22; - float tm21 = -sina*m11 + cosa*m21; - float tm22 = -sina*m12 + cosa*m22; - m11 = tm11; m12 = tm12; - m21 = tm21; m22 = tm22; + float tm11 = cosa * m11 + sina * m21; + float tm12 = cosa * m12 + sina * m22; + float tm21 = -sina * m11 + cosa * m21; + float tm22 = -sina * m12 + cosa * m22; + m11 = tm11; + m12 = tm12; + m21 = tm21; + m22 = tm22; break; } } - if (dirty < MatrixType::Rotate) - dirty = MatrixType::Rotate; + if (dirty < MatrixType::Rotate) dirty = MatrixType::Rotate; } else { VMatrix result; if (axis == Axis::Y) { @@ -291,69 +283,74 @@ VMatrix & VMatrix::rotate(float a, Axis axis) VMatrix VMatrix::operator*(const VMatrix &m) const { const MatrixType otherType = m.type(); - if (otherType == MatrixType::None) - return *this; + if (otherType == MatrixType::None) return *this; const MatrixType thisType = type(); - if (thisType == MatrixType::None) - return m; + if (thisType == MatrixType::None) return m; - VMatrix t; + VMatrix t; MatrixType type = vMax(thisType, otherType); - switch(type) { + switch (type) { case MatrixType::None: break; case MatrixType::Translate: t.mtx = mtx + m.mtx; t.mty += mty + m.mty; break; - case MatrixType::Scale: - { - float m11v = m11*m.m11; - float m22v = m22*m.m22; + case MatrixType::Scale: { + float m11v = m11 * m.m11; + float m22v = m22 * m.m22; - float m31v = mtx*m.m11 + m.mtx; - float m32v = mty*m.m22 + m.mty; + float m31v = mtx * m.m11 + m.mtx; + float m32v = mty * m.m22 + m.mty; t.m11 = m11v; t.m22 = m22v; - t.mtx = m31v; t.mty = m32v; + t.mtx = m31v; + t.mty = m32v; break; } case MatrixType::Rotate: - case MatrixType::Shear: - { - float m11v = m11*m.m11 + m12*m.m21; - float m12v = m11*m.m12 + m12*m.m22; + case MatrixType::Shear: { + float m11v = m11 * m.m11 + m12 * m.m21; + float m12v = m11 * m.m12 + m12 * m.m22; - float m21v = m21*m.m11 + m22*m.m21; - float m22v = m21*m.m12 + m22*m.m22; + float m21v = m21 * m.m11 + m22 * m.m21; + float m22v = m21 * m.m12 + m22 * m.m22; - float m31v = mtx*m.m11 + mty*m.m21 + m.mtx; - float m32v = mtx*m.m12 + mty*m.m22 + m.mty; + float m31v = mtx * m.m11 + mty * m.m21 + m.mtx; + float m32v = mtx * m.m12 + mty * m.m22 + m.mty; - t.m11 = m11v; t.m12 = m12v; - t.m21 = m21v; t.m22 = m22v; - t.mtx = m31v; t.mty = m32v; + t.m11 = m11v; + t.m12 = m12v; + t.m21 = m21v; + t.m22 = m22v; + t.mtx = m31v; + t.mty = m32v; break; } - case MatrixType::Project: - { - float m11v = m11*m.m11 + m12*m.m21 + m13*m.mtx; - float m12v = m11*m.m12 + m12*m.m22 + m13*m.mty; - float m13v = m11*m.m13 + m12*m.m23 + m13*m.m33; + case MatrixType::Project: { + float m11v = m11 * m.m11 + m12 * m.m21 + m13 * m.mtx; + float m12v = m11 * m.m12 + m12 * m.m22 + m13 * m.mty; + float m13v = m11 * m.m13 + m12 * m.m23 + m13 * m.m33; - float m21v = m21*m.m11 + m22*m.m21 + m23*m.mtx; - float m22v = m21*m.m12 + m22*m.m22 + m23*m.mty; - float m23v = m21*m.m13 + m22*m.m23 + m23*m.m33; + float m21v = m21 * m.m11 + m22 * m.m21 + m23 * m.mtx; + float m22v = m21 * m.m12 + m22 * m.m22 + m23 * m.mty; + float m23v = m21 * m.m13 + m22 * m.m23 + m23 * m.m33; - float m31v = mtx*m.m11 + mty*m.m21 + m33*m.mtx; - float m32v = mtx*m.m12 + mty*m.m22 + m33*m.mty; - float m33v = mtx*m.m13 + mty*m.m23 + m33*m.m33; + float m31v = mtx * m.m11 + mty * m.m21 + m33 * m.mtx; + float m32v = mtx * m.m12 + mty * m.m22 + m33 * m.mty; + float m33v = mtx * m.m13 + mty * m.m23 + m33 * m.m33; - t.m11 = m11v; t.m12 = m12v; t.m13 = m13v; - t.m21 = m21v; t.m22 = m22v; t.m23 = m23v; - t.mtx = m31v; t.mty = m32v; t.m33 = m33v; + t.m11 = m11v; + t.m12 = m12v; + t.m13 = m13v; + t.m21 = m21v; + t.m22 = m22v; + t.m23 = m23v; + t.mtx = m31v; + t.mty = m32v; + t.m33 = m33v; } } @@ -363,71 +360,76 @@ VMatrix VMatrix::operator*(const VMatrix &m) const return t; } -VMatrix & VMatrix::operator*=(const VMatrix &o) +VMatrix &VMatrix::operator*=(const VMatrix &o) { const MatrixType otherType = o.type(); - if (otherType == MatrixType::None) - return *this; + if (otherType == MatrixType::None) return *this; const MatrixType thisType = type(); - if (thisType == MatrixType::None) - return operator=(o); + if (thisType == MatrixType::None) return operator=(o); MatrixType t = vMax(thisType, otherType); - switch(t) { + switch (t) { case MatrixType::None: break; case MatrixType::Translate: mtx += o.mtx; mty += o.mty; break; - case MatrixType::Scale: - { - float m11v = m11*o.m11; - float m22v = m22*o.m22; + case MatrixType::Scale: { + float m11v = m11 * o.m11; + float m22v = m22 * o.m22; - float m31v = mtx*o.m11 + o.mtx; - float m32v = mty*o.m22 + o.mty; + float m31v = mtx * o.m11 + o.mtx; + float m32v = mty * o.m22 + o.mty; m11 = m11v; m22 = m22v; - mtx = m31v; mty = m32v; + mtx = m31v; + mty = m32v; break; } case MatrixType::Rotate: - case MatrixType::Shear: - { - float m11v = m11*o.m11 + m12*o.m21; - float m12v = m11*o.m12 + m12*o.m22; + case MatrixType::Shear: { + float m11v = m11 * o.m11 + m12 * o.m21; + float m12v = m11 * o.m12 + m12 * o.m22; - float m21v = m21*o.m11 + m22*o.m21; - float m22v = m21*o.m12 + m22*o.m22; + float m21v = m21 * o.m11 + m22 * o.m21; + float m22v = m21 * o.m12 + m22 * o.m22; - float m31v = mtx*o.m11 + mty*o.m21 + o.mtx; - float m32v = mtx*o.m12 + mty*o.m22 + o.mty; + float m31v = mtx * o.m11 + mty * o.m21 + o.mtx; + float m32v = mtx * o.m12 + mty * o.m22 + o.mty; - m11 = m11v; m12 = m12v; - m21 = m21v; m22 = m22v; - mtx = m31v; mty = m32v; + m11 = m11v; + m12 = m12v; + m21 = m21v; + m22 = m22v; + mtx = m31v; + mty = m32v; break; } - case MatrixType::Project: - { - float m11v = m11*o.m11 + m12*o.m21 + m13*o.mtx; - float m12v = m11*o.m12 + m12*o.m22 + m13*o.mty; - float m13v = m11*o.m13 + m12*o.m23 + m13*o.m33; + case MatrixType::Project: { + float m11v = m11 * o.m11 + m12 * o.m21 + m13 * o.mtx; + float m12v = m11 * o.m12 + m12 * o.m22 + m13 * o.mty; + float m13v = m11 * o.m13 + m12 * o.m23 + m13 * o.m33; - float m21v = m21*o.m11 + m22*o.m21 + m23*o.mtx; - float m22v = m21*o.m12 + m22*o.m22 + m23*o.mty; - float m23v = m21*o.m13 + m22*o.m23 + m23*o.m33; + float m21v = m21 * o.m11 + m22 * o.m21 + m23 * o.mtx; + float m22v = m21 * o.m12 + m22 * o.m22 + m23 * o.mty; + float m23v = m21 * o.m13 + m22 * o.m23 + m23 * o.m33; - float m31v = mtx*o.m11 + mty*o.m21 + m33*o.mtx; - float m32v = mtx*o.m12 + mty*o.m22 + m33*o.mty; - float m33v = mtx*o.m13 + mty*o.m23 + m33*o.m33; + float m31v = mtx * o.m11 + mty * o.m21 + m33 * o.mtx; + float m32v = mtx * o.m12 + mty * o.m22 + m33 * o.mty; + float m33v = mtx * o.m13 + mty * o.m23 + m33 * o.m33; - m11 = m11v; m12 = m12v; m13 = m13v; - m21 = m21v; m22 = m22v; m23 = m23v; - mtx = m31v; mty = m32v; m33 = m33v; + m11 = m11v; + m12 = m12v; + m13 = m13v; + m21 = m21v; + m22 = m22v; + m23 = m23v; + mtx = m31v; + mty = m32v; + m33 = m33v; } } @@ -439,18 +441,16 @@ VMatrix & VMatrix::operator*=(const VMatrix &o) VMatrix VMatrix::adjoint() const { - float h11, h12, h13, - h21, h22, h23, - h31, h32, h33; - h11 = m22*m33 - m23*mty; - h21 = m23*mtx - m21*m33; - h31 = m21*mty - m22*mtx; - h12 = m13*mty - m12*m33; - h22 = m11*m33 - m13*mtx; - h32 = m12*mtx - m11*mty; - h13 = m12*m23 - m13*m22; - h23 = m13*m21 - m11*m23; - h33 = m11*m22 - m12*m21; + float h11, h12, h13, h21, h22, h23, h31, h32, h33; + h11 = m22 * m33 - m23 * mty; + h21 = m23 * mtx - m21 * m33; + h31 = m21 * mty - m22 * mtx; + h12 = m13 * mty - m12 * m33; + h22 = m11 * m33 - m13 * mtx; + h32 = m12 * mtx - m11 * mty; + h13 = m12 * m23 - m13 * m22; + h23 = m13 * m21 - m11 * m23; + h33 = m11 * m22 - m12 * m21; VMatrix res; res.m11 = h11; @@ -471,9 +471,9 @@ VMatrix VMatrix::adjoint() const VMatrix VMatrix::inverted(bool *invertible) const { VMatrix invert; - bool inv = true; + bool inv = true; - switch(type()) { + switch (type()) { case MatrixType::None: break; case MatrixType::Translate: @@ -494,14 +494,12 @@ VMatrix VMatrix::inverted(bool *invertible) const // general case float det = determinant(); inv = !vIsZero(det); - if (inv) - invert = (adjoint() /= det); - //TODO Test above line + if (inv) invert = (adjoint() /= det); + // TODO Test above line break; } - if (invertible) - *invertible = inv; + if (invertible) *invertible = inv; if (inv) { // inverting doesn't change the type @@ -522,50 +520,47 @@ bool VMatrix::operator!=(const VMatrix &o) const return !operator==(o); } -bool VMatrix::fuzzyCompare(const VMatrix& o) const +bool VMatrix::fuzzyCompare(const VMatrix &o) const { - return vCompare(m11 , o.m11 ) - && vCompare(m12 , o.m12) - && vCompare(m21 , o.m21) - && vCompare(m22 , o.m22) - && vCompare(mtx , o.mtx) - && vCompare(mty , o.mty); + return vCompare(m11, o.m11) && vCompare(m12, o.m12) && + vCompare(m21, o.m21) && vCompare(m22, o.m22) && + vCompare(mtx, o.mtx) && vCompare(mty, o.mty); } #define V_NEAR_CLIP 0.000001 #ifdef MAP -# undef MAP +#undef MAP #endif -#define MAP(x, y, nx, ny) \ - do { \ - float FX_ = x; \ - float FY_ = y; \ - switch(t) { \ - case MatrixType::None: \ - nx = FX_; \ - ny = FY_; \ - break; \ - case MatrixType::Translate: \ - nx = FX_ + mtx; \ - ny = FY_ + mty; \ - break; \ - case MatrixType::Scale: \ - nx = m11 * FX_ + mtx; \ - ny = m22 * FY_ + mty; \ - break; \ - case MatrixType::Rotate: \ - case MatrixType::Shear: \ - case MatrixType::Project: \ - nx = m11 * FX_ + m21 * FY_ + mtx; \ - ny = m12 * FX_ + m22 * FY_ + mty; \ - if (t == MatrixType::Project) { \ - float w = ( m13 * FX_ + m23 * FY_ + m33); \ - if (w < V_NEAR_CLIP) w = V_NEAR_CLIP; \ - w = 1./w; \ - nx *= w; \ - ny *= w; \ - } \ - } \ +#define MAP(x, y, nx, ny) \ + do { \ + float FX_ = x; \ + float FY_ = y; \ + switch (t) { \ + case MatrixType::None: \ + nx = FX_; \ + ny = FY_; \ + break; \ + case MatrixType::Translate: \ + nx = FX_ + mtx; \ + ny = FY_ + mty; \ + break; \ + case MatrixType::Scale: \ + nx = m11 * FX_ + mtx; \ + ny = m22 * FY_ + mty; \ + break; \ + case MatrixType::Rotate: \ + case MatrixType::Shear: \ + case MatrixType::Project: \ + nx = m11 * FX_ + m21 * FY_ + mtx; \ + ny = m12 * FX_ + m22 * FY_ + mty; \ + if (t == MatrixType::Project) { \ + float w = (m13 * FX_ + m23 * FY_ + m33); \ + if (w < V_NEAR_CLIP) w = V_NEAR_CLIP; \ + w = 1. / w; \ + nx *= w; \ + ny *= w; \ + } \ + } \ } while (0) VRect VMatrix::map(const VRect &rect) const @@ -575,10 +570,10 @@ VRect VMatrix::map(const VRect &rect) const return rect.translated(std::round(mtx), std::round(mty)); if (t <= MatrixType::Scale) { - int x = std::round(m11*rect.x() + mtx); - int y = std::round(m22*rect.y() + mty); - int w = std::round(m11*rect.width()); - int h = std::round(m22*rect.height()); + int x = std::round(m11 * rect.x() + mtx); + int y = std::round(m22 * rect.y() + mty); + int w = std::round(m11 * rect.width()); + int h = std::round(m22 * rect.height()); if (w < 0) { w = -w; x -= w; @@ -611,7 +606,9 @@ VRect VMatrix::map(const VRect &rect) const ymin = vMin(ymin, y); xmax = vMax(xmax, x); ymax = vMax(ymax, y); - return VRect(std::round(xmin), std::round(ymin), std::round(xmax)-std::round(xmin), std::round(ymax)-std::round(ymin)); + return VRect(std::round(xmin), std::round(ymin), + std::round(xmax) - std::round(xmin), + std::round(ymax) - std::round(ymin)); } else { // Not supported assert(0); @@ -621,8 +618,7 @@ VRect VMatrix::map(const VRect &rect) const VRegion VMatrix::map(const VRegion &r) const { VMatrix::MatrixType t = type(); - if (t == MatrixType::None) - return r; + if (t == MatrixType::None) return r; if (t == MatrixType::Translate) { VRegion copy(r); @@ -645,7 +641,7 @@ VPointF VMatrix::map(const VPointF &p) const float x = 0, y = 0; VMatrix::MatrixType t = type(); - switch(t) { + switch (t) { case MatrixType::None: x = fx; y = fy; @@ -664,7 +660,7 @@ VPointF VMatrix::map(const VPointF &p) const x = m11 * fx + m21 * fy + mtx; y = m12 * fx + m22 * fy + mty; if (t == MatrixType::Project) { - float w = 1./(m13 * fx + m23 * fy + m33); + float w = 1. / (m13 * fx + m23 * fy + m33); x *= w; y *= w; } @@ -673,7 +669,7 @@ VPointF VMatrix::map(const VPointF &p) const } static std::string type_helper(VMatrix::MatrixType t) { - switch(t) { + switch (t) { case VMatrix::MatrixType::None: return "MatrixType::None"; break; @@ -695,11 +691,14 @@ static std::string type_helper(VMatrix::MatrixType t) } return ""; } -std::ostream& operator<<(std::ostream& os, const VMatrix& o) +std::ostream &operator<<(std::ostream &os, const VMatrix &o) { - os<<"[Matrix: "<<"type ="<mBuffer.prepare(buffer); mImpl->mSpanData.init(&mImpl->mBuffer); - //TODO find a better api to clear the surface + // TODO find a better api to clear the surface mImpl->mBuffer.clear(); return true; } -void VPainter::end() -{ - -} +void VPainter::end() {} void VPainter::setBrush(const VBrush &brush) { diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index f48844608c..67942a21f6 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -1,9 +1,9 @@ #ifndef VPAINTER_H #define VPAINTER_H -#include"vpoint.h" -#include"vrle.h" -#include"vbrush.h" +#include "vbrush.h" +#include "vpoint.h" +#include "vrle.h" V_BEGIN_NAMESPACE @@ -11,22 +11,20 @@ class VBitmap; class VPainterImpl; class VPainter { public: - enum CompositionMode{ - CompModeSrc, - CompModeSrcOver - }; + enum CompositionMode { CompModeSrc, CompModeSrcOver }; ~VPainter(); VPainter(); VPainter(VBitmap *buffer); - bool begin(VBitmap *buffer); - void end(); - void setBrush(const VBrush &brush); - void drawRle(const VPoint &pos, const VRle &rle); + bool begin(VBitmap *buffer); + void end(); + void setBrush(const VBrush &brush); + void drawRle(const VPoint &pos, const VRle &rle); VRect clipBoundingRect() const; + private: - VPainterImpl *mImpl; + VPainterImpl *mImpl; }; V_END_NAMESPACE -#endif //VPAINTER_H +#endif // VPAINTER_H diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 1724f8fbba..043bdcf013 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -1,70 +1,70 @@ -#include"vpath.h" -#include -#include -#include"vdebug.h" -#include"vbezier.h" +#include "vpath.h" +#include +#include +#include "vbezier.h" +#include "vdebug.h" #include "vrect.h" V_BEGIN_NAMESPACE -VPath::VPathData::VPathData():m_points(), - m_elements(), - m_segments(0), - mStartPoint(), - mNewSegment(true){} +VPath::VPathData::VPathData() + : m_points(), m_elements(), m_segments(0), mStartPoint(), mNewSegment(true) +{ +} -VPath::VPathData::VPathData(const VPathData &o):m_points(o.m_points), - m_elements(o.m_elements), - m_segments(o.m_segments), - mStartPoint(o.mStartPoint), - mNewSegment(o.mNewSegment){} +VPath::VPathData::VPathData(const VPathData &o) + : m_points(o.m_points), + m_elements(o.m_elements), + m_segments(o.m_segments), + mStartPoint(o.mStartPoint), + mNewSegment(o.mNewSegment) +{ +} void VPath::VPathData::transform(const VMatrix &m) { - for(auto &i : m_points) { + for (auto &i : m_points) { i = m.map(i); } } float VPath::VPathData::length() const { - float len = 0.0; - int i = 0; - for (auto e : m_elements) { + float len = 0.0; + int i = 0; + for (auto e : m_elements) { switch (e) { - case VPath::Element::MoveTo: - i++; - break; - case VPath::Element::LineTo: - { - VPointF p0 = m_points[i - 1]; - VPointF p = m_points[i++]; - VBezier b = VBezier::fromPoints(p0, p0, p, p); - len += b.length(); - break; - } - case VPath::Element::CubicTo: - { - VPointF p0 = m_points[i - 1]; - VPointF p = m_points[i++]; - VPointF p1 = m_points[i++]; - VPointF p2 = m_points[i++]; - VBezier b = VBezier::fromPoints(p0, p, p1, p2); - len += b.length(); - break; - } - case VPath::Element::Close: - break; + case VPath::Element::MoveTo: + i++; + break; + case VPath::Element::LineTo: { + VPointF p0 = m_points[i - 1]; + VPointF p = m_points[i++]; + VBezier b = VBezier::fromPoints(p0, p0, p, p); + len += b.length(); + break; } - } + case VPath::Element::CubicTo: { + VPointF p0 = m_points[i - 1]; + VPointF p = m_points[i++]; + VPointF p1 = m_points[i++]; + VPointF p2 = m_points[i++]; + VBezier b = VBezier::fromPoints(p0, p, p1, p2); + len += b.length(); + break; + } + case VPath::Element::Close: + break; + } + } - return len; + return len; } void VPath::VPathData::checkNewSegment() { if (mNewSegment) { - moveTo(VPointF(0,0)); + moveTo(VPointF(0, 0)); mNewSegment = false; } } @@ -83,7 +83,8 @@ void VPath::VPathData::lineTo(const VPointF &p) m_elements.push_back(VPath::Element::LineTo); m_points.push_back(p); } -void VPath::VPathData::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) +void VPath::VPathData::cubicTo(const VPointF &c1, const VPointF &c2, + const VPointF &e) { checkNewSegment(); m_elements.push_back(VPath::Element::CubicTo); @@ -98,7 +99,7 @@ void VPath::VPathData::close() const VPointF &lastPt = m_points.back(); if (!fuzzyCompare(mStartPoint, lastPt)) { - lineTo(mStartPoint); + lineTo(mStartPoint); } m_elements.push_back(VPath::Element::Close); mNewSegment = true; @@ -127,25 +128,28 @@ void VPath::VPathData::reserve(int pts, int elms) static VPointF curvesForArc(const VRectF &, float, float, VPointF *, int *); static constexpr float PATH_KAPPA = 0.5522847498; -void VPath::VPathData::arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo) +void VPath::VPathData::arcTo(const VRectF &rect, float startAngle, + float sweepLength, bool forceMoveTo) { - int point_count = 0; + int point_count = 0; VPointF pts[15]; - VPointF curve_start = curvesForArc(rect, startAngle, sweepLength, pts, &point_count); + VPointF curve_start = + curvesForArc(rect, startAngle, sweepLength, pts, &point_count); if (isEmpty() || forceMoveTo) { moveTo(curve_start); } else { lineTo(curve_start); } - for (int i=0; i 3 o'clock - cubicTo(VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), VPointF(x + w, y + h2)); - // 3 -> 6 o'clock - cubicTo(VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), VPointF(x + w2, y + h)); - // 6 -> 9 o'clock - cubicTo(VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), VPointF(x , y + h2)); - // 9 -> 12 o'clock - cubicTo(VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), VPointF(x + w2, y)); + // moveto 12 o'clock. + moveTo(VPointF(x + w2, y)); + // 12 -> 3 o'clock + cubicTo(VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), + VPointF(x + w, y + h2)); + // 3 -> 6 o'clock + cubicTo(VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), + VPointF(x + w2, y + h)); + // 6 -> 9 o'clock + cubicTo(VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), + VPointF(x, y + h2)); + // 9 -> 12 o'clock + cubicTo(VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), + VPointF(x + w2, y)); } else { - // moveto 12 o'clock. - moveTo(VPointF(x+w2, y)); - // 12 -> 9 o'clock - cubicTo(VPointF(x + w2 - w2k, y), VPointF(x, y + h2 - h2k), VPointF(x , y + h2)); - // 9 -> 6 o'clock - cubicTo(VPointF(x, y + h2 + h2k), VPointF(x + w2 - w2k, y + h), VPointF(x + w2, y + h)); - // 6 -> 3 o'clock - cubicTo(VPointF(x + w2 + w2k, y + h), VPointF(x + w, y + h2 + h2k), VPointF(x + w, y + h2)); - // 3 -> 12 o'clock - cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), VPointF(x+w2, y)); + // moveto 12 o'clock. + moveTo(VPointF(x + w2, y)); + // 12 -> 9 o'clock + cubicTo(VPointF(x + w2 - w2k, y), VPointF(x, y + h2 - h2k), + VPointF(x, y + h2)); + // 9 -> 6 o'clock + cubicTo(VPointF(x, y + h2 + h2k), VPointF(x + w2 - w2k, y + h), + VPointF(x + w2, y + h)); + // 6 -> 3 o'clock + cubicTo(VPointF(x + w2 + w2k, y + h), VPointF(x + w, y + h2 + h2k), + VPointF(x + w, y + h2)); + // 3 -> 12 o'clock + cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), + VPointF(x + w2, y)); } } @@ -199,21 +210,22 @@ void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) float h = rect.height(); if (dir == VPath::Direction::CW) { - moveTo(VPointF(x + w, y)); - lineTo(VPointF(x + w, y + h)); - lineTo(VPointF(x , y + h)); - lineTo(VPointF(x , y)); - close(); + moveTo(VPointF(x + w, y)); + lineTo(VPointF(x + w, y + h)); + lineTo(VPointF(x, y + h)); + lineTo(VPointF(x, y)); + close(); } else { - moveTo(VPointF(x + w, y)); - lineTo(VPointF(x , y)); - lineTo(VPointF(x , y + h)); - lineTo(VPointF(x + w, y + h)); - close(); + moveTo(VPointF(x + w, y)); + lineTo(VPointF(x, y)); + lineTo(VPointF(x, y + h)); + lineTo(VPointF(x + w, y + h)); + close(); } } -void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) +void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, + VPath::Direction dir) { if (vCompare(rx, 0.f) || vCompare(ry, 0.f)) { addRect(rect, dir); @@ -225,49 +237,46 @@ void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, VPat float w = rect.width(); float h = rect.height(); // clamp the rx and ry radius value. - rx = 2*rx; - ry = 2*ry; + rx = 2 * rx; + ry = 2 * ry; if (rx > w) rx = w; if (ry > h) ry = h; - if (dir == VPath::Direction::CW) { - moveTo(VPointF(x + w, y + ry/2.f)); - arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0 , -90, false); - arcTo(VRectF(x, y + h - ry, rx, ry), -90 , -90, false); - arcTo(VRectF(x, y, rx, ry), -180 , -90, false); - arcTo(VRectF(x + w - rx, y, rx, ry), -270 , -90, false); - close(); - } else { - moveTo(VPointF(x + w, y + ry/2.f)); - arcTo(VRectF(x + w - rx, y , rx, ry), 0 , 90, false); - arcTo(VRectF(x, y, rx, ry), 90 , 90, false); - arcTo(VRectF(x, y + h - ry, rx, ry), 180 , 90, false); - arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 270 , 90, false); - close(); - } + if (dir == VPath::Direction::CW) { + moveTo(VPointF(x + w, y + ry / 2.f)); + arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0, -90, false); + arcTo(VRectF(x, y + h - ry, rx, ry), -90, -90, false); + arcTo(VRectF(x, y, rx, ry), -180, -90, false); + arcTo(VRectF(x + w - rx, y, rx, ry), -270, -90, false); + close(); + } else { + moveTo(VPointF(x + w, y + ry / 2.f)); + arcTo(VRectF(x + w - rx, y, rx, ry), 0, 90, false); + arcTo(VRectF(x, y, rx, ry), 90, 90, false); + arcTo(VRectF(x, y + h - ry, rx, ry), 180, 90, false); + arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 270, 90, false); + close(); + } } static float tForArcAngle(float angle); -void findEllipseCoords(const VRectF &r, float angle, float length, - VPointF* startPoint, VPointF *endPoint) +void findEllipseCoords(const VRectF &r, float angle, float length, + VPointF *startPoint, VPointF *endPoint) { if (r.isNull()) { - if (startPoint) - *startPoint = VPointF(); - if (endPoint) - *endPoint = VPointF(); + if (startPoint) *startPoint = VPointF(); + if (endPoint) *endPoint = VPointF(); return; } float w2 = r.width() / 2; float h2 = r.height() / 2; - float angles[2] = { angle, angle + length }; - VPointF *points[2] = { startPoint, endPoint }; + float angles[2] = {angle, angle + length}; + VPointF *points[2] = {startPoint, endPoint}; for (int i = 0; i < 2; ++i) { - if (!points[i]) - continue; + if (!points[i]) continue; float theta = angles[i] - 360 * floor(angles[i] / 360); float t = theta / 90; @@ -278,68 +287,75 @@ void findEllipseCoords(const VRectF &r, float angle, float length, t = tForArcAngle(90 * t); // swap x and y? - if (quadrant & 1) - t = 1 - t; + if (quadrant & 1) t = 1 - t; float a, b, c, d; VBezier::coefficients(t, a, b, c, d); - VPointF p(a + b + c*PATH_KAPPA, d + c + b*PATH_KAPPA); + VPointF p(a + b + c * PATH_KAPPA, d + c + b * PATH_KAPPA); // left quadrants - if (quadrant == 1 || quadrant == 2) - p.rx() = -p.x(); + if (quadrant == 1 || quadrant == 2) p.rx() = -p.x(); // top quadrants - if (quadrant == 0 || quadrant == 1) - p.ry() = -p.y(); + if (quadrant == 0 || quadrant == 1) p.ry() = -p.y(); *points[i] = r.center() + VPointF(w2 * p.x(), h2 * p.y()); } } -static float -tForArcAngle(float angle) +static float tForArcAngle(float angle) { - float radians, cos_angle, sin_angle, tc, ts, t; + float radians, cos_angle, sin_angle, tc, ts, t; - if (vCompare(angle,0.f)) return 0; - if (vCompare(angle, 90.0f)) return 1; + if (vCompare(angle, 0.f)) return 0; + if (vCompare(angle, 90.0f)) return 1; - radians = (angle/180) * M_PI; + radians = (angle / 180) * M_PI; - cos_angle = cos(radians); - sin_angle = sin(radians); + cos_angle = cos(radians); + sin_angle = sin(radians); - // initial guess - tc = angle / 90; + // initial guess + tc = angle / 90; - // do some iterations of newton's method to approximate cos_angle - // finds the zero of the function b.pointAt(tc).x() - cos_angle - tc -= ((((2-3*PATH_KAPPA) * tc + 3*(PATH_KAPPA-1)) * tc) * tc + 1 - cos_angle) // value - / (((6-9*PATH_KAPPA) * tc + 6*(PATH_KAPPA-1)) * tc); // derivative - tc -= ((((2-3*PATH_KAPPA) * tc + 3*(PATH_KAPPA-1)) * tc) * tc + 1 - cos_angle) // value - / (((6-9*PATH_KAPPA) * tc + 6*(PATH_KAPPA-1)) * tc); // derivative + // do some iterations of newton's method to approximate cos_angle + // finds the zero of the function b.pointAt(tc).x() - cos_angle + tc -= ((((2 - 3 * PATH_KAPPA) * tc + 3 * (PATH_KAPPA - 1)) * tc) * tc + 1 - + cos_angle) // value + / (((6 - 9 * PATH_KAPPA) * tc + 6 * (PATH_KAPPA - 1)) * + tc); // derivative + tc -= ((((2 - 3 * PATH_KAPPA) * tc + 3 * (PATH_KAPPA - 1)) * tc) * tc + 1 - + cos_angle) // value + / (((6 - 9 * PATH_KAPPA) * tc + 6 * (PATH_KAPPA - 1)) * + tc); // derivative - // initial guess - ts = tc; - // do some iterations of newton's method to approximate sin_angle - // finds the zero of the function b.pointAt(tc).y() - sin_angle - ts -= ((((3*PATH_KAPPA-2) * ts - 6*PATH_KAPPA + 3) * ts + 3*PATH_KAPPA) * ts - sin_angle) - / (((9*PATH_KAPPA-6) * ts + 12*PATH_KAPPA - 6) * ts + 3*PATH_KAPPA); - ts -= ((((3*PATH_KAPPA-2) * ts - 6*PATH_KAPPA + 3) * ts + 3*PATH_KAPPA) * ts - sin_angle) - / (((9*PATH_KAPPA-6) * ts + 12*PATH_KAPPA - 6) * ts + 3*PATH_KAPPA); + // initial guess + ts = tc; + // do some iterations of newton's method to approximate sin_angle + // finds the zero of the function b.pointAt(tc).y() - sin_angle + ts -= ((((3 * PATH_KAPPA - 2) * ts - 6 * PATH_KAPPA + 3) * ts + + 3 * PATH_KAPPA) * + ts - + sin_angle) / + (((9 * PATH_KAPPA - 6) * ts + 12 * PATH_KAPPA - 6) * ts + + 3 * PATH_KAPPA); + ts -= ((((3 * PATH_KAPPA - 2) * ts - 6 * PATH_KAPPA + 3) * ts + + 3 * PATH_KAPPA) * + ts - + sin_angle) / + (((9 * PATH_KAPPA - 6) * ts + 12 * PATH_KAPPA - 6) * ts + + 3 * PATH_KAPPA); - // use the average of the t that best approximates cos_angle - // and the t that best approximates sin_angle - t = 0.5 * (tc + ts); - return t; + // use the average of the t that best approximates cos_angle + // and the t that best approximates sin_angle + t = 0.5 * (tc + ts); + return t; } - // The return value is the starting point of the arc -static VPointF -curvesForArc(const VRectF &rect, float startAngle, float sweepLength, - VPointF *curves, int *point_count) +static VPointF curvesForArc(const VRectF &rect, float startAngle, + float sweepLength, VPointF *curves, + int *point_count) { if (rect.isNull()) { return VPointF(); @@ -356,44 +372,37 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, float h2 = rect.height() / 2; float h2k = h2 * PATH_KAPPA; - VPointF points[16] = - { + VPointF points[16] = { // start point VPointF(x + w, y + h2), // 0 -> 270 degrees - VPointF(x + w, y + h2 + h2k), - VPointF(x + w2 + w2k, y + h), + VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), VPointF(x + w2, y + h), // 270 -> 180 degrees - VPointF(x + w2 - w2k, y + h), - VPointF(x, y + h2 + h2k), + VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), VPointF(x, y + h2), // 180 -> 90 degrees - VPointF(x, y + h2 - h2k), - VPointF(x + w2 - w2k, y), - VPointF(x + w2, y), + VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), VPointF(x + w2, y), // 90 -> 0 degrees - VPointF(x + w2 + w2k, y), - VPointF(x + w, y + h2 - h2k), - VPointF(x + w, y + h2) - }; + VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), + VPointF(x + w, y + h2)}; - if (sweepLength > 360) sweepLength = 360; - else if (sweepLength < -360) sweepLength = -360; + if (sweepLength > 360) + sweepLength = 360; + else if (sweepLength < -360) + sweepLength = -360; // Special case fast paths if (startAngle == 0.0) { if (sweepLength == 360.0) { - for (int i = 11; i >= 0; --i) - curves[(*point_count)++] = points[i]; + for (int i = 11; i >= 0; --i) curves[(*point_count)++] = points[i]; return points[12]; } else if (sweepLength == -360.0) { - for (int i = 1; i <= 12; ++i) - curves[(*point_count)++] = points[i]; + for (int i = 1; i <= 12; ++i) curves[(*point_count)++] = points[i]; return points[0]; } } @@ -446,9 +455,11 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, VBezier b; if (delta > 0) - b = VBezier::fromPoints(points[j + 3], points[j + 2], points[j + 1], points[j]); + b = VBezier::fromPoints(points[j + 3], points[j + 2], points[j + 1], + points[j]); else - b = VBezier::fromPoints(points[j], points[j + 1], points[j + 2], points[j + 3]); + b = VBezier::fromPoints(points[j], points[j + 1], points[j + 2], + points[j + 3]); // empty arc? if (startSegment == endSegment && vCompare(startT, endT)) @@ -474,151 +485,160 @@ curvesForArc(const VRectF &rect, float startAngle, float sweepLength, return startPoint; } -void VPath::VPathData::addPolystar(float points, float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, - float startAngle, float cx, float cy, VPath::Direction dir) +void VPath::VPathData::addPolystar(float points, float innerRadius, + float outerRadius, float innerRoundness, + float outerRoundness, float startAngle, + float cx, float cy, VPath::Direction dir) { - const static float POLYSTAR_MAGIC_NUMBER = 0.47829 / 0.28; - float currentAngle = (startAngle - 90.0) * M_PI / 180.0; - float x; - float y; - float previousX; - float previousY; - float partialPointRadius = 0; - float anglePerPoint = (float) (2.0 * M_PI / points); - float halfAnglePerPoint = anglePerPoint / 2.0; - float partialPointAmount = points - (int) points; - bool longSegment = false; - int numPoints = (int) ceil(points) * 2.0; - float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); + const static float POLYSTAR_MAGIC_NUMBER = 0.47829 / 0.28; + float currentAngle = (startAngle - 90.0) * M_PI / 180.0; + float x; + float y; + float previousX; + float previousY; + float partialPointRadius = 0; + float anglePerPoint = (float)(2.0 * M_PI / points); + float halfAnglePerPoint = anglePerPoint / 2.0; + float partialPointAmount = points - (int)points; + bool longSegment = false; + int numPoints = (int)ceil(points) * 2.0; + float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); - innerRoundness /= 100.0; - outerRoundness /= 100.0; + innerRoundness /= 100.0; + outerRoundness /= 100.0; - if (partialPointAmount != 0) { - currentAngle += halfAnglePerPoint * (1.0 - partialPointAmount) * angleDir; - } + if (partialPointAmount != 0) { + currentAngle += + halfAnglePerPoint * (1.0 - partialPointAmount) * angleDir; + } - if (partialPointAmount != 0) { - partialPointRadius = innerRadius + partialPointAmount * (outerRadius - innerRadius); - x = (float) (partialPointRadius * cos(currentAngle)); - y = (float) (partialPointRadius * sin(currentAngle)); + if (partialPointAmount != 0) { + partialPointRadius = + innerRadius + partialPointAmount * (outerRadius - innerRadius); + x = (float)(partialPointRadius * cos(currentAngle)); + y = (float)(partialPointRadius * sin(currentAngle)); currentAngle += anglePerPoint * partialPointAmount / 2.0 * angleDir; - } else { - x = (float) (outerRadius * cos(currentAngle)); - y = (float) (outerRadius * sin(currentAngle)); + } else { + x = (float)(outerRadius * cos(currentAngle)); + y = (float)(outerRadius * sin(currentAngle)); currentAngle += halfAnglePerPoint * angleDir; - } + } - moveTo(VPointF(x + cx, y + cy)); + moveTo(VPointF(x + cx, y + cy)); - for (int i = 0; i < numPoints; i++) { + for (int i = 0; i < numPoints; i++) { float radius = longSegment ? outerRadius : innerRadius; float dTheta = halfAnglePerPoint; if (partialPointRadius != 0 && i == numPoints - 2) { - dTheta = anglePerPoint * partialPointAmount / 2.0; + dTheta = anglePerPoint * partialPointAmount / 2.0; } if (partialPointRadius != 0 && i == numPoints - 1) { - radius = partialPointRadius; + radius = partialPointRadius; } previousX = x; previousY = y; - x = (float) (radius * cos(currentAngle)); - y = (float) (radius * sin(currentAngle)); + x = (float)(radius * cos(currentAngle)); + y = (float)(radius * sin(currentAngle)); if (innerRoundness == 0 && outerRoundness == 0) { - lineTo(VPointF(x + cx, y + cy)); + lineTo(VPointF(x + cx, y + cy)); } else { - float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0 * angleDir); - float cp1Dx = (float) cos(cp1Theta); - float cp1Dy = (float) sin(cp1Theta); - float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0 * angleDir); - float cp2Dx = (float) cos(cp2Theta); - float cp2Dy = (float) sin(cp2Theta); + float cp1Theta = + (float)(atan2(previousY, previousX) - M_PI / 2.0 * angleDir); + float cp1Dx = (float)cos(cp1Theta); + float cp1Dy = (float)sin(cp1Theta); + float cp2Theta = (float)(atan2(y, x) - M_PI / 2.0 * angleDir); + float cp2Dx = (float)cos(cp2Theta); + float cp2Dy = (float)sin(cp2Theta); - float cp1Roundness = longSegment ? innerRoundness : outerRoundness; - float cp2Roundness = longSegment ? outerRoundness : innerRoundness; - float cp1Radius = longSegment ? innerRadius : outerRadius; - float cp2Radius = longSegment ? outerRadius : innerRadius; + float cp1Roundness = longSegment ? innerRoundness : outerRoundness; + float cp2Roundness = longSegment ? outerRoundness : innerRoundness; + float cp1Radius = longSegment ? innerRadius : outerRadius; + float cp2Radius = longSegment ? outerRadius : innerRadius; - float cp1x = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * cp1Dx / points; - float cp1y = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * cp1Dy / points; - float cp2x = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * cp2Dx / points; - float cp2y = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * cp2Dy / points; + float cp1x = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * + cp1Dx / points; + float cp1y = cp1Radius * cp1Roundness * POLYSTAR_MAGIC_NUMBER * + cp1Dy / points; + float cp2x = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * + cp2Dx / points; + float cp2y = cp2Radius * cp2Roundness * POLYSTAR_MAGIC_NUMBER * + cp2Dy / points; - if ((partialPointAmount != 0) && - ((i == 0) || (i == numPoints - 1))) { - cp1x *= partialPointAmount; - cp1y *= partialPointAmount; - cp2x *= partialPointAmount; - cp2y *= partialPointAmount; - } + if ((partialPointAmount != 0) && + ((i == 0) || (i == numPoints - 1))) { + cp1x *= partialPointAmount; + cp1y *= partialPointAmount; + cp2x *= partialPointAmount; + cp2y *= partialPointAmount; + } - cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), - VPointF(x + cp2x + cx, y + cp2y + cy), - VPointF(x + cx, y + cy)); + cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), + VPointF(x + cp2x + cx, y + cp2y + cy), + VPointF(x + cx, y + cy)); } currentAngle += dTheta * angleDir; longSegment = !longSegment; - } + } - close(); + close(); } void VPath::VPathData::addPolygon(float points, float radius, float roundness, - float startAngle, float cx, float cy, VPath::Direction dir) + float startAngle, float cx, float cy, + VPath::Direction dir) { - // TODO: Need to support floating point number for number of points - const static float POLYGON_MAGIC_NUMBER = 0.25; - float currentAngle = (startAngle - 90.0) * M_PI / 180.0; - float x; - float y; - float previousX; - float previousY; - float anglePerPoint = (float) (2.0 * M_PI / floor(points)); - int numPoints = (int) floor(points); - float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); + // TODO: Need to support floating point number for number of points + const static float POLYGON_MAGIC_NUMBER = 0.25; + float currentAngle = (startAngle - 90.0) * M_PI / 180.0; + float x; + float y; + float previousX; + float previousY; + float anglePerPoint = (float)(2.0 * M_PI / floor(points)); + int numPoints = (int)floor(points); + float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); - roundness /= 100.0; + roundness /= 100.0; - currentAngle = (currentAngle - 90.0) * M_PI / 180.0; - x = (float) (radius * cos(currentAngle)); - y = (float) (radius * sin(currentAngle)); - currentAngle += anglePerPoint * angleDir; + currentAngle = (currentAngle - 90.0) * M_PI / 180.0; + x = (float)(radius * cos(currentAngle)); + y = (float)(radius * sin(currentAngle)); + currentAngle += anglePerPoint * angleDir; - moveTo(VPointF(x + cx, y + cy)); + moveTo(VPointF(x + cx, y + cy)); - for (int i = 0; i < numPoints; i++) { + for (int i = 0; i < numPoints; i++) { previousX = x; previousY = y; - x = (float) (radius * cos(currentAngle)); - y = (float) (radius * sin(currentAngle)); + x = (float)(radius * cos(currentAngle)); + y = (float)(radius * sin(currentAngle)); if (roundness != 0) { - float cp1Theta = (float) (atan2(previousY, previousX) - M_PI / 2.0 * angleDir); - float cp1Dx = (float) cos(cp1Theta); - float cp1Dy = (float) sin(cp1Theta); - float cp2Theta = (float) (atan2(y, x) - M_PI / 2.0 * angleDir); - float cp2Dx = (float) cos(cp2Theta); - float cp2Dy = (float) sin(cp2Theta); + float cp1Theta = + (float)(atan2(previousY, previousX) - M_PI / 2.0 * angleDir); + float cp1Dx = (float)cos(cp1Theta); + float cp1Dy = (float)sin(cp1Theta); + float cp2Theta = (float)(atan2(y, x) - M_PI / 2.0 * angleDir); + float cp2Dx = (float)cos(cp2Theta); + float cp2Dy = (float)sin(cp2Theta); - float cp1x = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dx; - float cp1y = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dy; - float cp2x = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dx; - float cp2y = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dy; + float cp1x = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dx; + float cp1y = radius * roundness * POLYGON_MAGIC_NUMBER * cp1Dy; + float cp2x = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dx; + float cp2y = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dy; - cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), - VPointF(x + cp2x + cx, y + cp2y + cy), - VPointF(x, y)); + cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), + VPointF(x + cp2x + cx, y + cp2y + cy), VPointF(x, y)); } else { - lineTo(VPointF(x + cx, y + cy)); + lineTo(VPointF(x + cx, y + cy)); } currentAngle += anglePerPoint * angleDir; - } + } - close(); + close(); } V_END_NAMESPACE diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 2782861713..2d1858dfa7 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -1,91 +1,94 @@ #ifndef VPATH_H #define VPATH_H +#include +#include "vcowptr.h" +#include "vmatrix.h" #include "vpoint.h" #include "vrect.h" -#include "vmatrix.h" -#include -#include V_BEGIN_NAMESPACE struct VPathData; -class VPath -{ +class VPath { public: - enum class Direction { - CCW, - CW - }; + enum class Direction { CCW, CW }; - enum class Element : uchar { - MoveTo, - LineTo, - CubicTo, - Close - }; - bool isEmpty()const; - void moveTo(const VPointF &p); - void moveTo(float x, float y); - void lineTo(const VPointF &p); - void lineTo(float x, float y); - void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); - void cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey); - void arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo); - void close(); - void reset(); - void reserve(int pts, int elms); - int segments() const; - void addCircle(float cx, float cy, float radius, VPath::Direction dir = Direction::CW); - void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); - void addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir = Direction::CW); - void addRect(const VRectF &rect, VPath::Direction dir = Direction::CW); - void addPolystar(float points, float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, - float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); - void addPolygon(float points, float radius, float roundness, - float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); - void transform(const VMatrix &m); + enum class Element : uchar { MoveTo, LineTo, CubicTo, Close }; + bool isEmpty() const; + void moveTo(const VPointF &p); + void moveTo(float x, float y); + void lineTo(const VPointF &p); + void lineTo(float x, float y); + void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); + void cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, + float ey); + void arcTo(const VRectF &rect, float startAngle, float sweepLength, + bool forceMoveTo); + void close(); + void reset(); + void reserve(int pts, int elms); + int segments() const; + void addCircle(float cx, float cy, float radius, + VPath::Direction dir = Direction::CW); + void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); + void addRoundRect(const VRectF &rect, float rx, float ry, + VPath::Direction dir = Direction::CW); + void addRect(const VRectF &rect, VPath::Direction dir = Direction::CW); + void addPolystar(float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + float startAngle, float cx, float cy, + VPath::Direction dir = Direction::CW); + void addPolygon(float points, float radius, float roundness, + float startAngle, float cx, float cy, + VPath::Direction dir = Direction::CW); + void transform(const VMatrix &m); float length() const; const std::vector &elements() const; - const std::vector &points() const; + const std::vector & points() const; + private: struct VPathData { VPathData(); VPathData(const VPathData &o); - bool isEmpty() const { return m_elements.empty();} - void moveTo(const VPointF &pt); - void lineTo(const VPointF &pt); - void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); - void close(); - void reset(); - void reserve(int, int); - void checkNewSegment(); - int segments() const; - void transform(const VMatrix &m); + bool isEmpty() const { return m_elements.empty(); } + void moveTo(const VPointF &pt); + void lineTo(const VPointF &pt); + void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); + void close(); + void reset(); + void reserve(int, int); + void checkNewSegment(); + int segments() const; + void transform(const VMatrix &m); float length() const; - void addRoundRect(const VRectF &, float, float, VPath::Direction); - void addRect(const VRectF &, VPath::Direction); - void arcTo(const VRectF&, float, float, bool); - void addCircle(float, float, float, VPath::Direction); - void addOval(const VRectF &, VPath::Direction); - void addPolystar(float points, float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, - float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); - void addPolygon(float points, float radius, float roundness, - float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); - const std::vector &elements() const { return m_elements;} - const std::vector &points() const {return m_points;} - std::vector m_points; - std::vector m_elements; - int m_segments; - VPointF mStartPoint; - bool mNewSegment; + void addRoundRect(const VRectF &, float, float, VPath::Direction); + void addRect(const VRectF &, VPath::Direction); + void arcTo(const VRectF &, float, float, bool); + void addCircle(float, float, float, VPath::Direction); + void addOval(const VRectF &, VPath::Direction); + void addPolystar(float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, + float startAngle, float cx, float cy, + VPath::Direction dir = Direction::CW); + void addPolygon(float points, float radius, float roundness, + float startAngle, float cx, float cy, + VPath::Direction dir = Direction::CW); + const std::vector &elements() const + { + return m_elements; + } + const std::vector &points() const { return m_points; } + std::vector m_points; + std::vector m_elements; + int m_segments; + VPointF mStartPoint; + bool mNewSegment; }; vcow_ptr d; }; -inline bool VPath::isEmpty()const +inline bool VPath::isEmpty() const { return d->isEmpty(); } @@ -122,26 +125,28 @@ inline int VPath::segments() const inline float VPath::length() const { - //TODO re-calculate when there is a change + // TODO re-calculate when there is a change return d->length(); } -inline void VPath::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) +inline void VPath::cubicTo(const VPointF &c1, const VPointF &c2, + const VPointF &e) { d.write().cubicTo(c1, c2, e); } inline void VPath::lineTo(float x, float y) { - lineTo(VPointF(x,y)); + lineTo(VPointF(x, y)); } inline void VPath::moveTo(float x, float y) { - moveTo(VPointF(x,y)); + moveTo(VPointF(x, y)); } -inline void VPath::cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey) +inline void VPath::cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, + float ey) { cubicTo(VPointF(c1x, c1y), VPointF(c2x, c2y), VPointF(ex, ey)); } @@ -151,7 +156,8 @@ inline void VPath::transform(const VMatrix &m) d.write().transform(m); } -inline void VPath::arcTo(const VRectF &rect, float startAngle, float sweepLength, bool forceMoveTo) +inline void VPath::arcTo(const VRectF &rect, float startAngle, + float sweepLength, bool forceMoveTo) { d.write().arcTo(rect, startAngle, sweepLength, forceMoveTo); } @@ -161,12 +167,14 @@ inline void VPath::addRect(const VRectF &rect, VPath::Direction dir) d.write().addRect(rect, dir); } -inline void VPath::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) +inline void VPath::addRoundRect(const VRectF &rect, float rx, float ry, + VPath::Direction dir) { - d.write().addRoundRect(rect, rx, ry, dir); + d.write().addRoundRect(rect, rx, ry, dir); } -inline void VPath::addCircle(float cx, float cy, float radius, VPath::Direction dir) +inline void VPath::addCircle(float cx, float cy, float radius, + VPath::Direction dir) { d.write().addCircle(cx, cy, radius, dir); } @@ -176,20 +184,20 @@ inline void VPath::addOval(const VRectF &rect, VPath::Direction dir) d.write().addOval(rect, dir); } -inline void VPath::addPolystar(float points, float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, - float startAngle, float cx, float cy, VPath::Direction dir) +inline void VPath::addPolystar(float points, float innerRadius, + float outerRadius, float innerRoundness, + float outerRoundness, float startAngle, float cx, + float cy, VPath::Direction dir) { - d.write().addPolystar(points, innerRadius, outerRadius, - innerRoundness, outerRoundness, - startAngle, cx, cy, dir); + d.write().addPolystar(points, innerRadius, outerRadius, innerRoundness, + outerRoundness, startAngle, cx, cy, dir); } inline void VPath::addPolygon(float points, float radius, float roundness, - float startAngle, float cx, float cy, VPath::Direction dir) + float startAngle, float cx, float cy, + VPath::Direction dir) { - d.write().addPolygon(points, radius, roundness, - startAngle, cx, cy, dir); + d.write().addPolygon(points, radius, roundness, startAngle, cx, cy, dir); } inline const std::vector &VPath::elements() const @@ -204,4 +212,4 @@ inline const std::vector &VPath::points() const V_END_NAMESPACE -#endif // VPATH_H +#endif // VPATH_H diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 835f0f875f..5e93f8ff15 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,28 +1,28 @@ -#include"vpathmesure.h" -#include"vbezier.h" -#include"vdasher.h" +#include "vpathmesure.h" +#include "vbezier.h" +#include "vdasher.h" V_BEGIN_NAMESPACE void VPathMesure::setOffset(float sp, float ep) { - startOffset = sp; - endOffset = ep; + startOffset = sp; + endOffset = ep; } VPath VPathMesure::trim(const VPath &path) { - if (vCompare(startOffset, 0.0f) && (vCompare(endOffset, 1.0f))) return path; + if (vCompare(startOffset, 0.0f) && (vCompare(endOffset, 1.0f))) return path; - float len = path.length(); - float sg = len * startOffset; - float eg = len * (1.0f - endOffset); - len = len - (sg + eg); + float len = path.length(); + float sg = len * startOffset; + float eg = len * (1.0f - endOffset); + len = len - (sg + eg); - float array[5] = { 0.0f, sg, len, 1000, 0.0f }; - VDasher dasher(array, 5); + float array[5] = {0.0f, sg, len, 1000, 0.0f}; + VDasher dasher(array, 5); - return dasher.dashed(path); + return dasher.dashed(path); } V_END_NAMESPACE diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 6e507c838d..61b1d34e22 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -5,16 +5,16 @@ V_BEGIN_NAMESPACE -class VPathMesure -{ +class VPathMesure { public: - void setOffset(float sp, float ep); - VPath trim(const VPath &path); + void setOffset(float sp, float ep); + VPath trim(const VPath &path); + private: - float startOffset { 0.0f }; - float endOffset { 1.0f }; + float startOffset{0.0f}; + float endOffset{1.0f}; }; V_END_NAMESPACE -#endif // VPATHMESURE_H +#endif // VPATHMESURE_H diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 3d47514a8f..3c94ab0c30 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -1,151 +1,188 @@ #ifndef VPOINT_H #define VPOINT_H -#include"vglobal.h" +#include "vglobal.h" V_BEGIN_NAMESPACE -class VPointF -{ +class VPointF { public: - constexpr inline VPointF() noexcept :mx(0), my(0){} - constexpr inline VPointF(float x, float y) noexcept :mx(x), my(y){} - constexpr inline float x() const noexcept {return mx;} - constexpr inline float y() const noexcept {return my;} - inline float& rx() noexcept {return mx;} - inline float& ry() noexcept {return my;} - inline void setX(float x) {mx = x;} - inline void setY(float y) {my = y;} - inline VPointF operator-() noexcept { return VPointF(-mx, -my); } - inline VPointF &operator+=(const VPointF &p) noexcept; - inline VPointF &operator-=(const VPointF &p) noexcept; - friend const VPointF operator+(const VPointF & p1, const VPointF & p2) { - return VPointF(p1.mx + p2.mx , p1.my + p2.my); + constexpr inline VPointF() noexcept : mx(0), my(0) {} + constexpr inline VPointF(float x, float y) noexcept : mx(x), my(y) {} + constexpr inline float x() const noexcept { return mx; } + constexpr inline float y() const noexcept { return my; } + inline float & rx() noexcept { return mx; } + inline float & ry() noexcept { return my; } + inline void setX(float x) { mx = x; } + inline void setY(float y) { my = y; } + inline VPointF operator-() noexcept { return VPointF(-mx, -my); } + inline VPointF & operator+=(const VPointF &p) noexcept; + inline VPointF & operator-=(const VPointF &p) noexcept; + friend const VPointF operator+(const VPointF &p1, const VPointF &p2) + { + return VPointF(p1.mx + p2.mx, p1.my + p2.my); } - inline friend const bool fuzzyCompare(const VPointF & p1, const VPointF & p2); - inline friend VDebug& operator<<(VDebug& os, const VPointF& o); + inline friend const bool fuzzyCompare(const VPointF &p1, const VPointF &p2); + inline friend VDebug & operator<<(VDebug &os, const VPointF &o); - friend inline VPointF operator-(const VPointF &p1, const VPointF &p2); + friend inline VPointF operator-(const VPointF &p1, const VPointF &p2); friend inline const VPointF operator*(const VPointF &, float val); friend inline const VPointF operator*(float val, const VPointF &); friend inline const VPointF operator/(const VPointF &, float val); friend inline const VPointF operator/(float val, const VPointF &); + private: float mx; float my; }; -inline const bool fuzzyCompare(const VPointF & p1, const VPointF & p2) +inline const bool fuzzyCompare(const VPointF &p1, const VPointF &p2) { - return (vCompare(p1.mx , p2.mx) && vCompare(p1.my , p2.my)); + return (vCompare(p1.mx, p2.mx) && vCompare(p1.my, p2.my)); } - inline VPointF operator-(const VPointF &p1, const VPointF &p2) { - return VPointF(p1.mx-p2.mx, p1.my-p2.my); + return VPointF(p1.mx - p2.mx, p1.my - p2.my); } inline const VPointF operator*(const VPointF &p, float c) -{ return VPointF(p.mx*c, p.my*c); } +{ + return VPointF(p.mx * c, p.my * c); +} inline const VPointF operator*(float c, const VPointF &p) -{ return VPointF(p.mx*c, p.my*c); } +{ + return VPointF(p.mx * c, p.my * c); +} inline const VPointF operator/(const VPointF &p, float c) -{ return VPointF(p.mx/c, p.my/c); } +{ + return VPointF(p.mx / c, p.my / c); +} inline const VPointF operator/(float c, const VPointF &p) -{ return VPointF(p.mx/c, p.my/c); } - -inline VDebug& operator<<(VDebug& os, const VPointF& o) { - os<<"{P "< -#include"vdebug.h" -#include"vtaskqueue.h" -#include +#include "vraster.h" +#include +#include +#include "v_ft_raster.h" +#include "v_ft_stroker.h" +#include "vdebug.h" +#include "vmatrix.h" +#include "vpath.h" +#include "vtaskqueue.h" V_BEGIN_NAMESPACE -struct FTOutline -{ +struct FTOutline { public: - FTOutline():mMemory(nullptr){} - ~FTOutline(){delete[] mMemory;} - void releaseMemory() { - if (mMemory) delete [] mMemory; + FTOutline() : mMemory(nullptr) {} + ~FTOutline() { delete[] mMemory; } + void releaseMemory() + { + if (mMemory) delete[] mMemory; mMemory = nullptr; mPointSize = 0; mSegmentSize = 0; @@ -31,16 +31,16 @@ public: void close(); void end(); void transform(const VMatrix &m); - SW_FT_Outline ft; - SW_FT_Vector *mMemory{nullptr}; - int mPointSize{0}; - int mSegmentSize{0}; - bool closed{false}; - SW_FT_Stroker_LineCap ftCap; - SW_FT_Stroker_LineJoin ftJoin; - SW_FT_Fixed ftWidth; - SW_FT_Fixed ftMeterLimit; - SW_FT_Bool ftClosed; + SW_FT_Outline ft; + SW_FT_Vector * mMemory{nullptr}; + int mPointSize{0}; + int mSegmentSize{0}; + bool closed{false}; + SW_FT_Stroker_LineCap ftCap; + SW_FT_Stroker_LineJoin ftJoin; + SW_FT_Fixed ftWidth; + SW_FT_Fixed ftMeterLimit; + SW_FT_Bool ftClosed; }; void FTOutline::reset() @@ -52,19 +52,19 @@ void FTOutline::reset() void FTOutline::grow(int points, int segments) { reset(); - if (mPointSize >= points && mSegmentSize >= segments) - return; + if (mPointSize >= points && mSegmentSize >= segments) return; // release old memory releaseMemory(); - //update book keeping + // update book keeping mPointSize = points; mSegmentSize = segments; int point_size = (points + segments); int contour_size = ((sizeof(short) * segments) / sizeof(SW_FT_Vector)) + 1; - int tag_size = ((sizeof(char) * (points + segments)) / sizeof(SW_FT_Vector)) + 1; + int tag_size = + ((sizeof(char) * (points + segments)) / sizeof(SW_FT_Vector)) + 1; /* * Optimization, instead of allocating 3 different buffer @@ -80,13 +80,13 @@ void FTOutline::grow(int points, int segments) void FTOutline::convert(const VPath &path) { const std::vector &elements = path.elements(); - const std::vector &points = path.points(); + const std::vector & points = path.points(); grow(points.size(), path.segments()); int index = 0; - for(auto element : elements) { - switch (element){ + for (auto element : elements) { + switch (element) { case VPath::Element::MoveTo: moveTo(points[index]); index++; @@ -96,8 +96,8 @@ void FTOutline::convert(const VPath &path) index++; break; case VPath::Element::CubicTo: - cubicTo(points[index], points[index+1], points[index+2]); - index = index+3; + cubicTo(points[index], points[index + 1], points[index + 2]); + index = index + 3; break; case VPath::Element::Close: close(); @@ -109,48 +109,46 @@ void FTOutline::convert(const VPath &path) end(); } -void FTOutline::convert(CapStyle cap, JoinStyle join, - float width, float meterLimit) +void FTOutline::convert(CapStyle cap, JoinStyle join, float width, + float meterLimit) { - ftClosed = (SW_FT_Bool) closed; + ftClosed = (SW_FT_Bool)closed; - // map strokeWidth to freetype. It uses as the radius of the pen not the diameter - width = width/2.0; + // map strokeWidth to freetype. It uses as the radius of the pen not the + // diameter + width = width / 2.0; // convert to freetype co-ordinate - //IMP: stroker takes radius in 26.6 co-ordinate - ftWidth = SW_FT_Fixed(width * (1<<6)); - //IMP: stroker takes meterlimit in 16.16 co-ordinate - ftMeterLimit = SW_FT_Fixed(meterLimit * (1<<16)); + // IMP: stroker takes radius in 26.6 co-ordinate + ftWidth = SW_FT_Fixed(width * (1 << 6)); + // IMP: stroker takes meterlimit in 16.16 co-ordinate + ftMeterLimit = SW_FT_Fixed(meterLimit * (1 << 16)); // map to freetype capstyle - switch (cap) - { - case CapStyle::Square: - ftCap = SW_FT_STROKER_LINECAP_SQUARE; - break; - case CapStyle::Round: - ftCap = SW_FT_STROKER_LINECAP_ROUND; - break; - default: - ftCap = SW_FT_STROKER_LINECAP_BUTT; - break; - } - switch (join) - { - case JoinStyle::Bevel: - ftJoin = SW_FT_STROKER_LINEJOIN_BEVEL; - break; - case JoinStyle::Round: - ftJoin = SW_FT_STROKER_LINEJOIN_ROUND; - break; - default: - ftJoin = SW_FT_STROKER_LINEJOIN_MITER; - break; - } + switch (cap) { + case CapStyle::Square: + ftCap = SW_FT_STROKER_LINECAP_SQUARE; + break; + case CapStyle::Round: + ftCap = SW_FT_STROKER_LINECAP_ROUND; + break; + default: + ftCap = SW_FT_STROKER_LINECAP_BUTT; + break; + } + switch (join) { + case JoinStyle::Bevel: + ftJoin = SW_FT_STROKER_LINEJOIN_BEVEL; + break; + case JoinStyle::Round: + ftJoin = SW_FT_STROKER_LINEJOIN_ROUND; + break; + default: + ftJoin = SW_FT_STROKER_LINEJOIN_MITER; + break; + } } - -#define TO_FT_COORD(x) ((x) * 64) // to freetype 26.6 coordinate. +#define TO_FT_COORD(x) ((x)*64) // to freetype 26.6 coordinate. void FTOutline::moveTo(const VPointF &pt) { @@ -174,7 +172,8 @@ void FTOutline::lineTo(const VPointF &pt) closed = false; } -void FTOutline::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF ep) +void FTOutline::cubicTo(const VPointF &cp1, const VPointF &cp2, + const VPointF ep) { ft.points[ft.n_points].x = TO_FT_COORD(cp1.x()); ft.points[ft.n_points].y = TO_FT_COORD(cp1.y()); @@ -222,58 +221,54 @@ void FTOutline::end() } } -struct SpanInfo -{ - VRle::Span *spans; - int size; +struct SpanInfo { + VRle::Span *spans; + int size; }; -static void -rleGenerationCb( int count, const SW_FT_Span* spans,void *user) +static void rleGenerationCb(int count, const SW_FT_Span *spans, void *user) { - VRle *rle = (VRle *) user; - VRle::Span *rleSpan = (VRle::Span *)spans; - rle->addSpan(rleSpan, count); + VRle * rle = (VRle *)user; + VRle::Span *rleSpan = (VRle::Span *)spans; + rle->addSpan(rleSpan, count); } -struct RleTask -{ - RleTask() { - receiver = sender.get_future(); - } - std::promise sender; - std::future receiver; - bool stroke; - VPath path; - FillRule fillRule; - CapStyle cap; - JoinStyle join; - float width; - float meterLimit; - VRle operator()(FTOutline &outRef, SW_FT_Stroker &stroker); +struct RleTask { + RleTask() { receiver = sender.get_future(); } + std::promise sender; + std::future receiver; + bool stroke; + VPath path; + FillRule fillRule; + CapStyle cap; + JoinStyle join; + float width; + float meterLimit; + VRle operator()(FTOutline &outRef, SW_FT_Stroker &stroker); }; VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) { - if (stroke) { //Stroke Task + if (stroke) { // Stroke Task outRef.convert(path); outRef.convert(cap, join, width, meterLimit); - uint points,contors; + uint points, contors; - SW_FT_Stroker_Set(stroker, outRef.ftWidth, outRef.ftCap, outRef.ftJoin, outRef.ftMeterLimit); + SW_FT_Stroker_Set(stroker, outRef.ftWidth, outRef.ftCap, outRef.ftJoin, + outRef.ftMeterLimit); SW_FT_Stroker_ParseOutline(stroker, &outRef.ft, !outRef.ftClosed); - SW_FT_Stroker_GetCounts(stroker,&points, &contors); + SW_FT_Stroker_GetCounts(stroker, &points, &contors); FTOutline strokeOutline; strokeOutline.grow(points, contors); SW_FT_Stroker_Export(stroker, &strokeOutline.ft); - VRle rle; + VRle rle; SW_FT_Raster_Params params; - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; params.gray_spans = &rleGenerationCb; params.user = &rle; params.source = &strokeOutline; @@ -281,7 +276,7 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) sw_ft_grays_raster.raster_render(nullptr, ¶ms); return rle; - } else { //Fill Task + } else { // Fill Task outRef.convert(path); int fillRuleFlag = SW_FT_OUTLINE_NONE; switch (fillRule) { @@ -292,11 +287,11 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) fillRuleFlag = SW_FT_OUTLINE_NONE; break; } - outRef.ft.flags = fillRuleFlag; - VRle rle; + outRef.ft.flags = fillRuleFlag; + VRle rle; SW_FT_Raster_Params params; - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA ; + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; params.gray_spans = &rleGenerationCb; params.user = &rle; params.source = &outRef.ft; @@ -307,16 +302,17 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) } class RleTaskScheduler { - const unsigned _count{std::thread::hardware_concurrency()}; - std::vector _threads; + const unsigned _count{std::thread::hardware_concurrency()}; + std::vector _threads; std::vector> _q{_count}; - std::atomic _index{0}; + std::atomic _index{0}; - void run(unsigned i) { + void run(unsigned i) + { /* * initalize per thread objects. */ - FTOutline outlineRef; + FTOutline outlineRef; SW_FT_Stroker stroker; SW_FT_Stroker_New(&stroker); @@ -333,26 +329,27 @@ class RleTaskScheduler { delete task; } - //cleanup + // cleanup SW_FT_Stroker_Done(stroker); } public: - RleTaskScheduler() { + RleTaskScheduler() + { for (unsigned n = 0; n != _count; ++n) { _threads.emplace_back([&, n] { run(n); }); } } - ~RleTaskScheduler() { - for (auto& e : _q) - e.done(); + ~RleTaskScheduler() + { + for (auto &e : _q) e.done(); - for (auto& e : _threads) - e.join(); + for (auto &e : _threads) e.join(); } - std::future async(RleTask *task) { + std::future async(RleTask *task) + { auto receiver = std::move(task->receiver); auto i = _index++; @@ -365,11 +362,9 @@ public: return receiver; } - std::future strokeRle(const VPath &path, - CapStyle cap, - JoinStyle join, - float width, - float meterLimit) { + std::future strokeRle(const VPath &path, CapStyle cap, JoinStyle join, + float width, float meterLimit) + { RleTask *task = new RleTask(); task->stroke = true; task->path = path; @@ -380,7 +375,8 @@ public: return async(task); } - std::future fillRle(const VPath &path, FillRule fillRule) { + std::future fillRle(const VPath &path, FillRule fillRule) + { RleTask *task = new RleTask(); task->path = path; task->fillRule = fillRule; @@ -391,16 +387,12 @@ public: static RleTaskScheduler raster_scheduler; -VRaster::VRaster() -{ -} +VRaster::VRaster() {} -VRaster::~VRaster() -{ -} +VRaster::~VRaster() {} -std::future -VRaster::generateFillInfo(const VPath &path, FillRule fillRule) +std::future VRaster::generateFillInfo(const VPath &path, + FillRule fillRule) { if (path.isEmpty()) { std::promise promise; @@ -410,9 +402,9 @@ VRaster::generateFillInfo(const VPath &path, FillRule fillRule) return raster_scheduler.fillRle(path, fillRule); } -std::future -VRaster::generateStrokeInfo(const VPath &path, CapStyle cap, JoinStyle join, - float width, float meterLimit) +std::future VRaster::generateStrokeInfo(const VPath &path, CapStyle cap, + JoinStyle join, float width, + float meterLimit) { if (path.isEmpty()) { std::promise promise; diff --git a/src/vector/vraster.h b/src/vector/vraster.h index a2c1ad84c2..178786c252 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -1,7 +1,7 @@ #ifndef VRASTER_H #define VRASTER_H -#include"vrle.h" -#include +#include +#include "vrle.h" V_BEGIN_NAMESPACE @@ -9,8 +9,7 @@ struct FTOutline; class VPath; struct VRasterPrivate; -class VRaster -{ +class VRaster { public: ~VRaster(); static VRaster &instance() @@ -19,17 +18,20 @@ public: return Singleton; } VRaster(const VRaster &other) = delete; - VRaster(VRaster&&) = delete; - VRaster& operator=(VRaster const&) = delete; - VRaster& operator=(VRaster &&) = delete; + VRaster(VRaster &&) = delete; + VRaster &operator=(VRaster const &) = delete; + VRaster &operator=(VRaster &&) = delete; + + std::future generateFillInfo(const VPath &path, + FillRule fillRule = FillRule::Winding); + std::future generateStrokeInfo(const VPath &path, CapStyle cap, + JoinStyle join, float width, + float meterLimit); - std::future generateFillInfo(const VPath &path, FillRule fillRule = FillRule::Winding); - std::future generateStrokeInfo(const VPath &path, CapStyle cap, JoinStyle join, - float width, float meterLimit); private: VRaster(); }; V_END_NAMESPACE -#endif // VRASTER_H +#endif // VRASTER_H diff --git a/src/vector/vrect.h b/src/vector/vrect.h index c16ecab96b..0a2efdd019 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -1,39 +1,41 @@ #ifndef VRECT_H #define VRECT_H -#include"vglobal.h" -#include"vpoint.h" +#include "vglobal.h" +#include "vpoint.h" V_BEGIN_NAMESPACE -class VRect -{ +class VRect { public: - V_CONSTEXPR VRect(): x1(0), y1(0), x2(-1), y2(-1) {} - V_CONSTEXPR VRect(int left, int top, int width, int height); + V_CONSTEXPR VRect() : x1(0), y1(0), x2(-1), y2(-1) {} + V_CONSTEXPR VRect(int left, int top, int width, int height); V_CONSTEXPR inline bool isEmpty() const; V_CONSTEXPR inline bool isNull() const; - V_CONSTEXPR inline int left() const ; - V_CONSTEXPR inline int top() const ; - V_CONSTEXPR inline int right() const ; - V_CONSTEXPR inline int bottom() const ; - V_CONSTEXPR inline int width() const ; - V_CONSTEXPR inline int height() const ; - V_CONSTEXPR inline int x() const ; - V_CONSTEXPR inline int y() const ; - inline void setLeft(int l) {x1 = l;} - inline void setTop(int t) {y1 = t;} - inline void setRight(int r) {x2 = r;} - inline void setBottom(int b) {y2 = b;} - inline void setWidth(int w) {x2 = x1 + w;} - inline void setHeight(int h) {y2 = y1 + h;} - inline VRect translated(int dx, int dy) const ; - inline void translate(int dx, int dy); - inline bool contains(const VRect &r, bool proper = false) const; - inline bool intersects(const VRect &r); - friend V_CONSTEXPR inline bool operator==(const VRect &, const VRect &) noexcept; - friend V_CONSTEXPR inline bool operator!=(const VRect &, const VRect &) noexcept; - friend VDebug& operator<<(VDebug& os, const VRect& o); + V_CONSTEXPR inline int left() const; + V_CONSTEXPR inline int top() const; + V_CONSTEXPR inline int right() const; + V_CONSTEXPR inline int bottom() const; + V_CONSTEXPR inline int width() const; + V_CONSTEXPR inline int height() const; + V_CONSTEXPR inline int x() const; + V_CONSTEXPR inline int y() const; + inline void setLeft(int l) { x1 = l; } + inline void setTop(int t) { y1 = t; } + inline void setRight(int r) { x2 = r; } + inline void setBottom(int b) { y2 = b; } + inline void setWidth(int w) { x2 = x1 + w; } + inline void setHeight(int h) { y2 = y1 + h; } + inline VRect translated(int dx, int dy) const; + inline void translate(int dx, int dy); + inline bool contains(const VRect &r, bool proper = false) const; + inline bool intersects(const VRect &r); + friend V_CONSTEXPR inline bool operator==(const VRect &, + const VRect &) noexcept; + friend V_CONSTEXPR inline bool operator!=(const VRect &, + const VRect &) noexcept; + friend VDebug & operator<<(VDebug &os, const VRect &o); + private: int x1; int y1; @@ -43,55 +45,78 @@ private: inline bool VRect::intersects(const VRect &r) { - return (right() > r.left() && left() < r.right() && - bottom() > r.top() && top() < r.bottom()); + return (right() > r.left() && left() < r.right() && bottom() > r.top() && + top() < r.bottom()); } -inline VDebug& operator<<(VDebug& os, const VRect& o) +inline VDebug &operator<<(VDebug &os, const VRect &o) { - os<<"{R "< x2 || y1 > y2; } +{ + return x1 > x2 || y1 > y2; +} V_CONSTEXPR inline bool VRect::isNull() const -{ return (((x2-x1) == 0) || ((y2 - y1) == 0)); } +{ + return (((x2 - x1) == 0) || ((y2 - y1) == 0)); +} V_CONSTEXPR inline int VRect::x() const -{ return x1; } +{ + return x1; +} V_CONSTEXPR inline int VRect::y() const -{ return y1; } +{ + return y1; +} V_CONSTEXPR inline int VRect::left() const -{ return x1; } +{ + return x1; +} V_CONSTEXPR inline int VRect::top() const -{ return y1; } +{ + return y1; +} V_CONSTEXPR inline int VRect::right() const -{ return x2; } +{ + return x2; +} V_CONSTEXPR inline int VRect::bottom() const -{ return y2; } +{ + return y2; +} V_CONSTEXPR inline int VRect::width() const -{ return x2 - x1; } +{ + return x2 - x1; +} V_CONSTEXPR inline int VRect::height() const -{ return y2 - y1; } +{ + return y2 - y1; +} inline VRect VRect::translated(int dx, int dy) const -{ return VRect(x1+dx, y1+dy, x2-x1, y2-y1); } +{ + return VRect(x1 + dx, y1 + dy, x2 - x1, y2 - y1); +} inline void VRect::translate(int dx, int dy) { @@ -103,51 +128,59 @@ inline void VRect::translate(int dx, int dy) inline bool VRect::contains(const VRect &r, bool proper) const { if (!proper) { - if ((x1 <= r.x1) && - (x2 >= r.x2) && - (y1 <= r.y1) && - (y2 >= r.y2)) + if ((x1 <= r.x1) && (x2 >= r.x2) && (y1 <= r.y1) && (y2 >= r.y2)) return true; return false; - }else { - if ((x1 < r.x1) && - (x2 > r.x2) && - (y1 < r.y1) && - (y2 > r.y2)) + } else { + if ((x1 < r.x1) && (x2 > r.x2) && (y1 < r.y1) && (y2 > r.y2)) return true; return false; } - } -V_CONSTEXPR inline VRect::VRect(int left, int top, int width, int height): - x1(left), y1(top), x2(width + left), y2(height + top){} - -class VRectF +V_CONSTEXPR inline VRect::VRect(int left, int top, int width, int height) + : x1(left), y1(top), x2(width + left), y2(height + top) { +} + +class VRectF { public: - V_CONSTEXPR VRectF(): x1(0), y1(0), x2(-1), y2(-1) {} - VRectF(float left, float top, float width, float height){ - x1 = left; y1 = top; x2 = x1 + width; y2 = y1 + height; + V_CONSTEXPR VRectF() : x1(0), y1(0), x2(-1), y2(-1) {} + VRectF(float left, float top, float width, float height) + { + x1 = left; + y1 = top; + x2 = x1 + width; + y2 = y1 + height; + } + + V_CONSTEXPR inline bool isEmpty() const; + V_CONSTEXPR inline bool isNull() const; + V_CONSTEXPR inline float left() const; + V_CONSTEXPR inline float top() const; + V_CONSTEXPR inline float right() const; + V_CONSTEXPR inline float bottom() const; + V_CONSTEXPR inline float width() const; + V_CONSTEXPR inline float height() const; + V_CONSTEXPR inline float x() const; + V_CONSTEXPR inline float y() const; + V_CONSTEXPR inline VPointF center() const + { + return VPointF(x1 + (x2 - x1) / 2.f, y1 + (y2 - y1) / 2.f); + } + inline void setLeft(float l) { x1 = l; } + inline void setTop(float t) { y1 = t; } + inline void setRight(float r) { x2 = r; } + inline void setBottom(float b) { y2 = b; } + inline void setWidth(float w) { x2 = x1 + w; } + inline void setHeight(float h) { y2 = y1 + h; } + inline void translate(float dx, float dy) + { + x1 -= dx; + x2 -= dx; + y1 -= dx; + y2 -= dx; } - V_CONSTEXPR inline bool isEmpty() const; - V_CONSTEXPR inline bool isNull() const; - V_CONSTEXPR inline float left() const ; - V_CONSTEXPR inline float top() const ; - V_CONSTEXPR inline float right() const ; - V_CONSTEXPR inline float bottom() const ; - V_CONSTEXPR inline float width() const ; - V_CONSTEXPR inline float height() const ; - V_CONSTEXPR inline float x() const ; - V_CONSTEXPR inline float y() const ; - V_CONSTEXPR inline VPointF center() const {return VPointF(x1 + (x2-x1)/2.f , y1 + (y2-y1)/2.f);} - inline void setLeft(float l) {x1 = l;} - inline void setTop(float t) {y1 = t;} - inline void setRight(float r) {x2 = r;} - inline void setBottom(float b) {y2 = b;} - inline void setWidth(float w) {x2 = x1 + w;} - inline void setHeight(float h) {y2 = y1 + h;} - inline void translate(float dx, float dy) {x1 -= dx; x2 -= dx; y1 -= dx; y2 -= dx;} private: float x1; float y1; @@ -156,33 +189,53 @@ private: }; V_CONSTEXPR inline bool VRectF::isEmpty() const -{ return x1 > x2 || y1 > y2; } +{ + return x1 > x2 || y1 > y2; +} V_CONSTEXPR inline bool VRectF::isNull() const -{ return (((x2-x1) == 0) || ((y2 - y1) == 0)); } +{ + return (((x2 - x1) == 0) || ((y2 - y1) == 0)); +} V_CONSTEXPR inline float VRectF::x() const -{ return x1; } +{ + return x1; +} V_CONSTEXPR inline float VRectF::y() const -{ return y1; } +{ + return y1; +} V_CONSTEXPR inline float VRectF::left() const -{ return x1; } +{ + return x1; +} V_CONSTEXPR inline float VRectF::top() const -{ return y1; } +{ + return y1; +} V_CONSTEXPR inline float VRectF::right() const -{ return x2; } +{ + return x2; +} V_CONSTEXPR inline float VRectF::bottom() const -{ return y2; } +{ + return y2; +} V_CONSTEXPR inline float VRectF::width() const -{ return x2 - x1; } +{ + return x2 - x1; +} V_CONSTEXPR inline float VRectF::height() const -{ return y2 - y1; } +{ + return y2 - y1; +} V_END_NAMESPACE -#endif // VRECT_H +#endif // VRECT_H diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index da819537ec..f482330bde 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -63,12 +63,11 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#include +#include +#include #include #include -#include -#include - +#include #define critical_if_fail assert #define PIXMAN_EXPORT static @@ -80,88 +79,78 @@ typedef int pixman_bool_t; -typedef struct pixman_rectangle pixman_rectangle_t; +typedef struct pixman_rectangle pixman_rectangle_t; -typedef struct pixman_box box_type_t; -typedef struct pixman_region_data region_data_type_t; -typedef struct pixman_region region_type_t; -typedef int64_t overflow_int_t; +typedef struct pixman_box box_type_t; +typedef struct pixman_region_data region_data_type_t; +typedef struct pixman_region region_type_t; +typedef int64_t overflow_int_t; #define PREFIX(x) pixman_region##x #define PIXMAN_REGION_MAX INT32_MAX #define PIXMAN_REGION_MIN INT32_MIN - typedef struct { int x, y; } point_type_t; struct pixman_region_data { - long size; - long numRects; -/* box_type_t rects[size]; in memory but not explicitly declared */ + long size; + long numRects; + /* box_type_t rects[size]; in memory but not explicitly declared */ }; -struct pixman_rectangle -{ - int32_t x, y; +struct pixman_rectangle { + int32_t x, y; uint32_t width, height; }; -struct pixman_box -{ +struct pixman_box { int32_t x1, y1, x2, y2; }; -struct pixman_region -{ +struct pixman_region { box_type_t extents; - region_data_type_t *data; + region_data_type_t *data; }; -typedef enum -{ +typedef enum { PIXMAN_REGION_OUT, PIXMAN_REGION_IN, PIXMAN_REGION_PART } pixman_region_overlap_t; -static void -_pixman_log_error (const char *function, const char *message) +static void _pixman_log_error(const char *function, const char *message) { - fprintf (stderr, - "*** BUG ***\n" - "In %s: %s\n" - "Set a breakpoint on '_pixman_log_error' to debug\n\n", - function, message); + fprintf(stderr, + "*** BUG ***\n" + "In %s: %s\n" + "Set a breakpoint on '_pixman_log_error' to debug\n\n", + function, message); } - - #define PIXREGION_NIL(reg) ((reg)->data && !(reg)->data->numRects) /* not a region */ -#define PIXREGION_NAR(reg) ((reg)->data == pixman_broken_data) +#define PIXREGION_NAR(reg) ((reg)->data == pixman_broken_data) #define PIXREGION_NUMRECTS(reg) ((reg)->data ? (reg)->data->numRects : 1) #define PIXREGION_SIZE(reg) ((reg)->data ? (reg)->data->size : 0) #define PIXREGION_RECTS(reg) \ - ((reg)->data ? (box_type_t *)((reg)->data + 1) \ - : &(reg)->extents) + ((reg)->data ? (box_type_t *)((reg)->data + 1) : &(reg)->extents) #define PIXREGION_BOXPTR(reg) ((box_type_t *)((reg)->data + 1)) -#define PIXREGION_BOX(reg, i) (&PIXREGION_BOXPTR (reg)[i]) -#define PIXREGION_TOP(reg) PIXREGION_BOX (reg, (reg)->data->numRects) -#define PIXREGION_END(reg) PIXREGION_BOX (reg, (reg)->data->numRects - 1) +#define PIXREGION_BOX(reg, i) (&PIXREGION_BOXPTR(reg)[i]) +#define PIXREGION_TOP(reg) PIXREGION_BOX(reg, (reg)->data->numRects) +#define PIXREGION_END(reg) PIXREGION_BOX(reg, (reg)->data->numRects - 1) #define GOOD_RECT(rect) ((rect)->x1 < (rect)->x2 && (rect)->y1 < (rect)->y2) #define BAD_RECT(rect) ((rect)->x1 > (rect)->x2 || (rect)->y1 > (rect)->y2) #ifdef DEBUG -#define GOOD(reg) \ - do \ - { \ - if (!PREFIX (_selfcheck (reg))) \ - _pixman_log_error (FUNC, "Malformed region " # reg); \ +#define GOOD(reg) \ + do { \ + if (!PREFIX(_selfcheck(reg))) \ + _pixman_log_error(FUNC, "Malformed region " #reg); \ } while (0) #else @@ -170,23 +159,21 @@ _pixman_log_error (const char *function, const char *message) #endif -static const box_type_t PREFIX (_empty_box_) = { 0, 0, 0, 0 }; -static const region_data_type_t PREFIX (_empty_data_) = { 0, 0 }; -#if defined (__llvm__) && !defined (__clang__) -static const volatile region_data_type_t PREFIX (_broken_data_) = { 0, 0 }; +static const box_type_t PREFIX(_empty_box_) = {0, 0, 0, 0}; +static const region_data_type_t PREFIX(_empty_data_) = {0, 0}; +#if defined(__llvm__) && !defined(__clang__) +static const volatile region_data_type_t PREFIX(_broken_data_) = {0, 0}; #else -static const region_data_type_t PREFIX (_broken_data_) = { 0, 0 }; +static const region_data_type_t PREFIX(_broken_data_) = {0, 0}; #endif -static box_type_t *pixman_region_empty_box = - (box_type_t *)&PREFIX (_empty_box_); +static box_type_t *pixman_region_empty_box = (box_type_t *)&PREFIX(_empty_box_); static region_data_type_t *pixman_region_empty_data = - (region_data_type_t *)&PREFIX (_empty_data_); + (region_data_type_t *)&PREFIX(_empty_data_); static region_data_type_t *pixman_broken_data = - (region_data_type_t *)&PREFIX (_broken_data_); + (region_data_type_t *)&PREFIX(_broken_data_); -static pixman_bool_t -pixman_break (region_type_t *region); +static pixman_bool_t pixman_break(region_type_t *region); /* * The functions in this file implement the Region abstraction used extensively @@ -238,261 +225,204 @@ pixman_break (region_type_t *region); */ /* true iff two Boxes overlap */ -#define EXTENTCHECK(r1, r2) \ - (!( ((r1)->x2 <= (r2)->x1) || \ - ((r1)->x1 >= (r2)->x2) || \ - ((r1)->y2 <= (r2)->y1) || \ - ((r1)->y1 >= (r2)->y2) ) ) +#define EXTENTCHECK(r1, r2) \ + (!(((r1)->x2 <= (r2)->x1) || ((r1)->x1 >= (r2)->x2) || \ + ((r1)->y2 <= (r2)->y1) || ((r1)->y1 >= (r2)->y2))) /* true iff (x,y) is in Box */ -#define INBOX(r, x, y) \ - ( ((r)->x2 > x) && \ - ((r)->x1 <= x) && \ - ((r)->y2 > y) && \ - ((r)->y1 <= y) ) +#define INBOX(r, x, y) \ + (((r)->x2 > x) && ((r)->x1 <= x) && ((r)->y2 > y) && ((r)->y1 <= y)) /* true iff Box r1 contains Box r2 */ -#define SUBSUMES(r1, r2) \ - ( ((r1)->x1 <= (r2)->x1) && \ - ((r1)->x2 >= (r2)->x2) && \ - ((r1)->y1 <= (r2)->y1) && \ - ((r1)->y2 >= (r2)->y2) ) +#define SUBSUMES(r1, r2) \ + (((r1)->x1 <= (r2)->x1) && ((r1)->x2 >= (r2)->x2) && \ + ((r1)->y1 <= (r2)->y1) && ((r1)->y2 >= (r2)->y2)) -static size_t -PIXREGION_SZOF (size_t n) +static size_t PIXREGION_SZOF(size_t n) { size_t size = n * sizeof(box_type_t); - if (n > UINT32_MAX / sizeof(box_type_t)) - return 0; + if (n > UINT32_MAX / sizeof(box_type_t)) return 0; - if (sizeof(region_data_type_t) > UINT32_MAX - size) - return 0; + if (sizeof(region_data_type_t) > UINT32_MAX - size) return 0; return size + sizeof(region_data_type_t); } -static region_data_type_t * -alloc_data (size_t n) +static region_data_type_t *alloc_data(size_t n) { - size_t sz = PIXREGION_SZOF (n); + size_t sz = PIXREGION_SZOF(n); - if (!sz) - return NULL; + if (!sz) return NULL; - return (region_data_type_t *)malloc (sz); + return (region_data_type_t *)malloc(sz); } -#define FREE_DATA(reg) if ((reg)->data && (reg)->data->size) free ((reg)->data) +#define FREE_DATA(reg) \ + if ((reg)->data && (reg)->data->size) free((reg)->data) -#define RECTALLOC_BAIL(region, n, bail) \ - do \ - { \ - if (!(region)->data || \ - (((region)->data->numRects + (n)) > (region)->data->size)) \ - { \ - if (!pixman_rect_alloc (region, n)) \ - goto bail; \ - } \ +#define RECTALLOC_BAIL(region, n, bail) \ + do { \ + if (!(region)->data || \ + (((region)->data->numRects + (n)) > (region)->data->size)) { \ + if (!pixman_rect_alloc(region, n)) goto bail; \ + } \ } while (0) -#define RECTALLOC(region, n) \ - do \ - { \ - if (!(region)->data || \ - (((region)->data->numRects + (n)) > (region)->data->size)) \ - { \ - if (!pixman_rect_alloc (region, n)) { \ - return FALSE; \ - } \ - } \ +#define RECTALLOC(region, n) \ + do { \ + if (!(region)->data || \ + (((region)->data->numRects + (n)) > (region)->data->size)) { \ + if (!pixman_rect_alloc(region, n)) { \ + return FALSE; \ + } \ + } \ } while (0) -#define ADDRECT(next_rect, nx1, ny1, nx2, ny2) \ - do \ - { \ - next_rect->x1 = nx1; \ - next_rect->y1 = ny1; \ - next_rect->x2 = nx2; \ - next_rect->y2 = ny2; \ - next_rect++; \ - } \ - while (0) - -#define NEWRECT(region, next_rect, nx1, ny1, nx2, ny2) \ - do \ - { \ - if (!(region)->data || \ - ((region)->data->numRects == (region)->data->size)) \ - { \ - if (!pixman_rect_alloc (region, 1)) \ - return FALSE; \ - next_rect = PIXREGION_TOP (region); \ - } \ - ADDRECT (next_rect, nx1, ny1, nx2, ny2); \ - region->data->numRects++; \ - critical_if_fail (region->data->numRects <= region->data->size); \ +#define ADDRECT(next_rect, nx1, ny1, nx2, ny2) \ + do { \ + next_rect->x1 = nx1; \ + next_rect->y1 = ny1; \ + next_rect->x2 = nx2; \ + next_rect->y2 = ny2; \ + next_rect++; \ } while (0) -#define DOWNSIZE(reg, numRects) \ - do \ - { \ - if (((numRects) < ((reg)->data->size >> 1)) && \ - ((reg)->data->size > 50)) \ - { \ - region_data_type_t * new_data; \ - size_t data_size = PIXREGION_SZOF (numRects); \ - \ - if (!data_size) \ - { \ - new_data = NULL; \ - } \ - else \ - { \ - new_data = (region_data_type_t *) \ - realloc ((reg)->data, data_size); \ - } \ - \ - if (new_data) \ - { \ - new_data->size = (numRects); \ - (reg)->data = new_data; \ - } \ - } \ +#define NEWRECT(region, next_rect, nx1, ny1, nx2, ny2) \ + do { \ + if (!(region)->data || \ + ((region)->data->numRects == (region)->data->size)) { \ + if (!pixman_rect_alloc(region, 1)) return FALSE; \ + next_rect = PIXREGION_TOP(region); \ + } \ + ADDRECT(next_rect, nx1, ny1, nx2, ny2); \ + region->data->numRects++; \ + critical_if_fail(region->data->numRects <= region->data->size); \ } while (0) -PIXMAN_EXPORT pixman_bool_t -PREFIX (_equal) (region_type_t *reg1, region_type_t *reg2) +#define DOWNSIZE(reg, numRects) \ + do { \ + if (((numRects) < ((reg)->data->size >> 1)) && \ + ((reg)->data->size > 50)) { \ + region_data_type_t *new_data; \ + size_t data_size = PIXREGION_SZOF(numRects); \ + \ + if (!data_size) { \ + new_data = NULL; \ + } else { \ + new_data = \ + (region_data_type_t *)realloc((reg)->data, data_size); \ + } \ + \ + if (new_data) { \ + new_data->size = (numRects); \ + (reg)->data = new_data; \ + } \ + } \ + } while (0) + +PIXMAN_EXPORT pixman_bool_t PREFIX(_equal)(region_type_t *reg1, + region_type_t *reg2) { - int i; + int i; box_type_t *rects1; box_type_t *rects2; - if (reg1->extents.x1 != reg2->extents.x1) - return FALSE; + if (reg1->extents.x1 != reg2->extents.x1) return FALSE; - if (reg1->extents.x2 != reg2->extents.x2) - return FALSE; + if (reg1->extents.x2 != reg2->extents.x2) return FALSE; - if (reg1->extents.y1 != reg2->extents.y1) - return FALSE; + if (reg1->extents.y1 != reg2->extents.y1) return FALSE; - if (reg1->extents.y2 != reg2->extents.y2) - return FALSE; + if (reg1->extents.y2 != reg2->extents.y2) return FALSE; - if (PIXREGION_NUMRECTS (reg1) != PIXREGION_NUMRECTS (reg2)) - return FALSE; + if (PIXREGION_NUMRECTS(reg1) != PIXREGION_NUMRECTS(reg2)) return FALSE; - rects1 = PIXREGION_RECTS (reg1); - rects2 = PIXREGION_RECTS (reg2); + rects1 = PIXREGION_RECTS(reg1); + rects2 = PIXREGION_RECTS(reg2); - for (i = 0; i != PIXREGION_NUMRECTS (reg1); i++) - { - if (rects1[i].x1 != rects2[i].x1) - return FALSE; + for (i = 0; i != PIXREGION_NUMRECTS(reg1); i++) { + if (rects1[i].x1 != rects2[i].x1) return FALSE; - if (rects1[i].x2 != rects2[i].x2) - return FALSE; + if (rects1[i].x2 != rects2[i].x2) return FALSE; - if (rects1[i].y1 != rects2[i].y1) - return FALSE; + if (rects1[i].y1 != rects2[i].y1) return FALSE; - if (rects1[i].y2 != rects2[i].y2) - return FALSE; + if (rects1[i].y2 != rects2[i].y2) return FALSE; } return TRUE; } // returns true if both region intersects -PIXMAN_EXPORT pixman_bool_t -PREFIX (_intersects) (region_type_t *reg1, region_type_t *reg2) +PIXMAN_EXPORT pixman_bool_t PREFIX(_intersects)(region_type_t *reg1, + region_type_t *reg2) { - box_type_t *rects1 = PIXREGION_RECTS (reg1); - box_type_t *rects2 = PIXREGION_RECTS (reg2); - for (int i = 0; i != PIXREGION_NUMRECTS (reg1); i++) - { - for(int j = 0; j != PIXREGION_NUMRECTS (reg2); j++) - { - if (EXTENTCHECK(rects1 + i, rects2 + j)) - return TRUE; + box_type_t *rects1 = PIXREGION_RECTS(reg1); + box_type_t *rects2 = PIXREGION_RECTS(reg2); + for (int i = 0; i != PIXREGION_NUMRECTS(reg1); i++) { + for (int j = 0; j != PIXREGION_NUMRECTS(reg2); j++) { + if (EXTENTCHECK(rects1 + i, rects2 + j)) return TRUE; } } return FALSE; } -int -PREFIX (_print) (region_type_t *rgn) +int PREFIX(_print)(region_type_t *rgn) { - int num, size; - int i; - box_type_t * rects; + int num, size; + int i; + box_type_t *rects; - num = PIXREGION_NUMRECTS (rgn); - size = PIXREGION_SIZE (rgn); - rects = PIXREGION_RECTS (rgn); + num = PIXREGION_NUMRECTS(rgn); + size = PIXREGION_SIZE(rgn); + rects = PIXREGION_RECTS(rgn); - fprintf (stderr, "num: %d size: %d\n", num, size); - fprintf (stderr, "extents: %d %d %d %d\n", - rgn->extents.x1, - rgn->extents.y1, - rgn->extents.x2, - rgn->extents.y2); + fprintf(stderr, "num: %d size: %d\n", num, size); + fprintf(stderr, "extents: %d %d %d %d\n", rgn->extents.x1, rgn->extents.y1, + rgn->extents.x2, rgn->extents.y2); - for (i = 0; i < num; i++) - { - fprintf (stderr, "%d %d %d %d \n", - rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2); + for (i = 0; i < num; i++) { + fprintf(stderr, "%d %d %d %d \n", rects[i].x1, rects[i].y1, rects[i].x2, + rects[i].y2); } - fprintf (stderr, "\n"); + fprintf(stderr, "\n"); - return(num); + return (num); } - -PIXMAN_EXPORT void -PREFIX (_init) (region_type_t *region) +PIXMAN_EXPORT void PREFIX(_init)(region_type_t *region) { region->extents = *pixman_region_empty_box; region->data = pixman_region_empty_data; } -PIXMAN_EXPORT pixman_bool_t -PREFIX (_union_rect) (region_type_t *dest, - region_type_t *source, - int x, - int y, - unsigned int width, - unsigned int height); -PIXMAN_EXPORT void -PREFIX (_init_rect) (region_type_t * region, - int x, - int y, - unsigned int width, - unsigned int height) +PIXMAN_EXPORT pixman_bool_t PREFIX(_union_rect)(region_type_t *dest, + region_type_t *source, int x, + int y, unsigned int width, + unsigned int height); +PIXMAN_EXPORT void PREFIX(_init_rect)(region_type_t *region, int x, int y, + unsigned int width, unsigned int height) { - PREFIX (_init) (region); - PREFIX (_union_rect)(region, region, x, y, width, height); + PREFIX(_init)(region); + PREFIX(_union_rect)(region, region, x, y, width, height); } -PIXMAN_EXPORT void -PREFIX (_fini) (region_type_t *region) +PIXMAN_EXPORT void PREFIX(_fini)(region_type_t *region) { - GOOD (region); - FREE_DATA (region); + GOOD(region); + FREE_DATA(region); } -PIXMAN_EXPORT int -PREFIX (_n_rects) (region_type_t *region) +PIXMAN_EXPORT int PREFIX(_n_rects)(region_type_t *region) { - return PIXREGION_NUMRECTS (region); + return PIXREGION_NUMRECTS(region); } -static pixman_bool_t -pixman_break (region_type_t *region) +static pixman_bool_t pixman_break(region_type_t *region) { - FREE_DATA (region); + FREE_DATA(region); region->extents = *pixman_region_empty_box; region->data = pixman_broken_data; @@ -500,60 +430,46 @@ pixman_break (region_type_t *region) return FALSE; } -static pixman_bool_t -pixman_rect_alloc (region_type_t * region, - int n) +static pixman_bool_t pixman_rect_alloc(region_type_t *region, int n) { region_data_type_t *data; - if (!region->data) - { - n++; - region->data = alloc_data (n); + if (!region->data) { + n++; + region->data = alloc_data(n); - if (!region->data) - return pixman_break (region); + if (!region->data) return pixman_break(region); - region->data->numRects = 1; - *PIXREGION_BOXPTR (region) = region->extents; - } - else if (!region->data->size) - { - region->data = alloc_data (n); + region->data->numRects = 1; + *PIXREGION_BOXPTR(region) = region->extents; + } else if (!region->data->size) { + region->data = alloc_data(n); - if (!region->data) - return pixman_break (region); + if (!region->data) return pixman_break(region); - region->data->numRects = 0; - } - else - { - size_t data_size; + region->data->numRects = 0; + } else { + size_t data_size; - if (n == 1) - { - n = region->data->numRects; - if (n > 500) /* XXX pick numbers out of a hat */ - n = 250; - } + if (n == 1) { + n = region->data->numRects; + if (n > 500) /* XXX pick numbers out of a hat */ + n = 250; + } - n += region->data->numRects; - data_size = PIXREGION_SZOF (n); + n += region->data->numRects; + data_size = PIXREGION_SZOF(n); - if (!data_size) - { - data = NULL; - } - else - { - data = (region_data_type_t *) - realloc (region->data, PIXREGION_SZOF (n)); - } + if (!data_size) { + data = NULL; + } else { + data = + (region_data_type_t *)realloc(region->data, PIXREGION_SZOF(n)); + } - if (!data) - return pixman_break (region); + if (!data) return pixman_break(region); - region->data = data; + region->data = data; } region->data->size = n; @@ -561,40 +477,36 @@ pixman_rect_alloc (region_type_t * region, return TRUE; } -PIXMAN_EXPORT pixman_bool_t -PREFIX (_copy) (region_type_t *dst, region_type_t *src) +PIXMAN_EXPORT pixman_bool_t PREFIX(_copy)(region_type_t *dst, + region_type_t *src) { - GOOD (dst); - GOOD (src); + GOOD(dst); + GOOD(src); - if (dst == src) - return TRUE; + if (dst == src) return TRUE; dst->extents = src->extents; - if (!src->data || !src->data->size) - { - FREE_DATA (dst); - dst->data = src->data; - return TRUE; + if (!src->data || !src->data->size) { + FREE_DATA(dst); + dst->data = src->data; + return TRUE; } - if (!dst->data || (dst->data->size < src->data->numRects)) - { - FREE_DATA (dst); + if (!dst->data || (dst->data->size < src->data->numRects)) { + FREE_DATA(dst); - dst->data = alloc_data (src->data->numRects); + dst->data = alloc_data(src->data->numRects); - if (!dst->data) - return pixman_break (dst); + if (!dst->data) return pixman_break(dst); - dst->data->size = src->data->numRects; + dst->data->size = src->data->numRects; } dst->data->numRects = src->data->numRects; - memmove ((char *)PIXREGION_BOXPTR (dst), (char *)PIXREGION_BOXPTR (src), - dst->data->numRects * sizeof(box_type_t)); + memmove((char *)PIXREGION_BOXPTR(dst), (char *)PIXREGION_BOXPTR(src), + dst->data->numRects * sizeof(box_type_t)); return TRUE; } @@ -621,21 +533,21 @@ PREFIX (_copy) (region_type_t *dst, region_type_t *src) * *----------------------------------------------------------------------- */ -static inline int -pixman_coalesce (region_type_t * region, /* Region to coalesce */ - int prev_start, /* Index of start of previous band */ - int cur_start) /* Index of start of current band */ +static inline int pixman_coalesce( + region_type_t *region, /* Region to coalesce */ + int prev_start, /* Index of start of previous band */ + int cur_start) /* Index of start of current band */ { - box_type_t *prev_box; /* Current box in previous band */ - box_type_t *cur_box; /* Current box in current band */ - int numRects; /* Number rectangles in both bands */ - int y2; /* Bottom of current band */ + box_type_t *prev_box; /* Current box in previous band */ + box_type_t *cur_box; /* Current box in current band */ + int numRects; /* Number rectangles in both bands */ + int y2; /* Bottom of current band */ /* * Figure out how many rectangles are in the band. */ numRects = cur_start - prev_start; - critical_if_fail (numRects == region->data->numRects - cur_start); + critical_if_fail(numRects == region->data->numRects - cur_start); if (!numRects) return cur_start; @@ -643,8 +555,8 @@ pixman_coalesce (region_type_t * region, /* Region to coalesce */ * The bands may only be coalesced if the bottom of the previous * matches the top scanline of the current. */ - prev_box = PIXREGION_BOX (region, prev_start); - cur_box = PIXREGION_BOX (region, cur_start); + prev_box = PIXREGION_BOX(region, prev_start); + cur_box = PIXREGION_BOX(region, cur_start); if (prev_box->y2 != cur_box->y1) return cur_start; /* @@ -655,16 +567,14 @@ pixman_coalesce (region_type_t * region, /* Region to coalesce */ */ y2 = cur_box->y2; - do - { - if ((prev_box->x1 != cur_box->x1) || (prev_box->x2 != cur_box->x2)) - return (cur_start); + do { + if ((prev_box->x1 != cur_box->x1) || (prev_box->x2 != cur_box->x2)) + return (cur_start); - prev_box++; - cur_box++; - numRects--; - } - while (numRects); + prev_box++; + cur_box++; + numRects--; + } while (numRects); /* * The bands may be merged, so set the bottom y of each box @@ -673,13 +583,11 @@ pixman_coalesce (region_type_t * region, /* Region to coalesce */ numRects = cur_start - prev_start; region->data->numRects -= numRects; - do - { - prev_box--; - prev_box->y2 = y2; - numRects--; - } - while (numRects); + do { + prev_box--; + prev_box->y2 = y2; + numRects--; + } while (numRects); return prev_start; } @@ -687,12 +595,11 @@ pixman_coalesce (region_type_t * region, /* Region to coalesce */ /* Quicky macro to avoid trivial reject procedure calls to pixman_coalesce */ #define COALESCE(new_reg, prev_band, cur_band) \ - do \ - { \ - if (cur_band - prev_band == new_reg->data->numRects - cur_band) \ - prev_band = pixman_coalesce (new_reg, prev_band, cur_band); \ - else \ - prev_band = cur_band; \ + do { \ + if (cur_band - prev_band == new_reg->data->numRects - cur_band) \ + prev_band = pixman_coalesce(new_reg, prev_band, cur_band); \ + else \ + prev_band = cur_band; \ } while (0) /*- @@ -711,65 +618,59 @@ pixman_coalesce (region_type_t * region, /* Region to coalesce */ * *----------------------------------------------------------------------- */ -static inline pixman_bool_t -pixman_region_append_non_o (region_type_t * region, - box_type_t * r, - box_type_t * r_end, - int y1, - int y2) +static inline pixman_bool_t pixman_region_append_non_o(region_type_t *region, + box_type_t * r, + box_type_t * r_end, + int y1, int y2) { box_type_t *next_rect; - int new_rects; + int new_rects; new_rects = r_end - r; - critical_if_fail (y1 < y2); - critical_if_fail (new_rects != 0); + critical_if_fail(y1 < y2); + critical_if_fail(new_rects != 0); /* Make sure we have enough space for all rectangles to be added */ - RECTALLOC (region, new_rects); - next_rect = PIXREGION_TOP (region); + RECTALLOC(region, new_rects); + next_rect = PIXREGION_TOP(region); region->data->numRects += new_rects; - do - { - critical_if_fail (r->x1 < r->x2); - ADDRECT (next_rect, r->x1, y1, r->x2, y2); - r++; - } - while (r != r_end); + do { + critical_if_fail(r->x1 < r->x2); + ADDRECT(next_rect, r->x1, y1, r->x2, y2); + r++; + } while (r != r_end); return TRUE; } -#define FIND_BAND(r, r_band_end, r_end, ry1) \ - do \ - { \ - ry1 = r->y1; \ - r_band_end = r + 1; \ - while ((r_band_end != r_end) && (r_band_end->y1 == ry1)) { \ - r_band_end++; \ - } \ +#define FIND_BAND(r, r_band_end, r_end, ry1) \ + do { \ + ry1 = r->y1; \ + r_band_end = r + 1; \ + while ((r_band_end != r_end) && (r_band_end->y1 == ry1)) { \ + r_band_end++; \ + } \ } while (0) -#define APPEND_REGIONS(new_reg, r, r_end) \ - do \ - { \ - int new_rects; \ - if ((new_rects = r_end - r)) { \ - RECTALLOC_BAIL (new_reg, new_rects, bail); \ - memmove ((char *)PIXREGION_TOP (new_reg), (char *)r, \ - new_rects * sizeof(box_type_t)); \ - new_reg->data->numRects += new_rects; \ - } \ +#define APPEND_REGIONS(new_reg, r, r_end) \ + do { \ + int new_rects; \ + if ((new_rects = r_end - r)) { \ + RECTALLOC_BAIL(new_reg, new_rects, bail); \ + memmove((char *)PIXREGION_TOP(new_reg), (char *)r, \ + new_rects * sizeof(box_type_t)); \ + new_reg->data->numRects += new_rects; \ + } \ } while (0) /*- *----------------------------------------------------------------------- * pixman_op -- - * Apply an operation to two regions. Called by pixman_region_union, pixman_region_inverse, - * pixman_region_subtract, pixman_region_intersect.... Both regions MUST have at least one - * rectangle, and cannot be the same object. + * Apply an operation to two regions. Called by pixman_region_union, + *pixman_region_inverse, pixman_region_subtract, pixman_region_intersect.... + *Both regions MUST have at least one rectangle, and cannot be the same object. * * Results: * TRUE if successful. @@ -793,53 +694,49 @@ pixman_region_append_non_o (region_type_t * region, *----------------------------------------------------------------------- */ -typedef pixman_bool_t (*overlap_proc_ptr) (region_type_t *region, - box_type_t * r1, - box_type_t * r1_end, - box_type_t * r2, - box_type_t * r2_end, - int y1, - int y2); +typedef pixman_bool_t (*overlap_proc_ptr)(region_type_t *region, box_type_t *r1, + box_type_t *r1_end, box_type_t *r2, + box_type_t *r2_end, int y1, int y2); -static pixman_bool_t -pixman_op (region_type_t * new_reg, /* Place to store result */ - region_type_t * reg1, /* First region in operation */ - region_type_t * reg2, /* 2d region in operation */ - overlap_proc_ptr overlap_func, /* Function to call for over- - * lapping bands */ - int append_non1, /* Append non-overlapping bands - * in region 1 ? - */ - int append_non2 /* Append non-overlapping bands - * in region 2 ? - */ - ) +static pixman_bool_t pixman_op( + region_type_t * new_reg, /* Place to store result */ + region_type_t * reg1, /* First region in operation */ + region_type_t * reg2, /* 2d region in operation */ + overlap_proc_ptr overlap_func, /* Function to call for over- + * lapping bands */ + int append_non1, /* Append non-overlapping bands + * in region 1 ? + */ + int append_non2 /* Append non-overlapping bands + * in region 2 ? + */ +) { - box_type_t *r1; /* Pointer into first region */ - box_type_t *r2; /* Pointer into 2d region */ - box_type_t *r1_end; /* End of 1st region */ - box_type_t *r2_end; /* End of 2d region */ - int ybot; /* Bottom of intersection */ - int ytop; /* Top of intersection */ - region_data_type_t *old_data; /* Old data for new_reg */ - int prev_band; /* Index of start of - * previous band in new_reg */ - int cur_band; /* Index of start of current - * band in new_reg */ - box_type_t * r1_band_end; /* End of current band in r1 */ - box_type_t * r2_band_end; /* End of current band in r2 */ - int top; /* Top of non-overlapping band */ - int bot; /* Bottom of non-overlapping band*/ - int r1y1; /* Temps for r1->y1 and r2->y1 */ - int r2y1; - int new_size; - int numRects; + box_type_t * r1; /* Pointer into first region */ + box_type_t * r2; /* Pointer into 2d region */ + box_type_t * r1_end; /* End of 1st region */ + box_type_t * r2_end; /* End of 2d region */ + int ybot; /* Bottom of intersection */ + int ytop; /* Top of intersection */ + region_data_type_t *old_data; /* Old data for new_reg */ + int prev_band; /* Index of start of + * previous band in new_reg */ + int cur_band; /* Index of start of current + * band in new_reg */ + box_type_t *r1_band_end; /* End of current band in r1 */ + box_type_t *r2_band_end; /* End of current band in r2 */ + int top; /* Top of non-overlapping band */ + int bot; /* Bottom of non-overlapping band*/ + int r1y1; /* Temps for r1->y1 and r2->y1 */ + int r2y1; + int new_size; + int numRects; /* * Break any region computed from a broken region */ - if (PIXREGION_NAR (reg1) || PIXREGION_NAR (reg2)) - return pixman_break (new_reg); + if (PIXREGION_NAR(reg1) || PIXREGION_NAR(reg2)) + return pixman_break(new_reg); /* * Initialization: @@ -849,44 +746,40 @@ pixman_op (region_type_t * new_reg, /* Place to store result * another array of rectangles for it to use. */ - r1 = PIXREGION_RECTS (reg1); - new_size = PIXREGION_NUMRECTS (reg1); + r1 = PIXREGION_RECTS(reg1); + new_size = PIXREGION_NUMRECTS(reg1); r1_end = r1 + new_size; - numRects = PIXREGION_NUMRECTS (reg2); - r2 = PIXREGION_RECTS (reg2); + numRects = PIXREGION_NUMRECTS(reg2); + r2 = PIXREGION_RECTS(reg2); r2_end = r2 + numRects; - critical_if_fail (r1 != r1_end); - critical_if_fail (r2 != r2_end); + critical_if_fail(r1 != r1_end); + critical_if_fail(r2 != r2_end); old_data = (region_data_type_t *)NULL; if (((new_reg == reg1) && (new_size > 1)) || - ((new_reg == reg2) && (numRects > 1))) - { + ((new_reg == reg2) && (numRects > 1))) { old_data = new_reg->data; new_reg->data = pixman_region_empty_data; } /* guess at new size */ - if (numRects > new_size) - new_size = numRects; + if (numRects > new_size) new_size = numRects; new_size <<= 1; if (!new_reg->data) - new_reg->data = pixman_region_empty_data; + new_reg->data = pixman_region_empty_data; else if (new_reg->data->size) - new_reg->data->numRects = 0; + new_reg->data->numRects = 0; - if (new_size > new_reg->data->size) - { - if (!pixman_rect_alloc (new_reg, new_size)) - { - free (old_data); + if (new_size > new_reg->data->size) { + if (!pixman_rect_alloc(new_reg, new_size)) { + free(old_data); return FALSE; - } + } } /* @@ -903,7 +796,7 @@ pixman_op (region_type_t * new_reg, /* Place to store result * the top of the rectangles of both regions and ybot clips the bottoms. */ - ybot = MIN (r1->y1, r2->y1); + ybot = MIN(r1->y1, r2->y1); /* * prev_band serves to mark the start of the previous band so rectangles @@ -916,101 +809,86 @@ pixman_op (region_type_t * new_reg, /* Place to store result */ prev_band = 0; - do - { + do { /* - * This algorithm proceeds one source-band (as opposed to a - * destination band, which is determined by where the two regions - * intersect) at a time. r1_band_end and r2_band_end serve to mark the - * rectangle after the last one in the current band for their - * respective regions. - */ - critical_if_fail (r1 != r1_end); - critical_if_fail (r2 != r2_end); + * This algorithm proceeds one source-band (as opposed to a + * destination band, which is determined by where the two regions + * intersect) at a time. r1_band_end and r2_band_end serve to mark the + * rectangle after the last one in the current band for their + * respective regions. + */ + critical_if_fail(r1 != r1_end); + critical_if_fail(r2 != r2_end); - FIND_BAND (r1, r1_band_end, r1_end, r1y1); - FIND_BAND (r2, r2_band_end, r2_end, r2y1); + FIND_BAND(r1, r1_band_end, r1_end, r1y1); + FIND_BAND(r2, r2_band_end, r2_end, r2y1); /* - * First handle the band that doesn't intersect, if any. - * - * Note that attention is restricted to one band in the - * non-intersecting region at once, so if a region has n - * bands between the current position and the next place it overlaps - * the other, this entire loop will be passed through n times. - */ - if (r1y1 < r2y1) - { - if (append_non1) - { - top = MAX (r1y1, ybot); - bot = MIN (r1->y2, r2y1); - if (top != bot) - { + * First handle the band that doesn't intersect, if any. + * + * Note that attention is restricted to one band in the + * non-intersecting region at once, so if a region has n + * bands between the current position and the next place it overlaps + * the other, this entire loop will be passed through n times. + */ + if (r1y1 < r2y1) { + if (append_non1) { + top = MAX(r1y1, ybot); + bot = MIN(r1->y2, r2y1); + if (top != bot) { cur_band = new_reg->data->numRects; - if (!pixman_region_append_non_o (new_reg, r1, r1_band_end, top, bot)) - goto bail; - COALESCE (new_reg, prev_band, cur_band); - } - } + if (!pixman_region_append_non_o(new_reg, r1, r1_band_end, + top, bot)) + goto bail; + COALESCE(new_reg, prev_band, cur_band); + } + } ytop = r2y1; - } - else if (r2y1 < r1y1) - { - if (append_non2) - { - top = MAX (r2y1, ybot); - bot = MIN (r2->y2, r1y1); + } else if (r2y1 < r1y1) { + if (append_non2) { + top = MAX(r2y1, ybot); + bot = MIN(r2->y2, r1y1); - if (top != bot) - { + if (top != bot) { cur_band = new_reg->data->numRects; - if (!pixman_region_append_non_o (new_reg, r2, r2_band_end, top, bot)) - goto bail; + if (!pixman_region_append_non_o(new_reg, r2, r2_band_end, + top, bot)) + goto bail; - COALESCE (new_reg, prev_band, cur_band); - } - } + COALESCE(new_reg, prev_band, cur_band); + } + } ytop = r1y1; - } - else - { + } else { ytop = r1y1; - } + } /* - * Now see if we've hit an intersecting band. The two bands only - * intersect if ybot > ytop - */ - ybot = MIN (r1->y2, r2->y2); - if (ybot > ytop) - { + * Now see if we've hit an intersecting band. The two bands only + * intersect if ybot > ytop + */ + ybot = MIN(r1->y2, r2->y2); + if (ybot > ytop) { cur_band = new_reg->data->numRects; - if (!(*overlap_func)(new_reg, - r1, r1_band_end, - r2, r2_band_end, - ytop, ybot)) - { - goto bail; + if (!(*overlap_func)(new_reg, r1, r1_band_end, r2, r2_band_end, + ytop, ybot)) { + goto bail; + } + + COALESCE(new_reg, prev_band, cur_band); } - COALESCE (new_reg, prev_band, cur_band); - } - /* - * If we've finished with a band (y2 == ybot) we skip forward - * in the region to the next band. - */ - if (r1->y2 == ybot) - r1 = r1_band_end; + * If we've finished with a band (y2 == ybot) we skip forward + * in the region to the next band. + */ + if (r1->y2 == ybot) r1 = r1_band_end; - if (r2->y2 == ybot) - r2 = r2_band_end; + if (r2->y2 == ybot) r2 = r2_band_end; - } - while (r1 != r1_end && r2 != r2_end); + } while (r1 != r1_end && r2 != r2_end); /* * Deal with whichever region (if any) still has rectangles left. @@ -1020,69 +898,57 @@ pixman_op (region_type_t * new_reg, /* Place to store result * regardless of how many bands, into one final append to the list. */ - if ((r1 != r1_end) && append_non1) - { + if ((r1 != r1_end) && append_non1) { /* Do first non_overlap1Func call, which may be able to coalesce */ - FIND_BAND (r1, r1_band_end, r1_end, r1y1); + FIND_BAND(r1, r1_band_end, r1_end, r1y1); cur_band = new_reg->data->numRects; - if (!pixman_region_append_non_o (new_reg, - r1, r1_band_end, - MAX (r1y1, ybot), r1->y2)) - { - goto bail; - } + if (!pixman_region_append_non_o(new_reg, r1, r1_band_end, + MAX(r1y1, ybot), r1->y2)) { + goto bail; + } - COALESCE (new_reg, prev_band, cur_band); + COALESCE(new_reg, prev_band, cur_band); /* Just append the rest of the boxes */ - APPEND_REGIONS (new_reg, r1_band_end, r1_end); - } - else if ((r2 != r2_end) && append_non2) - { + APPEND_REGIONS(new_reg, r1_band_end, r1_end); + } else if ((r2 != r2_end) && append_non2) { /* Do first non_overlap2Func call, which may be able to coalesce */ - FIND_BAND (r2, r2_band_end, r2_end, r2y1); + FIND_BAND(r2, r2_band_end, r2_end, r2y1); - cur_band = new_reg->data->numRects; + cur_band = new_reg->data->numRects; - if (!pixman_region_append_non_o (new_reg, - r2, r2_band_end, - MAX (r2y1, ybot), r2->y2)) - { - goto bail; - } + if (!pixman_region_append_non_o(new_reg, r2, r2_band_end, + MAX(r2y1, ybot), r2->y2)) { + goto bail; + } - COALESCE (new_reg, prev_band, cur_band); + COALESCE(new_reg, prev_band, cur_band); /* Append rest of boxes */ - APPEND_REGIONS (new_reg, r2_band_end, r2_end); + APPEND_REGIONS(new_reg, r2_band_end, r2_end); } - free (old_data); + free(old_data); - if (!(numRects = new_reg->data->numRects)) - { - FREE_DATA (new_reg); + if (!(numRects = new_reg->data->numRects)) { + FREE_DATA(new_reg); new_reg->data = pixman_region_empty_data; - } - else if (numRects == 1) - { - new_reg->extents = *PIXREGION_BOXPTR (new_reg); - FREE_DATA (new_reg); + } else if (numRects == 1) { + new_reg->extents = *PIXREGION_BOXPTR(new_reg); + FREE_DATA(new_reg); new_reg->data = (region_data_type_t *)NULL; - } - else - { - DOWNSIZE (new_reg, numRects); + } else { + DOWNSIZE(new_reg, numRects); } return TRUE; bail: - free (old_data); + free(old_data); - return pixman_break (new_reg); + return pixman_break(new_reg); } /*- @@ -1100,23 +966,20 @@ bail: * *----------------------------------------------------------------------- */ -static void -pixman_set_extents (region_type_t *region) +static void pixman_set_extents(region_type_t *region) { box_type_t *box, *box_end; - if (!region->data) - return; + if (!region->data) return; - if (!region->data->size) - { + if (!region->data->size) { region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; return; } - box = PIXREGION_BOXPTR (region); - box_end = PIXREGION_END (region); + box = PIXREGION_BOXPTR(region); + box_end = PIXREGION_END(region); /* * Since box is the first rectangle in the region, it must have the @@ -1130,18 +993,15 @@ pixman_set_extents (region_type_t *region) region->extents.x2 = box_end->x2; region->extents.y2 = box_end->y2; - critical_if_fail (region->extents.y1 < region->extents.y2); + critical_if_fail(region->extents.y1 < region->extents.y2); - while (box <= box_end) - { - if (box->x1 < region->extents.x1) - region->extents.x1 = box->x1; - if (box->x2 > region->extents.x2) - region->extents.x2 = box->x2; + while (box <= box_end) { + if (box->x1 < region->extents.x1) region->extents.x1 = box->x1; + if (box->x2 > region->extents.x2) region->extents.x2 = box->x2; box++; } - critical_if_fail (region->extents.x1 < region->extents.x2); + critical_if_fail(region->extents.x1 < region->extents.x2); } /*====================================================================== @@ -1161,137 +1021,108 @@ pixman_set_extents (region_type_t *region) *----------------------------------------------------------------------- */ /*ARGSUSED*/ -static pixman_bool_t -pixman_region_intersect_o (region_type_t *region, - box_type_t * r1, - box_type_t * r1_end, - box_type_t * r2, - box_type_t * r2_end, - int y1, - int y2) +static pixman_bool_t pixman_region_intersect_o( + region_type_t *region, box_type_t *r1, box_type_t *r1_end, box_type_t *r2, + box_type_t *r2_end, int y1, int y2) { - int x1; - int x2; - box_type_t * next_rect; + int x1; + int x2; + box_type_t *next_rect; - next_rect = PIXREGION_TOP (region); + next_rect = PIXREGION_TOP(region); - critical_if_fail (y1 < y2); - critical_if_fail (r1 != r1_end && r2 != r2_end); + critical_if_fail(y1 < y2); + critical_if_fail(r1 != r1_end && r2 != r2_end); - do - { - x1 = MAX (r1->x1, r2->x1); - x2 = MIN (r1->x2, r2->x2); + do { + x1 = MAX(r1->x1, r2->x1); + x2 = MIN(r1->x2, r2->x2); /* - * If there's any overlap between the two rectangles, add that - * overlap to the new region. - */ - if (x1 < x2) - NEWRECT (region, next_rect, x1, y1, x2, y2); + * If there's any overlap between the two rectangles, add that + * overlap to the new region. + */ + if (x1 < x2) NEWRECT(region, next_rect, x1, y1, x2, y2); /* - * Advance the pointer(s) with the leftmost right side, since the next - * rectangle on that list may still overlap the other region's - * current rectangle. - */ - if (r1->x2 == x2) - { + * Advance the pointer(s) with the leftmost right side, since the next + * rectangle on that list may still overlap the other region's + * current rectangle. + */ + if (r1->x2 == x2) { r1++; - } - if (r2->x2 == x2) - { + } + if (r2->x2 == x2) { r2++; - } - } - while ((r1 != r1_end) && (r2 != r2_end)); + } + } while ((r1 != r1_end) && (r2 != r2_end)); return TRUE; } -PIXMAN_EXPORT pixman_bool_t -PREFIX (_intersect) (region_type_t * new_reg, - region_type_t * reg1, - region_type_t * reg2) +PIXMAN_EXPORT pixman_bool_t PREFIX(_intersect)(region_type_t *new_reg, + region_type_t *reg1, + region_type_t *reg2) { - GOOD (reg1); - GOOD (reg2); - GOOD (new_reg); + GOOD(reg1); + GOOD(reg2); + GOOD(new_reg); /* check for trivial reject */ - if (PIXREGION_NIL (reg1) || PIXREGION_NIL (reg2) || - !EXTENTCHECK (®1->extents, ®2->extents)) - { + if (PIXREGION_NIL(reg1) || PIXREGION_NIL(reg2) || + !EXTENTCHECK(®1->extents, ®2->extents)) { /* Covers about 20% of all cases */ - FREE_DATA (new_reg); + FREE_DATA(new_reg); new_reg->extents.x2 = new_reg->extents.x1; new_reg->extents.y2 = new_reg->extents.y1; - if (PIXREGION_NAR (reg1) || PIXREGION_NAR (reg2)) - { + if (PIXREGION_NAR(reg1) || PIXREGION_NAR(reg2)) { new_reg->data = pixman_broken_data; return FALSE; - } - else - { - new_reg->data = pixman_region_empty_data; - } - } - else if (!reg1->data && !reg2->data) - { + } else { + new_reg->data = pixman_region_empty_data; + } + } else if (!reg1->data && !reg2->data) { /* Covers about 80% of cases that aren't trivially rejected */ - new_reg->extents.x1 = MAX (reg1->extents.x1, reg2->extents.x1); - new_reg->extents.y1 = MAX (reg1->extents.y1, reg2->extents.y1); - new_reg->extents.x2 = MIN (reg1->extents.x2, reg2->extents.x2); - new_reg->extents.y2 = MIN (reg1->extents.y2, reg2->extents.y2); + new_reg->extents.x1 = MAX(reg1->extents.x1, reg2->extents.x1); + new_reg->extents.y1 = MAX(reg1->extents.y1, reg2->extents.y1); + new_reg->extents.x2 = MIN(reg1->extents.x2, reg2->extents.x2); + new_reg->extents.y2 = MIN(reg1->extents.y2, reg2->extents.y2); - FREE_DATA (new_reg); + FREE_DATA(new_reg); - new_reg->data = (region_data_type_t *)NULL; - } - else if (!reg2->data && SUBSUMES (®2->extents, ®1->extents)) - { - return PREFIX (_copy) (new_reg, reg1); - } - else if (!reg1->data && SUBSUMES (®1->extents, ®2->extents)) - { - return PREFIX (_copy) (new_reg, reg2); - } - else if (reg1 == reg2) - { - return PREFIX (_copy) (new_reg, reg1); - } - else - { + new_reg->data = (region_data_type_t *)NULL; + } else if (!reg2->data && SUBSUMES(®2->extents, ®1->extents)) { + return PREFIX(_copy)(new_reg, reg1); + } else if (!reg1->data && SUBSUMES(®1->extents, ®2->extents)) { + return PREFIX(_copy)(new_reg, reg2); + } else if (reg1 == reg2) { + return PREFIX(_copy)(new_reg, reg1); + } else { /* General purpose intersection */ - if (!pixman_op (new_reg, reg1, reg2, pixman_region_intersect_o, FALSE, FALSE)) - return FALSE; + if (!pixman_op(new_reg, reg1, reg2, pixman_region_intersect_o, FALSE, + FALSE)) + return FALSE; - pixman_set_extents (new_reg); + pixman_set_extents(new_reg); } - GOOD (new_reg); - return(TRUE); + GOOD(new_reg); + return (TRUE); } -#define MERGERECT(r) \ - do \ - { \ - if (r->x1 <= x2) \ - { \ - /* Merge with current rectangle */ \ - if (x2 < r->x2) \ - x2 = r->x2; \ - } \ - else \ - { \ - /* Add current rectangle, start new one */ \ - NEWRECT (region, next_rect, x1, y1, x2, y2); \ - x1 = r->x1; \ - x2 = r->x2; \ - } \ - r++; \ +#define MERGERECT(r) \ + do { \ + if (r->x1 <= x2) { \ + /* Merge with current rectangle */ \ + if (x2 < r->x2) x2 = r->x2; \ + } else { \ + /* Add current rectangle, start new one */ \ + NEWRECT(region, next_rect, x1, y1, x2, y2); \ + x1 = r->x1; \ + x2 = r->x2; \ + } \ + r++; \ } while (0) /*====================================================================== @@ -1313,75 +1144,59 @@ PREFIX (_intersect) (region_type_t * new_reg, * *----------------------------------------------------------------------- */ -static pixman_bool_t -pixman_region_union_o (region_type_t *region, - box_type_t * r1, - box_type_t * r1_end, - box_type_t * r2, - box_type_t * r2_end, - int y1, - int y2) +static pixman_bool_t pixman_region_union_o(region_type_t *region, + box_type_t *r1, box_type_t *r1_end, + box_type_t *r2, box_type_t *r2_end, + int y1, int y2) { box_type_t *next_rect; - int x1; /* left and right side of current union */ - int x2; + int x1; /* left and right side of current union */ + int x2; - critical_if_fail (y1 < y2); - critical_if_fail (r1 != r1_end && r2 != r2_end); + critical_if_fail(y1 < y2); + critical_if_fail(r1 != r1_end && r2 != r2_end); - next_rect = PIXREGION_TOP (region); + next_rect = PIXREGION_TOP(region); /* Start off current rectangle */ - if (r1->x1 < r2->x1) - { + if (r1->x1 < r2->x1) { x1 = r1->x1; x2 = r1->x2; r1++; - } - else - { + } else { x1 = r2->x1; x2 = r2->x2; r2++; } - while (r1 != r1_end && r2 != r2_end) - { + while (r1 != r1_end && r2 != r2_end) { if (r1->x1 < r2->x1) - MERGERECT (r1); - else - MERGERECT (r2); + MERGERECT(r1); + else + MERGERECT(r2); } /* Finish off whoever (if any) is left */ - if (r1 != r1_end) - { - do - { - MERGERECT (r1); - } - while (r1 != r1_end); - } - else if (r2 != r2_end) - { - do - { - MERGERECT (r2); - } - while (r2 != r2_end); + if (r1 != r1_end) { + do { + MERGERECT(r1); + } while (r1 != r1_end); + } else if (r2 != r2_end) { + do { + MERGERECT(r2); + } while (r2 != r2_end); } /* Add current rectangle */ - NEWRECT (region, next_rect, x1, y1, x2, y2); + NEWRECT(region, next_rect, x1, y1, x2, y2); return TRUE; } -PIXMAN_EXPORT pixman_bool_t -PREFIX(_intersect_rect) (region_type_t *dest, - region_type_t *source, - int x, int y, - unsigned int width, - unsigned int height) +PIXMAN_EXPORT pixman_bool_t PREFIX(_intersect_rect)(region_type_t *dest, + region_type_t *source, + int x, int y, + unsigned int width, + unsigned int height) { region_type_t region; @@ -1391,24 +1206,20 @@ PREFIX(_intersect_rect) (region_type_t *dest, region.extents.x2 = x + width; region.extents.y2 = y + height; - return PREFIX(_intersect) (dest, source, ®ion); + return PREFIX(_intersect)(dest, source, ®ion); } -PIXMAN_EXPORT pixman_bool_t -PREFIX (_union) (region_type_t *new_reg, - region_type_t *reg1, - region_type_t *reg2); +PIXMAN_EXPORT pixman_bool_t PREFIX(_union)(region_type_t *new_reg, + region_type_t *reg1, + region_type_t *reg2); /* Convenience function for performing union of region with a * single rectangle */ -PIXMAN_EXPORT pixman_bool_t -PREFIX (_union_rect) (region_type_t *dest, - region_type_t *source, - int x, - int y, - unsigned int width, - unsigned int height) +PIXMAN_EXPORT pixman_bool_t PREFIX(_union_rect)(region_type_t *dest, + region_type_t *source, int x, + int y, unsigned int width, + unsigned int height) { region_type_t region; @@ -1417,97 +1228,84 @@ PREFIX (_union_rect) (region_type_t *dest, region.extents.x2 = x + width; region.extents.y2 = y + height; - if (!GOOD_RECT (®ion.extents)) - { - if (BAD_RECT (®ion.extents)) - _pixman_log_error (FUNC, "Invalid rectangle passed"); - return PREFIX (_copy) (dest, source); + if (!GOOD_RECT(®ion.extents)) { + if (BAD_RECT(®ion.extents)) + _pixman_log_error(FUNC, "Invalid rectangle passed"); + return PREFIX(_copy)(dest, source); } region.data = NULL; - return PREFIX (_union) (dest, source, ®ion); + return PREFIX(_union)(dest, source, ®ion); } -PIXMAN_EXPORT pixman_bool_t -PREFIX (_union) (region_type_t *new_reg, - region_type_t *reg1, - region_type_t *reg2) +PIXMAN_EXPORT pixman_bool_t PREFIX(_union)(region_type_t *new_reg, + region_type_t *reg1, + region_type_t *reg2) { /* Return TRUE if some overlap * between reg1, reg2 */ - GOOD (reg1); - GOOD (reg2); - GOOD (new_reg); + GOOD(reg1); + GOOD(reg2); + GOOD(new_reg); /* checks all the simple cases */ /* * Region 1 and 2 are the same */ - if (reg1 == reg2) - return PREFIX (_copy) (new_reg, reg1); + if (reg1 == reg2) return PREFIX(_copy)(new_reg, reg1); /* * Region 1 is empty */ - if (PIXREGION_NIL (reg1)) - { - if (PIXREGION_NAR (reg1)) - return pixman_break (new_reg); + if (PIXREGION_NIL(reg1)) { + if (PIXREGION_NAR(reg1)) return pixman_break(new_reg); - if (new_reg != reg2) - return PREFIX (_copy) (new_reg, reg2); + if (new_reg != reg2) return PREFIX(_copy)(new_reg, reg2); - return TRUE; + return TRUE; } /* * Region 2 is empty */ - if (PIXREGION_NIL (reg2)) - { - if (PIXREGION_NAR (reg2)) - return pixman_break (new_reg); + if (PIXREGION_NIL(reg2)) { + if (PIXREGION_NAR(reg2)) return pixman_break(new_reg); - if (new_reg != reg1) - return PREFIX (_copy) (new_reg, reg1); + if (new_reg != reg1) return PREFIX(_copy)(new_reg, reg1); - return TRUE; + return TRUE; } /* * Region 1 completely subsumes region 2 */ - if (!reg1->data && SUBSUMES (®1->extents, ®2->extents)) - { - if (new_reg != reg1) - return PREFIX (_copy) (new_reg, reg1); + if (!reg1->data && SUBSUMES(®1->extents, ®2->extents)) { + if (new_reg != reg1) return PREFIX(_copy)(new_reg, reg1); - return TRUE; + return TRUE; } /* * Region 2 completely subsumes region 1 */ - if (!reg2->data && SUBSUMES (®2->extents, ®1->extents)) - { - if (new_reg != reg2) - return PREFIX (_copy) (new_reg, reg2); + if (!reg2->data && SUBSUMES(®2->extents, ®1->extents)) { + if (new_reg != reg2) return PREFIX(_copy)(new_reg, reg2); - return TRUE; + return TRUE; } - if (!pixman_op (new_reg, reg1, reg2, pixman_region_union_o, TRUE, TRUE)) - return FALSE; + if (!pixman_op(new_reg, reg1, reg2, pixman_region_union_o, TRUE, TRUE)) + return FALSE; - new_reg->extents.x1 = MIN (reg1->extents.x1, reg2->extents.x1); - new_reg->extents.y1 = MIN (reg1->extents.y1, reg2->extents.y1); - new_reg->extents.x2 = MAX (reg1->extents.x2, reg2->extents.x2); - new_reg->extents.y2 = MAX (reg1->extents.y2, reg2->extents.y2); + new_reg->extents.x1 = MIN(reg1->extents.x1, reg2->extents.x1); + new_reg->extents.y1 = MIN(reg1->extents.y1, reg2->extents.y1); + new_reg->extents.x2 = MAX(reg1->extents.x2, reg2->extents.x2); + new_reg->extents.y2 = MAX(reg1->extents.y2, reg2->extents.y2); - GOOD (new_reg); + GOOD(new_reg); return TRUE; } @@ -1531,114 +1329,88 @@ PREFIX (_union) (region_type_t *new_reg, *----------------------------------------------------------------------- */ /*ARGSUSED*/ -static pixman_bool_t -pixman_region_subtract_o (region_type_t * region, - box_type_t * r1, - box_type_t * r1_end, - box_type_t * r2, - box_type_t * r2_end, - int y1, - int y2) +static pixman_bool_t pixman_region_subtract_o( + region_type_t *region, box_type_t *r1, box_type_t *r1_end, box_type_t *r2, + box_type_t *r2_end, int y1, int y2) { - box_type_t * next_rect; - int x1; + box_type_t *next_rect; + int x1; x1 = r1->x1; - critical_if_fail (y1 < y2); - critical_if_fail (r1 != r1_end && r2 != r2_end); + critical_if_fail(y1 < y2); + critical_if_fail(r1 != r1_end && r2 != r2_end); - next_rect = PIXREGION_TOP (region); + next_rect = PIXREGION_TOP(region); - do - { - if (r2->x2 <= x1) - { + do { + if (r2->x2 <= x1) { /* - * Subtrahend entirely to left of minuend: go to next subtrahend. - */ + * Subtrahend entirely to left of minuend: go to next subtrahend. + */ r2++; - } - else if (r2->x1 <= x1) - { + } else if (r2->x1 <= x1) { /* - * Subtrahend precedes minuend: nuke left edge of minuend. - */ + * Subtrahend precedes minuend: nuke left edge of minuend. + */ x1 = r2->x2; - if (x1 >= r1->x2) - { + if (x1 >= r1->x2) { /* - * Minuend completely covered: advance to next minuend and - * reset left fence to edge of new minuend. - */ + * Minuend completely covered: advance to next minuend and + * reset left fence to edge of new minuend. + */ r1++; - if (r1 != r1_end) - x1 = r1->x1; - } - else - { + if (r1 != r1_end) x1 = r1->x1; + } else { /* - * Subtrahend now used up since it doesn't extend beyond - * minuend - */ + * Subtrahend now used up since it doesn't extend beyond + * minuend + */ r2++; - } - } - else if (r2->x1 < r1->x2) - { + } + } else if (r2->x1 < r1->x2) { /* - * Left part of subtrahend covers part of minuend: add uncovered - * part of minuend to region and skip to next subtrahend. - */ - critical_if_fail (x1 < r2->x1); - NEWRECT (region, next_rect, x1, y1, r2->x1, y2); + * Left part of subtrahend covers part of minuend: add uncovered + * part of minuend to region and skip to next subtrahend. + */ + critical_if_fail(x1 < r2->x1); + NEWRECT(region, next_rect, x1, y1, r2->x1, y2); x1 = r2->x2; - if (x1 >= r1->x2) - { + if (x1 >= r1->x2) { /* - * Minuend used up: advance to new... - */ + * Minuend used up: advance to new... + */ r1++; - if (r1 != r1_end) - x1 = r1->x1; - } - else - { + if (r1 != r1_end) x1 = r1->x1; + } else { /* - * Subtrahend used up - */ + * Subtrahend used up + */ r2++; - } - } - else - { + } + } else { /* - * Minuend used up: add any remaining piece before advancing. - */ - if (r1->x2 > x1) - NEWRECT (region, next_rect, x1, y1, r1->x2, y2); + * Minuend used up: add any remaining piece before advancing. + */ + if (r1->x2 > x1) NEWRECT(region, next_rect, x1, y1, r1->x2, y2); r1++; - if (r1 != r1_end) - x1 = r1->x1; - } - } - while ((r1 != r1_end) && (r2 != r2_end)); + if (r1 != r1_end) x1 = r1->x1; + } + } while ((r1 != r1_end) && (r2 != r2_end)); /* * Add remaining minuend rectangles to region. */ - while (r1 != r1_end) - { - critical_if_fail (x1 < r1->x2); + while (r1 != r1_end) { + critical_if_fail(x1 < r1->x2); - NEWRECT (region, next_rect, x1, y1, r1->x2, y2); + NEWRECT(region, next_rect, x1, y1, r1->x2, y2); r1++; - if (r1 != r1_end) - x1 = r1->x1; + if (r1 != r1_end) x1 = r1->x1; } return TRUE; } @@ -1657,27 +1429,22 @@ pixman_region_subtract_o (region_type_t * region, * *----------------------------------------------------------------------- */ -PIXMAN_EXPORT pixman_bool_t -PREFIX (_subtract) (region_type_t *reg_d, - region_type_t *reg_m, - region_type_t *reg_s) +PIXMAN_EXPORT pixman_bool_t PREFIX(_subtract)(region_type_t *reg_d, + region_type_t *reg_m, + region_type_t *reg_s) { - GOOD (reg_m); - GOOD (reg_s); - GOOD (reg_d); + GOOD(reg_m); + GOOD(reg_s); + GOOD(reg_d); /* check for trivial rejects */ - if (PIXREGION_NIL (reg_m) || PIXREGION_NIL (reg_s) || - !EXTENTCHECK (®_m->extents, ®_s->extents)) - { - if (PIXREGION_NAR (reg_s)) - return pixman_break (reg_d); + if (PIXREGION_NIL(reg_m) || PIXREGION_NIL(reg_s) || + !EXTENTCHECK(®_m->extents, ®_s->extents)) { + if (PIXREGION_NAR(reg_s)) return pixman_break(reg_d); - return PREFIX (_copy) (reg_d, reg_m); - } - else if (reg_m == reg_s) - { - FREE_DATA (reg_d); + return PREFIX(_copy)(reg_d, reg_m); + } else if (reg_m == reg_s) { + FREE_DATA(reg_d); reg_d->extents.x2 = reg_d->extents.x1; reg_d->extents.y2 = reg_d->extents.y1; reg_d->data = pixman_region_empty_data; @@ -1688,8 +1455,8 @@ PREFIX (_subtract) (region_type_t *reg_d, /* Add those rectangles in region 1 that aren't in region 2, do yucky subtraction for overlaps, and just throw away rectangles in region 2 that aren't in region 1 */ - if (!pixman_op (reg_d, reg_m, reg_s, pixman_region_subtract_o, TRUE, FALSE)) - return FALSE; + if (!pixman_op(reg_d, reg_m, reg_s, pixman_region_subtract_o, TRUE, FALSE)) + return FALSE; /* * Can't alter reg_d's extents before we call pixman_op because @@ -1698,8 +1465,8 @@ PREFIX (_subtract) (region_type_t *reg_d, * way there's no checking against rectangles that will be nuked * due to coalescing, so we have to examine fewer rectangles. */ - pixman_set_extents (reg_d); - GOOD (reg_d); + pixman_set_extents(reg_d); + GOOD(reg_d); return TRUE; } #if 0 @@ -1769,34 +1536,28 @@ PREFIX (_inverse) (region_type_t *new_reg, /* Destination region */ /* In time O(log n), locate the first box whose y2 is greater than y. * Return @end if no such box exists. */ -static box_type_t * -find_box_for_y (box_type_t *begin, box_type_t *end, int y) +static box_type_t *find_box_for_y(box_type_t *begin, box_type_t *end, int y) { box_type_t *mid; - if (end == begin) - return end; + if (end == begin) return end; - if (end - begin == 1) - { - if (begin->y2 > y) - return begin; - else - return end; + if (end - begin == 1) { + if (begin->y2 > y) + return begin; + else + return end; } mid = begin + (end - begin) / 2; - if (mid->y2 > y) - { - /* If no box is found in [begin, mid], the function - * will return @mid, which is then known to be the - * correct answer. - */ - return find_box_for_y (begin, mid, y); - } - else - { - return find_box_for_y (mid, end, y); + if (mid->y2 > y) { + /* If no box is found in [begin, mid], the function + * will return @mid, which is then known to be the + * correct answer. + */ + return find_box_for_y(begin, mid, y); + } else { + return find_box_for_y(mid, end, y); } } @@ -1817,30 +1578,28 @@ find_box_for_y (box_type_t *begin, box_type_t *end, int y) * that doesn't overlap the box at all and part_in is false) */ PIXMAN_EXPORT pixman_region_overlap_t -PREFIX (_contains_rectangle) (region_type_t * region, - box_type_t * prect) + PREFIX(_contains_rectangle)(region_type_t *region, box_type_t *prect) { - box_type_t * pbox; - box_type_t * pbox_end; - int part_in, part_out; - int numRects; - int x, y; + box_type_t *pbox; + box_type_t *pbox_end; + int part_in, part_out; + int numRects; + int x, y; - GOOD (region); + GOOD(region); - numRects = PIXREGION_NUMRECTS (region); + numRects = PIXREGION_NUMRECTS(region); /* useful optimization */ - if (!numRects || !EXTENTCHECK (®ion->extents, prect)) - return(PIXMAN_REGION_OUT); + if (!numRects || !EXTENTCHECK(®ion->extents, prect)) + return (PIXMAN_REGION_OUT); - if (numRects == 1) - { + if (numRects == 1) { /* We know that it must be PIXMAN_REGION_IN or PIXMAN_REGION_PART */ - if (SUBSUMES (®ion->extents, prect)) - return(PIXMAN_REGION_IN); + if (SUBSUMES(®ion->extents, prect)) + return (PIXMAN_REGION_IN); else - return(PIXMAN_REGION_PART); + return (PIXMAN_REGION_PART); } part_out = FALSE; @@ -1850,73 +1609,56 @@ PREFIX (_contains_rectangle) (region_type_t * region, x = prect->x1; y = prect->y1; - /* can stop when both part_out and part_in are TRUE, or we reach prect->y2 */ - for (pbox = PIXREGION_BOXPTR (region), pbox_end = pbox + numRects; - pbox != pbox_end; - pbox++) - { - /* getting up to speed or skipping remainder of band */ - if (pbox->y2 <= y) - { - if ((pbox = find_box_for_y (pbox, pbox_end, y)) == pbox_end) - break; - } + /* can stop when both part_out and part_in are TRUE, or we reach prect->y2 + */ + for (pbox = PIXREGION_BOXPTR(region), pbox_end = pbox + numRects; + pbox != pbox_end; pbox++) { + /* getting up to speed or skipping remainder of band */ + if (pbox->y2 <= y) { + if ((pbox = find_box_for_y(pbox, pbox_end, y)) == pbox_end) break; + } - if (pbox->y1 > y) - { - part_out = TRUE; /* missed part of rectangle above */ - if (part_in || (pbox->y1 >= prect->y2)) - break; - y = pbox->y1; /* x guaranteed to be == prect->x1 */ - } + if (pbox->y1 > y) { + part_out = TRUE; /* missed part of rectangle above */ + if (part_in || (pbox->y1 >= prect->y2)) break; + y = pbox->y1; /* x guaranteed to be == prect->x1 */ + } - if (pbox->x2 <= x) - continue; /* not far enough over yet */ + if (pbox->x2 <= x) continue; /* not far enough over yet */ - if (pbox->x1 > x) - { - part_out = TRUE; /* missed part of rectangle to left */ - if (part_in) - break; - } + if (pbox->x1 > x) { + part_out = TRUE; /* missed part of rectangle to left */ + if (part_in) break; + } - if (pbox->x1 < prect->x2) - { - part_in = TRUE; /* definitely overlap */ - if (part_out) - break; - } + if (pbox->x1 < prect->x2) { + part_in = TRUE; /* definitely overlap */ + if (part_out) break; + } - if (pbox->x2 >= prect->x2) - { - y = pbox->y2; /* finished with this band */ - if (y >= prect->y2) - break; - x = prect->x1; /* reset x out to left again */ - } - else - { + if (pbox->x2 >= prect->x2) { + y = pbox->y2; /* finished with this band */ + if (y >= prect->y2) break; + x = prect->x1; /* reset x out to left again */ + } else { /* - * Because boxes in a band are maximal width, if the first box - * to overlap the rectangle doesn't completely cover it in that - * band, the rectangle must be partially out, since some of it - * will be uncovered in that band. part_in will have been set true - * by now... - */ + * Because boxes in a band are maximal width, if the first box + * to overlap the rectangle doesn't completely cover it in that + * band, the rectangle must be partially out, since some of it + * will be uncovered in that band. part_in will have been set true + * by now... + */ part_out = TRUE; break; - } + } } - if (part_in) - { + if (part_in) { if (y < prect->y2) - return PIXMAN_REGION_PART; + return PIXMAN_REGION_PART; else - return PIXMAN_REGION_IN; - } - else - { + return PIXMAN_REGION_IN; + } else { return PIXMAN_REGION_OUT; } } @@ -1925,116 +1667,104 @@ PREFIX (_contains_rectangle) (region_type_t * region, * translates in place */ -PIXMAN_EXPORT void -PREFIX (_translate) (region_type_t *region, int x, int y) +PIXMAN_EXPORT void PREFIX(_translate)(region_type_t *region, int x, int y) { overflow_int_t x1, x2, y1, y2; - int nbox; - box_type_t * pbox; + int nbox; + box_type_t * pbox; - GOOD (region); + GOOD(region); region->extents.x1 = x1 = region->extents.x1 + x; region->extents.y1 = y1 = region->extents.y1 + y; region->extents.x2 = x2 = region->extents.x2 + x; region->extents.y2 = y2 = region->extents.y2 + y; - if (((x1 - PIXMAN_REGION_MIN) | (y1 - PIXMAN_REGION_MIN) | (PIXMAN_REGION_MAX - x2) | (PIXMAN_REGION_MAX - y2)) >= 0) - { - if (region->data && (nbox = region->data->numRects)) - { - for (pbox = PIXREGION_BOXPTR (region); nbox--; pbox++) - { + if (((x1 - PIXMAN_REGION_MIN) | (y1 - PIXMAN_REGION_MIN) | + (PIXMAN_REGION_MAX - x2) | (PIXMAN_REGION_MAX - y2)) >= 0) { + if (region->data && (nbox = region->data->numRects)) { + for (pbox = PIXREGION_BOXPTR(region); nbox--; pbox++) { pbox->x1 += x; pbox->y1 += y; pbox->x2 += x; pbox->y2 += y; + } } - } return; } - if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) - { + if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | + (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) { region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; - FREE_DATA (region); + FREE_DATA(region); region->data = pixman_region_empty_data; return; } if (x1 < PIXMAN_REGION_MIN) - region->extents.x1 = PIXMAN_REGION_MIN; + region->extents.x1 = PIXMAN_REGION_MIN; else if (x2 > PIXMAN_REGION_MAX) - region->extents.x2 = PIXMAN_REGION_MAX; + region->extents.x2 = PIXMAN_REGION_MAX; if (y1 < PIXMAN_REGION_MIN) - region->extents.y1 = PIXMAN_REGION_MIN; + region->extents.y1 = PIXMAN_REGION_MIN; else if (y2 > PIXMAN_REGION_MAX) - region->extents.y2 = PIXMAN_REGION_MAX; + region->extents.y2 = PIXMAN_REGION_MAX; - if (region->data && (nbox = region->data->numRects)) - { - box_type_t * pbox_out; + if (region->data && (nbox = region->data->numRects)) { + box_type_t *pbox_out; - for (pbox_out = pbox = PIXREGION_BOXPTR (region); nbox--; pbox++) - { + for (pbox_out = pbox = PIXREGION_BOXPTR(region); nbox--; pbox++) { pbox_out->x1 = x1 = pbox->x1 + x; pbox_out->y1 = y1 = pbox->y1 + y; pbox_out->x2 = x2 = pbox->x2 + x; pbox_out->y2 = y2 = pbox->y2 + y; if (((x2 - PIXMAN_REGION_MIN) | (y2 - PIXMAN_REGION_MIN) | - (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) - { + (PIXMAN_REGION_MAX - x1) | (PIXMAN_REGION_MAX - y1)) <= 0) { region->data->numRects--; continue; - } + } if (x1 < PIXMAN_REGION_MIN) - pbox_out->x1 = PIXMAN_REGION_MIN; + pbox_out->x1 = PIXMAN_REGION_MIN; else if (x2 > PIXMAN_REGION_MAX) - pbox_out->x2 = PIXMAN_REGION_MAX; + pbox_out->x2 = PIXMAN_REGION_MAX; if (y1 < PIXMAN_REGION_MIN) - pbox_out->y1 = PIXMAN_REGION_MIN; + pbox_out->y1 = PIXMAN_REGION_MIN; else if (y2 > PIXMAN_REGION_MAX) - pbox_out->y2 = PIXMAN_REGION_MAX; + pbox_out->y2 = PIXMAN_REGION_MAX; pbox_out++; - } + } - if (pbox_out != pbox) - { - if (region->data->numRects == 1) - { - region->extents = *PIXREGION_BOXPTR (region); - FREE_DATA (region); + if (pbox_out != pbox) { + if (region->data->numRects == 1) { + region->extents = *PIXREGION_BOXPTR(region); + FREE_DATA(region); region->data = (region_data_type_t *)NULL; - } - else - { - pixman_set_extents (region); + } else { + pixman_set_extents(region); + } } } - } - GOOD (region); + GOOD(region); } -PIXMAN_EXPORT int -PREFIX (_not_empty) (region_type_t * region) +PIXMAN_EXPORT int PREFIX(_not_empty)(region_type_t *region) { - GOOD (region); + GOOD(region); - return(!PIXREGION_NIL (region)); + return (!PIXREGION_NIL(region)); } -PIXMAN_EXPORT box_type_t * -PREFIX (_extents) (region_type_t * region) +PIXMAN_EXPORT box_type_t *PREFIX(_extents)(region_type_t *region) { - GOOD (region); + GOOD(region); - return(®ion->extents); + return (®ion->extents); } typedef region_type_t VRegionPrivate; @@ -2043,11 +1773,11 @@ typedef region_type_t VRegionPrivate; V_BEGIN_NAMESPACE -static VRegionPrivate regionPrivate = {{0,0,0,0}, NULL}; +static VRegionPrivate regionPrivate = {{0, 0, 0, 0}, NULL}; struct VRegionData { - VRegionData():ref(-1),rgn(®ionPrivate){} - RefCount ref; + VRegionData() : ref(-1), rgn(®ionPrivate) {} + RefCount ref; VRegionPrivate *rgn; }; @@ -2069,8 +1799,7 @@ void VRegion::cleanUp(VRegionData *x) void VRegion::detach() { - if (d->ref.isShared()) - *this = copy(); + if (d->ref.isShared()) *this = copy(); } VRegion VRegion::copy() const @@ -2080,16 +1809,12 @@ VRegion VRegion::copy() const r.d = new VRegionData; r.d->rgn = new VRegionPrivate; r.d->ref.setOwned(); - PREFIX (_init) (r.d->rgn); - if (d != &shared_empty) - PREFIX(_copy)(r.d->rgn, d->rgn); + PREFIX(_init)(r.d->rgn); + if (d != &shared_empty) PREFIX(_copy)(r.d->rgn, d->rgn); return r; } -VRegion::VRegion() - : d(const_cast(&shared_empty)) -{ -} +VRegion::VRegion() : d(const_cast(&shared_empty)) {} VRegion::VRegion(int x, int y, int w, int h) { @@ -2101,7 +1826,7 @@ VRegion::VRegion(int x, int y, int w, int h) VRegion::VRegion(const VRect &r) { if (r.isEmpty()) { - d = const_cast(&shared_empty); + d = const_cast(&shared_empty); } else { d = new VRegionData; d->rgn = new VRegionPrivate; @@ -2116,17 +1841,15 @@ VRegion::VRegion(const VRegion &r) d->ref.ref(); } -VRegion::VRegion(VRegion &&other): d(other.d) +VRegion::VRegion(VRegion &&other) : d(other.d) { - other.d = const_cast(&shared_empty); - + other.d = const_cast(&shared_empty); } VRegion &VRegion::operator=(const VRegion &r) { r.d->ref.ref(); - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); d = r.d; return *this; @@ -2134,17 +1857,15 @@ VRegion &VRegion::operator=(const VRegion &r) inline VRegion &VRegion::operator=(VRegion &&other) { - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); d = other.d; - other.d = const_cast(&shared_empty); + other.d = const_cast(&shared_empty); return *this; } VRegion::~VRegion() { - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); } bool VRegion::isEmpty() const @@ -2154,8 +1875,7 @@ bool VRegion::isEmpty() const void VRegion::translate(const VPoint &p) { - if (p == VPoint() || isEmpty()) - return; + if (p == VPoint() || isEmpty()) return; detach(); PREFIX(_translate)(d->rgn, p.x(), p.y()); @@ -2175,24 +1895,22 @@ bool VRegion::within(const VRect &r1) const { box_type_t *r2 = PREFIX(_extents)(d->rgn); - return r2->x1 >= r1.left() && r2->x2 <= r1.right() - && r2->y1 >= r1.top() && r2->y2 <= r1.bottom(); + return r2->x1 >= r1.left() && r2->x2 <= r1.right() && r2->y1 >= r1.top() && + r2->y2 <= r1.bottom(); } bool VRegion::contains(const VRect &r) const { box_type_t box = {r.left(), r.top(), r.right(), r.bottom()}; - pixman_region_overlap_t res = PREFIX (_contains_rectangle)(d->rgn, &box); - if (res == PIXMAN_REGION_IN) - return true; + pixman_region_overlap_t res = PREFIX(_contains_rectangle)(d->rgn, &box); + if (res == PIXMAN_REGION_IN) return true; return false; } VRegion VRegion::united(const VRect &r) const { - if (isEmpty()) - return r; + if (isEmpty()) return r; if (contains(r)) { return *this; @@ -2201,22 +1919,17 @@ VRegion VRegion::united(const VRect &r) const } else { VRegion result; result.detach(); - PREFIX(_union_rect)(result.d->rgn, d->rgn, - r.left(), r.top(), - r.width(), r.height()); + PREFIX(_union_rect) + (result.d->rgn, d->rgn, r.left(), r.top(), r.width(), r.height()); return result; } } VRegion VRegion::united(const VRegion &r) const { - if (isEmpty()) - return r; - if (r.isEmpty()) - return *this; - if (d == r.d || - PREFIX(_equal)(d->rgn, r.d->rgn)) - return *this; + if (isEmpty()) return r; + if (r.isEmpty()) return *this; + if (d == r.d || PREFIX(_equal)(d->rgn, r.d->rgn)) return *this; VRegion result; result.detach(); PREFIX(_union)(result.d->rgn, d->rgn, r.d->rgn); @@ -2225,29 +1938,24 @@ VRegion VRegion::united(const VRegion &r) const VRegion VRegion::intersected(const VRect &r) const { - if (isEmpty() || r.isEmpty()) - return VRegion(); + if (isEmpty() || r.isEmpty()) return VRegion(); /* this is fully contained in r */ - if (within(r)) - return *this; + if (within(r)) return *this; /* r is fully contained in this */ - if (contains(r)) - return r; + if (contains(r)) return r; VRegion result; result.detach(); - PREFIX(_intersect_rect)(result.d->rgn, d->rgn, - r.left(), r.top(), - r.width(), r.height()); + PREFIX(_intersect_rect) + (result.d->rgn, d->rgn, r.left(), r.top(), r.width(), r.height()); return result; } VRegion VRegion::intersected(const VRegion &r) const { - if (isEmpty() || r.isEmpty()) - return VRegion(); + if (isEmpty() || r.isEmpty()) return VRegion(); VRegion result; result.detach(); @@ -2258,11 +1966,8 @@ VRegion VRegion::intersected(const VRegion &r) const VRegion VRegion::subtracted(const VRegion &r) const { - if (isEmpty() || r.isEmpty()) - return *this; - if (d == r.d || - PREFIX(_equal)(d->rgn, r.d->rgn)) - return VRegion(); + if (isEmpty() || r.isEmpty()) return *this; + if (d == r.d || PREFIX(_equal)(d->rgn, r.d->rgn)) return VRegion(); VRegion result; result.detach(); @@ -2279,8 +1984,7 @@ int VRegion::rectCount() const VRect VRegion::rectAt(int index) const { VRegionPrivate *reg = d->rgn; - if (!reg) - return VRect(); + if (!reg) return VRect(); box_type_t *box = PIXREGION_RECTS(reg) + index; @@ -2288,20 +1992,24 @@ VRect VRegion::rectAt(int index) const } VRegion VRegion::operator+(const VRect &r) const -{ return united(r); } +{ + return united(r); +} VRegion VRegion::operator+(const VRegion &r) const -{ return united(r); } +{ + return united(r); +} VRegion VRegion::operator-(const VRegion &r) const -{ return subtracted(r); } - -VRegion& VRegion::operator+=(const VRect &r) { - if (isEmpty()) - return *this = r; - if (r.isEmpty()) - return *this; + return subtracted(r); +} + +VRegion &VRegion::operator+=(const VRect &r) +{ + if (isEmpty()) return *this = r; + if (r.isEmpty()) return *this; if (contains(r)) { return *this; @@ -2309,37 +2017,32 @@ VRegion& VRegion::operator+=(const VRect &r) return *this = r; } else { detach(); - PREFIX(_union_rect)(d->rgn, d->rgn, - r.left(), r.top(), - r.width(), r.height()); + PREFIX(_union_rect) + (d->rgn, d->rgn, r.left(), r.top(), r.width(), r.height()); return *this; } } -VRegion& VRegion::operator+=(const VRegion &r) +VRegion &VRegion::operator+=(const VRegion &r) { - if (isEmpty()) - return *this = r; - if (r.isEmpty()) - return *this; - if (d == r.d || - PREFIX(_equal)(d->rgn, r.d->rgn)) - return *this; + if (isEmpty()) return *this = r; + if (r.isEmpty()) return *this; + if (d == r.d || PREFIX(_equal)(d->rgn, r.d->rgn)) return *this; detach(); PREFIX(_union)(d->rgn, d->rgn, r.d->rgn); return *this; } -VRegion& VRegion::operator-=(const VRegion &r) -{ return *this = *this - r; } +VRegion &VRegion::operator-=(const VRegion &r) +{ + return *this = *this - r; +} bool VRegion::operator==(const VRegion &r) const { - if (isEmpty()) - return r.isEmpty(); - if (r.isEmpty()) - return isEmpty(); + if (isEmpty()) return r.isEmpty(); + if (r.isEmpty()) return isEmpty(); if (d == r.d) return true; @@ -2349,8 +2052,7 @@ bool VRegion::operator==(const VRegion &r) const VRect VRegion::boundingRect() const noexcept { - if (isEmpty()) - return VRect(); + if (isEmpty()) return VRect(); return box_to_rect(&d->rgn->extents); } @@ -2362,24 +2064,23 @@ inline bool rect_intersects(const VRect &r1, const VRect &r2) bool VRegion::intersects(const VRegion &r) const { - if (isEmpty() || r.isEmpty()) - return false; + if (isEmpty() || r.isEmpty()) return false; return PREFIX(_intersects)(d->rgn, r.d->rgn); } -VDebug& operator<<(VDebug& os, const VRegion& o) +VDebug &operator<<(VDebug &os, const VRegion &o) { - os<<"[REGION: "<<"[bbox = "< -#include -#include -#include +#include +#include +#include +#include "vdebug.h" V_BEGIN_NAMESPACE struct VRegionData; -class VRegion -{ +class VRegion { public: VRegion(); VRegion(int x, int y, int w, int h); @@ -19,53 +18,54 @@ public: VRegion(const VRegion ®ion); VRegion(VRegion &&other); ~VRegion(); - VRegion &operator=(const VRegion &); - VRegion &operator=(VRegion &&); - bool isEmpty() const; - bool contains(const VRect &r) const; - VRegion united(const VRect &r) const; - VRegion united(const VRegion &r) const; - VRegion intersected(const VRect &r) const; - VRegion intersected(const VRegion &r) const; - VRegion subtracted(const VRegion &r) const; - void translate(const VPoint &p); - inline void translate(int dx, int dy); - VRegion translated(const VPoint &p) const; + VRegion & operator=(const VRegion &); + VRegion & operator=(VRegion &&); + bool isEmpty() const; + bool contains(const VRect &r) const; + VRegion united(const VRect &r) const; + VRegion united(const VRegion &r) const; + VRegion intersected(const VRect &r) const; + VRegion intersected(const VRegion &r) const; + VRegion subtracted(const VRegion &r) const; + void translate(const VPoint &p); + inline void translate(int dx, int dy); + VRegion translated(const VPoint &p) const; inline VRegion translated(int dx, int dy) const; - int rectCount() const; - VRect rectAt(int index) const; + int rectCount() const; + VRect rectAt(int index) const; - VRegion operator+(const VRect &r) const; - VRegion operator+(const VRegion &r) const; - VRegion operator-(const VRegion &r) const; - VRegion& operator+=(const VRect &r); - VRegion& operator+=(const VRegion &r); - VRegion& operator-=(const VRegion &r); + VRegion operator+(const VRect &r) const; + VRegion operator+(const VRegion &r) const; + VRegion operator-(const VRegion &r) const; + VRegion &operator+=(const VRect &r); + VRegion &operator+=(const VRegion &r); + VRegion &operator-=(const VRegion &r); VRect boundingRect() const noexcept; - bool intersects(const VRegion ®ion) const; + bool intersects(const VRegion ®ion) const; - bool operator==(const VRegion &r) const; + bool operator==(const VRegion &r) const; inline bool operator!=(const VRegion &r) const { return !(operator==(r)); } - friend VDebug& operator<<(VDebug& os, const VRegion& o); + friend VDebug &operator<<(VDebug &os, const VRegion &o); + private: - bool within(const VRect &r) const; + bool within(const VRect &r) const; VRegion copy() const; - void detach(); - void cleanUp(VRegionData *x); + void detach(); + void cleanUp(VRegionData *x); struct VRegionData *d; }; inline void VRegion::translate(int dx, int dy) { - translate(VPoint(dx,dy)); + translate(VPoint(dx, dy)); } inline VRegion VRegion::translated(int dx, int dy) const { - return translated(VPoint(dx,dy)); + return translated(VPoint(dx, dy)); } V_END_NAMESPACE -#endif //VREGION_H +#endif // VREGION_H diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index de248a563d..83487ac889 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -1,27 +1,28 @@ #include "vrle.h" -#include"vglobal.h" -#include -#include -#include -#include -#include -#include"vdebug.h" -#include"vregion.h" +#include +#include +#include +#include +#include +#include "vdebug.h" +#include "vglobal.h" +#include "vregion.h" V_BEGIN_NAMESPACE -struct VRleHelper -{ - ushort alloc; - ushort size; - VRle::Span *spans; +struct VRleHelper { + ushort alloc; + ushort size; + VRle::Span *spans; }; -#define VMIN(a,b) ((a) < (b) ? (a) : (b)) -#define VMAX(a,b) ((a) > (b) ? (a) : (b)) +#define VMIN(a, b) ((a) < (b) ? (a) : (b)) +#define VMAX(a, b) ((a) > (b) ? (a) : (b)) -static inline uchar -divBy255(int x) { return (x + (x>>8) + 0x80) >> 8; } +static inline uchar divBy255(int x) +{ + return (x + (x >> 8) + 0x80) >> 8; +} /* * This function will clip a rle list with another rle object @@ -33,86 +34,71 @@ divBy255(int x) { return (x + (x>>8) + 0x80) >> 8; } * that are yet to be processed as well as the tpm_clip object * with the unprocessed clip spans. */ -static void -rleIntersectWithRle(VRleHelper *tmp_clip, - int clip_offset_x, - int clip_offset_y, - VRleHelper *tmp_obj, - VRleHelper *result) +static void rleIntersectWithRle(VRleHelper *tmp_clip, int clip_offset_x, + int clip_offset_y, VRleHelper *tmp_obj, + VRleHelper *result) { VRle::Span *out = result->spans; - int available = result->alloc; + int available = result->alloc; VRle::Span *spans = tmp_obj->spans; VRle::Span *end = tmp_obj->spans + tmp_obj->size; VRle::Span *clipSpans = tmp_clip->spans; VRle::Span *clipEnd = tmp_clip->spans + tmp_clip->size; - int sx1, sx2, cx1, cx2, x, len; + int sx1, sx2, cx1, cx2, x, len; - - while (available && spans < end ) - { - if (clipSpans >= clipEnd) - { - spans = end; - break; - } - if ((clipSpans->y + clip_offset_y) > spans->y) - { - ++spans; - continue; - } - if (spans->y != (clipSpans->y + clip_offset_y)) - { - ++clipSpans; - continue; - } - //assert(spans->y == (clipSpans->y + clip_offset_y)); + while (available && spans < end) { + if (clipSpans >= clipEnd) { + spans = end; + break; + } + if ((clipSpans->y + clip_offset_y) > spans->y) { + ++spans; + continue; + } + if (spans->y != (clipSpans->y + clip_offset_y)) { + ++clipSpans; + continue; + } + // assert(spans->y == (clipSpans->y + clip_offset_y)); sx1 = spans->x; sx2 = sx1 + spans->len; cx1 = (clipSpans->x + clip_offset_x); cx2 = cx1 + clipSpans->len; - if (cx1 < sx1 && cx2 < sx1) - { - ++clipSpans; - continue; - } - else if (sx1 < cx1 && sx2 < cx1) - { - ++spans; - continue; - } + if (cx1 < sx1 && cx2 < sx1) { + ++clipSpans; + continue; + } else if (sx1 < cx1 && sx2 < cx1) { + ++spans; + continue; + } x = VMAX(sx1, cx1); len = VMIN(sx2, cx2) - x; - if (len) - { - out->x = VMAX(sx1, cx1); - out->len = ( VMIN(sx2, cx2) - out->x); - out->y = spans->y; - out->coverage = divBy255(spans->coverage * clipSpans->coverage); - ++out; - --available; - } - if (sx2 < cx2) - { - ++spans; - } - else - { - ++clipSpans; - } - } + if (len) { + out->x = VMAX(sx1, cx1); + out->len = (VMIN(sx2, cx2) - out->x); + out->y = spans->y; + out->coverage = divBy255(spans->coverage * clipSpans->coverage); + ++out; + --available; + } + if (sx2 < cx2) { + ++spans; + } else { + ++clipSpans; + } + } - // update the span list that yet to be processed - tmp_obj->spans = spans; - tmp_obj->size = end - spans; + // update the span list that yet to be processed + tmp_obj->spans = spans; + tmp_obj->size = end - spans; - // update the clip list that yet to be processed - tmp_clip->spans = clipSpans; - tmp_clip->size = clipEnd - clipSpans; + // update the clip list that yet to be processed + tmp_clip->spans = clipSpans; + tmp_clip->size = clipEnd - clipSpans; - // update the result - result->size = result->alloc - available; + // update the result + result->size = result->alloc - available; } /* @@ -124,62 +110,52 @@ rleIntersectWithRle(VRleHelper *tmp_clip, * it will stop and update the tmp_obj with the span list * that are yet to be processed */ -static void -rleIntersectWithRect(const VRect &clip, - VRleHelper *tmp_obj, - VRleHelper *result) +static void rleIntersectWithRect(const VRect &clip, VRleHelper *tmp_obj, + VRleHelper *result) { - VRle::Span *out = result->spans; - int available = result->alloc; - VRle::Span *spans = tmp_obj->spans; - VRle::Span *end = tmp_obj->spans + tmp_obj->size; - short minx, miny, maxx, maxy; + VRle::Span *out = result->spans; + int available = result->alloc; + VRle::Span *spans = tmp_obj->spans; + VRle::Span *end = tmp_obj->spans + tmp_obj->size; + short minx, miny, maxx, maxy; - minx = clip.left(); - miny = clip.top(); - maxx = clip.right() - 1; - maxy = clip.bottom() - 1; + minx = clip.left(); + miny = clip.top(); + maxx = clip.right() - 1; + maxy = clip.bottom() - 1; - while (available && spans < end ) - { - if (spans->y > maxy) - { - spans = end;// update spans so that we can breakout - break; - } - if (spans->y < miny - || spans->x > maxx - || spans->x + spans->len <= minx) - { - ++spans; - continue; - } - if (spans->x < minx) - { - out->len = VMIN(spans->len - (minx - spans->x), maxx - minx + 1); - out->x = minx; - } - else - { - out->x = spans->x; - out->len = VMIN(spans->len, (maxx - spans->x + 1)); - } - if (out->len != 0) - { - out->y = spans->y; - out->coverage = spans->coverage; - ++out; - --available; - } + while (available && spans < end) { + if (spans->y > maxy) { + spans = end; // update spans so that we can breakout + break; + } + if (spans->y < miny || spans->x > maxx || + spans->x + spans->len <= minx) { + ++spans; + continue; + } + if (spans->x < minx) { + out->len = VMIN(spans->len - (minx - spans->x), maxx - minx + 1); + out->x = minx; + } else { + out->x = spans->x; + out->len = VMIN(spans->len, (maxx - spans->x + 1)); + } + if (out->len != 0) { + out->y = spans->y; + out->coverage = spans->coverage; + ++out; + --available; + } ++spans; - } + } - // update the span list that yet to be processed - tmp_obj->spans = spans; - tmp_obj->size = end - spans; + // update the span list that yet to be processed + tmp_obj->spans = spans; + tmp_obj->size = end - spans; - // update the result - result->size = result->alloc - available; + // update the result + result->size = result->alloc - available; } void drawSpanlineMul(VRle::Span *spans, int count, uchar *buffer, int offsetX) @@ -213,10 +189,10 @@ void drawSpanline(VRle::Span *spans, int count, uchar *buffer, int offsetX) int bufferToRle(uchar *buffer, int size, int offsetX, int y, VRle::Span *out) { - int count = 0; + int count = 0; uchar value = buffer[0]; - int curIndex = 0; - for (int i = 0; i < size ; i++) { + int curIndex = 0; + for (int i = 0; i < size; i++) { uchar curValue = buffer[0]; if (value != curValue) { out->y = y; @@ -238,18 +214,16 @@ int bufferToRle(uchar *buffer, int size, int offsetX, int y, VRle::Span *out) return count; } -static void -rleAddWithRle1(VRleHelper *tmp_clip, - VRleHelper *tmp_obj, - VRleHelper *result) +static void rleAddWithRle1(VRleHelper *tmp_clip, VRleHelper *tmp_obj, + VRleHelper *result) { - std::array rleHolder; - VRle::Span *out = result->spans; - int available = result->alloc; - VRle::Span *spans = tmp_obj->spans; - VRle::Span *end = tmp_obj->spans + tmp_obj->size; - VRle::Span *clipSpans = tmp_clip->spans; - VRle::Span *clipEnd = tmp_clip->spans + tmp_clip->size; + std::array rleHolder; + VRle::Span * out = result->spans; + int available = result->alloc; + VRle::Span * spans = tmp_obj->spans; + VRle::Span * end = tmp_obj->spans + tmp_obj->size; + VRle::Span * clipSpans = tmp_clip->spans; + VRle::Span * clipEnd = tmp_clip->spans + tmp_clip->size; while (available && spans < end && clipSpans < clipEnd) { if (spans->y < clipSpans->y) { @@ -258,25 +232,27 @@ rleAddWithRle1(VRleHelper *tmp_clip, } else if (clipSpans->y < spans->y) { *out++ = *clipSpans++; available--; - } else { // same y - int y = spans->y; + } else { // same y + int y = spans->y; VRle::Span *spanPtr = spans; VRle::Span *clipPtr = clipSpans; while (spanPtr < end && spanPtr->y == y) spanPtr++; while (clipPtr < clipEnd && clipPtr->y == y) clipPtr++; - int spanLength = (spanPtr-1)->x + (spanPtr-1)->len - spans->x; - int clipLength = (clipPtr-1)->x + (clipPtr-1)->len - clipSpans->x; - int offsetX = VMIN(spans->x, clipSpans->x); - std::array array = {0}; + int spanLength = (spanPtr - 1)->x + (spanPtr - 1)->len - spans->x; + int clipLength = + (clipPtr - 1)->x + (clipPtr - 1)->len - clipSpans->x; + int offsetX = VMIN(spans->x, clipSpans->x); + std::array array = {0}; drawSpanline(spans, (spanPtr - spans), array.data(), -offsetX); - drawSpanlineMul(clipSpans, (clipPtr - clipSpans), array.data(), -offsetX); + drawSpanlineMul(clipSpans, (clipPtr - clipSpans), array.data(), + -offsetX); VRle::Span *rleHolderPtr = rleHolder.data(); int size = bufferToRle(array.data(), VMAX(spanLength, clipLength), offsetX, y, rleHolderPtr); if (available >= size) { - while(size--) { + while (size--) { *out++ = *rleHolderPtr++; available--; } @@ -299,47 +275,48 @@ rleAddWithRle1(VRleHelper *tmp_clip, result->size = result->alloc - available; } - -class VRleImpl -{ +class VRleImpl { public: - inline VRleImpl():m_bbox(),m_spans(), mOffset(), mBboxDirty(true){} + inline VRleImpl() : m_bbox(), m_spans(), mOffset(), mBboxDirty(true) {} VRleImpl &operator=(const VRleImpl &); - void addSpan(const VRle::Span *span, int count); - void updateBbox(); - bool operator ==(const VRleImpl &) const; - void intersected(const VRect &r, VRleImpl &result); + void addSpan(const VRle::Span *span, int count); + void updateBbox(); + bool operator==(const VRleImpl &) const; + void intersected(const VRect &r, VRleImpl &result); void intersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) const; void intersected(const VRleImpl &clip, VRleImpl &result); - friend VDebug& operator<<(VDebug& os, const VRleImpl& object); - void invert(); - void alphaMul(int alpha); - void translate(const VPoint &pt); - void opAdd(const VRleImpl &other, VRleImpl &res); - VRect bbox(); + friend VDebug &operator<<(VDebug &os, const VRleImpl &object); + void invert(); + void alphaMul(int alpha); + void translate(const VPoint &pt); + void opAdd(const VRleImpl &other, VRleImpl &res); + VRect bbox(); + public: VRect m_bbox; - std::vector m_spans;// array of Spanlines. + std::vector m_spans; // array of Spanlines. VPoint mOffset; - bool mBboxDirty; + bool mBboxDirty; }; -inline static void -copyArrayToVector(const VRle::Span *span, int count, std::vector &v) +inline static void copyArrayToVector(const VRle::Span *span, int count, + std::vector &v) { // make sure enough memory available v.reserve(v.size() + count); std::copy(span, span + count, back_inserter(v)); } -VDebug& operator<<(VDebug& os, const VRleImpl& o) +VDebug &operator<<(VDebug &os, const VRleImpl &o) { - os<<"[bbox="<< o.m_bbox<<"]"<<"[offset="< array; + VRleHelper tresult, tmp_obj; + std::array array; - //setup the tresult object + // setup the tresult object tresult.size = array.size(); tresult.alloc = array.size(); tresult.spans = array.data(); @@ -396,25 +373,25 @@ void VRleImpl::intersected(const VRect &r, VRleImpl &result) tmp_obj.spans = m_spans.data(); // run till all the spans are processed - while (tmp_obj.size) - { - rleIntersectWithRect(clip, &tmp_obj, &tresult); - if (tresult.size) { - copyArrayToVector(tresult.spans, tresult.size, result.m_spans); - } - tresult.size = 0; - } + while (tmp_obj.size) { + rleIntersectWithRect(clip, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, result.m_spans); + } + tresult.size = 0; + } result.updateBbox(); } -void VRleImpl::intersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) const +void VRleImpl::intersect(const VRect &r, VRle::VRleSpanCb cb, + void *userData) const { VRect clip = r; - VRleHelper tresult, tmp_obj; - std::array array; + VRleHelper tresult, tmp_obj; + std::array array; - //setup the tresult object + // setup the tresult object tresult.size = array.size(); tresult.alloc = array.size(); tresult.spans = array.data(); @@ -424,22 +401,21 @@ void VRleImpl::intersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) co tmp_obj.spans = const_cast(m_spans.data()); // run till all the spans are processed - while (tmp_obj.size) - { - rleIntersectWithRect(clip, &tmp_obj, &tresult); - if (tresult.size) { - cb(tresult.size, tresult.spans, userData); - } - tresult.size = 0; - } + while (tmp_obj.size) { + rleIntersectWithRect(clip, &tmp_obj, &tresult); + if (tresult.size) { + cb(tresult.size, tresult.spans, userData); + } + tresult.size = 0; + } } void VRleImpl::intersected(const VRleImpl &clip, VRleImpl &result) { - VRleHelper tresult, tmp_obj, tmp_clip; - std::array array; + VRleHelper tresult, tmp_obj, tmp_clip; + std::array array; - //setup the tresult object + // setup the tresult object tresult.size = array.size(); tresult.alloc = array.size(); tresult.spans = array.data(); @@ -448,19 +424,18 @@ void VRleImpl::intersected(const VRleImpl &clip, VRleImpl &result) tmp_obj.size = m_spans.size(); tmp_obj.spans = m_spans.data(); - //setup tmp clip object + // setup tmp clip object tmp_clip.size = clip.m_spans.size(); tmp_clip.spans = const_cast(clip.m_spans.data()); // run till all the spans are processed - while (tmp_obj.size) - { - rleIntersectWithRle(&tmp_clip, 0, 0, &tmp_obj, &tresult); - if (tresult.size) { - copyArrayToVector(tresult.spans, tresult.size, result.m_spans); - } - tresult.size = 0; - } + while (tmp_obj.size) { + rleIntersectWithRle(&tmp_clip, 0, 0, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, result.m_spans); + } + tresult.size = 0; + } result.updateBbox(); } @@ -471,20 +446,21 @@ void VRleImpl::opAdd(const VRleImpl &other, VRleImpl &result) // if two rle are disjoint if (!m_bbox.intersects(other.m_bbox)) { result.m_spans = m_spans; - copyArrayToVector(other.m_spans.data(), other.m_spans.size(), result.m_spans); + copyArrayToVector(other.m_spans.data(), other.m_spans.size(), + result.m_spans); } else { VRle::Span *ptr = m_spans.data(); - int otherY = other.m_bbox.top(); + int otherY = other.m_bbox.top(); // 1. forward till both y intersect - while (ptr->y < otherY) ptr++; + while (ptr->y < otherY) ptr++; int spanToCopy = ptr - m_spans.data(); copyArrayToVector(m_spans.data(), spanToCopy, result.m_spans); // 2. calculate the intersect region - VRleHelper tresult, tmp_obj, tmp_other; - std::array array; + VRleHelper tresult, tmp_obj, tmp_other; + std::array array; - //setup the tresult object + // setup the tresult object tresult.size = array.size(); tresult.alloc = array.size(); tresult.spans = array.data(); @@ -493,20 +469,19 @@ void VRleImpl::opAdd(const VRleImpl &other, VRleImpl &result) tmp_obj.size = m_spans.size() - spanToCopy; tmp_obj.spans = ptr; - //setup tmp clip object + // setup tmp clip object tmp_other.size = other.m_spans.size(); tmp_other.spans = const_cast(other.m_spans.data()); // run till all the spans are processed - while (tmp_obj.size && tmp_other.size) - { - rleAddWithRle1(&tmp_other, &tmp_obj, &tresult); - if (tresult.size) { - copyArrayToVector(tresult.spans, tresult.size, result.m_spans); - } - tresult.size = 0; - } - //3. copy the rest + while (tmp_obj.size && tmp_other.size) { + rleAddWithRle1(&tmp_other, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, result.m_spans); + } + tresult.size = 0; + } + // 3. copy the rest if (tmp_other.size) { copyArrayToVector(tmp_other.spans, tmp_other.size, result.m_spans); } @@ -522,7 +497,6 @@ void VRleImpl::opAdd(const VRleImpl &other, VRleImpl &result) result.mBboxDirty = false; } - VRleImpl &VRleImpl::operator=(const VRleImpl &other) { m_spans = other.m_spans; @@ -531,17 +505,15 @@ VRleImpl &VRleImpl::operator=(const VRleImpl &other) return *this; } -bool VRleImpl::operator ==(const VRleImpl &other) const +bool VRleImpl::operator==(const VRleImpl &other) const { - if (m_spans.size() != other.m_spans.size()) - return false; + if (m_spans.size() != other.m_spans.size()) return false; const VRle::Span *spans = m_spans.data(); const VRle::Span *o_spans = other.m_spans.data(); - int sz = m_spans.size(); + int sz = m_spans.size(); for (int i = 0; i < sz; i++) { - if (spans[i].x != o_spans[i].x || - spans[i].y != o_spans[i].y || + if (spans[i].x != o_spans[i].x || spans[i].y != o_spans[i].y || spans[i].len != o_spans[i].len || spans[i].coverage != o_spans[i].coverage) return false; @@ -549,7 +521,6 @@ bool VRleImpl::operator ==(const VRleImpl &other) const return true; } - void VRleImpl::updateBbox() { if (!mBboxDirty) return; @@ -562,17 +533,15 @@ void VRleImpl::updateBbox() m_bbox = VRect(); sz = m_spans.size(); - if (sz) - { - t = span[0].y; - b = span[sz-1].y; - for (i = 0; i < sz; i++) - { - if (span[i].x < l) l = span[i].x; - if (span[i].x + span[i].len > r) r = span[i].x + span[i].len; - } - m_bbox = VRect(l, t, r - l, b - t + 1); - } + if (sz) { + t = span[0].y; + b = span[sz - 1].y; + for (i = 0; i < sz; i++) { + if (span[i].x < l) l = span[i].x; + if (span[i].x + span[i].len > r) r = span[i].x + span[i].len; + } + m_bbox = VRect(l, t, r - l, b - t + 1); + } } void VRleImpl::addSpan(const VRle::Span *span, int count) @@ -581,11 +550,10 @@ void VRleImpl::addSpan(const VRle::Span *span, int count) mBboxDirty = true; } -struct VRleData -{ - VRleData():ref(-1), impl(){} - RefCount ref; - VRleImpl impl; +struct VRleData { + VRleData() : ref(-1), impl() {} + RefCount ref; + VRleImpl impl; }; static const struct VRleData shared_empty; @@ -597,8 +565,7 @@ inline void VRle::cleanUp(VRleData *d) void VRle::detach() { - if (d->ref.isShared()) - *this = copy(); + if (d->ref.isShared()) *this = copy(); } VRle VRle::copy() const @@ -613,14 +580,10 @@ VRle VRle::copy() const VRle::~VRle() { - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); } -VRle::VRle() - : d(const_cast(&shared_empty)) -{ -} +VRle::VRle() : d(const_cast(&shared_empty)) {} VRle::VRle(const VRle &other) { @@ -628,16 +591,15 @@ VRle::VRle(const VRle &other) d->ref.ref(); } -VRle::VRle(VRle &&other): d(other.d) +VRle::VRle(VRle &&other) : d(other.d) { - other.d = const_cast(&shared_empty); + other.d = const_cast(&shared_empty); } VRle &VRle::operator=(const VRle &other) { other.d->ref.ref(); - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); d = other.d; return *this; @@ -645,14 +607,13 @@ VRle &VRle::operator=(const VRle &other) inline VRle &VRle::operator=(VRle &&other) { - if (!d->ref.deref()) - cleanUp(d); + if (!d->ref.deref()) cleanUp(d); d = other.d; - other.d = const_cast(&shared_empty); + other.d = const_cast(&shared_empty); return *this; } -bool VRle::isEmpty()const +bool VRle::isEmpty() const { return (d == &shared_empty || d->impl.m_spans.empty()); } @@ -665,17 +626,14 @@ void VRle::addSpan(const VRle::Span *span, int count) VRect VRle::boundingRect() const { - if(isEmpty()) - return VRect(); + if (isEmpty()) return VRect(); return d->impl.bbox(); } -bool VRle::operator ==(const VRle &other) const +bool VRle::operator==(const VRle &other) const { - if (isEmpty()) - return other.isEmpty(); - if (other.isEmpty()) - return isEmpty(); + if (isEmpty()) return other.isEmpty(); + if (other.isEmpty()) return isEmpty(); if (d == other.d) return true; @@ -695,12 +653,10 @@ void VRle::translate(const VPoint &p) VRle VRle::intersected(const VRect &r) const { - if (isEmpty() || r.isEmpty()) - return VRle(); + if (isEmpty() || r.isEmpty()) return VRle(); // check if the bounding rect is contain inside r - if (r.contains(boundingRect(), true)) - return *this; + if (r.contains(boundingRect(), true)) return *this; VRle result; result.detach(); @@ -710,8 +666,7 @@ VRle VRle::intersected(const VRect &r) const VRle VRle::intersected(const VRle &other) const { - if (isEmpty() || other.isEmpty()) - return VRle(); + if (isEmpty() || other.isEmpty()) return VRle(); // check if the bounding rect are not intersecting VRle result; result.detach(); @@ -738,7 +693,7 @@ VRle VRle::operator+(const VRle &other) const VRle result; result.detach(); if (boundingRect().top() < other.boundingRect().top()) - d->impl.opAdd(other.d->impl, result.d->impl); + d->impl.opAdd(other.d->impl, result.d->impl); else other.d->impl.opAdd(d->impl, result.d->impl); return result; @@ -766,18 +721,14 @@ VRle VRle::operator&(const VRle &o) const return result; } - - void VRle::intersect(const VRect &r, VRleSpanCb cb, void *userData) const { d->impl.intersect(r, cb, userData); } - -VRle &VRle::intersect(const VRect &r) +VRle &VRle::intersect(const VRect &r) { - if (isEmpty() || r.isEmpty()) - return *this = VRle(); + if (isEmpty() || r.isEmpty()) return *this = VRle(); VRle result; result.detach(); @@ -795,14 +746,13 @@ VRle operator*(const VRle &obj, int alpha) return result; } - int VRle::size() const { if (isEmpty()) return 0; return d->impl.m_spans.size(); } -const VRle::Span* VRle::data() const +const VRle::Span *VRle::data() const { if (isEmpty()) return nullptr; return d->impl.m_spans.data(); @@ -820,24 +770,23 @@ VRle VRle::toRle(const VRect &rect) int height = rect.height(); result.d->impl.m_spans.reserve(height); VRle::Span span; - for(int i=0; i < height ; i++) { + for (int i = 0; i < height; i++) { span.x = x; span.y = y + i; span.len = width; span.coverage = 255; - result.d->impl.m_spans.push_back(span); + result.d->impl.m_spans.push_back(span); } return result; } -VDebug& operator<<(VDebug& os, const VRle& o) +VDebug &operator<<(VDebug &os, const VRle &o) { - os<<"[RLE: [dptr = "<<"o.d"<<"]"<<"[ref = "<ref.count()<<"]"<impl<<"]"; + os << "[RLE: [dptr = " + << "o.d" + << "]" + << "[ref = " << o.d->ref.count() << "]" << o.d->impl << "]"; return os; } V_END_NAMESPACE - - - - diff --git a/src/vector/vrle.h b/src/vector/vrle.h index fd7ca29856..5b0e003fe8 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -1,59 +1,59 @@ #ifndef VRLE_H #define VRLE_H -#include -#include -#include +#include +#include +#include V_BEGIN_NAMESPACE struct VRleData; -class VRle -{ +class VRle { public: - struct Span - { - short x; - short y; - ushort len; - uchar coverage; + struct Span { + short x; + short y; + ushort len; + uchar coverage; }; - typedef void (*VRleSpanCb)(int count, const VRle::Span *spans, void *userData); + typedef void (*VRleSpanCb)(int count, const VRle::Span *spans, + void *userData); ~VRle(); VRle(); VRle(const VRle &other); VRle(VRle &&other); VRle &operator=(const VRle &); VRle &operator=(VRle &&other); - bool isEmpty()const; + bool isEmpty() const; VRect boundingRect() const; - void addSpan(const VRle::Span *span, int count); - bool operator ==(const VRle &other) const; - void translate(const VPoint &p); - void translate(int x, int y); - VRle intersected(const VRect &r) const; - VRle intersected(const VRle &other) const; - void intersect(const VRect &r, VRleSpanCb cb, void *userData) const; + void addSpan(const VRle::Span *span, int count); + bool operator==(const VRle &other) const; + void translate(const VPoint &p); + void translate(int x, int y); + VRle intersected(const VRect &r) const; + VRle intersected(const VRle &other) const; + void intersect(const VRect &r, VRleSpanCb cb, void *userData) const; VRle &intersect(const VRect &r); - int size() const; - const VRle::Span* data() const; - VRle operator~() const; - VRle operator+(const VRle &o) const; - VRle operator-(const VRle &o) const; - VRle operator&(const VRle &o) const; - static VRle toRle(const VRect &rect); - friend VRle operator*(const VRle &, int alpha); + int size() const; + const VRle::Span * data() const; + VRle operator~() const; + VRle operator+(const VRle &o) const; + VRle operator-(const VRle &o) const; + VRle operator&(const VRle &o) const; + static VRle toRle(const VRect &rect); + friend VRle operator*(const VRle &, int alpha); inline friend VRle operator*(int alpha, const VRle &); - friend VDebug& operator<<(VDebug& os, const VRle& object); + friend VDebug & operator<<(VDebug &os, const VRle &object); + private: - VRle copy() const; - void detach(); - void cleanUp(VRleData *x); + VRle copy() const; + void detach(); + void cleanUp(VRleData *x); VRleData *d; }; inline void VRle::translate(int x, int y) { - translate(VPoint(x,y)); + translate(VPoint(x, y)); } inline VRle operator*(int alpha, const VRle &rle) @@ -63,4 +63,4 @@ inline VRle operator*(int alpha, const VRle &rle) V_END_NAMESPACE -#endif // VRLE_H +#endif // VRLE_H diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h index 66bb6931fe..5700eab487 100644 --- a/src/vector/vtaskqueue.h +++ b/src/vector/vtaskqueue.h @@ -1,18 +1,19 @@ #ifndef VTASKQUEUE_H #define VTASKQUEUE_H -#include +#include template class TaskQueue { using lock_t = std::unique_lock; - std::deque _q; - bool _done{false}; - std::mutex _mutex; + std::deque _q; + bool _done{false}; + std::mutex _mutex; std::condition_variable _ready; public: - bool try_pop(Task *&task) { + bool try_pop(Task *&task) + { lock_t lock{_mutex, std::try_to_lock}; if (!lock || _q.empty()) return false; task = _q.front(); @@ -20,7 +21,8 @@ public: return true; } - bool try_push(Task *task) { + bool try_push(Task *task) + { { lock_t lock{_mutex, std::try_to_lock}; if (!lock) return false; @@ -30,7 +32,8 @@ public: return true; } - void done() { + void done() + { { lock_t lock{_mutex}; _done = true; @@ -38,17 +41,18 @@ public: _ready.notify_all(); } - bool pop(Task *&task) { + bool pop(Task *&task) + { lock_t lock{_mutex}; - while (_q.empty() && !_done) - _ready.wait(lock); + while (_q.empty() && !_done) _ready.wait(lock); if (_q.empty()) return false; task = _q.front(); _q.pop_front(); return true; } - void push(Task *task) { + void push(Task *task) + { { lock_t lock{_mutex}; _q.push_back(task); @@ -57,4 +61,4 @@ public: } }; -#endif // VTASKQUEUE_H +#endif // VTASKQUEUE_H From e527a3d7c04fd604b4155d6e1dd28195ce526763 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 13:40:24 +0900 Subject: [PATCH 095/672] lottie: remove inline from public api. Change-Id: Ia6fdd2ddf0029f7aa1af57446e327ac6887708c8 --- src/vector/vrle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 83487ac889..87365f5bd8 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -605,7 +605,7 @@ VRle &VRle::operator=(const VRle &other) return *this; } -inline VRle &VRle::operator=(VRle &&other) +VRle &VRle::operator=(VRle &&other) { if (!d->ref.deref()) cleanUp(d); d = other.d; From 21867e1bd15ab07ebc527fbaf0d70bfcfc7b95d5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 13:44:09 +0900 Subject: [PATCH 096/672] lottie: Enable compiler Optimization on library. Change-Id: I4edee092788670e5438139ea60a8daa9998c6575 --- CMakeLists.txt | 2 +- meson.build | 2 +- packaging/lottie-player.spec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index daf3d6bad9..8e8f161095 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ target_compile_options(lottie-player PUBLIC -std=c++14 PRIVATE - -Wall -fvisibility=hidden) + -Wall -fvisibility=hidden -O2) #declare dependancy set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) diff --git a/meson.build b/meson.build index 8abff811a5..9552d9b4a5 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ lottie_player_lib_version = '0.0.1' add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_source_dir()), language : 'cpp') -compiler_flags = ['-Wall','-std=c++14', '-fvisibility=hidden'] +compiler_flags = ['-Wall', '-O2', '-std=c++14', '-fvisibility=hidden'] if (build_machine.system() == 'linux') compiler_flags += ['-pthread'] diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index cc4e78a3a5..6e343fae8c 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -29,7 +29,7 @@ lottie player library (devel) %build -export CFLAGS+=" -fvisibility=hidden -fPIC -Wall" +export CFLAGS+=" -fvisibility=hidden -fPIC -Wall -O2" export LDFLAGS+=" " From aa29d857d8cbedb9e6ba3663b4e0af9108e177a7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 14:13:46 +0900 Subject: [PATCH 097/672] lottie: fixed warning. Change-Id: Icc12cc76584913dd1f219207c23b987c61bb4829 --- src/vector/vbitmap.cpp | 41 +------------------------------------- src/vector/vdrawhelper.cpp | 1 + 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 5e18fdef7a..9be33204a3 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -155,47 +155,8 @@ VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap VBitmap::copy(const VRect &r) const { - if (!d) return VBitmap(); - - if (r.isNull()) { - VBitmap image(d->width, d->height, d->format); - if (image.isNull()) return image; - - if (image.d->nBytes != d->nBytes) { - int bpl = vMin(stride(), image.stride()); - for (int i = 0; i < height(); i++) - memcpy(image.scanLine(i), scanLine(i), bpl); - } else - memcpy(image.bits(), bits(), d->nBytes); - return image; - } - - int x = r.x(); - int y = r.y(); - int w = r.width(); - int h = r.height(); - - int dx = 0; - int dy = 0; - if (w <= 0 || h <= 0) return VBitmap(); - - VBitmap image(w, h, d->format); - if (image.isNull()) return image; - - if (x < 0 || y < 0 || x + w > d->width || y + h > d->height) { - // bitBlt will not cover entire image - clear it. - image.fill(0); - if (x < 0) { - dx = -x; - x = 0; - } - if (y < 0) { - dy = -y; - y = 0; - } - } // TODO implement properly. - return image; + return *this; } int VBitmap::stride() const diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index bec2410436..ce07aaca85 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -473,6 +473,7 @@ static inline Operator getOperator(const VSpanData * data, op.srcFetch = &fetch_radial_gradient; break; default: + op.srcFetch = nullptr; break; } From 548051c0e1201b40f60e1d62586a12549da63701 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 14:22:11 +0900 Subject: [PATCH 098/672] lottie: save extra memory allocation by reusing FtOutline object. Change-Id: Ib3574052524cd38cd106ba27620ac825eb6a3f2a --- src/vector/vraster.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 19d2b072b1..5d8bb510d8 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -260,10 +260,9 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) SW_FT_Stroker_ParseOutline(stroker, &outRef.ft, !outRef.ftClosed); SW_FT_Stroker_GetCounts(stroker, &points, &contors); - FTOutline strokeOutline; - strokeOutline.grow(points, contors); + outRef.grow(points, contors); - SW_FT_Stroker_Export(stroker, &strokeOutline.ft); + SW_FT_Stroker_Export(stroker, &outRef.ft); VRle rle; SW_FT_Raster_Params params; @@ -271,7 +270,7 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; params.gray_spans = &rleGenerationCb; params.user = &rle; - params.source = &strokeOutline; + params.source = &outRef; sw_ft_grays_raster.raster_render(nullptr, ¶ms); From dfe59f9fd5f724b1ead6b7580e8ce5b3658a48c2 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 14:31:19 +0900 Subject: [PATCH 099/672] lottie/vector: updated paths reserve api policy. Change-Id: I9b6e97526d887ec6d342384cb7f2046584dbaf04 --- src/vector/vpath.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 043bdcf013..ef5e8c28f7 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -121,8 +121,10 @@ int VPath::VPathData::segments() const void VPath::VPathData::reserve(int pts, int elms) { - m_points.reserve(m_points.size() + pts); - m_elements.reserve(m_elements.size() + elms); + if (m_points.capacity() < m_points.size() + pts) + m_points.reserve(m_points.size() + pts); + if (m_elements.capacity() < m_elements.size() + elms) + m_elements.reserve(m_elements.size() + elms); } static VPointF curvesForArc(const VRectF &, float, float, VPointF *, int *); From 3b5bac83a099313501a162a9d03656041a63c5f1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 14:34:24 +0900 Subject: [PATCH 100/672] lottie/vector: reserve memory only when required. Change-Id: Ia86c292d66c1060d33ccffd2fe5922480d219eb4 --- src/vector/vrle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 87365f5bd8..7fd4004799 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -303,7 +303,8 @@ inline static void copyArrayToVector(const VRle::Span *span, int count, std::vector &v) { // make sure enough memory available - v.reserve(v.size() + count); + if (v.capacity() < v.size() + count) + v.reserve(v.size() + count); std::copy(span, span + count, back_inserter(v)); } From e99664a5ca1a0da0a443b080c9727b87b2058178 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 30 Jul 2018 14:41:23 +0900 Subject: [PATCH 101/672] lottie/vector: remove an unused variable warning message Change-Id: I1ac0b9c3ec314ac01da8d3be3d11a1b21ef9938a --- src/vector/vdebug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index bc2fc3b9a4..47db2eb731 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -534,7 +534,7 @@ public: if (read_buffer == nullptr) return false; - if (bool success = read_buffer->try_pop(logline, m_read_index)) { + if (read_buffer->try_pop(logline, m_read_index)) { m_read_index++; if (m_read_index == Buffer::size) { m_read_index = 0; From 29eedc78ea17d5188f5f82842b5dd8ec12587625 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 30 Jul 2018 14:48:28 +0900 Subject: [PATCH 102/672] lottie/vector: remove a warning message from 64 bits compilation uint64_t is same as unsigned long long in 32 bits compilation. But, it is same as unsigned long in 64 bits compilation. Change-Id: Ibcddaf17d1fa1f6c972906f6571c05253292b752 --- src/vector/vdebug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 47db2eb731..3b42ea22f5 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -32,7 +32,7 @@ void format_timestamp(std::ostream& os, uint64_t timestamp) char buffer[32]; strftime(buffer, 32, "%Y-%m-%d %T.", gmtime); char microseconds[7]; - sprintf(microseconds, "%06llu", timestamp % 1000000); + sprintf(microseconds, "%06llu", (long long unsigned int)timestamp % 1000000); os << '[' << buffer << microseconds << ']'; } From 33e6a807c9f9495245ce0190ea86503b9e2e6b15 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 30 Jul 2018 15:24:11 +0900 Subject: [PATCH 103/672] lottie/vector: reserve memory space ahead for minimizing reallocation - Polystar/Polygon It also fix to use vIsZero() instead of equal(=) for floating values. Change-Id: Iebe619a1a7be58b00e7261d8a6079e8ea817e055 --- src/vector/vpath.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index ef5e8c28f7..dbd1212a1b 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -505,6 +505,7 @@ void VPath::VPathData::addPolystar(float points, float innerRadius, bool longSegment = false; int numPoints = (int)ceil(points) * 2.0; float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); + bool hasRoundness = false; innerRoundness /= 100.0; outerRoundness /= 100.0; @@ -526,6 +527,13 @@ void VPath::VPathData::addPolystar(float points, float innerRadius, currentAngle += halfAnglePerPoint * angleDir; } + if (vIsZero(innerRoundness) && vIsZero(outerRoundness)) { + reserve(numPoints + 2, numPoints + 3); + } else { + reserve(numPoints * 3 + 2, numPoints + 3); + hasRoundness = true; + } + moveTo(VPointF(x + cx, y + cy)); for (int i = 0; i < numPoints; i++) { @@ -542,9 +550,7 @@ void VPath::VPathData::addPolystar(float points, float innerRadius, x = (float)(radius * cos(currentAngle)); y = (float)(radius * sin(currentAngle)); - if (innerRoundness == 0 && outerRoundness == 0) { - lineTo(VPointF(x + cx, y + cy)); - } else { + if (hasRoundness) { float cp1Theta = (float)(atan2(previousY, previousX) - M_PI / 2.0 * angleDir); float cp1Dx = (float)cos(cp1Theta); @@ -578,6 +584,8 @@ void VPath::VPathData::addPolystar(float points, float innerRadius, cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), VPointF(x + cp2x + cx, y + cp2y + cy), VPointF(x + cx, y + cy)); + } else { + lineTo(VPointF(x + cx, y + cy)); } currentAngle += dTheta * angleDir; @@ -601,6 +609,7 @@ void VPath::VPathData::addPolygon(float points, float radius, float roundness, float anglePerPoint = (float)(2.0 * M_PI / floor(points)); int numPoints = (int)floor(points); float angleDir = ((dir == VPath::Direction::CW) ? 1.0 : -1.0); + bool hasRoundness = false; roundness /= 100.0; @@ -609,6 +618,13 @@ void VPath::VPathData::addPolygon(float points, float radius, float roundness, y = (float)(radius * sin(currentAngle)); currentAngle += anglePerPoint * angleDir; + if (vIsZero(roundness)) { + reserve(numPoints + 2, numPoints + 3); + } else { + reserve(numPoints * 3 + 2, numPoints + 3); + hasRoundness = true; + } + moveTo(VPointF(x + cx, y + cy)); for (int i = 0; i < numPoints; i++) { @@ -617,7 +633,7 @@ void VPath::VPathData::addPolygon(float points, float radius, float roundness, x = (float)(radius * cos(currentAngle)); y = (float)(radius * sin(currentAngle)); - if (roundness != 0) { + if (hasRoundness) { float cp1Theta = (float)(atan2(previousY, previousX) - M_PI / 2.0 * angleDir); float cp1Dx = (float)cos(cp1Theta); From b7f80074315114ef866b9eb383a7b99622b8738f Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 30 Jul 2018 15:47:36 +0900 Subject: [PATCH 104/672] lottie: use make_unique construct Change-Id: I8618541470fb636d2315aa39360fadc58c182dd3 --- example/uxsampletest.cpp | 3 ++- src/vector/vdebug.cpp | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index dae6b44c6e..0ff8f7b9b2 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -1,5 +1,6 @@ #include"evasapp.h" #include "lottieview.h" +#include #include #include @@ -38,7 +39,7 @@ public: private: void show() { - mView = std::unique_ptr(new LottieView(mApp->evas(), mRenderMode)); + mView = std::make_unique(mApp->evas(), mRenderMode); mView->setFilePath(mResourceList[mCurIndex].c_str()); mView->setPos(0, 0); mView->setSize(mApp->width(), mApp->height()); diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 3b42ea22f5..25d69fa7bc 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -256,7 +257,7 @@ void VDebug::resize_buffer_if_needed(size_t additional_bytes) if (!m_heap_buffer) { m_buffer_size = std::max(static_cast(512), required_size); - m_heap_buffer.reset(new char[m_buffer_size]); + m_heap_buffer = std::make_unique(m_buffer_size); memcpy(m_heap_buffer.get(), m_stack_buffer, m_bytes_used); return; } else { @@ -603,7 +604,7 @@ private: } m_bytes_written = 0; - m_os.reset(new std::ofstream()); + m_os = std::make_unique(); // TODO Optimize this part. Does it even matter ? std::string log_file_name = m_name; log_file_name.append("."); @@ -697,8 +698,8 @@ void initialize(NonGuaranteedLogger ngl, std::string const& log_directory, std::string const& log_file_name, uint32_t log_file_roll_size_mb) { - nanologger.reset(new NanoLogger(ngl, log_directory, log_file_name, - log_file_roll_size_mb)); + nanologger = std::make_unique(ngl, log_directory, log_file_name, + log_file_roll_size_mb); atomic_nanologger.store(nanologger.get(), std::memory_order_seq_cst); } @@ -706,8 +707,8 @@ void initialize(GuaranteedLogger gl, std::string const& log_directory, std::string const& log_file_name, uint32_t log_file_roll_size_mb) { - nanologger.reset(new NanoLogger(gl, log_directory, log_file_name, - log_file_roll_size_mb)); + nanologger = std::make_unique(gl, log_directory, log_file_name, + log_file_roll_size_mb); atomic_nanologger.store(nanologger.get(), std::memory_order_seq_cst); } From abb7872b7994f566adf767aa904d4ad70e3a1a39 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 30 Jul 2018 14:54:42 +0900 Subject: [PATCH 105/672] lottie/vector: reserve memory ahead to minimize reallocation. Change-Id: Idb973bb7660c4ec95f36aa36d3707aa6030f5ffc --- src/vector/vpath.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index dbd1212a1b..e7411656e7 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -138,6 +138,7 @@ void VPath::VPathData::arcTo(const VRectF &rect, float startAngle, VPointF curve_start = curvesForArc(rect, startAngle, sweepLength, pts, &point_count); + reserve(point_count + 1, point_count / 3 + 1); if (isEmpty() || forceMoveTo) { moveTo(curve_start); } else { @@ -169,6 +170,7 @@ void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) float h2 = rect.height() / 2; float h2k = h2 * PATH_KAPPA; + reserve(14, 7); // 1Move + 4Cubic + 1Close if (dir == VPath::Direction::CW) { // moveto 12 o'clock. moveTo(VPointF(x + w2, y)); @@ -200,6 +202,7 @@ void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), VPointF(x + w2, y)); } + close(); } void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) @@ -211,6 +214,7 @@ void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) float w = rect.width(); float h = rect.height(); + reserve(6, 6); // 1Move + 4Line + 1Close if (dir == VPath::Direction::CW) { moveTo(VPointF(x + w, y)); lineTo(VPointF(x + w, y + h)); @@ -244,6 +248,7 @@ void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, if (rx > w) rx = w; if (ry > h) ry = h; + reserve(14, 7); // 1Move + 4Cubic + 1Close if (dir == VPath::Direction::CW) { moveTo(VPointF(x + w, y + ry / 2.f)); arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0, -90, false); From 333d888a4292882adc719518ed9d311121a5d7ca Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 31 Jul 2018 10:14:46 +0900 Subject: [PATCH 106/672] lottie: add cmake config file so that library can be found with find_package() Change-Id: I4e1c29f79a1a24636808079762cc88501fe2389b --- CMakeLists.txt | 29 +++++++++++++++++++++++++++-- cmake/lottie-playerConfig.cmake.in | 16 ++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 cmake/lottie-playerConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e8f161095..6a04e590ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required( VERSION 3.2 ) #declare project -project( lottie-player LANGUAGES C CXX ) +project( lottie-player VERSION 0.0.1 LANGUAGES C CXX ) #declare target add_library( lottie-player SHARED "" ) @@ -53,12 +53,37 @@ install( TARGETS lottie-player EXPORT lottie-player-targets ) #install config file. + install( EXPORT lottie-player-targets - FILE lottie-player.cmake + FILE lottie-playerTargets.cmake NAMESPACE lottie-player:: DESTINATION lib/cmake/lottie-player ) +#Create a ConfigVersion.cmake file +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) + +configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/lottie-playerConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake + INSTALL_DESTINATION lib/cmake/lottie-player +) + +#Install the config, configversion and custom find modules +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake + DESTINATION lib/cmake/lottie-player +) + + +export(EXPORT lottie-player-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerTargets.cmake NAMESPACE lottie-player::) + #Register package in user's package registry export(PACKAGE lottie-player) + diff --git a/cmake/lottie-playerConfig.cmake.in b/cmake/lottie-playerConfig.cmake.in new file mode 100644 index 0000000000..8367242b03 --- /dev/null +++ b/cmake/lottie-playerConfig.cmake.in @@ -0,0 +1,16 @@ +get_filename_component(lottie-player_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +include(CMakeFindDependencyMacro) + +list(APPEND CMAKE_MODULE_PATH ${lottie-player_CMAKE_DIR}) + +# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 + +#find_dependency(RapidJSON 1.0 REQUIRED MODULE) +#find_package(Boost 1.55 REQUIRED COMPONENTS regex) +list(REMOVE_AT CMAKE_MODULE_PATH -1) + +if(NOT TARGET lottie-player::lottie-player) + include("${lottie-player_CMAKE_DIR}/lottie-playerTargets.cmake") +endif() + +set(lottie-player_LIBRARIES lottie-player::lottie-player) From a5528fc85d4d15d54fa5026ace343fdedb71d7f7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 31 Jul 2018 13:52:57 +0900 Subject: [PATCH 107/672] lottie: fixed pc file for linking issue of lottie library in tizen thanks to youngbok for the help Change-Id: Iff2cb41b58102892b8903cf17cc7847ff3c9163e --- lottie-player.pc.in | 11 ++++++----- packaging/lottie-player.spec | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lottie-player.pc.in b/lottie-player.pc.in index 52c5b4a4ba..b56cc46a78 100644 --- a/lottie-player.pc.in +++ b/lottie-player.pc.in @@ -1,11 +1,12 @@ -prefix=@PREFIX@ -exec_prefix=@EXEC_DIR@ -libdir=@LIBDIR@ -includedir=@INCDIR@ +prefix=/usr +exec_prefix=/usr +apiversion=0.0.1 +libdir=/usr/lib +includedir=/usr/include Name: lottie-player Description: A lottie-player library Version: @VERSION@ Requires: Libs: -L${libdir} -llottie-player -Cflags: -I${includedir} +Cflags: -I${includedir} -std=c++14 diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index 6e343fae8c..b1e4acd7d0 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -53,13 +53,14 @@ echo "INFO: System should be restarted or execute: systemctl --user daemon-reloa %files %defattr(-,root,root,-) -%{_libdir}/liblottie-player.so* +%{_libdir}/liblottie-player.so.* %{_datadir}/license/%{name} %manifest %{name}.manifest %files devel %defattr(-,root,root,-) %{_includedir}/*.h +%{_libdir}/liblottie-player.so %{_libdir}/cmake/lottie-player/*.cmake %{_libdir}/pkgconfig/lottie-player.pc From 46d1fec227d8d208c46e26510ed50a364bb0943c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 31 Jul 2018 14:29:01 +0900 Subject: [PATCH 108/672] lottie: move logging system initialization to player. disable loggin for tizen till issue resolved. Change-Id: I24664f43128c6edfacd09f7296d63cad636c0c81 --- src/lottie/lottieplayer.cpp | 12 ++++++++++++ src/vector/vdebug.cpp | 19 ------------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 4405290429..c55f426bdb 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -271,3 +271,15 @@ bool LOTPlayer::renderSync(float pos, LOTBuffer &buffer) LOTNode::~LOTNode() {} LOTNode::LOTNode() {} + +void initLogging() +{ +#if defined(__ARM_NEON__) + set_log_level(LogLevel::OFF); +#else + initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); + set_log_level(LogLevel::INFO); +#endif +} + +V_CONSTRUCTOR_FUNCTION(initLogging) diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 25d69fa7bc..22e131b0b3 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -724,22 +724,3 @@ bool is_logged(LogLevel level) return static_cast(level) >= loglevel.load(std::memory_order_relaxed); } - -void initDebug() -{ - initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); - set_log_level(LogLevel::INFO); -} - -#ifndef DEBUG_CONSTRUCTOR_FUNCTION -#define DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) \ - namespace { \ - static const struct AFUNC##_ctor_class_ { \ - inline AFUNC##_ctor_class_() { AFUNC(); } \ - } AFUNC##_ctor_instance_; \ - } - -#define DEBUG_CONSTRUCTOR_FUNCTION(AFUNC) DEBUG_CONSTRUCTOR_FUNCTION0(AFUNC) -#endif - -DEBUG_CONSTRUCTOR_FUNCTION(initDebug) From d7084820c3fc3c84c578f88cf1b9ea392450560b Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 31 Jul 2018 14:57:12 +0900 Subject: [PATCH 109/672] lottie: remove hardcoding pathes in pkgconfig file. (.pc) Change-Id: I284cc1fc0af6f58e0da16ea8ab3d17de7f3b4286 --- CMakeLists.txt | 4 ++++ lottie-player.pc.in | 12 ++++++------ packaging/lottie-player.spec | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a04e590ba..453da55004 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,10 @@ target_link_libraries(lottie-player add_subdirectory(inc) add_subdirectory(src) +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_DIR ${PREFIX}) +SET(LIBDIR ${LIB_INSTALL_DIR}) +SET(INCDIR ${PREFIX}/include) CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) diff --git a/lottie-player.pc.in b/lottie-player.pc.in index b56cc46a78..f7ea6f012d 100644 --- a/lottie-player.pc.in +++ b/lottie-player.pc.in @@ -1,12 +1,12 @@ -prefix=/usr -exec_prefix=/usr -apiversion=0.0.1 -libdir=/usr/lib -includedir=/usr/include +prefix=@PREFIX@ +exec_prefix=@EXEC_DIR@ +apiversion=@player_version@ +libdir=@LIBDIR@ +includedir=@INCDIR@ Name: lottie-player Description: A lottie-player library -Version: @VERSION@ +Version: @player_version@ Requires: Libs: -L${libdir} -llottie-player Cflags: -I${includedir} -std=c++14 diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index b1e4acd7d0..0f96d78838 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -33,8 +33,8 @@ export CFLAGS+=" -fvisibility=hidden -fPIC -Wall -O2" export LDFLAGS+=" " -cmake \ - . -DCMAKE_INSTALL_PREFIX=/usr +cmake . -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR:PATH=%{_libdir} make %{?jobs:-j%jobs} From 23557dff621bbb65fc6263fd1ef7f6e812c6f444 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 31 Jul 2018 17:01:05 +0900 Subject: [PATCH 110/672] lottie: treat undefined symbol as error while building library and enable assembly building. Change-Id: I034d8bb84e61ecc56da6a66c18e620e8611dcb0b --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 453da55004..f8b631877e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required( VERSION 3.2 ) #declare project -project( lottie-player VERSION 0.0.1 LANGUAGES C CXX ) +project( lottie-player VERSION 0.0.1 LANGUAGES C CXX ASM) #declare target add_library( lottie-player SHARED "" ) @@ -35,6 +35,11 @@ target_link_libraries(lottie-player "${CMAKE_THREAD_LIBS_INIT}" ) +target_link_libraries(lottie-player + PUBLIC + "-Wl,--no-undefined" + ) + #declare source and include files add_subdirectory(inc) add_subdirectory(src) From 74650552891d3a63924e2374dd44aad21a0bcd8c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 31 Jul 2018 17:08:54 +0900 Subject: [PATCH 111/672] lottie/render: add support for arm backend build. Change-Id: I2cd319c4f599ead2e33056b037828d417d47753b --- packaging/lottie-player.spec | 10 ++++++++++ src/vector/CMakeLists.txt | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index 0f96d78838..596098bca6 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -32,9 +32,19 @@ lottie player library (devel) export CFLAGS+=" -fvisibility=hidden -fPIC -Wall -O2" export LDFLAGS+=" " +%ifarch %{arm} +export CXXFLAGS+=" -D_ARCH_ARM_ -mfpu=neon" +%endif + +%ifarch %{arm} +cmake . -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR:PATH=%{_libdir} \ + -DARCH="arm" +%else cmake . -DCMAKE_INSTALL_PREFIX=/usr \ -DLIB_INSTALL_DIR:PATH=%{_libdir} +%endif make %{?jobs:-j%jobs} diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 98525e5ded..0a4c80aafd 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -10,6 +10,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vcompositionfunctions.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper_sse2.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper_neon.cpp" "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" "${CMAKE_CURRENT_LIST_DIR}/vrle.cpp" "${CMAKE_CURRENT_LIST_DIR}/vpath.cpp" @@ -23,6 +24,14 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vdrawable.cpp" ) +IF("${ARCH}" STREQUAL "arm") +#SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") +#target_sources(lottie-player +# PRIVATE +# "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" +# ) +ENDIF("${ARCH}" STREQUAL "arm") + target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" From 14f66bb3b581563e33aaa9460462aa3fc2c01682 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 31 Jul 2018 17:10:30 +0900 Subject: [PATCH 112/672] lottie/render: fixed rendering backend issue for arm. Change-Id: I23b2f24b0ed995cb76ba554228e4ff72677806bd --- src/vector/vdrawhelper.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index ce07aaca85..b4be4c752c 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -630,7 +630,7 @@ void VSpanData::updateSpanFunc() } } -#if !defined(__SSE2__) && !defined(__ARM_NEON__) +#if !defined(__SSE2__) void memfill32(uint32_t *dest, uint32_t value, int length) { int n; @@ -677,15 +677,15 @@ void vInitDrawhelperFunctions() #if defined(__ARM_NEON__) // update fast path for NEON - extern void comp_func_solid_SourceOver_neon( - uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); - extern void comp_func_solid_Source_neon( - uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); +// extern void comp_func_solid_SourceOver_neon( +// uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); +// extern void comp_func_solid_Source_neon( +// uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); - COMP_functionForModeSolid_C[VPainter::CompModeSrc] = - comp_func_solid_Source_neon; - COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = - comp_func_solid_SourceOver_neon; +// COMP_functionForModeSolid_C[VPainter::CompModeSrc] = +// comp_func_solid_Source_neon; +// COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = +// comp_func_solid_SourceOver_neon; #endif #if defined(__SSE2__) From 79af60fc2f4733210ea039e511cfd6e5eaea3326 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 1 Aug 2018 11:43:37 +0900 Subject: [PATCH 113/672] lottie/vector: added reset() api to VRle class. Change-Id: Iace73912f6ab4510c0adb15387029e2038ad15be --- src/vector/vrle.cpp | 15 +++++++++++++++ src/vector/vrle.h | 1 + 2 files changed, 16 insertions(+) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 7fd4004799..0fedea0099 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -291,6 +291,7 @@ public: void translate(const VPoint &pt); void opAdd(const VRleImpl &other, VRleImpl &res); VRect bbox(); + void reset(); public: VRect m_bbox; @@ -327,6 +328,14 @@ VRect VRleImpl::bbox() return m_bbox; } +void VRleImpl::reset() +{ + m_spans.clear(); + m_bbox = VRect(); + mOffset = VPoint(); + mBboxDirty = false; +} + void VRleImpl::translate(const VPoint &pt) { // take care of last offset if applied @@ -759,6 +768,12 @@ const VRle::Span *VRle::data() const return d->impl.m_spans.data(); } +void VRle::reset() +{ + detach(); + d->impl.reset(); +} + VRle VRle::toRle(const VRect &rect) { if (rect.isEmpty()) return VRle(); diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 5b0e003fe8..5e2bc1ba23 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -35,6 +35,7 @@ public: VRle &intersect(const VRect &r); int size() const; const VRle::Span * data() const; + void reset(); VRle operator~() const; VRle operator+(const VRle &o) const; VRle operator-(const VRle &o) const; From 4954721403dccf1d5b3dfae1f0a57e559634131e Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 1 Aug 2018 11:46:31 +0900 Subject: [PATCH 114/672] lottie/optimization: move the rle object to rletask thread to reuse the object between frames. Change-Id: Ia551fea9346c27aa4b6c020670a287b83b8a472e --- src/lottie/lottieitem.cpp | 2 +- src/vector/vdrawable.cpp | 4 ++-- src/vector/vraster.cpp | 21 +++++++++++---------- src/vector/vraster.h | 4 ++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index bef0c2d69e..111a069308 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -184,7 +184,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, VPath path = mLocalPath; path.transform(parentMatrix); - mRleTask = VRaster::instance().generateFillInfo(path); + mRleTask = VRaster::instance().generateFillInfo(path, std::move(mRle)); } VRle LOTMaskItem::rle() diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 89be798842..c04783e80f 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -12,10 +12,10 @@ void VDrawable::preprocess() newPath = dasher.dashed(mPath); } mRleTask = VRaster::instance().generateStrokeInfo( - newPath, mStroke.cap, mStroke.join, mStroke.width, + newPath, std::move(mRle), mStroke.cap, mStroke.join, mStroke.width, mStroke.meterLimit); } else { - mRleTask = VRaster::instance().generateFillInfo(mPath, mFillRule); + mRleTask = VRaster::instance().generateFillInfo(mPath, std::move(mRle), mFillRule); } mFlag &= ~DirtyFlag(DirtyState::Path); } diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 5d8bb510d8..0e07e0f468 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -239,6 +239,7 @@ struct RleTask { std::future receiver; bool stroke; VPath path; + VRle rle; FillRule fillRule; CapStyle cap; JoinStyle join; @@ -249,6 +250,7 @@ struct RleTask { VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) { + rle.reset(); if (stroke) { // Stroke Task outRef.convert(path); outRef.convert(cap, join, width, meterLimit); @@ -264,7 +266,6 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) SW_FT_Stroker_Export(stroker, &outRef.ft); - VRle rle; SW_FT_Raster_Params params; params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; @@ -274,7 +275,6 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) sw_ft_grays_raster.raster_render(nullptr, ¶ms); - return rle; } else { // Fill Task outRef.convert(path); int fillRuleFlag = SW_FT_OUTLINE_NONE; @@ -287,7 +287,6 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) break; } outRef.ft.flags = fillRuleFlag; - VRle rle; SW_FT_Raster_Params params; params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; @@ -296,8 +295,8 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) params.source = &outRef.ft; sw_ft_grays_raster.raster_render(nullptr, ¶ms); - return rle; } + return std::move(rle); } class RleTaskScheduler { @@ -361,12 +360,13 @@ public: return receiver; } - std::future strokeRle(const VPath &path, CapStyle cap, JoinStyle join, + std::future strokeRle(const VPath &path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit) { RleTask *task = new RleTask(); task->stroke = true; task->path = path; + task->rle = std::move(rle); task->cap = cap; task->join = join; task->width = width; @@ -374,10 +374,11 @@ public: return async(task); } - std::future fillRle(const VPath &path, FillRule fillRule) + std::future fillRle(const VPath &path, VRle &&rle, FillRule fillRule) { RleTask *task = new RleTask(); task->path = path; + task->rle = std::move(rle); task->fillRule = fillRule; task->stroke = false; return async(task); @@ -390,7 +391,7 @@ VRaster::VRaster() {} VRaster::~VRaster() {} -std::future VRaster::generateFillInfo(const VPath &path, +std::future VRaster::generateFillInfo(const VPath &path, VRle &&rle, FillRule fillRule) { if (path.isEmpty()) { @@ -398,10 +399,10 @@ std::future VRaster::generateFillInfo(const VPath &path, promise.set_value(VRle()); return promise.get_future(); } - return raster_scheduler.fillRle(path, fillRule); + return raster_scheduler.fillRle(path, std::move(rle), fillRule); } -std::future VRaster::generateStrokeInfo(const VPath &path, CapStyle cap, +std::future VRaster::generateStrokeInfo(const VPath &path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit) { @@ -410,7 +411,7 @@ std::future VRaster::generateStrokeInfo(const VPath &path, CapStyle cap, promise.set_value(VRle()); return promise.get_future(); } - return raster_scheduler.strokeRle(path, cap, join, width, meterLimit); + return raster_scheduler.strokeRle(path, std::move(rle), cap, join, width, meterLimit); } V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 178786c252..5d47dfee60 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -22,9 +22,9 @@ public: VRaster &operator=(VRaster const &) = delete; VRaster &operator=(VRaster &&) = delete; - std::future generateFillInfo(const VPath &path, + std::future generateFillInfo(const VPath &path, VRle &&rle, FillRule fillRule = FillRule::Winding); - std::future generateStrokeInfo(const VPath &path, CapStyle cap, + std::future generateStrokeInfo(const VPath &path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit); From 6204af6ab65b98998e489e23324e60a3992dcf17 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 1 Aug 2018 13:06:44 +0900 Subject: [PATCH 115/672] lottie: remove dead code. Change-Id: Ia56674a813a65007f07b2a54d230743ced6b6511 --- src/lottie/lottiemodel.cpp | 116 ------------------------------------ src/lottie/lottiemodel.h | 4 -- src/lottie/lottieparser.cpp | 1 - 3 files changed, 121 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 7015749c09..934b6ced09 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -48,110 +48,6 @@ public: bool mRepeaterFound; }; -class LottiePathOperationProcesser : public LOTDataVisitor { -public: - LottiePathOperationProcesser() : mPathOperator(false), mPathNode(false) {} - void visit(LOTCompositionData *obj) {} - void visit(LOTLayerData *obj) {} - void visit(LOTTransformData *) {} - void visit(LOTShapeGroupData *obj) {} - void visit(LOTShapeData *) { mPathNode = true; } - void visit(LOTRectData *) { mPathNode = true; } - void visit(LOTEllipseData *) { mPathNode = true; } - void visit(LOTTrimData *) { mPathOperator = true; } - void visit(LOTRepeaterData *) {} - void visit(LOTFillData *) {} - void visit(LOTStrokeData *) {} - void visit(LOTPolystarData *) { mPathNode = true; } - void visitChildren(LOTGroupData *obj) - { - int curOpCount = mPathOperationList.size(); - mPathOperator = false; - mPathNode = false; - for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); - ++i) { - auto child = *i; - child.get()->accept(this); - if (mPathOperator) { - mPathOperationList.push_back(child); - // obj->mChildren.erase(std::next(i).base()); - } - if (mPathNode) { - updatePathObject(static_cast(child.get())); - } - mPathOperator = false; - mPathNode = false; - } - mPathOperationList.erase(mPathOperationList.begin() + curOpCount, - mPathOperationList.end()); - } - - void updatePathObject(LOTPath *drawable) - { - for (auto i = mPathOperationList.rbegin(); - i != mPathOperationList.rend(); ++i) { - drawable->mPathOperations.push_back(*i); - } - } - -public: - bool mPathOperator; - bool mPathNode; - std::vector> mPathOperationList; -}; - -class LottiePaintOperationProcesser : public LOTDataVisitor { -public: - LottiePaintOperationProcesser() : mPaintOperator(false), mPathNode(false) {} - void visit(LOTCompositionData *obj) {} - void visit(LOTLayerData *obj) {} - void visit(LOTTransformData *) {} - void visit(LOTShapeGroupData *obj) {} - void visit(LOTShapeData *) { mPathNode = true; } - void visit(LOTRectData *) { mPathNode = true; } - void visit(LOTEllipseData *) { mPathNode = true; } - void visit(LOTTrimData *) {} - void visit(LOTRepeaterData *) {} - void visit(LOTFillData *) { mPaintOperator = true; } - void visit(LOTStrokeData *) { mPaintOperator = true; } - void visit(LOTPolystarData *) { mPathNode = true; } - void visitChildren(LOTGroupData *obj) - { - int curOpCount = mPaintOperationList.size(); - mPaintOperator = false; - mPathNode = false; - for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); - ++i) { - auto child = *i; - child.get()->accept(this); - if (mPaintOperator) { - mPaintOperationList.push_back(child); - // obj->mChildren.erase(std::next(i).base()); - } - if (mPathNode) { - // put it in the list - updatePathObject(static_cast(child.get())); - } - mPaintOperator = false; - mPathNode = false; - } - mPaintOperationList.erase(mPaintOperationList.begin() + curOpCount, - mPaintOperationList.end()); - } - - void updatePathObject(LOTPath *drawable) - { - for (auto i = mPaintOperationList.begin(); - i != mPaintOperationList.end(); ++i) { - drawable->mPaintOperations.push_back(*i); - } - } - -public: - bool mPaintOperator; - bool mPathNode; - std::vector> mPaintOperationList; -}; void LOTCompositionData::processRepeaterObjects() { @@ -159,18 +55,6 @@ void LOTCompositionData::processRepeaterObjects() accept(&visitor); } -void LOTCompositionData::processPathOperatorObjects() -{ - LottiePathOperationProcesser visitor; - accept(&visitor); -} - -void LOTCompositionData::processPaintOperatorObjects() -{ - LottiePaintOperationProcesser visitor; - accept(&visitor); -} - VMatrix LOTTransformData::matrix(int frameNo) const { if (mStaticMatrix) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index fa9e9d5f1b..6880ffade9 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -313,8 +313,6 @@ public: class LOTCompositionData : public LOTGroupData { public: - void processPathOperatorObjects(); - void processPaintOperatorObjects(); void processRepeaterObjects(); void accept(LOTDataVisitor *visitor) override {visitor->visit(this); visitor->visitChildren(this);} @@ -577,8 +575,6 @@ public: else return VPath::Direction::CW;} public: int mDirection; - std::vector> mPathOperations; - std::vector> mPaintOperations; }; class LOTShapeData : public LOTPath diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index bcdc213d67..af1304f5a2 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1952,7 +1952,6 @@ std::shared_ptr LottieParser::model() { std::shared_ptr model = std::make_shared(); model->mRoot = d->composition(); - model->mRoot->processPathOperatorObjects(); model->mRoot->processRepeaterObjects(); #ifdef DEBUG_PARSER From 4b823247bd271627b2092b1045c8b1987a6b483d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 2 Aug 2018 10:39:56 +0900 Subject: [PATCH 116/672] lottie: add support for arm fast path in vector render backend. Change-Id: I6e2524290eb22cf889033ebb129b9a699bcdaf07 --- src/vector/CMakeLists.txt | 10 +- src/vector/pixman-arm-neon-asm.S | 497 +++++++++++++ src/vector/pixman-arm-neon-asm.h | 1126 ++++++++++++++++++++++++++++++ src/vector/vdrawhelper.cpp | 2 +- src/vector/vdrawhelper_neon.cpp | 18 + 5 files changed, 1647 insertions(+), 6 deletions(-) create mode 100644 src/vector/pixman-arm-neon-asm.S create mode 100644 src/vector/pixman-arm-neon-asm.h diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 0a4c80aafd..4c2acfcd54 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -25,11 +25,11 @@ target_sources(lottie-player ) IF("${ARCH}" STREQUAL "arm") -#SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") -#target_sources(lottie-player -# PRIVATE -# "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" -# ) +SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" + ) ENDIF("${ARCH}" STREQUAL "arm") target_include_directories(lottie-player diff --git a/src/vector/pixman-arm-neon-asm.S b/src/vector/pixman-arm-neon-asm.S new file mode 100644 index 0000000000..f2203c21cf --- /dev/null +++ b/src/vector/pixman-arm-neon-asm.S @@ -0,0 +1,497 @@ +/* + * Copyright © 2009 Nokia Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Siarhei Siamashka (siarhei.siamashka@nokia.com) + */ + +/* + * This file contains implementations of NEON optimized pixel processing + * functions. There is no full and detailed tutorial, but some functions + * (those which are exposing some new or interesting features) are + * extensively commented and can be used as examples. + * + * You may want to have a look at the comments for following functions: + * - pixman_composite_over_8888_0565_asm_neon + * - pixman_composite_over_n_8_0565_asm_neon + */ + +/* Prevent the stack from becoming executable for no reason... */ +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif + + .text + .fpu neon + .arch armv7a + .object_arch armv4 + .eabi_attribute 10, 0 /* suppress Tag_FP_arch */ + .eabi_attribute 12, 0 /* suppress Tag_Advanced_SIMD_arch */ + .arm + .altmacro + .p2align 2 + + +//#include "pixman-arm-asm.h" +/* Supplementary macro for setting function attributes */ +.macro pixman_asm_function fname + .func fname + .global fname +#ifdef __ELF__ + .hidden fname + .type fname, %function +#endif +fname: +.endm + +//#include "pixman-private.h" +/* + * The defines which are shared between C and assembly code + */ + +/* bilinear interpolation precision (must be < 8) */ +#define BILINEAR_INTERPOLATION_BITS 7 +#define BILINEAR_INTERPOLATION_RANGE (1 << BILINEAR_INTERPOLATION_BITS) + +#include "pixman-arm-neon-asm.h" + +/* Global configuration options and preferences */ + +/* + * The code can optionally make use of unaligned memory accesses to improve + * performance of handling leading/trailing pixels for each scanline. + * Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for + * example in linux if unaligned memory accesses are not configured to + * generate.exceptions. + */ +.set RESPECT_STRICT_ALIGNMENT, 1 + +/* + * Set default prefetch type. There is a choice between the following options: + * + * PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work + * as NOP to workaround some HW bugs or for whatever other reason) + * + * PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where + * advanced prefetch intruduces heavy overhead) + * + * PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8 + * which can run ARM and NEON instructions simultaneously so that extra ARM + * instructions do not add (many) extra cycles, but improve prefetch efficiency) + * + * Note: some types of function can't support advanced prefetch and fallback + * to simple one (those which handle 24bpp pixels) + */ +.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED + +/* Prefetch distance in pixels for simple prefetch */ +.set PREFETCH_DISTANCE_SIMPLE, 64 + +/* + * Implementation of pixman_composite_over_8888_0565_asm_neon + * + * This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and + * performs OVER compositing operation. Function fast_composite_over_8888_0565 + * from pixman-fast-path.c does the same in C and can be used as a reference. + * + * First we need to have some NEON assembly code which can do the actual + * operation on the pixels and provide it to the template macro. + * + * Template macro quite conveniently takes care of emitting all the necessary + * code for memory reading and writing (including quite tricky cases of + * handling unaligned leading/trailing pixels), so we only need to deal with + * the data in NEON registers. + * + * NEON registers allocation in general is recommented to be the following: + * d0, d1, d2, d3 - contain loaded source pixel data + * d4, d5, d6, d7 - contain loaded destination pixels (if they are needed) + * d24, d25, d26, d27 - contain loading mask pixel data (if mask is used) + * d28, d29, d30, d31 - place for storing the result (destination pixels) + * + * As can be seen above, four 64-bit NEON registers are used for keeping + * intermediate pixel data and up to 8 pixels can be processed in one step + * for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp). + * + * This particular function uses the following registers allocation: + * d0, d1, d2, d3 - contain loaded source pixel data + * d4, d5 - contain loaded destination pixels (they are needed) + * d28, d29 - place for storing the result (destination pixels) + */ + +/* + * Step one. We need to have some code to do some arithmetics on pixel data. + * This is implemented as a pair of macros: '*_head' and '*_tail'. When used + * back-to-back, they take pixel data from {d0, d1, d2, d3} and {d4, d5}, + * perform all the needed calculations and write the result to {d28, d29}. + * The rationale for having two macros and not just one will be explained + * later. In practice, any single monolitic function which does the work can + * be split into two parts in any arbitrary way without affecting correctness. + * + * There is one special trick here too. Common template macro can optionally + * make our life a bit easier by doing R, G, B, A color components + * deinterleaving for 32bpp pixel formats (and this feature is used in + * 'pixman_composite_over_8888_0565_asm_neon' function). So it means that + * instead of having 8 packed pixels in {d0, d1, d2, d3} registers, we + * actually use d0 register for blue channel (a vector of eight 8-bit + * values), d1 register for green, d2 for red and d3 for alpha. This + * simple conversion can be also done with a few NEON instructions: + * + * Packed to planar conversion: + * vuzp.8 d0, d1 + * vuzp.8 d2, d3 + * vuzp.8 d1, d3 + * vuzp.8 d0, d2 + * + * Planar to packed conversion: + * vzip.8 d0, d2 + * vzip.8 d1, d3 + * vzip.8 d2, d3 + * vzip.8 d0, d1 + * + * But pixel can be loaded directly in planar format using VLD4.8 NEON + * instruction. It is 1 cycle slower than VLD1.32, so this is not always + * desirable, that's why deinterleaving is optional. + * + * But anyway, here is the code: + */ + +/* + * OK, now we got almost everything that we need. Using the above two + * macros, the work can be done right. But now we want to optimize + * it a bit. ARM Cortex-A8 is an in-order core, and benefits really + * a lot from good code scheduling and software pipelining. + * + * Let's construct some code, which will run in the core main loop. + * Some pseudo-code of the main loop will look like this: + * head + * while (...) { + * tail + * head + * } + * tail + * + * It may look a bit weird, but this setup allows to hide instruction + * latencies better and also utilize dual-issue capability more + * efficiently (make pairs of load-store and ALU instructions). + * + * So what we need now is a '*_tail_head' macro, which will be used + * in the core main loop. A trivial straightforward implementation + * of this macro would look like this: + * + * pixman_composite_over_8888_0565_process_pixblock_tail + * vst1.16 {d28, d29}, [DST_W, :128]! + * vld1.16 {d4, d5}, [DST_R, :128]! + * vld4.32 {d0, d1, d2, d3}, [SRC]! + * pixman_composite_over_8888_0565_process_pixblock_head + * cache_preload 8, 8 + * + * Now it also got some VLD/VST instructions. We simply can't move from + * processing one block of pixels to the other one with just arithmetics. + * The previously processed data needs to be written to memory and new + * data needs to be fetched. Fortunately, this main loop does not deal + * with partial leading/trailing pixels and can load/store a full block + * of pixels in a bulk. Additionally, destination buffer is already + * 16 bytes aligned here (which is good for performance). + * + * New things here are DST_R, DST_W, SRC and MASK identifiers. These + * are the aliases for ARM registers which are used as pointers for + * accessing data. We maintain separate pointers for reading and writing + * destination buffer (DST_R and DST_W). + * + * Another new thing is 'cache_preload' macro. It is used for prefetching + * data into CPU L2 cache and improve performance when dealing with large + * images which are far larger than cache size. It uses one argument + * (actually two, but they need to be the same here) - number of pixels + * in a block. Looking into 'pixman-arm-neon-asm.h' can provide some + * details about this macro. Moreover, if good performance is needed + * the code from this macro needs to be copied into '*_tail_head' macro + * and mixed with the rest of code for optimal instructions scheduling. + * We are actually doing it below. + * + * Now after all the explanations, here is the optimized code. + * Different instruction streams (originaling from '*_head', '*_tail' + * and 'cache_preload' macro) use different indentation levels for + * better readability. Actually taking the code from one of these + * indentation levels and ignoring a few VLD/VST instructions would + * result in exactly the code from '*_head', '*_tail' or 'cache_preload' + * macro! + */ + +/* + * And now the final part. We are using 'generate_composite_function' macro + * to put all the stuff together. We are specifying the name of the function + * which we want to get, number of bits per pixel for the source, mask and + * destination (0 if unused, like mask in this case). Next come some bit + * flags: + * FLAG_DST_READWRITE - tells that the destination buffer is both read + * and written, for write-only buffer we would use + * FLAG_DST_WRITEONLY flag instead + * FLAG_DEINTERLEAVE_32BPP - tells that we prefer to work with planar data + * and separate color channels for 32bpp format. + * The next things are: + * - the number of pixels processed per iteration (8 in this case, because + * that's the maximum what can fit into four 64-bit NEON registers). + * - prefetch distance, measured in pixel blocks. In this case it is 5 times + * by 8 pixels. That would be 40 pixels, or up to 160 bytes. Optimal + * prefetch distance can be selected by running some benchmarks. + * + * After that we specify some macros, these are 'default_init', + * 'default_cleanup' here which are empty (but it is possible to have custom + * init/cleanup macros to be able to save/restore some extra NEON registers + * like d8-d15 or do anything else) followed by + * 'pixman_composite_over_8888_0565_process_pixblock_head', + * 'pixman_composite_over_8888_0565_process_pixblock_tail' and + * 'pixman_composite_over_8888_0565_process_pixblock_tail_head' + * which we got implemented above. + * + * The last part is the NEON registers allocation scheme. + */ + +/******************************************************************************/ + +/******************************************************************************/ + .macro pixman_composite_out_reverse_8888_8888_process_pixblock_head + vmvn.8 d24, d3 /* get inverted alpha */ + /* do alpha blending */ + vmull.u8 q8, d24, d4 + vmull.u8 q9, d24, d5 + vmull.u8 q10, d24, d6 + vmull.u8 q11, d24, d7 + .endm + + .macro pixman_composite_out_reverse_8888_8888_process_pixblock_tail + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + .endm + +/******************************************************************************/ + +.macro pixman_composite_over_8888_8888_process_pixblock_head + pixman_composite_out_reverse_8888_8888_process_pixblock_head +.endm + +.macro pixman_composite_over_8888_8888_process_pixblock_tail + pixman_composite_out_reverse_8888_8888_process_pixblock_tail + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 +.endm + +.macro pixman_composite_over_8888_8888_process_pixblock_tail_head + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vrshr.u16 q14, q8, #8 + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0xF + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + PF cmp PF_X, ORIG_W + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 + fetch_src_pixblock + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + vmvn.8 d22, d3 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + PF subge PF_X, PF_X, ORIG_W + vmull.u8 q8, d22, d4 + PF subges PF_CTL, PF_CTL, #0x10 + vmull.u8 q9, d22, d5 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! + vmull.u8 q10, d22, d6 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vmull.u8 q11, d22, d7 +.endm + +generate_composite_function \ + pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_process_pixblock_tail_head + +generate_composite_function_single_scanline \ + pixman_composite_scanline_over_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + default_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_over_n_8888_process_pixblock_head + /* deinterleaved source pixels in {d0, d1, d2, d3} */ + /* inverted alpha in {d24} */ + /* destination pixels in {d4, d5, d6, d7} */ + vmull.u8 q8, d24, d4 + vmull.u8 q9, d24, d5 + vmull.u8 q10, d24, d6 + vmull.u8 q11, d24, d7 +.endm + +.macro pixman_composite_over_n_8888_process_pixblock_tail + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q2, q10, #8 + vrshr.u16 q3, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q2, q10 + vraddhn.u16 d31, q3, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 +.endm + +.macro pixman_composite_over_n_8888_process_pixblock_tail_head + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q2, q10, #8 + vrshr.u16 q3, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q2, q10 + vraddhn.u16 d31, q3, q11 + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vqadd.u8 q14, q0, q14 + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0x0F + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vqadd.u8 q15, q1, q15 + PF cmp PF_X, ORIG_W + vmull.u8 q8, d24, d4 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + vmull.u8 q9, d24, d5 + PF subge PF_X, PF_X, ORIG_W + vmull.u8 q10, d24, d6 + PF subges PF_CTL, PF_CTL, #0x10 + vmull.u8 q11, d24, d7 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! +.endm + +.macro pixman_composite_over_n_8888_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d3[0]}, [DUMMY] + vdup.8 d0, d3[0] + vdup.8 d1, d3[1] + vdup.8 d2, d3[2] + vdup.8 d3, d3[3] + vmvn.8 d24, d3 /* get inverted alpha */ +.endm + +generate_composite_function \ + pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_n_8888_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_n_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_src_n_8888_process_pixblock_head +.endm + +.macro pixman_composite_src_n_8888_process_pixblock_tail +.endm + +.macro pixman_composite_src_n_8888_process_pixblock_tail_head + vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! +.endm + +.macro pixman_composite_src_n_8888_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d0[0]}, [DUMMY] + vsli.u64 d0, d0, #32 + vorr d1, d0, d0 + vorr q1, q0, q0 +.endm + +.macro pixman_composite_src_n_8888_cleanup +.endm + +generate_composite_function \ + pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 0, /* prefetch distance */ \ + pixman_composite_src_n_8888_init, \ + pixman_composite_src_n_8888_cleanup, \ + pixman_composite_src_n_8888_process_pixblock_head, \ + pixman_composite_src_n_8888_process_pixblock_tail, \ + pixman_composite_src_n_8888_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_8888_8888_process_pixblock_head +.endm + +.macro pixman_composite_src_8888_8888_process_pixblock_tail +.endm + +.macro pixman_composite_src_8888_8888_process_pixblock_tail_head + vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! + fetch_src_pixblock + cache_preload 8, 8 +.endm + +generate_composite_function \ + pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_8888_8888_process_pixblock_head, \ + pixman_composite_src_8888_8888_process_pixblock_tail, \ + pixman_composite_src_8888_8888_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ diff --git a/src/vector/pixman-arm-neon-asm.h b/src/vector/pixman-arm-neon-asm.h new file mode 100644 index 0000000000..6add220a18 --- /dev/null +++ b/src/vector/pixman-arm-neon-asm.h @@ -0,0 +1,1126 @@ +/* + * Copyright © 2009 Nokia Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Siarhei Siamashka (siarhei.siamashka@nokia.com) + */ + +/* + * This file contains a macro ('generate_composite_function') which can + * construct 2D image processing functions, based on a common template. + * Any combinations of source, destination and mask images with 8bpp, + * 16bpp, 24bpp, 32bpp color formats are supported. + * + * This macro takes care of: + * - handling of leading and trailing unaligned pixels + * - doing most of the work related to L2 cache preload + * - encourages the use of software pipelining for better instructions + * scheduling + * + * The user of this macro has to provide some configuration parameters + * (bit depths for the images, prefetch distance, etc.) and a set of + * macros, which should implement basic code chunks responsible for + * pixels processing. See 'pixman-arm-neon-asm.S' file for the usage + * examples. + * + * TODO: + * - try overlapped pixel method (from Ian Rickards) when processing + * exactly two blocks of pixels + * - maybe add an option to do reverse scanline processing + */ + +/* + * Bit flags for 'generate_composite_function' macro which are used + * to tune generated functions behavior. + */ +.set FLAG_DST_WRITEONLY, 0 +.set FLAG_DST_READWRITE, 1 +.set FLAG_DEINTERLEAVE_32BPP, 2 + +/* + * Offset in stack where mask and source pointer/stride can be accessed + * from 'init' macro. This is useful for doing special handling for solid mask. + */ +.set ARGS_STACK_OFFSET, 40 + +/* + * Constants for selecting preferable prefetch type. + */ +.set PREFETCH_TYPE_NONE, 0 /* No prefetch at all */ +.set PREFETCH_TYPE_SIMPLE, 1 /* A simple, fixed-distance-ahead prefetch */ +.set PREFETCH_TYPE_ADVANCED, 2 /* Advanced fine-grained prefetch */ + +/* + * Definitions of supplementary pixld/pixst macros (for partial load/store of + * pixel data). + */ + +.macro pixldst1 op, elem_size, reg1, mem_operand, abits +.if abits > 0 + op&.&elem_size {d®1}, [&mem_operand&, :&abits&]! +.else + op&.&elem_size {d®1}, [&mem_operand&]! +.endif +.endm + +.macro pixldst2 op, elem_size, reg1, reg2, mem_operand, abits +.if abits > 0 + op&.&elem_size {d®1, d®2}, [&mem_operand&, :&abits&]! +.else + op&.&elem_size {d®1, d®2}, [&mem_operand&]! +.endif +.endm + +.macro pixldst4 op, elem_size, reg1, reg2, reg3, reg4, mem_operand, abits +.if abits > 0 + op&.&elem_size {d®1, d®2, d®3, d®4}, [&mem_operand&, :&abits&]! +.else + op&.&elem_size {d®1, d®2, d®3, d®4}, [&mem_operand&]! +.endif +.endm + +.macro pixldst0 op, elem_size, reg1, idx, mem_operand, abits + op&.&elem_size {d®1[idx]}, [&mem_operand&]! +.endm + +.macro pixldst3 op, elem_size, reg1, reg2, reg3, mem_operand + op&.&elem_size {d®1, d®2, d®3}, [&mem_operand&]! +.endm + +.macro pixldst30 op, elem_size, reg1, reg2, reg3, idx, mem_operand + op&.&elem_size {d®1[idx], d®2[idx], d®3[idx]}, [&mem_operand&]! +.endm + +.macro pixldst numbytes, op, elem_size, basereg, mem_operand, abits +.if numbytes == 32 + pixldst4 op, elem_size, %(basereg+4), %(basereg+5), \ + %(basereg+6), %(basereg+7), mem_operand, abits +.elseif numbytes == 16 + pixldst2 op, elem_size, %(basereg+2), %(basereg+3), mem_operand, abits +.elseif numbytes == 8 + pixldst1 op, elem_size, %(basereg+1), mem_operand, abits +.elseif numbytes == 4 + .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 32) + pixldst0 op, 32, %(basereg+0), 1, mem_operand, abits + .elseif elem_size == 16 + pixldst0 op, 16, %(basereg+0), 2, mem_operand, abits + pixldst0 op, 16, %(basereg+0), 3, mem_operand, abits + .else + pixldst0 op, 8, %(basereg+0), 4, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 5, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 6, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 7, mem_operand, abits + .endif +.elseif numbytes == 2 + .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 16) + pixldst0 op, 16, %(basereg+0), 1, mem_operand, abits + .else + pixldst0 op, 8, %(basereg+0), 2, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 3, mem_operand, abits + .endif +.elseif numbytes == 1 + pixldst0 op, 8, %(basereg+0), 1, mem_operand, abits +.else + .error "unsupported size: numbytes" +.endif +.endm + +.macro pixld numpix, bpp, basereg, mem_operand, abits=0 +.if bpp > 0 +.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0) + pixldst4 vld4, 8, %(basereg+4), %(basereg+5), \ + %(basereg+6), %(basereg+7), mem_operand, abits +.elseif (bpp == 24) && (numpix == 8) + pixldst3 vld3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand +.elseif (bpp == 24) && (numpix == 4) + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand +.elseif (bpp == 24) && (numpix == 2) + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand +.elseif (bpp == 24) && (numpix == 1) + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand +.else + pixldst %(numpix * bpp / 8), vld1, %(bpp), basereg, mem_operand, abits +.endif +.endif +.endm + +.macro pixst numpix, bpp, basereg, mem_operand, abits=0 +.if bpp > 0 +.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0) + pixldst4 vst4, 8, %(basereg+4), %(basereg+5), \ + %(basereg+6), %(basereg+7), mem_operand, abits +.elseif (bpp == 24) && (numpix == 8) + pixldst3 vst3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand +.elseif (bpp == 24) && (numpix == 4) + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand +.elseif (bpp == 24) && (numpix == 2) + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand +.elseif (bpp == 24) && (numpix == 1) + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand +.else + pixldst %(numpix * bpp / 8), vst1, %(bpp), basereg, mem_operand, abits +.endif +.endif +.endm + +.macro pixld_a numpix, bpp, basereg, mem_operand +.if (bpp * numpix) <= 128 + pixld numpix, bpp, basereg, mem_operand, %(bpp * numpix) +.else + pixld numpix, bpp, basereg, mem_operand, 128 +.endif +.endm + +.macro pixst_a numpix, bpp, basereg, mem_operand +.if (bpp * numpix) <= 128 + pixst numpix, bpp, basereg, mem_operand, %(bpp * numpix) +.else + pixst numpix, bpp, basereg, mem_operand, 128 +.endif +.endm + +/* + * Pixel fetcher for nearest scaling (needs TMP1, TMP2, VX, UNIT_X register + * aliases to be defined) + */ +.macro pixld1_s elem_size, reg1, mem_operand +.if elem_size == 16 + mov TMP1, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP1, mem_operand, TMP1, asl #1 + mov TMP2, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP2, mem_operand, TMP2, asl #1 + vld1.16 {d®1&[0]}, [TMP1, :16] + mov TMP1, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP1, mem_operand, TMP1, asl #1 + vld1.16 {d®1&[1]}, [TMP2, :16] + mov TMP2, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP2, mem_operand, TMP2, asl #1 + vld1.16 {d®1&[2]}, [TMP1, :16] + vld1.16 {d®1&[3]}, [TMP2, :16] +.elseif elem_size == 32 + mov TMP1, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP1, mem_operand, TMP1, asl #2 + mov TMP2, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP2, mem_operand, TMP2, asl #2 + vld1.32 {d®1&[0]}, [TMP1, :32] + vld1.32 {d®1&[1]}, [TMP2, :32] +.else + .error "unsupported" +.endif +.endm + +.macro pixld2_s elem_size, reg1, reg2, mem_operand +.if 0 /* elem_size == 32 */ + mov TMP1, VX, asr #16 + add VX, VX, UNIT_X, asl #1 + add TMP1, mem_operand, TMP1, asl #2 + mov TMP2, VX, asr #16 + sub VX, VX, UNIT_X + add TMP2, mem_operand, TMP2, asl #2 + vld1.32 {d®1&[0]}, [TMP1, :32] + mov TMP1, VX, asr #16 + add VX, VX, UNIT_X, asl #1 + add TMP1, mem_operand, TMP1, asl #2 + vld1.32 {d®2&[0]}, [TMP2, :32] + mov TMP2, VX, asr #16 + add VX, VX, UNIT_X + add TMP2, mem_operand, TMP2, asl #2 + vld1.32 {d®1&[1]}, [TMP1, :32] + vld1.32 {d®2&[1]}, [TMP2, :32] +.else + pixld1_s elem_size, reg1, mem_operand + pixld1_s elem_size, reg2, mem_operand +.endif +.endm + +.macro pixld0_s elem_size, reg1, idx, mem_operand +.if elem_size == 16 + mov TMP1, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP1, mem_operand, TMP1, asl #1 + vld1.16 {d®1&[idx]}, [TMP1, :16] +.elseif elem_size == 32 + mov TMP1, VX, asr #16 + adds VX, VX, UNIT_X +5: subpls VX, VX, SRC_WIDTH_FIXED + bpl 5b + add TMP1, mem_operand, TMP1, asl #2 + vld1.32 {d®1&[idx]}, [TMP1, :32] +.endif +.endm + +.macro pixld_s_internal numbytes, elem_size, basereg, mem_operand +.if numbytes == 32 + pixld2_s elem_size, %(basereg+4), %(basereg+5), mem_operand + pixld2_s elem_size, %(basereg+6), %(basereg+7), mem_operand + pixdeinterleave elem_size, %(basereg+4) +.elseif numbytes == 16 + pixld2_s elem_size, %(basereg+2), %(basereg+3), mem_operand +.elseif numbytes == 8 + pixld1_s elem_size, %(basereg+1), mem_operand +.elseif numbytes == 4 + .if elem_size == 32 + pixld0_s elem_size, %(basereg+0), 1, mem_operand + .elseif elem_size == 16 + pixld0_s elem_size, %(basereg+0), 2, mem_operand + pixld0_s elem_size, %(basereg+0), 3, mem_operand + .else + pixld0_s elem_size, %(basereg+0), 4, mem_operand + pixld0_s elem_size, %(basereg+0), 5, mem_operand + pixld0_s elem_size, %(basereg+0), 6, mem_operand + pixld0_s elem_size, %(basereg+0), 7, mem_operand + .endif +.elseif numbytes == 2 + .if elem_size == 16 + pixld0_s elem_size, %(basereg+0), 1, mem_operand + .else + pixld0_s elem_size, %(basereg+0), 2, mem_operand + pixld0_s elem_size, %(basereg+0), 3, mem_operand + .endif +.elseif numbytes == 1 + pixld0_s elem_size, %(basereg+0), 1, mem_operand +.else + .error "unsupported size: numbytes" +.endif +.endm + +.macro pixld_s numpix, bpp, basereg, mem_operand +.if bpp > 0 + pixld_s_internal %(numpix * bpp / 8), %(bpp), basereg, mem_operand +.endif +.endm + +.macro vuzp8 reg1, reg2 + vuzp.8 d®1, d®2 +.endm + +.macro vzip8 reg1, reg2 + vzip.8 d®1, d®2 +.endm + +/* deinterleave B, G, R, A channels for eight 32bpp pixels in 4 registers */ +.macro pixdeinterleave bpp, basereg +.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0) + vuzp8 %(basereg+0), %(basereg+1) + vuzp8 %(basereg+2), %(basereg+3) + vuzp8 %(basereg+1), %(basereg+3) + vuzp8 %(basereg+0), %(basereg+2) +.endif +.endm + +/* interleave B, G, R, A channels for eight 32bpp pixels in 4 registers */ +.macro pixinterleave bpp, basereg +.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0) + vzip8 %(basereg+0), %(basereg+2) + vzip8 %(basereg+1), %(basereg+3) + vzip8 %(basereg+2), %(basereg+3) + vzip8 %(basereg+0), %(basereg+1) +.endif +.endm + +/* + * This is a macro for implementing cache preload. The main idea is that + * cache preload logic is mostly independent from the rest of pixels + * processing code. It starts at the top left pixel and moves forward + * across pixels and can jump across scanlines. Prefetch distance is + * handled in an 'incremental' way: it starts from 0 and advances to the + * optimal distance over time. After reaching optimal prefetch distance, + * it is kept constant. There are some checks which prevent prefetching + * unneeded pixel lines below the image (but it still can prefetch a bit + * more data on the right side of the image - not a big issue and may + * be actually helpful when rendering text glyphs). Additional trick is + * the use of LDR instruction for prefetch instead of PLD when moving to + * the next line, the point is that we have a high chance of getting TLB + * miss in this case, and PLD would be useless. + * + * This sounds like it may introduce a noticeable overhead (when working with + * fully cached data). But in reality, due to having a separate pipeline and + * instruction queue for NEON unit in ARM Cortex-A8, normal ARM code can + * execute simultaneously with NEON and be completely shadowed by it. Thus + * we get no performance overhead at all (*). This looks like a very nice + * feature of Cortex-A8, if used wisely. We don't have a hardware prefetcher, + * but still can implement some rather advanced prefetch logic in software + * for almost zero cost! + * + * (*) The overhead of the prefetcher is visible when running some trivial + * pixels processing like simple copy. Anyway, having prefetch is a must + * when working with the graphics data. + */ +.macro PF a, x:vararg +.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_ADVANCED) + a x +.endif +.endm + +.macro cache_preload std_increment, boost_increment +.if (src_bpp_shift >= 0) || (dst_r_bpp != 0) || (mask_bpp_shift >= 0) +.if regs_shortage + PF ldr ORIG_W, [sp] /* If we are short on regs, ORIG_W is kept on stack */ +.endif +.if std_increment != 0 + PF add PF_X, PF_X, #std_increment +.endif + PF tst PF_CTL, #0xF + PF addne PF_X, PF_X, #boost_increment + PF subne PF_CTL, PF_CTL, #1 + PF cmp PF_X, ORIG_W +.if src_bpp_shift >= 0 + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] +.endif +.if dst_r_bpp != 0 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] +.endif +.if mask_bpp_shift >= 0 + PF pld, [PF_MASK, PF_X, lsl #mask_bpp_shift] +.endif + PF subge PF_X, PF_X, ORIG_W + PF subges PF_CTL, PF_CTL, #0x10 +.if src_bpp_shift >= 0 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! +.endif +.if dst_r_bpp != 0 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! +.endif +.if mask_bpp_shift >= 0 + PF ldrgeb DUMMY, [PF_MASK, MASK_STRIDE, lsl #mask_bpp_shift]! +.endif +.endif +.endm + +.macro cache_preload_simple +.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_SIMPLE) +.if src_bpp > 0 + pld [SRC, #(PREFETCH_DISTANCE_SIMPLE * src_bpp / 8)] +.endif +.if dst_r_bpp > 0 + pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE * dst_r_bpp / 8)] +.endif +.if mask_bpp > 0 + pld [MASK, #(PREFETCH_DISTANCE_SIMPLE * mask_bpp / 8)] +.endif +.endif +.endm + +.macro fetch_mask_pixblock + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK +.endm + +/* + * Macro which is used to process leading pixels until destination + * pointer is properly aligned (at 16 bytes boundary). When destination + * buffer uses 16bpp format, this is unnecessary, or even pointless. + */ +.macro ensure_destination_ptr_alignment process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head +.if dst_w_bpp != 24 + tst DST_R, #0xF + beq 2f + +.irp lowbit, 1, 2, 4, 8, 16 +local skip1 +.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp)) +.if lowbit < 16 /* we don't need more than 16-byte alignment */ + tst DST_R, #lowbit + beq 1f +.endif + pixld_src (lowbit * 8 / dst_w_bpp), src_bpp, src_basereg, SRC + pixld (lowbit * 8 / dst_w_bpp), mask_bpp, mask_basereg, MASK +.if dst_r_bpp > 0 + pixld_a (lowbit * 8 / dst_r_bpp), dst_r_bpp, dst_r_basereg, DST_R +.else + add DST_R, DST_R, #lowbit +.endif + PF add PF_X, PF_X, #(lowbit * 8 / dst_w_bpp) + sub W, W, #(lowbit * 8 / dst_w_bpp) +1: +.endif +.endr + pixdeinterleave src_bpp, src_basereg + pixdeinterleave mask_bpp, mask_basereg + pixdeinterleave dst_r_bpp, dst_r_basereg + + process_pixblock_head + cache_preload 0, pixblock_size + cache_preload_simple + process_pixblock_tail + + pixinterleave dst_w_bpp, dst_w_basereg +.irp lowbit, 1, 2, 4, 8, 16 +.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp)) +.if lowbit < 16 /* we don't need more than 16-byte alignment */ + tst DST_W, #lowbit + beq 1f +.endif + pixst_a (lowbit * 8 / dst_w_bpp), dst_w_bpp, dst_w_basereg, DST_W +1: +.endif +.endr +.endif +2: +.endm + +/* + * Special code for processing up to (pixblock_size - 1) remaining + * trailing pixels. As SIMD processing performs operation on + * pixblock_size pixels, anything smaller than this has to be loaded + * and stored in a special way. Loading and storing of pixel data is + * performed in such a way that we fill some 'slots' in the NEON + * registers (some slots naturally are unused), then perform compositing + * operation as usual. In the end, the data is taken from these 'slots' + * and saved to memory. + * + * cache_preload_flag - allows to suppress prefetch if + * set to 0 + * dst_aligned_flag - selects whether destination buffer + * is aligned + */ +.macro process_trailing_pixels cache_preload_flag, \ + dst_aligned_flag, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + tst W, #(pixblock_size - 1) + beq 2f +.irp chunk_size, 16, 8, 4, 2, 1 +.if pixblock_size > chunk_size + tst W, #chunk_size + beq 1f + pixld_src chunk_size, src_bpp, src_basereg, SRC + pixld chunk_size, mask_bpp, mask_basereg, MASK +.if dst_aligned_flag != 0 + pixld_a chunk_size, dst_r_bpp, dst_r_basereg, DST_R +.else + pixld chunk_size, dst_r_bpp, dst_r_basereg, DST_R +.endif +.if cache_preload_flag != 0 + PF add PF_X, PF_X, #chunk_size +.endif +1: +.endif +.endr + pixdeinterleave src_bpp, src_basereg + pixdeinterleave mask_bpp, mask_basereg + pixdeinterleave dst_r_bpp, dst_r_basereg + + process_pixblock_head +.if cache_preload_flag != 0 + cache_preload 0, pixblock_size + cache_preload_simple +.endif + process_pixblock_tail + pixinterleave dst_w_bpp, dst_w_basereg +.irp chunk_size, 16, 8, 4, 2, 1 +.if pixblock_size > chunk_size + tst W, #chunk_size + beq 1f +.if dst_aligned_flag != 0 + pixst_a chunk_size, dst_w_bpp, dst_w_basereg, DST_W +.else + pixst chunk_size, dst_w_bpp, dst_w_basereg, DST_W +.endif +1: +.endif +.endr +2: +.endm + +/* + * Macro, which performs all the needed operations to switch to the next + * scanline and start the next loop iteration unless all the scanlines + * are already processed. + */ +.macro advance_to_next_scanline start_of_loop_label +.if regs_shortage + ldrd W, [sp] /* load W and H (width and height) from stack */ +.else + mov W, ORIG_W +.endif + add DST_W, DST_W, DST_STRIDE, lsl #dst_bpp_shift +.if src_bpp != 0 + add SRC, SRC, SRC_STRIDE, lsl #src_bpp_shift +.endif +.if mask_bpp != 0 + add MASK, MASK, MASK_STRIDE, lsl #mask_bpp_shift +.endif +.if (dst_w_bpp != 24) + sub DST_W, DST_W, W, lsl #dst_bpp_shift +.endif +.if (src_bpp != 24) && (src_bpp != 0) + sub SRC, SRC, W, lsl #src_bpp_shift +.endif +.if (mask_bpp != 24) && (mask_bpp != 0) + sub MASK, MASK, W, lsl #mask_bpp_shift +.endif + subs H, H, #1 + mov DST_R, DST_W +.if regs_shortage + str H, [sp, #4] /* save updated height to stack */ +.endif + bge start_of_loop_label +.endm + +/* + * Registers are allocated in the following way by default: + * d0, d1, d2, d3 - reserved for loading source pixel data + * d4, d5, d6, d7 - reserved for loading destination pixel data + * d24, d25, d26, d27 - reserved for loading mask pixel data + * d28, d29, d30, d31 - final destination pixel data for writeback to memory + */ +.macro generate_composite_function fname, \ + src_bpp_, \ + mask_bpp_, \ + dst_w_bpp_, \ + flags, \ + pixblock_size_, \ + prefetch_distance, \ + init, \ + cleanup, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head, \ + dst_w_basereg_ = 28, \ + dst_r_basereg_ = 4, \ + src_basereg_ = 0, \ + mask_basereg_ = 24 + + pixman_asm_function fname + + push {r4-r12, lr} /* save all registers */ + +/* + * Select prefetch type for this function. If prefetch distance is + * set to 0 or one of the color formats is 24bpp, SIMPLE prefetch + * has to be used instead of ADVANCED. + */ + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_DEFAULT +.if prefetch_distance == 0 + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE +.elseif (PREFETCH_TYPE_CURRENT > PREFETCH_TYPE_SIMPLE) && \ + ((src_bpp_ == 24) || (mask_bpp_ == 24) || (dst_w_bpp_ == 24)) + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_SIMPLE +.endif + +/* + * Make some macro arguments globally visible and accessible + * from other macros + */ + .set src_bpp, src_bpp_ + .set mask_bpp, mask_bpp_ + .set dst_w_bpp, dst_w_bpp_ + .set pixblock_size, pixblock_size_ + .set dst_w_basereg, dst_w_basereg_ + .set dst_r_basereg, dst_r_basereg_ + .set src_basereg, src_basereg_ + .set mask_basereg, mask_basereg_ + + .macro pixld_src x:vararg + pixld x + .endm + .macro fetch_src_pixblock + pixld_src pixblock_size, src_bpp, \ + (src_basereg - pixblock_size * src_bpp / 64), SRC + .endm +/* + * Assign symbolic names to registers + */ + W .req r0 /* width (is updated during processing) */ + H .req r1 /* height (is updated during processing) */ + DST_W .req r2 /* destination buffer pointer for writes */ + DST_STRIDE .req r3 /* destination image stride */ + SRC .req r4 /* source buffer pointer */ + SRC_STRIDE .req r5 /* source image stride */ + DST_R .req r6 /* destination buffer pointer for reads */ + + MASK .req r7 /* mask pointer */ + MASK_STRIDE .req r8 /* mask stride */ + + PF_CTL .req r9 /* combined lines counter and prefetch */ + /* distance increment counter */ + PF_X .req r10 /* pixel index in a scanline for current */ + /* pretetch position */ + PF_SRC .req r11 /* pointer to source scanline start */ + /* for prefetch purposes */ + PF_DST .req r12 /* pointer to destination scanline start */ + /* for prefetch purposes */ + PF_MASK .req r14 /* pointer to mask scanline start */ + /* for prefetch purposes */ +/* + * Check whether we have enough registers for all the local variables. + * If we don't have enough registers, original width and height are + * kept on top of stack (and 'regs_shortage' variable is set to indicate + * this for the rest of code). Even if there are enough registers, the + * allocation scheme may be a bit different depending on whether source + * or mask is not used. + */ +.if (PREFETCH_TYPE_CURRENT < PREFETCH_TYPE_ADVANCED) + ORIG_W .req r10 /* saved original width */ + DUMMY .req r12 /* temporary register */ + .set regs_shortage, 0 +.elseif mask_bpp == 0 + ORIG_W .req r7 /* saved original width */ + DUMMY .req r8 /* temporary register */ + .set regs_shortage, 0 +.elseif src_bpp == 0 + ORIG_W .req r4 /* saved original width */ + DUMMY .req r5 /* temporary register */ + .set regs_shortage, 0 +.else + ORIG_W .req r1 /* saved original width */ + DUMMY .req r1 /* temporary register */ + .set regs_shortage, 1 +.endif + + .set mask_bpp_shift, -1 +.if src_bpp == 32 + .set src_bpp_shift, 2 +.elseif src_bpp == 24 + .set src_bpp_shift, 0 +.elseif src_bpp == 16 + .set src_bpp_shift, 1 +.elseif src_bpp == 8 + .set src_bpp_shift, 0 +.elseif src_bpp == 0 + .set src_bpp_shift, -1 +.else + .error "requested src bpp (src_bpp) is not supported" +.endif +.if mask_bpp == 32 + .set mask_bpp_shift, 2 +.elseif mask_bpp == 24 + .set mask_bpp_shift, 0 +.elseif mask_bpp == 8 + .set mask_bpp_shift, 0 +.elseif mask_bpp == 0 + .set mask_bpp_shift, -1 +.else + .error "requested mask bpp (mask_bpp) is not supported" +.endif +.if dst_w_bpp == 32 + .set dst_bpp_shift, 2 +.elseif dst_w_bpp == 24 + .set dst_bpp_shift, 0 +.elseif dst_w_bpp == 16 + .set dst_bpp_shift, 1 +.elseif dst_w_bpp == 8 + .set dst_bpp_shift, 0 +.else + .error "requested dst bpp (dst_w_bpp) is not supported" +.endif + +.if (((flags) & FLAG_DST_READWRITE) != 0) + .set dst_r_bpp, dst_w_bpp +.else + .set dst_r_bpp, 0 +.endif +.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0) + .set DEINTERLEAVE_32BPP_ENABLED, 1 +.else + .set DEINTERLEAVE_32BPP_ENABLED, 0 +.endif + +.if prefetch_distance < 0 || prefetch_distance > 15 + .error "invalid prefetch distance (prefetch_distance)" +.endif + +.if src_bpp > 0 + ldr SRC, [sp, #40] +.endif +.if mask_bpp > 0 + ldr MASK, [sp, #48] +.endif + PF mov PF_X, #0 +.if src_bpp > 0 + ldr SRC_STRIDE, [sp, #44] +.endif +.if mask_bpp > 0 + ldr MASK_STRIDE, [sp, #52] +.endif + mov DST_R, DST_W + +.if src_bpp == 24 + sub SRC_STRIDE, SRC_STRIDE, W + sub SRC_STRIDE, SRC_STRIDE, W, lsl #1 +.endif +.if mask_bpp == 24 + sub MASK_STRIDE, MASK_STRIDE, W + sub MASK_STRIDE, MASK_STRIDE, W, lsl #1 +.endif +.if dst_w_bpp == 24 + sub DST_STRIDE, DST_STRIDE, W + sub DST_STRIDE, DST_STRIDE, W, lsl #1 +.endif + +/* + * Setup advanced prefetcher initial state + */ + PF mov PF_SRC, SRC + PF mov PF_DST, DST_R + PF mov PF_MASK, MASK + /* PF_CTL = prefetch_distance | ((h - 1) << 4) */ + PF mov PF_CTL, H, lsl #4 + PF add PF_CTL, #(prefetch_distance - 0x10) + + init +.if regs_shortage + push {r0, r1} +.endif + subs H, H, #1 +.if regs_shortage + str H, [sp, #4] /* save updated height to stack */ +.else + mov ORIG_W, W +.endif + blt 9f + cmp W, #(pixblock_size * 2) + blt 8f +/* + * This is the start of the pipelined loop, which if optimized for + * long scanlines + */ +0: + ensure_destination_ptr_alignment process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */ + pixld_a pixblock_size, dst_r_bpp, \ + (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R + fetch_src_pixblock + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK + PF add PF_X, PF_X, #pixblock_size + process_pixblock_head + cache_preload 0, pixblock_size + cache_preload_simple + subs W, W, #(pixblock_size * 2) + blt 2f +1: + process_pixblock_tail_head + cache_preload_simple + subs W, W, #pixblock_size + bge 1b +2: + process_pixblock_tail + pixst_a pixblock_size, dst_w_bpp, \ + (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W + + /* Process the remaining trailing pixels in the scanline */ + process_trailing_pixels 1, 1, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + advance_to_next_scanline 0b + +.if regs_shortage + pop {r0, r1} +.endif + cleanup + pop {r4-r12, pc} /* exit */ +/* + * This is the start of the loop, designed to process images with small width + * (less than pixblock_size * 2 pixels). In this case neither pipelining + * nor prefetch are used. + */ +8: + /* Process exactly pixblock_size pixels if needed */ + tst W, #pixblock_size + beq 1f + pixld pixblock_size, dst_r_bpp, \ + (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R + fetch_src_pixblock + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK + process_pixblock_head + process_pixblock_tail + pixst pixblock_size, dst_w_bpp, \ + (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W +1: + /* Process the remaining trailing pixels in the scanline */ + process_trailing_pixels 0, 0, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + advance_to_next_scanline 8b +9: +.if regs_shortage + pop {r0, r1} +.endif + cleanup + pop {r4-r12, pc} /* exit */ + + .purgem fetch_src_pixblock + .purgem pixld_src + + .unreq SRC + .unreq MASK + .unreq DST_R + .unreq DST_W + .unreq ORIG_W + .unreq W + .unreq H + .unreq SRC_STRIDE + .unreq DST_STRIDE + .unreq MASK_STRIDE + .unreq PF_CTL + .unreq PF_X + .unreq PF_SRC + .unreq PF_DST + .unreq PF_MASK + .unreq DUMMY + .endfunc +.endm + +/* + * A simplified variant of function generation template for a single + * scanline processing (for implementing pixman combine functions) + */ +.macro generate_composite_function_scanline use_nearest_scaling, \ + fname, \ + src_bpp_, \ + mask_bpp_, \ + dst_w_bpp_, \ + flags, \ + pixblock_size_, \ + init, \ + cleanup, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head, \ + dst_w_basereg_ = 28, \ + dst_r_basereg_ = 4, \ + src_basereg_ = 0, \ + mask_basereg_ = 24 + + pixman_asm_function fname + + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE +/* + * Make some macro arguments globally visible and accessible + * from other macros + */ + .set src_bpp, src_bpp_ + .set mask_bpp, mask_bpp_ + .set dst_w_bpp, dst_w_bpp_ + .set pixblock_size, pixblock_size_ + .set dst_w_basereg, dst_w_basereg_ + .set dst_r_basereg, dst_r_basereg_ + .set src_basereg, src_basereg_ + .set mask_basereg, mask_basereg_ + +.if use_nearest_scaling != 0 + /* + * Assign symbolic names to registers for nearest scaling + */ + W .req r0 + DST_W .req r1 + SRC .req r2 + VX .req r3 + UNIT_X .req ip + MASK .req lr + TMP1 .req r4 + TMP2 .req r5 + DST_R .req r6 + SRC_WIDTH_FIXED .req r7 + + .macro pixld_src x:vararg + pixld_s x + .endm + + ldr UNIT_X, [sp] + push {r4-r8, lr} + ldr SRC_WIDTH_FIXED, [sp, #(24 + 4)] + .if mask_bpp != 0 + ldr MASK, [sp, #(24 + 8)] + .endif +.else + /* + * Assign symbolic names to registers + */ + W .req r0 /* width (is updated during processing) */ + DST_W .req r1 /* destination buffer pointer for writes */ + SRC .req r2 /* source buffer pointer */ + DST_R .req ip /* destination buffer pointer for reads */ + MASK .req r3 /* mask pointer */ + + .macro pixld_src x:vararg + pixld x + .endm +.endif + +.if (((flags) & FLAG_DST_READWRITE) != 0) + .set dst_r_bpp, dst_w_bpp +.else + .set dst_r_bpp, 0 +.endif +.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0) + .set DEINTERLEAVE_32BPP_ENABLED, 1 +.else + .set DEINTERLEAVE_32BPP_ENABLED, 0 +.endif + + .macro fetch_src_pixblock + pixld_src pixblock_size, src_bpp, \ + (src_basereg - pixblock_size * src_bpp / 64), SRC + .endm + + init + mov DST_R, DST_W + + cmp W, #pixblock_size + blt 8f + + ensure_destination_ptr_alignment process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + subs W, W, #pixblock_size + blt 7f + + /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */ + pixld_a pixblock_size, dst_r_bpp, \ + (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R + fetch_src_pixblock + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK + process_pixblock_head + subs W, W, #pixblock_size + blt 2f +1: + process_pixblock_tail_head + subs W, W, #pixblock_size + bge 1b +2: + process_pixblock_tail + pixst_a pixblock_size, dst_w_bpp, \ + (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W +7: + /* Process the remaining trailing pixels in the scanline (dst aligned) */ + process_trailing_pixels 0, 1, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + cleanup +.if use_nearest_scaling != 0 + pop {r4-r8, pc} /* exit */ +.else + bx lr /* exit */ +.endif +8: + /* Process the remaining trailing pixels in the scanline (dst unaligned) */ + process_trailing_pixels 0, 0, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + cleanup + +.if use_nearest_scaling != 0 + pop {r4-r8, pc} /* exit */ + + .unreq DST_R + .unreq SRC + .unreq W + .unreq VX + .unreq UNIT_X + .unreq TMP1 + .unreq TMP2 + .unreq DST_W + .unreq MASK + .unreq SRC_WIDTH_FIXED + +.else + bx lr /* exit */ + + .unreq SRC + .unreq MASK + .unreq DST_R + .unreq DST_W + .unreq W +.endif + + .purgem fetch_src_pixblock + .purgem pixld_src + + .endfunc +.endm + +.macro generate_composite_function_single_scanline x:vararg + generate_composite_function_scanline 0, x +.endm + +.macro generate_composite_function_nearest_scanline x:vararg + generate_composite_function_scanline 1, x +.endm + +/* Default prologue/epilogue, nothing special needs to be done */ + +.macro default_init +.endm + +.macro default_cleanup +.endm + +/* + * Prologue/epilogue variant which additionally saves/restores d8-d15 + * registers (they need to be saved/restored by callee according to ABI). + * This is required if the code needs to use all the NEON registers. + */ + +.macro default_init_need_all_regs + vpush {d8-d15} +.endm + +.macro default_cleanup_need_all_regs + vpop {d8-d15} +.endm + +/******************************************************************************/ diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index b4be4c752c..76f1212f63 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -630,7 +630,7 @@ void VSpanData::updateSpanFunc() } } -#if !defined(__SSE2__) +#if !defined(__SSE2__) && !defined(__ARM_NEON__) void memfill32(uint32_t *dest, uint32_t value, int length) { int n; diff --git a/src/vector/vdrawhelper_neon.cpp b/src/vector/vdrawhelper_neon.cpp index e69de29bb2..65fd57a0a2 100644 --- a/src/vector/vdrawhelper_neon.cpp +++ b/src/vector/vdrawhelper_neon.cpp @@ -0,0 +1,18 @@ + +#include "vdrawhelper.h" + +extern "C" void +pixman_composite_src_n_8888_asm_neon (int32_t w, + int32_t h, + uint32_t *dst, + int32_t dst_stride, + uint32_t src); + +void memfill32(uint32_t *dest, uint32_t value, int length) +{ + pixman_composite_src_n_8888_asm_neon(length, + 1, + dest, + length, + value); +} From b9fe04a2514075d5083e9d55de9efa8e92c030cd Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Wed, 1 Aug 2018 20:15:15 +0900 Subject: [PATCH 117/672] lottie: reuse path for reducing constructor/destructor calls from getPath()/toPath() It helps to improve performance by avoiding constructor/destructor calls. The getPath function is renamed to updatePath function. And it does not return VPath anymore. Change-Id: I6e6cc52ec3f1560aac2ee0633cdf5a8c224dcc6e --- src/lottie/lottieitem.cpp | 28 +++++++++++----------------- src/lottie/lottieitem.h | 10 +++++----- src/lottie/lottiemodel.h | 9 ++++----- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 111a069308..5533379e12 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -172,10 +172,10 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, { if (mData->mShape.isStatic()) { if (mLocalPath.isEmpty()) { - mLocalPath = mData->mShape.value(frameNo).toPath(); + mData->mShape.value(frameNo).toPath(mLocalPath); } } else { - mLocalPath = mData->mShape.value(frameNo).toPath(); + mData->mShape.value(frameNo).toPath(mLocalPath); } float opacity = mData->opacity(frameNo); opacity = opacity * parentAlpha; @@ -670,7 +670,7 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, // 1. update the local path if needed if (!(mInit && mStaticPath)) { - mLocalPath = getPath(frameNo); + updatePath(mLocalPath, frameNo); mInit = true; mPathChanged = true; } @@ -726,7 +726,7 @@ LOTRectItem::LOTRectItem(LOTRectData *data) { } -VPath LOTRectItem::getPath(int frameNo) +void LOTRectItem::updatePath(VPath& path, int frameNo) { VPointF pos = mData->mPos.value(frameNo); VPointF size = mData->mSize.value(frameNo); @@ -734,10 +734,8 @@ VPath LOTRectItem::getPath(int frameNo) VRectF r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(), size.y()); - VPath path; + path.reset(); path.addRoundRect(r, radius, radius, mData->direction()); - - return path; } LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data) @@ -745,17 +743,15 @@ LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data) { } -VPath LOTEllipseItem::getPath(int frameNo) +void LOTEllipseItem::updatePath(VPath& path, int frameNo) { VPointF pos = mData->mPos.value(frameNo); VPointF size = mData->mSize.value(frameNo); VRectF r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(), size.y()); - VPath path; + path.reset(); path.addOval(r, mData->direction()); - - return path; } LOTShapeItem::LOTShapeItem(LOTShapeData *data) @@ -763,9 +759,9 @@ LOTShapeItem::LOTShapeItem(LOTShapeData *data) { } -VPath LOTShapeItem::getPath(int frameNo) +void LOTShapeItem::updatePath(VPath& path, int frameNo) { - return mData->mShape.value(frameNo).toPath(); + mData->mShape.value(frameNo).toPath(path); } LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data) @@ -773,7 +769,7 @@ LOTPolystarItem::LOTPolystarItem(LOTPolystarData *data) { } -VPath LOTPolystarItem::getPath(int frameNo) +void LOTPolystarItem::updatePath(VPath& path, int frameNo) { VPointF pos = mData->mPos.value(frameNo); float points = mData->mPointCount.value(frameNo); @@ -783,7 +779,7 @@ VPath LOTPolystarItem::getPath(int frameNo) float outerRoundness = mData->mOuterRoundness.value(frameNo); float rotation = mData->mRotation.value(frameNo); - VPath path; + path.reset(); VMatrix m; if (mData->mType == LOTPolystarData::PolyType::Star) { @@ -797,8 +793,6 @@ VPath LOTPolystarItem::getPath(int frameNo) m.translate(pos.x(), pos.y()).rotate(rotation); m.rotate(rotation); path.transform(m); - - return path; } /* diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index cb87ecc6f7..1d35d4817b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -225,7 +225,7 @@ private: bool mPathChanged; float mCombinedAlpha; protected: - virtual VPath getPath(int frameNo) = 0; + virtual void updatePath(VPath& path, int frameNo) = 0; }; class LOTRectItem: public LOTPathDataItem @@ -233,7 +233,7 @@ class LOTRectItem: public LOTPathDataItem public: LOTRectItem(LOTRectData *data); protected: - VPath getPath(int frameNo) final; + void updatePath(VPath& path, int frameNo) final; LOTRectData *mData; }; @@ -242,7 +242,7 @@ class LOTEllipseItem: public LOTPathDataItem public: LOTEllipseItem(LOTEllipseData *data); private: - VPath getPath(int frameNo) final; + void updatePath(VPath& path, int frameNo) final; LOTEllipseData *mData; }; @@ -251,7 +251,7 @@ class LOTShapeItem: public LOTPathDataItem public: LOTShapeItem(LOTShapeData *data); private: - VPath getPath(int frameNo) final; + void updatePath(VPath& path, int frameNo) final; LOTShapeData *mData; }; @@ -260,7 +260,7 @@ class LOTPolystarItem: public LOTPathDataItem public: LOTPolystarItem(LOTPolystarData *data); private: - VPath getPath(int frameNo) final; + void updatePath(VPath& path, int frameNo) final; LOTPolystarData *mData; }; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 6880ffade9..8d9df61015 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -106,10 +106,11 @@ public: void reserve(int size) { mPoints.reserve(mPoints.size() + size); } - VPath toPath() const{ - if (mPoints.empty()) return VPath(); + void toPath(VPath& path) { + path.reset(); + + if (mPoints.empty()) return; - VPath path; int size = mPoints.size(); const VPointF *points = mPoints.data(); /* reserve exact memory requirement at once @@ -123,8 +124,6 @@ public: } if (mClosed) path.close(); - - return path; } public: std::vector mPoints; From 3ef4a6b6aec8f0be11355a6109680ba93808ecc4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 2 Aug 2018 13:11:28 +0900 Subject: [PATCH 118/672] lottie/render: fixed logic where the memory will only grow when needed. Change-Id: I2367433c69083b5c52d109ff854b9fa3b9019247 --- src/vector/vraster.cpp | 52 +++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 0e07e0f468..692198477f 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -12,14 +12,11 @@ V_BEGIN_NAMESPACE struct FTOutline { public: - FTOutline() : mMemory(nullptr) {} - ~FTOutline() { delete[] mMemory; } - void releaseMemory() + ~FTOutline() { - if (mMemory) delete[] mMemory; - mMemory = nullptr; - mPointSize = 0; - mSegmentSize = 0; + if (mPointSize) delete[] ft.points; + if (mTagSize) delete[] ft.tags; + if (mSegmentSize) delete[] ft.contours; } void reset(); void grow(int, int); @@ -32,9 +29,9 @@ public: void end(); void transform(const VMatrix &m); SW_FT_Outline ft; - SW_FT_Vector * mMemory{nullptr}; int mPointSize{0}; int mSegmentSize{0}; + int mTagSize{0}; bool closed{false}; SW_FT_Stroker_LineCap ftCap; SW_FT_Stroker_LineJoin ftJoin; @@ -52,29 +49,28 @@ void FTOutline::reset() void FTOutline::grow(int points, int segments) { reset(); - if (mPointSize >= points && mSegmentSize >= segments) return; - - // release old memory - releaseMemory(); - - // update book keeping - mPointSize = points; - mSegmentSize = segments; int point_size = (points + segments); - int contour_size = ((sizeof(short) * segments) / sizeof(SW_FT_Vector)) + 1; - int tag_size = - ((sizeof(char) * (points + segments)) / sizeof(SW_FT_Vector)) + 1; + int segment_size = (sizeof(short) * segments); + int tag_size = (sizeof(char) * (points + segments)); - /* - * Optimization, instead of allocating 3 different buffer - * allocate one big buffer and divide the buffer into 3 different - * segment. - */ - mMemory = new SW_FT_Vector[point_size + contour_size + tag_size]; - ft.points = reinterpret_cast(mMemory); - ft.tags = reinterpret_cast(mMemory + point_size); - ft.contours = reinterpret_cast(mMemory + point_size + tag_size); + if (point_size > mPointSize) { + if (mPointSize) delete [] ft.points; + ft.points = new SW_FT_Vector[point_size]; + mPointSize = point_size; + } + + if (segment_size > mSegmentSize) { + if (mSegmentSize) delete [] ft.contours; + ft.contours = new short[segment_size]; + mSegmentSize = segment_size; + } + + if (tag_size > mTagSize) { + if (mTagSize) delete [] ft.tags; + ft.tags = new char[tag_size]; + mTagSize = tag_size; + } } void FTOutline::convert(const VPath &path) From a9def49291ac3cfb5894e24140d5db95ea0b43b1 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 2 Aug 2018 13:43:59 +0900 Subject: [PATCH 119/672] lottie/vector: add clone method to copy data without increasing ref count It helps to improve performance by avoiding copy job from writing COW data. Change-Id: I72d1c7106fc4fe53fa6db05e7ed8c74f1b70fe95 --- src/lottie/lottieitem.cpp | 2 +- src/vector/vpath.h | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 5533379e12..c3ff6a7643 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -692,7 +692,7 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, // 3. compute the final path with parentMatrix if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { - mFinalPath = tempPath; + mFinalPath.clone(tempPath); mFinalPath.transform(parentMatrix); mPathChanged = true; } diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 2d1858dfa7..3292675d18 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -45,6 +45,7 @@ public: float length() const; const std::vector &elements() const; const std::vector & points() const; + void clone(const VPath &srcPath); private: struct VPathData { @@ -210,6 +211,11 @@ inline const std::vector &VPath::points() const return d->points(); } +inline void VPath::clone(const VPath &srcPath) +{ + d.write() = srcPath.d.read(); +} + V_END_NAMESPACE #endif // VPATH_H From d0d3f3649326034f19c767dcd5a7466844bbcc64 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 2 Aug 2018 16:05:20 +0900 Subject: [PATCH 120/672] lottie/vector: move VPath to raster/drawable methods It prevents to increase ref count of VPath meaninglessly. It could be helpful to improve performance by avoiding alloc/dealloc/copy. Change-Id: I597ca0ea99cdc10bfe9c83a644d20caeab6162b3 --- src/lottie/lottieitem.cpp | 2 +- src/vector/vdrawable.cpp | 7 +++---- src/vector/vraster.cpp | 16 ++++++++-------- src/vector/vraster.h | 4 ++-- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c3ff6a7643..392c112a50 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -184,7 +184,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, VPath path = mLocalPath; path.transform(parentMatrix); - mRleTask = VRaster::instance().generateFillInfo(path, std::move(mRle)); + mRleTask = VRaster::instance().generateFillInfo(std::move(path), std::move(mRle)); } VRle LOTMaskItem::rle() diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index c04783e80f..93e7da1e5d 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -6,16 +6,15 @@ void VDrawable::preprocess() { if (mFlag & (DirtyState::Path)) { if (mStroke.enable) { - VPath newPath = mPath; if (mStroke.dashArraySize) { VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); - newPath = dasher.dashed(mPath); + mPath = dasher.dashed(mPath); } mRleTask = VRaster::instance().generateStrokeInfo( - newPath, std::move(mRle), mStroke.cap, mStroke.join, mStroke.width, + std::move(mPath), std::move(mRle), mStroke.cap, mStroke.join, mStroke.width, mStroke.meterLimit); } else { - mRleTask = VRaster::instance().generateFillInfo(mPath, std::move(mRle), mFillRule); + mRleTask = VRaster::instance().generateFillInfo(std::move(mPath), std::move(mRle), mFillRule); } mFlag &= ~DirtyFlag(DirtyState::Path); } diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 692198477f..b327d55fdc 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -356,12 +356,12 @@ public: return receiver; } - std::future strokeRle(const VPath &path, VRle &&rle, CapStyle cap, JoinStyle join, + std::future strokeRle(const VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit) { RleTask *task = new RleTask(); task->stroke = true; - task->path = path; + task->path = std::move(path); task->rle = std::move(rle); task->cap = cap; task->join = join; @@ -370,10 +370,10 @@ public: return async(task); } - std::future fillRle(const VPath &path, VRle &&rle, FillRule fillRule) + std::future fillRle(const VPath &&path, VRle &&rle, FillRule fillRule) { RleTask *task = new RleTask(); - task->path = path; + task->path = std::move(path); task->rle = std::move(rle); task->fillRule = fillRule; task->stroke = false; @@ -387,7 +387,7 @@ VRaster::VRaster() {} VRaster::~VRaster() {} -std::future VRaster::generateFillInfo(const VPath &path, VRle &&rle, +std::future VRaster::generateFillInfo(const VPath &&path, VRle &&rle, FillRule fillRule) { if (path.isEmpty()) { @@ -395,10 +395,10 @@ std::future VRaster::generateFillInfo(const VPath &path, VRle &&rle, promise.set_value(VRle()); return promise.get_future(); } - return raster_scheduler.fillRle(path, std::move(rle), fillRule); + return raster_scheduler.fillRle(std::move(path), std::move(rle), fillRule); } -std::future VRaster::generateStrokeInfo(const VPath &path, VRle &&rle, CapStyle cap, +std::future VRaster::generateStrokeInfo(const VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit) { @@ -407,7 +407,7 @@ std::future VRaster::generateStrokeInfo(const VPath &path, VRle &&rle, Cap promise.set_value(VRle()); return promise.get_future(); } - return raster_scheduler.strokeRle(path, std::move(rle), cap, join, width, meterLimit); + return raster_scheduler.strokeRle(std::move(path), std::move(rle), cap, join, width, meterLimit); } V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 5d47dfee60..c41a4ae537 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -22,9 +22,9 @@ public: VRaster &operator=(VRaster const &) = delete; VRaster &operator=(VRaster &&) = delete; - std::future generateFillInfo(const VPath &path, VRle &&rle, + std::future generateFillInfo(const VPath &&path, VRle &&rle, FillRule fillRule = FillRule::Winding); - std::future generateStrokeInfo(const VPath &path, VRle &&rle, CapStyle cap, + std::future generateStrokeInfo(const VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit); From e8cb8100e656e5ac851d38ee8ccd95d40a6e7937 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 2 Aug 2018 16:59:59 +0900 Subject: [PATCH 121/672] lottie/raster: remove Const qualifier from VPath parameters The given VPath should be moved by std::move. The std:move only work as our purpose when it is non-const variable. And it also fix a crash issue when its path is not changed, but its other properties are changed. Change-Id: I4135066f99c0eed07e033c368dc4b60e6703ca37 --- src/lottie/lottieitem.cpp | 7 ++++--- src/vector/vraster.cpp | 8 ++++---- src/vector/vraster.h | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 392c112a50..16969573ee 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -702,10 +702,11 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, i.drawable->mFlag = VDrawable::DirtyState::None; i.paintNodeRef->updateRenderNode(i.pathNodeRef, i.drawable, i.sameGroup); - if (mPathChanged) { - i.drawable->mPath = mFinalPath; + if (mPathChanged) i.drawable->mFlag |= VDrawable::DirtyState::Path; - } + + if (i.drawable->mFlag & VDrawable::DirtyState::Path) + i.drawable->mPath = mFinalPath; } } diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index b327d55fdc..ec711208d1 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -356,7 +356,7 @@ public: return receiver; } - std::future strokeRle(const VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, + std::future strokeRle(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit) { RleTask *task = new RleTask(); @@ -370,7 +370,7 @@ public: return async(task); } - std::future fillRle(const VPath &&path, VRle &&rle, FillRule fillRule) + std::future fillRle(VPath &&path, VRle &&rle, FillRule fillRule) { RleTask *task = new RleTask(); task->path = std::move(path); @@ -387,7 +387,7 @@ VRaster::VRaster() {} VRaster::~VRaster() {} -std::future VRaster::generateFillInfo(const VPath &&path, VRle &&rle, +std::future VRaster::generateFillInfo(VPath &&path, VRle &&rle, FillRule fillRule) { if (path.isEmpty()) { @@ -398,7 +398,7 @@ std::future VRaster::generateFillInfo(const VPath &&path, VRle &&rle, return raster_scheduler.fillRle(std::move(path), std::move(rle), fillRule); } -std::future VRaster::generateStrokeInfo(const VPath &&path, VRle &&rle, CapStyle cap, +std::future VRaster::generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit) { diff --git a/src/vector/vraster.h b/src/vector/vraster.h index c41a4ae537..5b5b1aa0a9 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -22,9 +22,9 @@ public: VRaster &operator=(VRaster const &) = delete; VRaster &operator=(VRaster &&) = delete; - std::future generateFillInfo(const VPath &&path, VRle &&rle, + std::future generateFillInfo(VPath &&path, VRle &&rle, FillRule fillRule = FillRule::Winding); - std::future generateStrokeInfo(const VPath &&path, VRle &&rle, CapStyle cap, + std::future generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit); From 649c463f4eef3923f633500912f82a5846be6491 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 2 Aug 2018 14:57:08 +0900 Subject: [PATCH 122/672] lottie: always get the item by ref or const ref. Change-Id: Id798812b135d2e1ef1fb593412808f15e2645761 --- src/lottie/lottieitem.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 16969573ee..c3bdd77f8c 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -17,7 +17,7 @@ LOTCompItem::LOTCompItem(LOTModel *model) { // 1. build layer item list mCompData = model->mRoot.get(); - for (auto i : mCompData->mChildren) { + for (auto &i : mCompData->mChildren) { LOTLayerData *layerData = dynamic_cast(i.get()); if (layerData) { LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerData); @@ -29,7 +29,7 @@ LOTCompItem::LOTCompItem(LOTModel *model) } // 2. update parent layer - for (auto i : mLayers) { + for (auto &i : mLayers) { int id = i->parentId(); if (id >= 0) { auto search = mLayerMap.find(id); @@ -40,7 +40,7 @@ LOTCompItem::LOTCompItem(LOTModel *model) } } // 3. update static property of each layer - for (auto i : mLayers) { + for (auto &i : mLayers) { i->updateStaticProperty(); } @@ -49,7 +49,7 @@ LOTCompItem::LOTCompItem(LOTModel *model) LOTCompItem::~LOTCompItem() { - for (auto i : mLayers) { + for (auto &i : mLayers) { delete i; } } @@ -133,7 +133,7 @@ void LOTCompItem::buildRenderList() } mRenderList.clear(); - for (auto i : mDrawableList) { + for (auto &i : mDrawableList) { LOTDrawable *lotDrawable = static_cast(i); lotDrawable->sync(); mRenderList.push_back(&lotDrawable->mCNode); @@ -210,7 +210,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } - for (auto i : list) { + for (auto &i : list) { painter->setBrush(i->mBrush); if (!mask.isEmpty()) { VRle rle = i->rle() & mask; @@ -256,7 +256,7 @@ LOTLayerItem::LOTLayerItem(LOTLayerData *layerData) mDirtyFlag(DirtyFlagBit::All) { if (mLayerData->mHasMask) { - for (auto i : mLayerData->mMasks) { + for (auto &i : mLayerData->mMasks) { mMasks.push_back(std::make_unique(i.get())); } } @@ -334,7 +334,7 @@ bool LOTLayerItem::visible() const LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) : LOTLayerItem(layerModel) { - for (auto i : mLayerData->mChildren) { + for (auto &i : mLayerData->mChildren) { LOTLayerData *layerModel = dynamic_cast(i.get()); if (layerModel) { LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel); @@ -346,7 +346,7 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) } // 2. update parent layer - for (auto i : mLayers) { + for (auto &i : mLayers) { int id = i->parentId(); if (id >= 0) { auto search = mLayerMap.find(id); @@ -363,7 +363,7 @@ void LOTCompLayerItem::updateStaticProperty() { LOTLayerItem::updateStaticProperty(); - for (auto i : mLayers) { + for (auto &i : mLayers) { i->updateStaticProperty(); } } @@ -379,14 +379,14 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } - for (auto i : mLayers) { + for (auto &i : mLayers) { i->render(painter, mask); } } LOTCompLayerItem::~LOTCompLayerItem() { - for (auto i : mLayers) { + for (auto &i : mLayers) { delete i; } } From 10cb2bda92e6825507dfd5740149f8df0a4090bc Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 3 Aug 2018 13:38:04 +0900 Subject: [PATCH 123/672] lottie: don't redraw path item if its properties are not changed A path item has few animation frames, it has to be redrawn only in animated frames. If the path item became static after animation frames, it shouldn't redraw its path. It will improve performance. Change-Id: I583f2b8a889208a07530f6d06ed90469bcee726c --- example/resource/dynamic_path_test.json | 1 + src/lottie/lottieitem.cpp | 10 ++- src/lottie/lottieitem.h | 99 +++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 example/resource/dynamic_path_test.json diff --git a/example/resource/dynamic_path_test.json b/example/resource/dynamic_path_test.json new file mode 100644 index 0000000000..a01e506dc2 --- /dev/null +++ b/example/resource/dynamic_path_test.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[135,135],"e":[116,116]},{"t":137.000005580124}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[24,25],"e":[57,52],"to":[5.5,4.5],"ti":[-5.5,-4.5]},{"t":129.000005254278}],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[54]},{"t":149.000006068894}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100],"e":[50,50]},{"t":40.0000016292334}],"ix":2},"p":{"a":0,"k":[-26,-37],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145327582955,0.057777773589,0.866666674614,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[26,-54],"ix":4},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":110,"s":[0],"e":[184]},{"t":149.000006068894}],"ix":5},"ir":{"a":0,"k":30,"ix":6},"is":{"a":0,"k":27,"ix":8},"or":{"a":0,"k":59,"ix":7},"os":{"a":0,"k":73,"ix":9},"ix":5,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.07993286103,0.716212213039,0.766274511814,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 3","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c3bdd77f8c..e76100d6a4 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -669,7 +669,7 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, mCombinedAlpha = parentAlpha; // 1. update the local path if needed - if (!(mInit && mStaticPath)) { + if (!(mInit && mStaticPath) && hasChanged(frameNo)) { updatePath(mLocalPath, frameNo); mInit = true; mPathChanged = true; @@ -731,12 +731,13 @@ void LOTRectItem::updatePath(VPath& path, int frameNo) { VPointF pos = mData->mPos.value(frameNo); VPointF size = mData->mSize.value(frameNo); - float radius = mData->mRound.value(frameNo); + float roundness = mData->mRound.value(frameNo); VRectF r(pos.x() - size.x() / 2, pos.y() - size.y() / 2, size.x(), size.y()); path.reset(); - path.addRoundRect(r, radius, radius, mData->direction()); + path.addRoundRect(r, roundness, roundness, mData->direction()); + updateCache(frameNo, pos, size, roundness); } LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data) @@ -753,6 +754,7 @@ void LOTEllipseItem::updatePath(VPath& path, int frameNo) path.reset(); path.addOval(r, mData->direction()); + updateCache(frameNo, pos, size); } LOTShapeItem::LOTShapeItem(LOTShapeData *data) @@ -794,6 +796,8 @@ void LOTPolystarItem::updatePath(VPath& path, int frameNo) m.translate(pos.x(), pos.y()).rotate(rotation); m.rotate(rotation); path.transform(m); + updateCache(frameNo, pos, points, innerRadius, outerRadius, + innerRoundness, outerRoundness, rotation); } /* diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 1d35d4817b..c7480df919 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -226,6 +226,7 @@ private: float mCombinedAlpha; protected: virtual void updatePath(VPath& path, int frameNo) = 0; + virtual bool hasChanged(int frameNo) = 0; }; class LOTRectItem: public LOTPathDataItem @@ -235,6 +236,35 @@ public: protected: void updatePath(VPath& path, int frameNo) final; LOTRectData *mData; + + struct Cache { + int mFrameNo; + VPointF mPos; + VPointF mSize; + float mRoundness; + }; + Cache mCache; + + void updateCache(int frameNo, VPointF pos, VPointF size, float roundness) { + mCache.mFrameNo = frameNo; + mCache.mPos = pos; + mCache.mSize = size; + mCache.mRoundness = roundness; + } + bool hasChanged(int frameNo) final { + if (mCache.mFrameNo == frameNo) return false; + + VPointF pos = mData->mPos.value(frameNo); + VPointF size = mData->mSize.value(frameNo); + float roundness = mData->mRound.value(frameNo); + + if (vCompare(mCache.mPos.x(), pos.x()) && vCompare(mCache.mPos.y(), pos.y()) && + vCompare(mCache.mSize.x(), size.x()) && vCompare(mCache.mSize.y(), size.y()) && + vCompare(mCache.mRoundness, roundness)) + return false; + + return true; + } }; class LOTEllipseItem: public LOTPathDataItem @@ -244,6 +274,31 @@ public: private: void updatePath(VPath& path, int frameNo) final; LOTEllipseData *mData; + + struct Cache { + int mFrameNo; + VPointF mPos; + VPointF mSize; + }; + Cache mCache; + + void updateCache(int frameNo, VPointF pos, VPointF size) { + mCache.mFrameNo = frameNo; + mCache.mPos = pos; + mCache.mSize = size; + } + bool hasChanged(int frameNo) final { + if (mCache.mFrameNo == frameNo) return false; + + VPointF pos = mData->mPos.value(frameNo); + VPointF size = mData->mSize.value(frameNo); + + if (vCompare(mCache.mPos.x(), pos.x()) && vCompare(mCache.mPos.y(), pos.y()) && + vCompare(mCache.mSize.x(), size.x()) && vCompare(mCache.mSize.y(), size.y())) + return false; + + return true; + } }; class LOTShapeItem: public LOTPathDataItem @@ -253,6 +308,7 @@ public: private: void updatePath(VPath& path, int frameNo) final; LOTShapeData *mData; + bool hasChanged(int frameNo) final { return true; } }; class LOTPolystarItem: public LOTPathDataItem @@ -262,6 +318,49 @@ public: private: void updatePath(VPath& path, int frameNo) final; LOTPolystarData *mData; + + struct Cache { + int mFrameNo; + VPointF mPos; + float mPoints; + float mInnerRadius; + float mOuterRadius; + float mInnerRoundness; + float mOuterRoundness; + float mRotation; + }; + Cache mCache; + + void updateCache(int frameNo, VPointF pos, float points, float innerRadius, float outerRadius, + float innerRoundness, float outerRoundness, float rotation) { + mCache.mFrameNo = frameNo; + mCache.mPos = pos; + mCache.mPoints = points; + mCache.mInnerRadius = innerRadius; + mCache.mOuterRadius = outerRadius; + mCache.mInnerRoundness = innerRoundness; + mCache.mOuterRoundness = outerRoundness; + mCache.mRotation = rotation; + } + bool hasChanged(int frameNo) final { + if (mCache.mFrameNo == frameNo) return false; + + VPointF pos = mData->mPos.value(frameNo); + float points = mData->mPointCount.value(frameNo); + float innerRadius = mData->mInnerRadius.value(frameNo); + float outerRadius = mData->mOuterRadius.value(frameNo); + float innerRoundness = mData->mInnerRoundness.value(frameNo); + float outerRoundness = mData->mOuterRoundness.value(frameNo); + float rotation = mData->mRotation.value(frameNo); + + if (vCompare(mCache.mPos.x(), pos.x()) && vCompare(mCache.mPos.y(), pos.y()) && + vCompare(mCache.mPoints, points) && vCompare(mCache.mRotation, rotation) && + vCompare(mCache.mInnerRadius, innerRadius) && vCompare(mCache.mOuterRadius, outerRadius) && + vCompare(mCache.mInnerRoundness, innerRoundness) && vCompare(mCache.mOuterRoundness, outerRoundness)) + return false; + + return true; + } }; From 296534e3c021ecbbd63ede73d20990899bc1066e Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 3 Aug 2018 17:46:02 +0900 Subject: [PATCH 124/672] lottie/render: don't redraw stroke/dash if there is no change It will improve performance. Change-Id: I3764d126d7eae19d009d72998247789e620205a1 --- example/resource/static_dynamic_dash.json | 1 + src/vector/vdrawable.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 example/resource/static_dynamic_dash.json diff --git a/example/resource/static_dynamic_dash.json b/example/resource/static_dynamic_dash.json new file mode 100644 index 0000000000..9ebce590cf --- /dev/null +++ b/example/resource/static_dynamic_dash.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[135,135],"e":[116,116]},{"t":137.000005580124}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[24,25],"e":[57,52],"to":[5.5,4.5],"ti":[-5.5,-4.5]},{"t":129.000005254278}],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[54]},{"t":149.000006068894}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.402888119221,0.437488675117,0.552941203117,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100],"e":[50,50]},{"t":40.0000016292334}],"ix":2},"p":{"a":0,"k":[-26,-37],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145327582955,0.057777773589,0.866666674614,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[26,-54],"ix":4},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":110,"s":[0],"e":[184]},{"t":149.000006068894}],"ix":5},"ir":{"a":0,"k":30,"ix":6},"is":{"a":0,"k":27,"ix":8},"or":{"a":0,"k":59,"ix":7},"os":{"a":0,"k":73,"ix":9},"ix":6,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.07993286103,0.716212213039,0.766274511814,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 3","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":25,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 93e7da1e5d..470f0e1bac 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -31,6 +31,10 @@ VRle VDrawable::rle() void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) { + if ((mStroke.cap == cap) && (mStroke.join == join) && + vCompare(mStroke.meterLimit, meterLimit) && vCompare(mStroke.width, strokeWidth)) + return; + mStroke.enable = true; mStroke.cap = cap; mStroke.join = join; @@ -41,6 +45,21 @@ void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, void VDrawable::setDashInfo(float *array, int size) { + bool hasChanged = false; + + if (mStroke.dashArraySize == size) { + for (int i = 0; i < size; i++) { + if (!vCompare(mStroke.dashArray[i], array[i])) { + hasChanged = true; + break; + } + } + } else { + hasChanged = true; + } + + if (!hasChanged) return; + mStroke.dashArray = array; mStroke.dashArraySize = size; mFlag |= DirtyState::Path; From 92c363da428985eee677acac0a3ba10c83ec1093 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 6 Aug 2018 10:19:57 +0900 Subject: [PATCH 125/672] lottie/render: Implement drawRle() with position information. Change-Id: Ia5bbcf911baaaa4b684045a6ac28c4dcfc14f841 --- src/vector/vdrawhelper.cpp | 11 ++++------- src/vector/vdrawhelper.h | 23 +++++++++++++++++------ src/vector/vpainter.cpp | 4 +++- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 76f1212f63..2b075299e3 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -496,8 +496,7 @@ static void blendColorARGB(int count, const VRle::Span *spans, void *userData) if (op.mode == VPainter::CompModeSrc) { // inline for performance while (count--) { - uint *target = - ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + uint *target = data->buffer(spans->x, spans->y); if (spans->coverage == 255) { memfill32(target, color, spans->len); } else { @@ -512,8 +511,7 @@ static void blendColorARGB(int count, const VRle::Span *spans, void *userData) } while (count--) { - uint *target = - ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; + uint *target = data->buffer(spans->x, spans->y); op.funcSolid(target, spans->len, color, spans->coverage); ++spans; } @@ -531,9 +529,8 @@ static void blendGradientARGB(int count, const VRle::Span *spans, if (!op.srcFetch) return; while (count--) { - uint *target = - ((uint *)data->mRasterBuffer->scanLine(spans->y)) + spans->x; - int length = spans->len; + uint *target = data->buffer(spans->x, spans->y); + int length = spans->len; while (length) { int l = std::min(length, BLEND_GRADIENT_BUFFER_SIZE); op.srcFetch(buffer, &op, data, spans->y, spans->x, l); diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 3ca9c43723..200929856f 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -111,12 +111,22 @@ struct VSpanData { }; enum class Type { None, Solid, LinearGradient, RadialGradient }; - void updateSpanFunc(); - void init(VRasterBuffer *image); - void setup(const VBrush & brush, - VPainter::CompositionMode mode = VPainter::CompModeSrcOver, - int alpha = 255); - void setupMatrix(const VMatrix &matrix); + void updateSpanFunc(); + void init(VRasterBuffer *image); + void setup(const VBrush & brush, + VPainter::CompositionMode mode = VPainter::CompModeSrcOver, + int alpha = 255); + void setupMatrix(const VMatrix &matrix); + void setPos(const VPoint &pos) { mPos = pos; } + VRect clipRect() const + { + return mSystemClip.translated(-mPos.x(), -mPos.y()); + } + + uint *buffer(int x, int y) const + { + return (uint *)(mRasterBuffer->scanLine(y + mPos.y())) + x + mPos.x(); + } VRasterBuffer * mRasterBuffer; ProcessRleSpan mBlendFunc; @@ -124,6 +134,7 @@ struct VSpanData { VRect mSystemClip; VSpanData::Type mType; std::shared_ptr mCachedGradient; + VPoint mPos; union { uint32_t mSolid; VGradientData mGradient; diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index c4bba88d9a..064f6345a0 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -19,8 +19,10 @@ void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle) if (!mSpanData.mUnclippedBlendFunc) return; + mSpanData.setPos(pos); + // do draw after applying clip. - rle.intersect(mSpanData.mSystemClip, mSpanData.mUnclippedBlendFunc, + rle.intersect(mSpanData.clipRect(), mSpanData.mUnclippedBlendFunc, &mSpanData); } From 62b1cea9e37475423d6cbf2943071238b0bb88b6 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 1 Aug 2018 11:04:29 +0900 Subject: [PATCH 126/672] lottie/vector: refactored VRle class to use cow_ptr. Change-Id: I00dd76c57e94a255efb478a61465ce6b20e8d0b5 --- src/lottie/lottieitem.cpp | 5 +- src/vector/vrle.cpp | 755 ++++++++++++-------------------------- src/vector/vrle.h | 147 ++++++-- 3 files changed, 342 insertions(+), 565 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index e76100d6a4..f3283f6f3c 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -185,6 +185,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, path.transform(parentMatrix); mRleTask = VRaster::instance().generateFillInfo(std::move(path), std::move(mRle)); + mRle = VRle(); } VRle LOTMaskItem::rle() @@ -192,8 +193,8 @@ VRle LOTMaskItem::rle() if (mRleTask.valid()) { mRle = mRleTask.get(); if (!vCompare(mCombinedAlpha, 1.0f)) - mRle = mRle * (mCombinedAlpha * 255); - if (mData->mInv) mRle = ~mRle; + mRle *= (mCombinedAlpha * 255); + if (mData->mInv) mRle.invert(); } return mRle; } diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 0fedea0099..69d4f64ed5 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -15,15 +15,237 @@ struct VRleHelper { ushort size; VRle::Span *spans; }; - -#define VMIN(a, b) ((a) < (b) ? (a) : (b)) -#define VMAX(a, b) ((a) > (b) ? (a) : (b)) +static void rleIntersectWithRle(VRleHelper *, int, int, VRleHelper *, + VRleHelper *); +static void rleIntersectWithRect(const VRect &, VRleHelper *, VRleHelper *); +static void rleAddWithRle(VRleHelper *, VRleHelper *, VRleHelper *); static inline uchar divBy255(int x) { return (x + (x >> 8) + 0x80) >> 8; } +inline static void copyArrayToVector(const VRle::Span *span, int count, + std::vector &v) +{ + // make sure enough memory available + if (v.capacity() < v.size() + count) v.reserve(v.size() + count); + std::copy(span, span + count, back_inserter(v)); +} + +void VRle::VRleData::addSpan(const VRle::Span *span, int count) +{ + copyArrayToVector(span, count, mSpans); + mBboxDirty = true; +} + +VRect VRle::VRleData::bbox() const +{ + updateBbox(); + return mBbox; +} + +void VRle::VRleData::reset() +{ + mSpans.clear(); + mBbox = VRect(); + mOffset = VPoint(); + mBboxDirty = false; +} + +void VRle::VRleData::translate(const VPoint &p) +{ + // take care of last offset if applied + mOffset = p - mOffset; + int x = mOffset.x(); + int y = mOffset.y(); + for (auto &i : mSpans) { + i.x = i.x + x; + i.y = i.y + y; + } + updateBbox(); + mBbox.translate(mOffset.x(), mOffset.y()); +} + +void VRle::VRleData::addRect(const VRect &rect) +{ + int x = rect.left(); + int y = rect.top(); + int width = rect.width(); + int height = rect.height(); + + mSpans.reserve(height); + + VRle::Span span; + for (int i = 0; i < height; i++) { + span.x = x; + span.y = y + i; + span.len = width; + span.coverage = 255; + mSpans.push_back(span); + } + updateBbox(); +} + +void VRle::VRleData::updateBbox() const +{ + if (!mBboxDirty) return; + + mBboxDirty = false; + + int i, l = 0, t = 0, r = 0, b = 0, sz; + l = std::numeric_limits::max(); + const VRle::Span *span = mSpans.data(); + + mBbox = VRect(); + sz = mSpans.size(); + if (sz) { + t = span[0].y; + b = span[sz - 1].y; + for (i = 0; i < sz; i++) { + if (span[i].x < l) l = span[i].x; + if (span[i].x + span[i].len > r) r = span[i].x + span[i].len; + } + mBbox = VRect(l, t, r - l, b - t + 1); + } +} + +void VRle::VRleData::invert() +{ + for (auto &i : mSpans) { + i.coverage = 255 - i.coverage; + } +} + +void VRle::VRleData::operator*=(int alpha) +{ + alpha &= 0xff; + for (auto &i : mSpans) { + i.coverage = divBy255(i.coverage * alpha); + } +} + +void VRle::VRleData::opIntersect(const VRect &r, VRle::VRleSpanCb cb, + void *userData) const +{ + VRect clip = r; + + VRleHelper tresult, tmp_obj; + std::array array; + + // setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup tmp object + tmp_obj.size = mSpans.size(); + tmp_obj.spans = const_cast(mSpans.data()); + + // run till all the spans are processed + while (tmp_obj.size) { + rleIntersectWithRect(clip, &tmp_obj, &tresult); + if (tresult.size) { + cb(tresult.size, tresult.spans, userData); + } + tresult.size = 0; + } +} + +void VRle::VRleData::opAdd(const VRle::VRleData &obj1, + const VRle::VRleData &obj2) +{ + // This routine assumes, obj1(span_y) < obj2(span_y). + + // reserve some space for the result vector. + mSpans.reserve(obj1.mSpans.size() + obj2.mSpans.size()); + + // if two rle are disjoint + if (!obj1.bbox().intersects(obj2.bbox())) { + copyArrayToVector(obj1.mSpans.data(), obj1.mSpans.size(), mSpans); + copyArrayToVector(obj2.mSpans.data(), obj2.mSpans.size(), mSpans); + } else { + VRle::Span *ptr = const_cast(obj1.mSpans.data()); + int otherY = obj2.mBbox.top(); + // 1. forward till both y intersect + while (ptr->y < otherY) ptr++; + int spanToCopy = ptr - obj1.mSpans.data(); + copyArrayToVector(obj1.mSpans.data(), spanToCopy, mSpans); + + // 2. calculate the intersect region + VRleHelper tresult, tmp_obj, tmp_other; + std::array array; + + // setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup tmp object + tmp_obj.size = obj1.mSpans.size() - spanToCopy; + tmp_obj.spans = ptr; + + // setup tmp clip object + tmp_other.size = obj2.mSpans.size(); + tmp_other.spans = const_cast(obj2.mSpans.data()); + + // run till all the spans are processed + while (tmp_obj.size && tmp_other.size) { + rleAddWithRle(&tmp_other, &tmp_obj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, mSpans); + } + tresult.size = 0; + } + // 3. copy the rest + if (tmp_other.size) { + copyArrayToVector(tmp_other.spans, tmp_other.size, mSpans); + } + if (tmp_obj.size) { + copyArrayToVector(tmp_obj.spans, tmp_obj.size, mSpans); + } + } + + // update result bounding box + VRegion reg(obj1.bbox()); + reg += obj2.bbox(); + mBbox = reg.boundingRect(); + mBboxDirty = false; +} + +void VRle::VRleData::opIntersect(const VRle::VRleData &obj1, + const VRle::VRleData &obj2) +{ + VRleHelper result, source, clip; + std::array array; + + // setup the tresult object + result.size = array.size(); + result.alloc = array.size(); + result.spans = array.data(); + + // setup tmp object + source.size = obj1.mSpans.size(); + source.spans = const_cast(obj1.mSpans.data()); + + // setup tmp clip object + clip.size = obj2.mSpans.size(); + clip.spans = const_cast(obj2.mSpans.data()); + + // run till all the spans are processed + while (source.size) { + rleIntersectWithRle(&clip, 0, 0, &source, &result); + if (result.size) { + copyArrayToVector(result.spans, result.size, mSpans); + } + result.size = 0; + } + updateBbox(); +} + +#define VMIN(a, b) ((a) < (b) ? (a) : (b)) +#define VMAX(a, b) ((a) > (b) ? (a) : (b)) + /* * This function will clip a rle list with another rle object * tmp_clip : The rle list that will be use to clip the rle @@ -214,8 +436,8 @@ int bufferToRle(uchar *buffer, int size, int offsetX, int y, VRle::Span *out) return count; } -static void rleAddWithRle1(VRleHelper *tmp_clip, VRleHelper *tmp_obj, - VRleHelper *result) +static void rleAddWithRle(VRleHelper *tmp_clip, VRleHelper *tmp_obj, + VRleHelper *result) { std::array rleHolder; VRle::Span * out = result->spans; @@ -275,534 +497,13 @@ static void rleAddWithRle1(VRleHelper *tmp_clip, VRleHelper *tmp_obj, result->size = result->alloc - available; } -class VRleImpl { -public: - inline VRleImpl() : m_bbox(), m_spans(), mOffset(), mBboxDirty(true) {} - VRleImpl &operator=(const VRleImpl &); - void addSpan(const VRle::Span *span, int count); - void updateBbox(); - bool operator==(const VRleImpl &) const; - void intersected(const VRect &r, VRleImpl &result); - void intersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) const; - void intersected(const VRleImpl &clip, VRleImpl &result); - friend VDebug &operator<<(VDebug &os, const VRleImpl &object); - void invert(); - void alphaMul(int alpha); - void translate(const VPoint &pt); - void opAdd(const VRleImpl &other, VRleImpl &res); - VRect bbox(); - void reset(); - -public: - VRect m_bbox; - std::vector m_spans; // array of Spanlines. - VPoint mOffset; - bool mBboxDirty; -}; - -inline static void copyArrayToVector(const VRle::Span *span, int count, - std::vector &v) -{ - // make sure enough memory available - if (v.capacity() < v.size() + count) - v.reserve(v.size() + count); - std::copy(span, span + count, back_inserter(v)); -} - -VDebug &operator<<(VDebug &os, const VRleImpl &o) -{ - os << "[bbox=" << o.m_bbox << "]" - << "[offset=" << o.mOffset << "]" - << "[span count =" << o.m_spans.size() << "]\n"; - os << "[rle spans = {x y len coverage}"; - for (auto sp : o.m_spans) - os << "{" << sp.x << " " << sp.y << " " << sp.len << " " << sp.coverage - << "}"; - os << "]"; - return os; -} - -VRect VRleImpl::bbox() -{ - updateBbox(); - return m_bbox; -} - -void VRleImpl::reset() -{ - m_spans.clear(); - m_bbox = VRect(); - mOffset = VPoint(); - mBboxDirty = false; -} - -void VRleImpl::translate(const VPoint &pt) -{ - // take care of last offset if applied - mOffset = pt - mOffset; - int x = mOffset.x(); - int y = mOffset.y(); - for (auto &i : m_spans) { - i.x = i.x + x; - i.y = i.y + y; - } - updateBbox(); - m_bbox.translate(mOffset.x(), mOffset.y()); -} - -void VRleImpl::invert() -{ - for (auto &i : m_spans) { - i.coverage = 255 - i.coverage; - } -} - -void VRleImpl::alphaMul(int alpha) -{ - alpha &= 0xff; - - for (auto &i : m_spans) { - i.coverage = divBy255(i.coverage * alpha); - } -} - -void VRleImpl::intersected(const VRect &r, VRleImpl &result) -{ - VRect clip = r; - - VRleHelper tresult, tmp_obj; - std::array array; - - // setup the tresult object - tresult.size = array.size(); - tresult.alloc = array.size(); - tresult.spans = array.data(); - - // setup tmp object - tmp_obj.size = m_spans.size(); - tmp_obj.spans = m_spans.data(); - - // run till all the spans are processed - while (tmp_obj.size) { - rleIntersectWithRect(clip, &tmp_obj, &tresult); - if (tresult.size) { - copyArrayToVector(tresult.spans, tresult.size, result.m_spans); - } - tresult.size = 0; - } - result.updateBbox(); -} - -void VRleImpl::intersect(const VRect &r, VRle::VRleSpanCb cb, - void *userData) const -{ - VRect clip = r; - - VRleHelper tresult, tmp_obj; - std::array array; - - // setup the tresult object - tresult.size = array.size(); - tresult.alloc = array.size(); - tresult.spans = array.data(); - - // setup tmp object - tmp_obj.size = m_spans.size(); - tmp_obj.spans = const_cast(m_spans.data()); - - // run till all the spans are processed - while (tmp_obj.size) { - rleIntersectWithRect(clip, &tmp_obj, &tresult); - if (tresult.size) { - cb(tresult.size, tresult.spans, userData); - } - tresult.size = 0; - } -} - -void VRleImpl::intersected(const VRleImpl &clip, VRleImpl &result) -{ - VRleHelper tresult, tmp_obj, tmp_clip; - std::array array; - - // setup the tresult object - tresult.size = array.size(); - tresult.alloc = array.size(); - tresult.spans = array.data(); - - // setup tmp object - tmp_obj.size = m_spans.size(); - tmp_obj.spans = m_spans.data(); - - // setup tmp clip object - tmp_clip.size = clip.m_spans.size(); - tmp_clip.spans = const_cast(clip.m_spans.data()); - - // run till all the spans are processed - while (tmp_obj.size) { - rleIntersectWithRle(&tmp_clip, 0, 0, &tmp_obj, &tresult); - if (tresult.size) { - copyArrayToVector(tresult.spans, tresult.size, result.m_spans); - } - tresult.size = 0; - } - result.updateBbox(); -} - -void VRleImpl::opAdd(const VRleImpl &other, VRleImpl &result) -{ - // reserve some space for the result vector. - result.m_spans.reserve(m_spans.size() + other.m_spans.size()); - // if two rle are disjoint - if (!m_bbox.intersects(other.m_bbox)) { - result.m_spans = m_spans; - copyArrayToVector(other.m_spans.data(), other.m_spans.size(), - result.m_spans); - } else { - VRle::Span *ptr = m_spans.data(); - int otherY = other.m_bbox.top(); - // 1. forward till both y intersect - while (ptr->y < otherY) ptr++; - int spanToCopy = ptr - m_spans.data(); - copyArrayToVector(m_spans.data(), spanToCopy, result.m_spans); - - // 2. calculate the intersect region - VRleHelper tresult, tmp_obj, tmp_other; - std::array array; - - // setup the tresult object - tresult.size = array.size(); - tresult.alloc = array.size(); - tresult.spans = array.data(); - - // setup tmp object - tmp_obj.size = m_spans.size() - spanToCopy; - tmp_obj.spans = ptr; - - // setup tmp clip object - tmp_other.size = other.m_spans.size(); - tmp_other.spans = const_cast(other.m_spans.data()); - - // run till all the spans are processed - while (tmp_obj.size && tmp_other.size) { - rleAddWithRle1(&tmp_other, &tmp_obj, &tresult); - if (tresult.size) { - copyArrayToVector(tresult.spans, tresult.size, result.m_spans); - } - tresult.size = 0; - } - // 3. copy the rest - if (tmp_other.size) { - copyArrayToVector(tmp_other.spans, tmp_other.size, result.m_spans); - } - if (tmp_obj.size) { - copyArrayToVector(tmp_obj.spans, tmp_obj.size, result.m_spans); - } - } - - // update result bounding box - VRegion reg(m_bbox); - reg += other.m_bbox; - result.m_bbox = reg.boundingRect(); - result.mBboxDirty = false; -} - -VRleImpl &VRleImpl::operator=(const VRleImpl &other) -{ - m_spans = other.m_spans; - m_bbox = other.m_bbox; - mOffset = other.mOffset; - return *this; -} - -bool VRleImpl::operator==(const VRleImpl &other) const -{ - if (m_spans.size() != other.m_spans.size()) return false; - const VRle::Span *spans = m_spans.data(); - const VRle::Span *o_spans = other.m_spans.data(); - int sz = m_spans.size(); - - for (int i = 0; i < sz; i++) { - if (spans[i].x != o_spans[i].x || spans[i].y != o_spans[i].y || - spans[i].len != o_spans[i].len || - spans[i].coverage != o_spans[i].coverage) - return false; - } - return true; -} - -void VRleImpl::updateBbox() -{ - if (!mBboxDirty) return; - - mBboxDirty = false; - - int i, l = 0, t = 0, r = 0, b = 0, sz; - l = std::numeric_limits::max(); - const VRle::Span *span = m_spans.data(); - - m_bbox = VRect(); - sz = m_spans.size(); - if (sz) { - t = span[0].y; - b = span[sz - 1].y; - for (i = 0; i < sz; i++) { - if (span[i].x < l) l = span[i].x; - if (span[i].x + span[i].len > r) r = span[i].x + span[i].len; - } - m_bbox = VRect(l, t, r - l, b - t + 1); - } -} - -void VRleImpl::addSpan(const VRle::Span *span, int count) -{ - copyArrayToVector(span, count, m_spans); - mBboxDirty = true; -} - -struct VRleData { - VRleData() : ref(-1), impl() {} - RefCount ref; - VRleImpl impl; -}; - -static const struct VRleData shared_empty; - -inline void VRle::cleanUp(VRleData *d) -{ - delete d; -} - -void VRle::detach() -{ - if (d->ref.isShared()) *this = copy(); -} - -VRle VRle::copy() const -{ - VRle other; - - other.d = new VRleData; - other.d->impl = d->impl; - other.d->ref.setOwned(); - return other; -} - -VRle::~VRle() -{ - if (!d->ref.deref()) cleanUp(d); -} - -VRle::VRle() : d(const_cast(&shared_empty)) {} - -VRle::VRle(const VRle &other) -{ - d = other.d; - d->ref.ref(); -} - -VRle::VRle(VRle &&other) : d(other.d) -{ - other.d = const_cast(&shared_empty); -} - -VRle &VRle::operator=(const VRle &other) -{ - other.d->ref.ref(); - if (!d->ref.deref()) cleanUp(d); - - d = other.d; - return *this; -} - -VRle &VRle::operator=(VRle &&other) -{ - if (!d->ref.deref()) cleanUp(d); - d = other.d; - other.d = const_cast(&shared_empty); - return *this; -} - -bool VRle::isEmpty() const -{ - return (d == &shared_empty || d->impl.m_spans.empty()); -} - -void VRle::addSpan(const VRle::Span *span, int count) -{ - detach(); - d->impl.addSpan(span, count); -} - -VRect VRle::boundingRect() const -{ - if (isEmpty()) return VRect(); - return d->impl.bbox(); -} - -bool VRle::operator==(const VRle &other) const -{ - if (isEmpty()) return other.isEmpty(); - if (other.isEmpty()) return isEmpty(); - - if (d == other.d) - return true; - else - return d->impl == other.d->impl; -} - -void VRle::translate(const VPoint &p) -{ - if (isEmpty()) return; - - if (d->impl.mOffset == p) return; - - detach(); - d->impl.translate(p); -} - -VRle VRle::intersected(const VRect &r) const -{ - if (isEmpty() || r.isEmpty()) return VRle(); - - // check if the bounding rect is contain inside r - if (r.contains(boundingRect(), true)) return *this; - - VRle result; - result.detach(); - d->impl.intersected(r, result.d->impl); - return result; -} - -VRle VRle::intersected(const VRle &other) const -{ - if (isEmpty() || other.isEmpty()) return VRle(); - // check if the bounding rect are not intersecting - VRle result; - result.detach(); - d->impl.intersected(other.d->impl, result.d->impl); - return result; -} - -VRle VRle::operator~() const -{ - if (isEmpty()) return VRle(); - - VRle result = *this; - result.detach(); - result.d->impl.invert(); - return result; -} - -VRle VRle::operator+(const VRle &other) const -{ - if (isEmpty()) return other; - - if (other.isEmpty()) return *this; - - VRle result; - result.detach(); - if (boundingRect().top() < other.boundingRect().top()) - d->impl.opAdd(other.d->impl, result.d->impl); - else - other.d->impl.opAdd(d->impl, result.d->impl); - return result; -} - -VRle VRle::operator-(const VRle &other) const -{ - if (isEmpty()) return ~other; - - if (other.isEmpty()) return *this; - - VRle temp = ~other; - return *this + temp; -} - -VRle VRle::operator&(const VRle &o) const -{ - if (isEmpty() || o.isEmpty()) return VRle(); - - if (!boundingRect().intersects(o.boundingRect())) return VRle(); - - VRle result; - result.detach(); - d->impl.intersected(o.d->impl, result.d->impl); - return result; -} - -void VRle::intersect(const VRect &r, VRleSpanCb cb, void *userData) const -{ - d->impl.intersect(r, cb, userData); -} - -VRle &VRle::intersect(const VRect &r) -{ - if (isEmpty() || r.isEmpty()) return *this = VRle(); - - VRle result; - result.detach(); - d->impl.intersected(r, result.d->impl); - return *this = result; -} - -VRle operator*(const VRle &obj, int alpha) -{ - if (obj.isEmpty()) return obj; - - VRle result = obj; - result.detach(); - result.d->impl.alphaMul(alpha); - return result; -} - -int VRle::size() const -{ - if (isEmpty()) return 0; - return d->impl.m_spans.size(); -} - -const VRle::Span *VRle::data() const -{ - if (isEmpty()) return nullptr; - return d->impl.m_spans.data(); -} - -void VRle::reset() -{ - detach(); - d->impl.reset(); -} - VRle VRle::toRle(const VRect &rect) { if (rect.isEmpty()) return VRle(); VRle result; - result.detach(); - int x = rect.left(); - int y = rect.top(); - int width = rect.width(); - int height = rect.height(); - result.d->impl.m_spans.reserve(height); - VRle::Span span; - for (int i = 0; i < height; i++) { - span.x = x; - span.y = y + i; - span.len = width; - span.coverage = 255; - result.d->impl.m_spans.push_back(span); - } + result.d.write().addRect(rect); return result; } -VDebug &operator<<(VDebug &os, const VRle &o) -{ - os << "[RLE: [dptr = " - << "o.d" - << "]" - << "[ref = " << o.d->ref.count() << "]" << o.d->impl << "]"; - return os; -} - V_END_NAMESPACE diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 5e2bc1ba23..b6a6b97601 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -1,12 +1,14 @@ #ifndef VRLE_H #define VRLE_H -#include -#include -#include + +#include +#include "vcowptr.h" +#include "vglobal.h" +#include "vpoint.h" +#include "vrect.h" V_BEGIN_NAMESPACE -struct VRleData; class VRle { public: struct Span { @@ -17,49 +19,122 @@ public: }; typedef void (*VRleSpanCb)(int count, const VRle::Span *spans, void *userData); - ~VRle(); - VRle(); - VRle(const VRle &other); - VRle(VRle &&other); - VRle &operator=(const VRle &); - VRle &operator=(VRle &&other); bool isEmpty() const; VRect boundingRect() const; void addSpan(const VRle::Span *span, int count); - bool operator==(const VRle &other) const; - void translate(const VPoint &p); - void translate(int x, int y); - VRle intersected(const VRect &r) const; - VRle intersected(const VRle &other) const; - void intersect(const VRect &r, VRleSpanCb cb, void *userData) const; - VRle &intersect(const VRect &r); - int size() const; - const VRle::Span * data() const; - void reset(); - VRle operator~() const; - VRle operator+(const VRle &o) const; - VRle operator-(const VRle &o) const; - VRle operator&(const VRle &o) const; - static VRle toRle(const VRect &rect); - friend VRle operator*(const VRle &, int alpha); - inline friend VRle operator*(int alpha, const VRle &); - friend VDebug & operator<<(VDebug &os, const VRle &object); + + void reset(); + void translate(const VPoint &p); + void invert(); + + void operator*=(int alpha); + + void intersect(const VRect &r, VRleSpanCb cb, void *userData) const; + + VRle operator&(const VRle &o) const; + VRle operator-(const VRle &o) const; + VRle operator+(const VRle &o) const; + + static VRle toRle(const VRect &rect); private: - VRle copy() const; - void detach(); - void cleanUp(VRleData *x); - VRleData *d; + struct VRleData { + bool isEmpty() const { return mSpans.empty(); } + void addSpan(const VRle::Span *span, int count); + void updateBbox() const; + VRect bbox() const; + void reset(); + void translate(const VPoint &p); + void operator*=(int alpha); + void invert(); + void opIntersect(const VRect &, VRle::VRleSpanCb, void *) const; + void opAdd(const VRle::VRleData &, const VRle::VRleData &); + void opIntersect(const VRle::VRleData &, const VRle::VRleData &); + void addRect(const VRect &rect); + std::vector mSpans; + VPoint mOffset; + mutable VRect mBbox; + mutable bool mBboxDirty = true; + }; + + vcow_ptr d; }; -inline void VRle::translate(int x, int y) +inline bool VRle::isEmpty() const { - translate(VPoint(x, y)); + return d->isEmpty(); } -inline VRle operator*(int alpha, const VRle &rle) +inline void VRle::addSpan(const VRle::Span *span, int count) { - return (rle * alpha); + d.write().addSpan(span, count); +} + +inline VRect VRle::boundingRect() const +{ + return d->bbox(); +} + +inline void VRle::invert() +{ + d.write().invert(); +} + +inline void VRle::operator*=(int alpha) +{ + d.write() *= alpha; +} + +inline VRle VRle::operator&(const VRle &o) const +{ + if (isEmpty() || o.isEmpty()) return VRle(); + + VRle result; + result.d.write().opIntersect(d.read(), o.d.read()); + + return result; +} + +inline VRle VRle::operator+(const VRle &o) const +{ + if (isEmpty()) return o; + if (o.isEmpty()) return *this; + + VRle result; + if (d->bbox().top() < o.d->bbox().top()) + result.d.write().opAdd(d.read(), o.d.read()); + else + result.d.write().opAdd(o.d.read(), d.read()); + + return result; +} + +inline VRle VRle::operator-(const VRle &o) const +{ + if (o.isEmpty()) return *this; + + VRle result = o; + result.invert(); + + if (isEmpty()) + return result; + else + return *this + result; +} + +inline void VRle::reset() +{ + d.write().reset(); +} + +inline void VRle::translate(const VPoint &p) +{ + d.write().translate(p); +} + +inline void VRle::intersect(const VRect &r, VRleSpanCb cb, void *userData) const +{ + d->opIntersect(r, cb, userData); } V_END_NAMESPACE From 13966ac8c425684dbd466d22d9061a882b506af8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 6 Aug 2018 15:56:10 +0900 Subject: [PATCH 127/672] lottie/vector: fixed dasher issue. Change-Id: If602ac7441469c5ed8bfe0500154a585087f433f --- src/vector/vdasher.cpp | 32 ++++++++++++++++++++++++++------ src/vector/vdasher.h | 1 + 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 7fa920d7aa..cd7df4382a 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -114,7 +114,10 @@ void VDasher::lineTo(const VPointF &p) if (length < mCurrentDashLength) { mCurrentDashLength -= length; if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(mCurPt); + if (!mNewSegment) { + mDashedPath.moveTo(mCurPt); + mNewSegment = true; + } mDashedPath.lineTo(p); } } else { @@ -122,7 +125,10 @@ void VDasher::lineTo(const VPointF &p) length -= mCurrentDashLength; line.splitAtLength(mCurrentDashLength, left, right); if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(left.p1()); + if (!mNewSegment) { + mDashedPath.moveTo(left.p1()); + mNewSegment = true; + } mDashedPath.lineTo(left.p2()); mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; } else { @@ -130,6 +136,8 @@ void VDasher::lineTo(const VPointF &p) mCurrentDashLength = mDashArray[mCurrentDashIndex].length; } mIsCurrentOperationGap = !mIsCurrentOperationGap; + if (mIsCurrentOperationGap) + mNewSegment = false; line = right; mCurPt = line.p1(); } @@ -144,6 +152,7 @@ void VDasher::lineTo(const VPointF &p) if (!mIsCurrentOperationGap) { mIsCurrentOperationGap = true; mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + mNewSegment = false; } else { mIsCurrentOperationGap = false; mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; @@ -163,7 +172,10 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) if (bezLen < mCurrentDashLength) { mCurrentDashLength -= bezLen; if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(mCurPt); + if (!mNewSegment) { + mDashedPath.moveTo(mCurPt); + mNewSegment = true; + } mDashedPath.cubicTo(cp1, cp2, e); } } else { @@ -171,22 +183,29 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) bezLen -= mCurrentDashLength; b.splitAtLength(mCurrentDashLength, &left, &right); if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(left.pt1()); + if (!mNewSegment) { + mDashedPath.moveTo(left.pt1()); + mNewSegment = true; + } mDashedPath.cubicTo(left.pt2(), left.pt3(), left.pt4()); - ; mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; } else { mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; mCurrentDashLength = mDashArray[mCurrentDashIndex].length; } mIsCurrentOperationGap = !mIsCurrentOperationGap; + if (mIsCurrentOperationGap) + mNewSegment = false; b = right; mCurPt = b.pt1(); } // remainder mCurrentDashLength -= bezLen; if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(b.pt1()); + if (!mNewSegment) { + mDashedPath.moveTo(b.pt1()); + mNewSegment = true; + } mDashedPath.cubicTo(b.pt2(), b.pt3(), b.pt4()); } if (mCurrentDashLength < 1.0) { @@ -194,6 +213,7 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) if (!mIsCurrentOperationGap) { mIsCurrentOperationGap = true; mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + mNewSegment = false; } else { mIsCurrentOperationGap = false; mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 833e8c9e60..c50bfb535c 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -29,6 +29,7 @@ private: bool mIsCurrentOperationGap; float mDashOffset; VPath mDashedPath; + bool mNewSegment=false; }; V_END_NAMESPACE From 0a7ca8137cacb9b7f4d467a3a6844559b629eeb9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 6 Aug 2018 17:09:23 +0900 Subject: [PATCH 128/672] lottie/render : fixed dash regression Change-Id: I7a79295348ba23d8328718014a49760c2e11e731 --- src/lottie/lottieitem.cpp | 15 ++++++++++----- src/vector/vdrawable.cpp | 29 +++++++++++++++++------------ src/vector/vdrawable.h | 20 ++++++++++---------- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index f3283f6f3c..9785b4a80a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -910,10 +910,12 @@ void LOTStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VBrush brush(color); drawable->setBrush(brush); - + float scale = getScale(mParentMatrix); drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, - mWidth * getScale(mParentMatrix)); + mWidth * scale); if (mDashArraySize) { + for (int i = 0 ; i < mDashArraySize ; i++) + mDashArray[i] *= scale; drawable->setDashInfo(mDashArray, mDashArraySize); } } @@ -940,10 +942,13 @@ void LOTGStrokeItem::updateContent(int frameNo) void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) { + float scale = getScale(mParentMatrix); drawable->setBrush(VBrush(mGradient.get())); drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, - mWidth * getScale(mParentMatrix)); + mWidth * scale); if (mDashArraySize) { + for (int i = 0 ; i < mDashArraySize ; i++) + mDashArray[i] *= scale; drawable->setDashInfo(mDashArray, mDashArraySize); } } @@ -1025,8 +1030,8 @@ void LOTDrawable::sync() break; } - mCNode.mStroke.dashArray = mStroke.dashArray; - mCNode.mStroke.dashArraySize = mStroke.dashArraySize; + mCNode.mStroke.dashArray = mStroke.mDash.data(); + mCNode.mStroke.dashArraySize = mStroke.mDash.size(); } else { mCNode.mStroke.enable = 0; diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 470f0e1bac..c8df216f90 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -6,15 +6,16 @@ void VDrawable::preprocess() { if (mFlag & (DirtyState::Path)) { if (mStroke.enable) { - if (mStroke.dashArraySize) { - VDasher dasher(mStroke.dashArray, mStroke.dashArraySize); + if (mStroke.mDash.size()) { + VDasher dasher(mStroke.mDash.data(), mStroke.mDash.size()); mPath = dasher.dashed(mPath); } mRleTask = VRaster::instance().generateStrokeInfo( - std::move(mPath), std::move(mRle), mStroke.cap, mStroke.join, mStroke.width, - mStroke.meterLimit); + std::move(mPath), std::move(mRle), mStroke.cap, mStroke.join, + mStroke.width, mStroke.meterLimit); } else { - mRleTask = VRaster::instance().generateFillInfo(std::move(mPath), std::move(mRle), mFillRule); + mRleTask = VRaster::instance().generateFillInfo( + std::move(mPath), std::move(mRle), mFillRule); } mFlag &= ~DirtyFlag(DirtyState::Path); } @@ -32,7 +33,8 @@ void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth) { if ((mStroke.cap == cap) && (mStroke.join == join) && - vCompare(mStroke.meterLimit, meterLimit) && vCompare(mStroke.width, strokeWidth)) + vCompare(mStroke.meterLimit, meterLimit) && + vCompare(mStroke.width, strokeWidth)) return; mStroke.enable = true; @@ -43,13 +45,13 @@ void VDrawable::setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, mFlag |= DirtyState::Path; } -void VDrawable::setDashInfo(float *array, int size) +void VDrawable::setDashInfo(float *array, uint size) { bool hasChanged = false; - if (mStroke.dashArraySize == size) { - for (int i = 0; i < size; i++) { - if (!vCompare(mStroke.dashArray[i], array[i])) { + if (mStroke.mDash.size() == size) { + for (uint i = 0; i < size; i++) { + if (!vCompare(mStroke.mDash[i], array[i])) { hasChanged = true; break; } @@ -60,7 +62,10 @@ void VDrawable::setDashInfo(float *array, int size) if (!hasChanged) return; - mStroke.dashArray = array; - mStroke.dashArraySize = size; + mStroke.mDash.clear(); + + for (uint i = 0; i < size; i++) { + mStroke.mDash.push_back(array[i]); + } mFlag |= DirtyState::Path; } diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index a518cd4959..e43ed77504 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -25,11 +25,19 @@ public: void setBrush(const VBrush &brush) { mBrush = brush; } void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); - void setDashInfo(float *array, int size); + void setDashInfo(float *array, uint size); void preprocess(); VRle rle(); public: + struct StrokeInfo { + bool enable{false}; + float width{0.0}; + CapStyle cap{CapStyle::Flat}; + JoinStyle join{JoinStyle::Bevel}; + float meterLimit{10}; + std::vector mDash; + }; DirtyFlag mFlag{DirtyState::All}; VDrawable::Type mType{Type::Fill}; VBrush mBrush; @@ -37,15 +45,7 @@ public: FillRule mFillRule{FillRule::Winding}; std::future mRleTask; VRle mRle; - struct { - bool enable{false}; - float width{0.0}; - CapStyle cap{CapStyle::Flat}; - JoinStyle join{JoinStyle::Bevel}; - float meterLimit{10}; - float * dashArray{nullptr}; - int dashArraySize{0}; - } mStroke; + StrokeInfo mStroke; }; #endif // VDRAWABLE_H From d424320bd488a57add9a53e724bca34926ec608a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 09:51:43 +0900 Subject: [PATCH 129/672] lottie/vector: added isEmpty() api in size class. Change-Id: Ia49254b2d83c047d268ff7510c058c6b25873564 --- src/vector/vpoint.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 3c94ab0c30..fea5603ab7 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -142,6 +142,7 @@ class VSize { public: constexpr inline VSize() noexcept : mw(0), mh(0) {} constexpr inline VSize(int w, int h) noexcept : mw(w), mh(h) {} + bool isEmpty() const {return (mw <= 0 || mh <= 0);} constexpr inline int width() const noexcept { return mw; } constexpr inline int height() const noexcept { return mh; } inline void setWidth(int w) { mw = w; } From de6d53632b1954dbc730bdac7707b2af07b2f0fc Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 09:52:20 +0900 Subject: [PATCH 130/672] lottie/player: make sure model or composition available before calling api. Change-Id: Ia1351bbd076d0e3189d033f708bd3ec281c30cd4 --- src/lottie/lottieplayer.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index c55f426bdb..8683b8ef90 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -11,7 +11,7 @@ public: LOTPlayerPrivate(); bool setFilePath(std::string path); void setSize(const VSize &sz); - void size(int &w, int &h) const; + VSize size() const; float playTime() const; bool setPos(float pos); float pos(); @@ -31,31 +31,28 @@ private: void LOTPlayerPrivate::setSize(const VSize &sz) { - if (!mCompItem.get()) { - vWarning << "Set file first!"; + mSize = sz; + if (!mCompItem) { return; } mCompItem->resize(sz); } -void LOTPlayerPrivate::size(int &w, int &h) const +VSize LOTPlayerPrivate::size() const { - if (!mCompItem.get()) { - w = 0; - h = 0; - return; + if (!mCompItem) { + return mSize; + } else { + return mCompItem->size(); } - - VSize size = mCompItem->size(); - w = size.width(); - h = size.height(); } const std::vector &LOTPlayerPrivate::renderList() const { - if (!mCompItem.get()) { - // FIXME: Reference is not good... + if (!mCompItem) { + static std::vector empty; + return empty; } return mCompItem->renderList(); @@ -63,7 +60,7 @@ const std::vector &LOTPlayerPrivate::renderList() const float LOTPlayerPrivate::playTime() const { - if (mModel->isStatic()) return 0; + if (!mModel || mModel->isStatic()) return 0; return float(mModel->frameDuration()) / float(mModel->frameRate()); } @@ -88,6 +85,8 @@ float LOTPlayerPrivate::pos() bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) { + if (!mCompItem) return false; + bool renderInProgress = mRenderInProgress.load(); if (renderInProgress) vCritical << "Already Rendering Scheduled for this Player"; @@ -120,6 +119,8 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); + if (!mSize.isEmpty()) + setSize(mSize); setPos(0); return true; } @@ -235,7 +236,10 @@ void LOTPlayer::setSize(int width, int height) void LOTPlayer::size(int &width, int &height) const { - d->size(width, height); + VSize sz = d->size(); + + width = sz.width(); + height = sz.height(); } float LOTPlayer::playTime() const From 123f76e7ed28430771c2fa8dd083918ff507e682 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 10:10:44 +0900 Subject: [PATCH 131/672] lottie/player: take buffer argument by value. As we have async rendering, we can't rely on the caller to keep the buffer alive till render finish. Change-Id: Ic7f9670a5e5003424c2b695c171a13717e531b21 --- inc/lottieplayer.h | 14 +++++++------- src/lottie/lottieplayer.cpp | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 795a3471fd..1fcdb77a44 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -30,11 +30,11 @@ class LOTPlayerPrivate; class LOTNode; struct LOT_EXPORT LOTBuffer { - uint32_t *buffer; - int width; - int height; - int bytesPerLine; - bool clear; + uint32_t *buffer = nullptr; + int width = 0; + int height = 0; + int bytesPerLine = 0; + bool clear = true; }; class LOT_EXPORT LOTPlayer { @@ -54,8 +54,8 @@ public: // TODO: Consider correct position... void setSize(int width, int height); void size(int &width, int &height) const; - std::future render(float pos, LOTBuffer &buffer); - bool renderSync(float pos, LOTBuffer &buffer); + std::future render(float pos, LOTBuffer buffer); + bool renderSync(float pos, LOTBuffer buffer); public: LOTPlayerPrivate *d; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 8683b8ef90..382bf2cec1 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -200,12 +200,12 @@ public: } std::future render(LOTPlayerPrivate *impl, float pos, - LOTBuffer &buffer) + LOTBuffer &&buffer) { RenderTask *task = new RenderTask(); task->playerImpl = impl; task->pos = pos; - task->buffer = buffer; + task->buffer = std::move(buffer); return async(task); } }; @@ -262,12 +262,12 @@ const std::vector &LOTPlayer::renderList() const return d->renderList(); } -std::future LOTPlayer::render(float pos, LOTBuffer &buffer) +std::future LOTPlayer::render(float pos, LOTBuffer buffer) { - return render_scheduler.render(d, pos, buffer); + return render_scheduler.render(d, pos, std::move(buffer)); } -bool LOTPlayer::renderSync(float pos, LOTBuffer &buffer) +bool LOTPlayer::renderSync(float pos, LOTBuffer buffer) { return d->render(pos, buffer); } From b4bdebb2d08a079c4e54171b37e294a874bb51b9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 10:25:20 +0900 Subject: [PATCH 132/672] lottie: added new resource for testing. Change-Id: I0050594833dfabf8f3d724d1da1636e2a18e735f --- example/resource/ModernPictogramsForLottie_LoudMute.json | 1 + example/resource/StickAndBall.json | 1 + example/resource/_alarm.json | 1 + example/resource/anubis.json | 1 + example/resource/balloons_with_string.json | 1 + example/resource/bell.json | 1 + example/resource/bounching_ball.json | 1 + example/resource/done.json | 1 + example/resource/emoji_shock.json | 1 + example/resource/gears.json | 1 + example/resource/gears_or_settings.json | 1 + example/resource/heart.json | 1 + example/resource/hourglass.json | 1 + example/resource/jolly_walker.json | 1 + example/resource/like.json | 1 + example/resource/loader.json | 1 + example/resource/loader_animation.json | 1 + example/resource/loading_animation.json | 1 + example/resource/mnemonics.json | 1 + example/resource/movie_loading.json | 1 + example/resource/telegram.json | 1 + example/resource/worm.json | 1 + 22 files changed, 22 insertions(+) create mode 100644 example/resource/ModernPictogramsForLottie_LoudMute.json create mode 100644 example/resource/StickAndBall.json create mode 100644 example/resource/_alarm.json create mode 100644 example/resource/anubis.json create mode 100644 example/resource/balloons_with_string.json create mode 100644 example/resource/bell.json create mode 100644 example/resource/bounching_ball.json create mode 100644 example/resource/done.json create mode 100644 example/resource/emoji_shock.json create mode 100644 example/resource/gears.json create mode 100644 example/resource/gears_or_settings.json create mode 100644 example/resource/heart.json create mode 100644 example/resource/hourglass.json create mode 100644 example/resource/jolly_walker.json create mode 100644 example/resource/like.json create mode 100644 example/resource/loader.json create mode 100644 example/resource/loader_animation.json create mode 100644 example/resource/loading_animation.json create mode 100644 example/resource/mnemonics.json create mode 100644 example/resource/movie_loading.json create mode 100644 example/resource/telegram.json create mode 100644 example/resource/worm.json diff --git a/example/resource/ModernPictogramsForLottie_LoudMute.json b/example/resource/ModernPictogramsForLottie_LoudMute.json new file mode 100644 index 0000000000..ac8e09cea4 --- /dev/null +++ b/example/resource/ModernPictogramsForLottie_LoudMute.json @@ -0,0 +1 @@ +{"v":"4.10.1","fr":60,"ip":0,"op":88,"w":800,"h":800,"nm":"LoudMute_Preview","ddd":0,"assets":[{"id":"comp_43","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Waves 4","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.25,"y":0},"n":"0p833_0p833_0p25_0","t":1,"s":[76.303,74.511,0],"e":[56.303,74.511,0],"to":[-3.33333325386047,0,0],"ti":[3.33333325386047,0,0]},{"t":14}],"ix":2},"a":{"a":0,"k":[76.303,74.511,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.25,0.25,0.25],"y":[0,0,0]},"n":["0p833_0p833_0p25_0","0p833_0p833_0p25_0","0p833_1_0p25_0"],"t":1,"s":[100,100,100],"e":[10,10,100]},{"t":14}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,11.05],[8.061,8.06],[0,0],[0,-13.78],[10.531,-10.531]],"o":[[8.061,-7.931],[0,-10.92],[0,0],[10.14,10.14],[0,12.87],[0,0]],"v":[[23.401,29.836],[35.492,-0.065],[23.401,-30.096],[30.292,-36.986],[46.022,0.585],[30.681,36.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.303,74.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":-126,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Waves 3","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.25,"y":0},"n":"0p833_0p833_0p25_0","t":1,"s":[76.303,74.511,0],"e":[56.303,74.511,0],"to":[-3.33333325386047,0,0],"ti":[3.33333325386047,0,0]},{"t":14}],"ix":2},"a":{"a":0,"k":[76.303,74.511,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.25,0.25,0.25],"y":[0,0,0]},"n":["0p833_0p833_0p25_0","0p833_0p833_0p25_0","0p833_1_0p25_0"],"t":1,"s":[100,100,100],"e":[10,10,100]},{"t":14}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,6.239],[4.42,4.551],[0,0],[0,-8.71],[7.151,-7.021]],"o":[[4.681,-4.68],[0,-6.11],[0,0],[6.37,6.501],[0,7.93],[0,0]],"v":[[8.84,16.835],[15.991,-0.585],[9.361,-17.096],[15.731,-23.466],[25.872,0.195],[15.601,23.466]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.303,74.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":12,"st":-126,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"StrikeOut","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[34.642,37.517,0],"ix":2},"a":{"a":0,"k":[-26.733,-37.483,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":5,"s":[0,0,100],"e":[100,100,100]},{"t":7}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-26.75,-37.5],[40.5,29.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.328],"y":[0]},"n":["0p19_1_0p328_0"],"t":7,"s":[0],"e":[0]},{"t":30}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.328],"y":[-0.008]},"n":["0p19_1_0p328_-0p008"],"t":7,"s":[0.05],"e":[100]},{"t":30}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":32,"st":-13,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"StrikeOutMatte","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.533,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":7,"s":[{"i":[[0,0],[0,0],[-15.409,-15.602],[2.12,-1.823],[2.829,2.891],[0,0],[0,0],[0,0],[-1,0.25],[0,0]],"o":[[0,0],[0,0],[3.254,3.295],[-2.194,1.886],[-7.913,-8.089],[0,0],[0,0],[0,0],[1,-0.25],[0,0]],"v":[[12.25,-60.25],[-102.807,-117.884],[-28.583,-43.548],[-28.734,-33.862],[-37.96,-34.576],[-112.917,-109.231],[-52.75,-30.75],[-52.25,54.75],[43.5,62.75],[45.75,-58.75]],"c":true}],"e":[{"i":[[0,0],[0,0],[-15.409,-15.602],[2.12,-1.823],[2.829,2.891],[0,0],[0,0],[0,0],[-1,0.25],[0,0]],"o":[[0,0],[0,0],[3.254,3.295],[-2.194,1.886],[-7.913,-8.089],[0,0],[0,0],[0,0],[1,-0.25],[0,0]],"v":[[12.25,-60.25],[-34.407,-49.484],[39.817,24.852],[39.666,34.538],[30.44,33.824],[-44.517,-40.831],[-52.75,-30.75],[-52.25,54.75],[43.5,62.75],[45.75,-58.75]],"c":true}]},{"t":30}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":52,"st":-4,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Sound","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.19,"y":1},"o":{"x":0.25,"y":0},"n":"0p19_1_0p25_0","t":7,"s":[76.303,74.511,0],"e":[89.928,74.511,0],"to":[2.27083325386047,0,0],"ti":[-2.27083325386047,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[76.303,74.511,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.82,39.196],[-22.491,14.885],[-46.022,14.885],[-46.022,-14.885],[-22.491,-14.885],[1.82,-39.196]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.303,74.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":32,"st":-13,"bm":0}]},{"id":"comp_44","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Waves 2","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.19,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p19_1_0p167_0p167","t":15,"s":[56.303,74.511,0],"e":[76.303,74.511,0],"to":[3.33333325386047,0,0],"ti":[-3.33333325386047,0,0]},{"t":47}],"ix":2},"a":{"a":0,"k":[76.303,74.511,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.19,0.19,0.19],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,15]},"n":["0p19_1_0p167_0p167","0p19_1_0p167_0p167","0p19_1_0p167_15"],"t":15,"s":[10,10,100],"e":[100,100,100]},{"t":47}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,11.05],[8.061,8.06],[0,0],[0,-13.78],[10.531,-10.531]],"o":[[8.061,-7.931],[0,-10.92],[0,0],[10.14,10.14],[0,12.87],[0,0]],"v":[[23.401,29.836],[35.492,-0.065],[23.401,-30.096],[30.292,-36.986],[46.022,0.585],[30.681,36.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.303,74.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":56,"st":-98,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Waves","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.19,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p19_1_0p167_0p167","t":17,"s":[56.303,74.511,0],"e":[76.303,74.511,0],"to":[3.33333325386047,0,0],"ti":[-3.33333325386047,0,0]},{"t":54}],"ix":2},"a":{"a":0,"k":[76.303,74.511,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.19,0.19,0.19],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,15]},"n":["0p19_1_0p167_0p167","0p19_1_0p167_0p167","0p19_1_0p167_15"],"t":17,"s":[10,10,100],"e":[100,100,100]},{"t":54}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,6.239],[4.42,4.551],[0,0],[0,-8.71],[7.151,-7.021]],"o":[[4.681,-4.68],[0,-6.11],[0,0],[6.37,6.501],[0,7.93],[0,0]],"v":[[8.84,16.835],[15.991,-0.585],[9.361,-17.096],[15.731,-23.466],[25.872,0.195],[15.601,23.466]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.303,74.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17,"op":56,"st":-96,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"StrikeOut","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[34.642,37.517,0],"ix":2},"a":{"a":0,"k":[-26.733,-37.483,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":22,"s":[100,100,100],"e":[0,0,100]},{"t":29}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-26.75,-37.5],[40.5,29.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.108],"y":[1]},"o":{"x":[0.256],"y":[0]},"n":["0p108_1_0p256_0"],"t":1,"s":[0],"e":[0]},{"t":22}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.108],"y":[0.981]},"o":{"x":[0.256],"y":[0]},"n":["0p108_0p981_0p256_0"],"t":1,"s":[100],"e":[0.05]},{"t":22}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":38,"st":-98,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"StrikeOutMatte","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.418,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":1,"s":[{"i":[[0,0],[0,0],[-15.409,-15.602],[2.12,-1.823],[2.829,2.891],[0,0],[0,0],[0,0],[-1,0.25],[0,0]],"o":[[0,0],[0,0],[3.254,3.295],[-2.194,1.886],[-7.913,-8.089],[0,0],[0,0],[0,0],[1,-0.25],[0,0]],"v":[[12.25,-60.25],[-34.407,-49.484],[39.817,24.852],[39.666,34.538],[30.44,33.824],[-44.517,-40.831],[-52.75,-30.75],[-52.25,54.75],[43.5,62.75],[45.75,-58.75]],"c":true}],"e":[{"i":[[0,0],[0,0],[-15.409,-15.602],[2.12,-1.823],[2.829,2.891],[0,0],[0,0],[0,0],[-1,0.25],[0,0]],"o":[[0,0],[0,0],[3.254,3.295],[-2.194,1.886],[-7.913,-8.089],[0,0],[0,0],[0,0],[1,-0.25],[0,0]],"v":[[12.25,-60.25],[-102.807,-117.884],[-28.583,-43.548],[-28.734,-33.862],[-37.96,-34.576],[-112.917,-109.231],[-52.75,-30.75],[-52.25,54.75],[43.5,62.75],[45.75,-58.75]],"c":true}]},{"t":24}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":56,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Sound","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.25,"y":0},"n":"0p1_1_0p25_0","t":1,"s":[89.928,74.511,0],"e":[76.303,74.511,0],"to":[-2.27083325386047,0,0],"ti":[2.27083325386047,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[76.303,74.511,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.82,39.196],[-22.491,14.885],[-46.022,14.885],[-46.022,-14.885],[-22.491,-14.885],[1.82,-39.196]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.303,74.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":56,"st":-98,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"LoudMute_Mute","refId":"comp_43","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[75,75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":150,"h":150,"ip":56,"op":88,"st":56,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"LoudMute_Loud","refId":"comp_44","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[75,75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":150,"h":150,"ip":0,"op":56,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/StickAndBall.json b/example/resource/StickAndBall.json new file mode 100644 index 0000000000..423b284d6b --- /dev/null +++ b/example/resource/StickAndBall.json @@ -0,0 +1 @@ +{"v":"4.7.0","fr":24,"ip":0,"op":23,"w":1080,"h":1080,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"#ball","ln":"ball","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":539},"y":{"a":1,"k":[{"i":{"x":[0.339],"y":[1]},"o":{"x":[0.893],"y":[0]},"n":["0p339_1_0p893_0"],"t":0,"s":[219],"e":[554]},{"i":{"x":[0.075],"y":[1]},"o":{"x":[0.622],"y":[0]},"n":["0p075_1_0p622_0"],"t":11,"s":[554],"e":[219]},{"t":22}]}},"a":{"a":0,"k":[-130,-257,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":2,"s":[94,94],"e":[85,122]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":5,"s":[85,122],"e":[94,94]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":7,"s":[94,94],"e":[94,92]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":11,"s":[94,92],"e":[94,94]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":15,"s":[94,94],"e":[84,118]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[84,118],"e":[94,94]},{"t":19}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0.9019608,0.4032295,0.6379266,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-129,-257],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":23,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"#stick","ln":"stick","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[90],"e":[75.623]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[75.623],"e":[65.727]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":7,"s":[65.727],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11,"s":[0],"e":[-37.333]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[-37.333],"e":[-41]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[-41],"e":[-66]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[-66],"e":[-82]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[-82],"e":[-90]},{"t":17}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[541.19,619.31,0],"e":[541.44,617.06,0],"to":[0.04166666790843,-0.375,0],"ti":[-0.04166666790843,0.375,0]},{"t":22}]},"a":{"a":0,"k":[251.515,7.576,0]},"s":{"a":0,"k":[33,33,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":13,"s":[{"i":[[-248.361,0],[-247.665,0]],"o":[[308.273,0],[237.183,0]],"v":[[-487.636,3.94],[983.453,7.879]],"c":false}],"e":[{"i":[[-243.183,50.45],[-568.665,-169.629]],"o":[[453.246,-94.029],[331.868,98.994]],"v":[[-487.636,3.94],[983.453,7.879]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[{"i":[[-243.183,50.45],[-568.665,-169.629]],"o":[[453.246,-94.029],[331.868,98.994]],"v":[[-487.636,3.94],[983.453,7.879]],"c":false}],"e":[{"i":[[-247.951,-14.258],[-458.271,96.09]],"o":[[469.414,26.993],[232.133,-48.674]],"v":[[-487.636,3.94],[983.453,-89.091]],"c":false}]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"n":"0p333_1_0p333_0","t":18,"s":[{"i":[[-247.951,-14.258],[-458.271,96.09]],"o":[[469.414,26.993],[232.133,-48.674]],"v":[[-487.636,3.94],[983.453,-89.091]],"c":false}],"e":[{"i":[[-248.361,0],[-247.665,0]],"o":[[308.273,0],[237.183,0]],"v":[[-487.636,3.94],[983.453,7.879]],"c":false}]},{"t":22}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":97},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":23,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/_alarm.json b/example/resource/_alarm.json new file mode 100644 index 0000000000..6834484058 --- /dev/null +++ b/example/resource/_alarm.json @@ -0,0 +1 @@ +{"v":"5.1.13","fr":30,"ip":0,"op":60,"w":300,"h":300,"nm":"alram","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"02","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-36,"ix":10},"p":{"a":0,"k":[114.4,38.435,0],"ix":2},"a":{"a":0,"k":[56,-77,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":11,"s":[100,100,100],"e":[120,120,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[120,120,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":21,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":41,"s":[100,100,100],"e":[120,120,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":46,"s":[120,120,100],"e":[100,100,100]},{"t":51}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"타원 패스 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"선 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.803921568627,0.122952704336,0.235112313663,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"칠 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[55,-78],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"변형"}],"nm":"타원 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"01","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.883],"y":[1.286]},"o":{"x":[0.377],"y":[-0.667]},"n":["0p883_1p286_0p377_-0p667"],"t":0,"s":[0],"e":[-24.645]},{"i":{"x":[0.79],"y":[1.277]},"o":{"x":[0.479],"y":[1.173]},"n":["0p79_1p277_0p479_1p173"],"t":15,"s":[-24.645],"e":[0]},{"i":{"x":[0.558],"y":[0.987]},"o":{"x":[0.382],"y":[-0.496]},"n":["0p558_0p987_0p382_-0p496"],"t":30,"s":[0],"e":[25.003]},{"i":{"x":[0.606],"y":[1.408]},"o":{"x":[0.368],"y":[-0.01]},"n":["0p606_1p408_0p368_-0p01"],"t":45,"s":[25.003],"e":[0]},{"t":60}],"ix":10},"p":{"a":0,"k":[150,68,0],"ix":2},"a":{"a":0,"k":[79.5,1.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16.704,0],[2.581,16.778],[-2.692,0.414],[-0.413,-2.691],[-11.823,0],[-1.848,11.914],[-2.689,-0.401],[0.417,-2.69]],"o":[[-16.725,0],[-0.414,-2.692],[2.687,-0.43],[1.836,11.934],[11.809,0],[0.419,-2.692],[2.691,0.419],[-2.6,16.754]],"v":[[0.001,17.505],[-33.318,-11.453],[-29.195,-17.075],[-23.573,-12.952],[0.001,7.645],[23.57,-12.918],[29.199,-17.035],[33.315,-11.407]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"칠 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.299,148.318],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"변형"}],"nm":"그룹 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.119,0],[0.276,-14.184],[0,-23.047],[0,0],[6.395,-4.16],[0,-4.302],[-8.032,-0.949],[-18.918,0],[-13.078,1.594],[0,16.065],[6.281,5.042],[0.249,9.057],[0.054,0.809],[18.499,9.322]],"o":[[-14.096,0],[-19.936,9.885],[0,0],[0.038,8.569],[-8.422,5.477],[0,16.08],[13.468,1.59],[18.738,0],[7.804,-0.951],[0,-3.69],[-7.863,-6.311],[-0.022,-0.803],[-1.404,-21.085],[-0.24,-14.216]],"v":[[0,-68.536],[-25.872,-42.896],[-58.71,10.594],[-58.709,10.879],[-68.861,31.212],[-79.051,47.267],[-49.681,66.815],[0.801,68.536],[50.519,66.81],[79.051,47.267],[71.452,33.077],[58.687,8.896],[58.573,6.478],[25.873,-42.831]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-8.845,0],[0,-9.001],[0.648,-1.77],[-1.361,-20.457],[-0.019,-0.676],[-9.666,-7.758],[0,-2.278],[38.213,0],[0,10.802],[-3.67,2.386],[0.051,11.472],[0,0.078],[-19.637,6.445],[0,1.993]],"o":[[8.846,0],[0,2],[18.524,6.142],[0.046,0.682],[0.344,12.522],[2.533,2.033],[0,10.802],[-38.213,0],[0,-2.768],[9.499,-6.179],[-0.001,-0.077],[0,-22.126],[-0.643,-1.765],[0,-9.001]],"v":[[0,-58.674],[16.017,-42.376],[14.998,-36.699],[48.734,7.133],[48.831,9.169],[65.28,40.768],[69.191,47.267],[0.801,58.676],[-69.19,47.267],[-63.485,39.478],[-48.849,10.827],[-48.85,10.594],[-15.004,-36.719],[-16.016,-42.376]],"c":true},"ix":2},"nm":"패스 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"패스 병합 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"칠 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.301,68.785],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"변형"}],"nm":"그룹 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/anubis.json b/example/resource/anubis.json new file mode 100644 index 0000000000..232779db51 --- /dev/null +++ b/example/resource/anubis.json @@ -0,0 +1 @@ +{"v":"5.1.8","fr":60,"ip":3,"op":140,"w":500,"h":500,"nm":"ANUB","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"a","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-3.113,"ix":10},"p":{"a":0,"k":[327.214,315.758,0],"ix":2},"a":{"a":0,"k":[-17,77,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-20.2,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-13.001,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-3.399,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2.999,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13.4,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.599,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32.599,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.2,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.999,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.999,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":66.2,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78.2,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87.8,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94.999,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":104.599,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":111.8,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":123.8,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":133.999,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"t":138.99921875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.149019607843,0.133333333333,0.109803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-22,82],"ix":2},"a":{"a":0,"k":[-22,82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-3,"op":289,"st":-20.2,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"b","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[221.537,318.968,0],"ix":2},"a":{"a":0,"k":[-17,77,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-2.4,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":14.401,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21.6,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31.2,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":43.2,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.401,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.2,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76.799,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88.799,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105.6,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.799,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":122.401,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":132,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"t":139.000390625}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.149019607843,0.133333333333,0.109803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-22,82],"ix":2},"a":{"a":0,"k":[-22,82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":288,"st":-2.4,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"c","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-3.113,"ix":10},"p":{"a":0,"k":[361.652,319.398,0],"ix":2},"a":{"a":0,"k":[-17,77,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-14.4,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-7.201,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-0.002,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-3.791,-1.166],[-4.083,-10.915]],"o":[[3.791,1.166],[3.33,8.322]],"v":[[-17,75],[5.704,158.168]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[{"i":[[-3.791,-1.166],[-4.083,-10.915]],"o":[[3.791,1.166],[3.33,8.322]],"v":[[-17,75],[5.704,158.168]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.998,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21.6,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28.799,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":38.399,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45.6,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":57.6,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.2,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.399,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83.998,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":91.2,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":103.2,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.799,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":119.998,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":130,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[-3.791,-1.166],[-4.083,-10.915]],"o":[[3.791,1.166],[3.33,8.322]],"v":[[-17,75],[5.704,158.168]],"c":false}]},{"t":139.000390625}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.149019607843,0.133333333333,0.109803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-22,82],"ix":2},"a":{"a":0,"k":[-22,82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-20,"op":279,"st":-14.4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"d","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[254.302,326.574,0],"ix":2},"a":{"a":0,"k":[-17,77,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-28.8,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-21.601,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-11.999,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-4.8,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2.8,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.8,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24.001,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33.6,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40.8,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.399,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":62.399,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.6,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":79.2,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":86.399,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96.001,"s":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}],"e":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":106.001,"s":[{"i":[[-6.5,-2],[-4.5,-15.5]],"o":[[6.5,2],[3.209,11.054]],"v":[[-17,75],[18,154]],"c":false}],"e":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":113.2,"s":[{"i":[[-4.161,-1.28],[50.642,-32.142]],"o":[[4.161,1.28],[-33.86,21.491]],"v":[[-17,75],[1.858,129.142]],"c":false}],"e":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":121.001,"s":[{"i":[[0,0],[29.75,-14.5]],"o":[[0,0],[-29.75,14.5]],"v":[[-17,75],[-56.25,145.5]],"c":false}],"e":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":130.001,"s":[{"i":[[0,0],[-7.5,-34]],"o":[[0,0],[7.5,34]],"v":[[-17,75],[-61,161]],"c":false}],"e":[{"i":[[0,0],[-3.5,-4.5]],"o":[[0,0],[3.5,4.5]],"v":[[-17,75],[-11.5,164]],"c":false}]},{"t":139.00078125}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.149019607843,0.133333333333,0.109803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-22,82],"ix":2},"a":{"a":0,"k":[-22,82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":266,"st":-28.8,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"b2","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.75],"y":[0]},"n":["0p25_1_0p75_0"],"t":0,"s":[-81],"e":[-97]},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.75],"y":[0]},"n":["0p25_1_0p75_0"],"t":67.199,"s":[-97],"e":[-81]},{"t":136.80078125}],"ix":10},"p":{"a":0,"k":[-13.573,-61.514,0],"ix":2},"a":{"a":0,"k":[-6,48,0],"ix":1},"s":{"a":0,"k":[73.171,73.171,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[82,82],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-6,48],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"b1","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-87,"ix":10},"p":{"a":0,"k":[-27.177,43.546,0],"ix":2},"a":{"a":0,"k":[-6,48,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[82,82],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-6,48],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"b","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":83,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[355.857,302.207,0],"e":[355.857,308.207,0],"to":[0,1,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.801,"s":[355.857,308.207,0],"e":[355.857,302.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33.6,"s":[355.857,302.207,0],"e":[355.857,308.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.4,"s":[355.857,308.207,0],"e":[355.857,302.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.199,"s":[355.857,302.207,0],"e":[355.857,308.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84,"s":[355.857,308.207,0],"e":[355.857,302.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100.801,"s":[355.857,302.207,0],"e":[355.857,308.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":120,"s":[355.857,308.207,0],"e":[355.857,302.207,0],"to":[0,0,0],"ti":[0,1,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":139,"s":[355.857,302.207,0],"e":[355.857,302.207,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":180,"s":[355.857,302.207,0],"e":[355.857,308.207,0],"to":[0,1,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":196.801,"s":[355.857,308.207,0],"e":[355.857,302.207,0],"to":[0,0,0],"ti":[0,1,0]},{"t":216}],"ix":2},"a":{"a":0,"k":[-5.706,-66.449,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.021,11.991],[1.75,-16.75],[3.593,-23.13],[3.492,-8.369],[0,23.5]],"o":[[-6.242,-14.906],[-1.081,10.349],[-2.222,14.305],[-14.312,34.299],[0,-55.082]],"v":[[14.5,-63],[-40.44,-62.693],[-44.148,-3.184],[-56.34,28.612],[12.218,41.438]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"ne","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":67.199,"s":[20],"e":[0]},{"t":134.400390625}],"ix":10},"p":{"a":0,"k":[-12,50,0],"ix":2},"a":{"a":0,"k":[-12,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.59,12.987],[1.75,-16.75],[-1.434,-15.164],[4.955,22.972]],"o":[[-1,-22],[-1.75,16.75],[3.5,37],[-11,-51]],"v":[[3.5,-51.5],[-31.25,-48.25],[-45,45],[12,36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ta","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[7],"e":[75]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":22.801,"s":[75],"e":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":45.6,"s":[7],"e":[75]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":68.4,"s":[75],"e":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":91.199,"s":[7],"e":[75]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":114,"s":[75],"e":[7]},{"t":136.80078125}],"ix":10},"p":{"a":0,"k":[15.301,27.13,0],"ix":2},"a":{"a":0,"k":[21.895,-104.814,0],"ix":1},"s":{"a":0,"k":[136.667,136.667,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.827,-5.636],[1.374,-48.171],[-2.647,2.438]],"o":[[33.061,38.596],[-0.068,2.375],[34.628,-76.569]],"v":[[-18.205,-190.23],[15.659,-106.249],[25.25,-102.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"el","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[-17],"e":[41]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":62.4,"s":[41],"e":[-17]},{"t":129.599609375}],"ix":10},"p":{"a":0,"k":[-90.831,16.442,0],"ix":2},"a":{"a":0,"k":[16.5,-109.52,0],"ix":1},"s":{"a":0,"k":[140.26,140.26,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.618,-7.395],[-2.323,-2.379],[-2.647,2.438]],"o":[[6.75,80.75],[1.66,1.7],[38.998,-68.667]],"v":[[-1.601,-210.907],[11.871,-104.272],[20.531,-99.66]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"hea","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[-15],"e":[8]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":67.199,"s":[8],"e":[-15]},{"t":134.400390625}],"ix":10},"p":{"a":0,"k":[-7.5,-46.5,0],"ix":2},"a":{"a":0,"k":[-110.468,94.987,0],"ix":1},"s":{"a":0,"k":[71.296,71.296,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.727,19.286],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-175.409,43.844],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[59.914,100],"ix":3},"r":{"a":0,"k":-168.452,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.727,19.286],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-122.039,45.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-10.966,2.431],[-1.181,-4.133],[1.601,-0.057],[-0.599,3.554]],"o":[[1.746,-0.387],[1.277,4.469],[-14.816,0.529],[0.406,-2.406]],"v":[[-8.421,-5.275],[2.908,3.703],[-0.161,10.282],[-18.683,3.926]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333333333,0.874509803922,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"eye1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-181.299,40.461],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":38.4,"s":[100,92.381],"e":[100,-0.256]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":55.199,"s":[100,-0.256],"e":[100,-0.256]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":62.4,"s":[100,-0.256],"e":[100,92.381]},{"t":79.19921875}],"ix":3},"r":{"a":0,"k":-128.667,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40.675,16.831],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333333333,0.874509803922,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"eye2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-123.091,45.195],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":38.4,"s":[100,92.381],"e":[100,-0.256]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":55.199,"s":[100,-0.256],"e":[100,-0.256]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":62.4,"s":[100,-0.256],"e":[100,92.381]},{"t":79.19921875}],"ix":3},"r":{"a":0,"k":-19.654,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[10.344,0.175],[-115.817,6.255]],"o":[[0,0],[-7.047,-0.119],[34.894,-1.884]],"v":[[-167.279,58.669],[-254.234,57.818],[-149.783,98.993]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-162,72.234],"ix":2},"a":{"a":0,"k":[-164.104,75.74],"ix":1},"s":{"a":0,"k":[100.434,93.355],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[108,108],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-128,48],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"er","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":7.199,"s":[-17],"e":[41]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":67.199,"s":[41],"e":[-17]},{"t":134.400390625}],"ix":10},"p":{"a":0,"k":[-151.699,7.848,0],"ix":2},"a":{"a":0,"k":[16.5,-109.52,0],"ix":1},"s":{"a":0,"k":[131.332,131.332,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.618,-7.395],[-2.323,-2.379],[-2.647,2.438]],"o":[[6.75,80.75],[1.66,1.7],[26.148,-64.813]],"v":[[-1.601,-210.907],[9.521,-107.006],[20.155,-104.319]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.132484795065,0.111034221275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":141.6,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/balloons_with_string.json b/example/resource/balloons_with_string.json new file mode 100644 index 0000000000..49e712183c --- /dev/null +++ b/example/resource/balloons_with_string.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":60,"ip":0,"op":600,"w":1440,"h":2560,"nm":"Balloon Animation","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"pinkBalloon ","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.566,"y":0.555},"o":{"x":0.18,"y":0.163},"n":"0p566_0p555_0p18_0p163","t":52,"s":[856,3484.5,0],"e":[863.025,2076.672,0],"to":[1.26471793651581,-253.457336425781,0],"ti":[-3.05289053916931,611.818237304688,0]},{"i":{"x":0.841,"y":0.859},"o":{"x":0.385,"y":0.391},"n":"0p841_0p859_0p385_0p391","t":157.5,"s":[863.025,2076.672,0],"e":[875.959,-515.333,0],"to":[4.97676658630371,-997.374938964844,0],"ti":[-2.06172013282776,413.181518554688,0]},{"t":350}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.465349324544,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"greenBalloon 4","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.829},"o":{"x":0.167,"y":0.173},"n":"0p833_0p829_0p167_0p173","t":52,"s":[56,3300.5,0],"e":[315.448,-162.334,0],"to":[43.2412719726562,-577.138977050781,0],"ti":[-43.2412719726562,577.138977050781,0]},{"t":350}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,1,0.528860234279,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"greenBalloon 3","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.16},"n":"0p833_0p851_0p167_0p16","t":148,"s":[1240,2924.5,0],"e":[1275.959,-478.276,0],"to":[5.99310493469238,-567.12939453125,0],"ti":[-5.99310493469238,567.12939453125,0]},{"t":402}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,1,0.528860234279,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"greenBalloon 2","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":0,"s":[198,2837.667,0],"e":[762,-368.5,0],"to":[94,-534.361145019531,0],"ti":[-94,534.361145019531,0]},{"t":271}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,1,0.528860234279,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"blueBalloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.198},"n":"0p833_0p83_0p167_0p198","t":23,"s":[1235.406,3127.833,0],"e":[761.634,-588.86,0],"to":[-78.9620056152344,-619.448791503906,0],"ti":[78.9620056152344,619.448791503906,0]},{"t":344}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.46011020436,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"yellowBalloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.167},"n":"0p833_0p856_0p167_0p167","t":0,"s":[1235.406,3127.833,0],"e":[1211.959,-627.333,0],"to":[-3.90793800354004,-625.861022949219,0],"ti":[3.90793800354004,625.861022949219,0]},{"t":271}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.987591911765,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"purpleBalloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"n":"0p833_0p845_0p167_0p167","t":0,"s":[776,3020.5,0],"e":[539.959,-454.276,0],"to":[-39.3402290344238,-579.12939453125,0],"ti":[39.3402290344238,579.12939453125,0]},{"t":271}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.462959289551,0,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"blueBallloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.134},"n":"0p833_0p863_0p167_0p134","t":106,"s":[512,2724.5,0],"e":[1162,-464.5,0],"to":[108.333335876465,-531.5,0],"ti":[-108.333335876465,531.5,0]},{"t":330}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.721047674441,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"blueBalloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.869},"o":{"x":0.167,"y":0.128},"n":"0p833_0p869_0p167_0p128","t":191,"s":[1232,2996.5,0],"e":[831.959,-273.776,0],"to":[-60.6597709655762,-578.37939453125,0],"ti":[66.6735610961914,545.046020507812,0]},{"t":408}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.497150914809,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"redBallloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.885},"o":{"x":0.167,"y":0.112},"n":"0p833_0p885_0p167_0p112","t":191,"s":[848,3476.5,0],"e":[604.041,-273.776,0],"to":[-60.6597709655762,-578.37939453125,0],"ti":[40.6597709655762,625.046020507812,0]},{"t":408}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.392279561361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"yellowBallloon 3","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.121},"n":"0p833_0p877_0p167_0p121","t":191,"s":[272,3204.5,0],"e":[312.041,-293.667,0],"to":[6.67356204986572,-583.02783203125,0],"ti":[-6.67356204986572,583.02783203125,0]},{"t":408}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.949172794118,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"yellowBallloon 2","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.156},"n":"0p833_0p841_0p167_0p156","t":121,"s":[512,2924.5,0],"e":[539.959,-454.276,0],"to":[4.65977144241333,-563.12939453125,0],"ti":[-4.65977144241333,563.12939453125,0]},{"t":391}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.949172794118,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"yellowBallloon","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.134},"n":"0p833_0p863_0p167_0p134","t":106,"s":[1376,2804.5,0],"e":[312.041,-293.667,0],"to":[-177.326431274414,-516.361145019531,0],"ti":[177.326431274414,516.361145019531,0]},{"t":331}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.949172794118,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"redBalloonNew","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.167},"n":"0p833_0p847_0p167_0p167","t":0,"s":[1016,2740.5,0],"e":[1098,-774.166,0],"to":[13.6666669845581,-585.777709960938,0],"ti":[-13.6666669845581,585.777709960938,0]},{"t":271}],"ix":2},"a":{"a":0,"k":[400.438,352.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.404779561361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.437,338.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"greenBalloonNew","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[198,2984.5,0],"e":[718,-260,0],"to":[86.6666641235352,-540.75,0],"ti":[-86.6666641235352,540.75,0]},{"t":360}],"ix":2},"a":{"a":0,"k":[-100.906,408.167,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[404.62,501.104],[403.62,497.604],[403.62,620.104],[405.62,622.104],[402.076,560.068]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-503,38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.015,103.448],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"String","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":2,"ty":"el","s":{"a":0,"k":[177.031,247.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.025,120.696],[12.355,149.564],[2.966,147.251],[-7.063,148.633],[-4.733,120.696]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,1,0.903125,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-100.906,394.391],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.744,107.385],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":80,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/bell.json b/example/resource/bell.json new file mode 100644 index 0000000000..c70f06bb7a --- /dev/null +++ b/example/resource/bell.json @@ -0,0 +1 @@ +{"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":0,"ty":1,"nm":"White Solid 1","td":1,"ks":{"o":{"k":100},"r":{"k":22},"p":{"k":[288.003,547.449,0]},"a":{"k":[25,25,0]},"s":{"k":[412,168,100]}},"ao":0,"sw":50,"sh":50,"sc":"#ffffff","ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","tt":2,"ks":{"o":{"k":100},"r":{"k":22},"p":{"k":[273.145,580.253,0]},"a":{"k":[-0.776,155.616,0]},"s":{"k":[110.945,113.273,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[59.648,59.648]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","fillEnabled":true,"c":{"k":[0,0,0,1]},"o":{"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[-1,155.5],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":50,"st":0,"bm":0,"sr":1}]}],"layers":[{"ddd":0,"ind":0,"ty":3,"nm":"Null 1","ks":{"o":{"k":0},"r":{"k":[{"i":{"x":[0.833],"y":[1.093]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1p093_0p167_0p167"],"t":0,"s":[0],"e":[-22]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.037]},"n":["0p833_1_0p167_0p037"],"t":6.931,"s":[-22],"e":[22]},{"i":{"x":[0.833],"y":[0.966]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p966_0p167_0"],"t":12.435,"s":[22],"e":[-22]},{"i":{"x":[0.833],"y":[0.857]},"o":{"x":[0.167],"y":[-0.098]},"n":["0p833_0p857_0p167_-0p098"],"t":18,"s":[-22],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.295]},"n":["0p833_1_0p167_0p295"],"t":26,"s":[0],"e":[4]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":29,"s":[4],"e":[0]},{"t":33}]},"p":{"k":[221.5,77,0]},"a":{"k":[0,0,0]},"s":{"k":[344,344,100]}},"ao":0,"ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":1,"nm":"Black Solid 1","parent":0,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[0,30.959,0]},"a":{"k":[221.5,183.5,0]},"s":{"k":[29.07,29.07,100]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"k":{"i":[[3.376,4.804],[0,15.358],[0,0],[40.857,4.809],[0,6.956],[9.556,0],[0,-9.556],[-4.437,-3.072],[-0.007,-0.031],[0,-42.092],[0,0],[8.971,-12.559],[-5.461,0],[0,0]],"o":[[-8.874,-12.628],[0,0],[0,-41.969],[4.427,-3.689],[0,-9.556],[-9.556,0],[0,5.802],[0,0],[-40.638,4.737],[0,0],[0,15.358],[-3.413,4.778],[0,0],[5.461,0]],"v":[[318.087,264.087],[303.411,220.401],[303.411,172.619],[231.019,91.367],[238.565,77.056],[221.5,59.991],[204.435,77.056],[211.944,91.049],[211.971,91.152],[139.589,172.619],[139.589,220.401],[124.913,264.087],[130.374,275.009],[312.626,275.009]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"ef":[{"ty":21,"nm":"Fill","mn":"ADBE Fill","ix":1,"ef":[{"ty":3,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"k":0}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"k":0}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"k":[1,1,1,1]}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"k":0}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"k":0}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"k":0}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"k":1}}]}],"sw":443,"sh":367,"sc":"#000000","ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":0,"nm":"Pre-comp 1","parent":0,"refId":"comp_0","ks":{"o":{"k":100},"r":{"k":-22},"p":{"k":[{"i":{"x":0.833,"y":0.814},"o":{"x":0.167,"y":0.167},"n":"0p833_0p814_0p167_0p167","t":2,"s":[4.737,11.725,0],"e":[19.737,11.725,0],"to":[2.5,0,0],"ti":[2.83333325386047,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.157},"n":"0p833_0p844_0p167_0p157","t":4.572,"s":[19.737,11.725,0],"e":[-12.263,11.725,0],"to":[-2.83333325386047,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.88},"o":{"x":0.167,"y":0.177},"n":"0p833_0p88_0p167_0p177","t":9,"s":[-12.263,11.725,0],"e":[19.737,11.725,0],"to":[0,0,0],"ti":[-2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.886},"o":{"x":0.167,"y":0.22},"n":"0p833_0p886_0p167_0p22","t":14.008,"s":[19.737,11.725,0],"e":[-8.129,11.725,0],"to":[0.7367005944252,0,0],"ti":[4.95352220535278,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.284},"n":"0p833_0p833_0p167_0p284","t":22,"s":[-8.129,11.725,0],"e":[3.737,11.725,0],"to":[-2.79587697982788,0,0],"ti":[0.0821717903018,0,0]},{"t":31}]},"a":{"k":[350,437.5,0]},"s":{"k":[29.07,29.07,100]}},"ao":0,"ef":[{"ty":21,"nm":"Fill","mn":"ADBE Fill","ix":1,"ef":[{"ty":3,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"k":0}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"k":0}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"k":[1,1,1,1]}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"k":0}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"k":0}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"k":0}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"k":1}}]}],"w":700,"h":875,"ip":0,"op":50,"st":0,"bm":0,"sr":1}],"v":"4.5.0","ddd":0,"ip":0,"op":42,"fr":25,"w":443,"h":367} \ No newline at end of file diff --git a/example/resource/bounching_ball.json b/example/resource/bounching_ball.json new file mode 100644 index 0000000000..377929513d --- /dev/null +++ b/example/resource/bounching_ball.json @@ -0,0 +1 @@ +{"v":"4.5.7","fr":30,"ip":0,"op":30,"w":800,"h":600,"ddd":0,"assets":[{"id":"comp_1","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Shape Layer 4","td":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":960},"y":{"a":1,"k":[{"i":{"x":[0.96],"y":[0.317]},"o":{"x":[0.453],"y":[0]},"n":["0p96_0p317_0p453_0"],"t":0,"s":[372.934],"e":[910.934]},{"i":{"x":[0.491],"y":[0.491]},"o":{"x":[0.405],"y":[0.405]},"n":["0p491_0p491_0p405_0p405"],"t":14,"s":[910.934],"e":[910.934]},{"i":{"x":[0.328],"y":[1]},"o":{"x":[0.02],"y":[0.674]},"n":["0p328_1_0p02_0p674"],"t":16,"s":[910.934],"e":[372.934]},{"t":30}]}},"a":{"a":0,"k":[-55.922,214.156,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[43,43,100],"e":[36.8,54.9,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[36.8,54.9,100],"e":[56.6,27.5,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":15,"s":[56.6,27.5,100],"e":[56.6,27.5,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[56.6,27.5,100],"e":[34.58,45.3,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[34.58,45.3,100],"e":[47.692,41.258,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":25,"s":[47.692,41.258,100],"e":[43,43,100]},{"t":30}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[460.156,460.156]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0.2,0.77,0.61,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0.95,0.31,0.56,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-55.922,-15.922],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","parent":2,"tt":1,"ks":{"o":{"a":0,"k":12},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[23.697,-140.59,0],"e":[59.033,-256.954,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[59.033,-256.954,0],"e":[23.697,-140.59,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}]},"a":{"a":0,"k":[7.73,-318.27,0]},"s":{"a":0,"k":[168.239,178.473,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[36.539,36.539]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0.2,0.77,0.61,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[7.73,-318.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":960},"y":{"a":1,"k":[{"i":{"x":[0.96],"y":[0.317]},"o":{"x":[0.453],"y":[0]},"n":["0p96_0p317_0p453_0"],"t":0,"s":[372.934],"e":[910.934]},{"i":{"x":[0.491],"y":[0.491]},"o":{"x":[0.405],"y":[0.405]},"n":["0p491_0p491_0p405_0p405"],"t":14,"s":[910.934],"e":[910.934]},{"i":{"x":[0.328],"y":[1]},"o":{"x":[0.02],"y":[0.674]},"n":["0p328_1_0p02_0p674"],"t":16,"s":[910.934],"e":[372.934]},{"t":30}]}},"a":{"a":0,"k":[-55.922,214.156,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[43,43,100],"e":[36.8,54.9,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[36.8,54.9,100],"e":[56.6,27.5,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":15,"s":[56.6,27.5,100],"e":[56.6,27.5,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[56.6,27.5,100],"e":[34.58,45.3,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[34.58,45.3,100],"e":[47.692,41.258,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":25,"s":[47.692,41.258,100],"e":[43,43,100]},{"t":30}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[460.156,460.156]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0.2,0.77,0.61,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0.95,0.31,0.56,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-55.922,-15.922],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":45},"r":{"a":0,"k":0},"p":{"a":0,"k":[958,908,0]},"a":{"a":0,"k":[-2,400,0]},"s":{"a":1,"k":[{"i":{"x":[0.893,0.893,1],"y":[0.5,-0.195,1]},"o":{"x":[0.44,0.44,0],"y":[0,0,0]},"n":["0p893_0p5_0p44_0","0p893_-0p195_0p44_0","1_1_0_0"],"t":0,"s":[117.1,83.8,100],"e":[39.9,51.5,100]},{"i":{"x":[0.539,0.539,1],"y":[1,1,1]},"o":{"x":[0.175,0.175,0],"y":[0.542,1.294,0]},"n":["0p539_1_0p175_0p542","0p539_1_0p175_1p294","1_1_0_0"],"t":16,"s":[39.9,51.5,100],"e":[117.1,83.8,100]},{"t":30}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[467.797,27.125]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0.2,0.77,0.61,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"a":0,"k":[0.18,0.62,0.5,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-2,400],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.545,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":150,"st":0,"bm":0,"sr":1}]}],"layers":[{"ddd":0,"ind":0,"ty":0,"nm":"bouncing ball.1920x1080","cl":"1920x1080","refId":"comp_1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,300,0]},"a":{"a":0,"k":[960,540,0]},"s":{"a":0,"k":[55.556,55.556,100]}},"ao":0,"w":1920,"h":1080,"ip":0,"op":150,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/done.json b/example/resource/done.json new file mode 100644 index 0000000000..a4b11963e8 --- /dev/null +++ b/example/resource/done.json @@ -0,0 +1 @@ +{"v":"4.11.1","fr":29.9700012207031,"ip":0,"op":76.0000030955435,"w":70,"h":70,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[35,35,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":33,"s":[0,0,100],"e":[120,120,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":46,"s":[120,120,100],"e":[100,100,100]},{"t":52.0000021180034}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-7,1.438],[-2.656,5.781],[7.422,-4.297]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":33,"s":[0],"e":[100]},{"t":52.0000021180034}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":450.000018328876,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[35,35,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":18,"s":[0,0,100],"e":[120,120,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":33,"s":[120,120,100],"e":[80,80,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":41,"s":[80,80,100],"e":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":49,"s":[110,110,100],"e":[100,100,100]},{"t":52.0000021180034}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.015,0],[0,-13.015],[-13.015,0],[0,13.015]],"o":[[-13.015,0],[0,13.015],[13.015,0],[0,-13.015]],"v":[[0,-23.566],[-23.566,0],[0,23.566],[23.566,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.898039215686,0.898039215686,0.898039215686,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.760784313725,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[105.535,105.535],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450.000018328876,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/emoji_shock.json b/example/resource/emoji_shock.json new file mode 100644 index 0000000000..65b69bcb66 --- /dev/null +++ b/example/resource/emoji_shock.json @@ -0,0 +1 @@ +{"v":"4.5.7","fr":30,"ip":0,"op":90,"w":100,"h":100,"ddd":0,"assets":[{"id":"comp_43","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"eyes","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-286,45.5,0]},"a":{"a":0,"k":[-252,-416.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.381,0],[0,-1.381],[1.381,0],[0,1.381]],"o":[[1.381,0],[0,1.381],[-1.381,0],[0,-1.381]],"v":[[70.5,-419],[73,-416.5],[70.5,-414],[68,-416.5]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.381,0],[0,-1.381],[1.381,0],[0,1.381]],"o":[[1.381,0],[0,1.381],[-1.381,0],[0,-1.381]],"v":[[97.5,-419],[100,-416.5],[97.5,-414],[95,-416.5]],"c":true}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.33,0.33,0.28,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"eyes_white","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-286,45.5,0]},"a":{"a":0,"k":[-252,-416.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.59,0],[0,-3.59],[3.59,0],[0,3.59]],"o":[[3.59,0],[0,3.59],[-3.59,0],[0,-3.59]],"v":[[97.5,-423],[104,-416.5],[97.5,-410],[91,-416.5]],"c":true}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.98,0.95,0.94,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[97.38,-416.49],"ix":2},"a":{"a":0,"k":[97.38,-416.49],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":16,"s":[80,80],"e":[150,150]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":21,"s":[150,150],"e":[140,140]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":31,"s":[140,140],"e":[150,150]},{"i":{"x":[0.313,0.313],"y":[1,1]},"o":{"x":[0.069,0.069],"y":[0,0]},"n":["0p313_1_0p069_0","0p313_1_0p069_0"],"t":40,"s":[150,150],"e":[75,75]},{"i":{"x":[0.313,0.313],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"n":["0p313_1_0p167_0","0p313_1_0p167_0"],"t":60,"s":[75,75],"e":[80,80]},{"t":90}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.59,0],[0,-3.59],[3.59,0],[0,3.59]],"o":[[3.59,0],[0,3.59],[-3.59,0],[0,-3.59]],"v":[[70.5,-423],[77,-416.5],[70.5,-410],[64,-416.5]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.98,0.95,0.94,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[70.32,-416.373],"ix":2},"a":{"a":0,"k":[70.32,-416.373],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":16,"s":[80,80],"e":[150,150]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":21,"s":[150,150],"e":[140,140]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":31,"s":[140,140],"e":[150,150]},{"i":{"x":[0.313,0.313],"y":[1,1]},"o":{"x":[0.069,0.069],"y":[0,0]},"n":["0p313_1_0p069_0","0p313_1_0p069_0"],"t":40,"s":[150,150],"e":[75,75]},{"i":{"x":[0.313,0.313],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"n":["0p313_1_0p167_0","0p313_1_0p167_0"],"t":60,"s":[75,75],"e":[80,80]},{"t":90}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1}]},{"id":"comp_44","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"mouth 3","td":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[50,65,0]},"a":{"a":0,"k":[84,-397,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.851,"y":1},"o":{"x":0.837,"y":0},"n":"0p851_1_0p837_0","t":7,"s":[{"i":[[-4.971,0],[0,-2.5],[4.971,0],[0,2.219]],"o":[[4.971,0],[0,2.594],[-4.971,0],[0,-2.344]],"v":[[84,-398.906],[91.5,-397],[84,-395],[76.75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406.812],[93,-397],[84,-386.75],[75,-397]],"c":true}]},{"i":{"x":0.577,"y":1},"o":{"x":0.563,"y":0},"n":"0p577_1_0p563_0","t":14,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406.812],[93,-397],[84,-386.75],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-405.5],[93,-397],[84,-389],[75,-397]],"c":true}]},{"i":{"x":0.615,"y":1},"o":{"x":0.586,"y":0},"n":"0p615_1_0p586_0","t":21,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-405.5],[93,-397],[84,-389],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406],[93,-397],[84,-388],[75,-397]],"c":true}]},{"i":{"x":0.531,"y":0.201},"o":{"x":0.778,"y":0},"n":"0p531_0p201_0p778_0","t":30,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406],[93,-397],[84,-388],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-403.375],[93,-397],[84,-389.625],[75,-397]],"c":true}]},{"i":{"x":0.683,"y":1},"o":{"x":0.587,"y":1},"n":"0p683_1_0p587_1","t":46,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-403.375],[93,-397],[84,-389.625],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-2.5],[4.971,0],[0,2.219]],"o":[[4.971,0],[0,2.594],[-4.971,0],[0,-2.344]],"v":[[84,-398.906],[91.5,-397],[84,-395],[76.75,-397]],"c":true}]},{"t":65}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":7,"s":[0.33,0.33,0.28,1],"e":[0.96,0.62,0.52,1]},{"t":9}]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"mouth_teeth","tt":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-118,60,0]},"a":{"a":0,"k":[-83.5,-402,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[68,-409.75],[101,-409.75],[101,-400],[68,-400]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.98,0.95,0.94,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"mouth 2","td":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[50,65,0]},"a":{"a":0,"k":[84,-397,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.851,"y":1},"o":{"x":0.837,"y":0},"n":"0p851_1_0p837_0","t":7,"s":[{"i":[[-4.971,0],[0,-2.5],[4.971,0],[0,2.219]],"o":[[4.971,0],[0,2.594],[-4.971,0],[0,-2.344]],"v":[[84,-398.906],[91.5,-397],[84,-395],[76.75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406.812],[93,-397],[84,-386.75],[75,-397]],"c":true}]},{"i":{"x":0.577,"y":1},"o":{"x":0.563,"y":0},"n":"0p577_1_0p563_0","t":14,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406.812],[93,-397],[84,-386.75],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-405.5],[93,-397],[84,-389],[75,-397]],"c":true}]},{"i":{"x":0.615,"y":1},"o":{"x":0.586,"y":0},"n":"0p615_1_0p586_0","t":21,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-405.5],[93,-397],[84,-389],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406],[93,-397],[84,-388],[75,-397]],"c":true}]},{"i":{"x":0.531,"y":0.201},"o":{"x":0.778,"y":0},"n":"0p531_0p201_0p778_0","t":30,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406],[93,-397],[84,-388],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-403.375],[93,-397],[84,-389.625],[75,-397]],"c":true}]},{"i":{"x":0.683,"y":1},"o":{"x":0.587,"y":1},"n":"0p683_1_0p587_1","t":46,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-403.375],[93,-397],[84,-389.625],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-2.5],[4.971,0],[0,2.219]],"o":[[4.971,0],[0,2.594],[-4.971,0],[0,-2.344]],"v":[[84,-398.906],[91.5,-397],[84,-395],[76.75,-397]],"c":true}]},{"t":65}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":7,"s":[0.33,0.33,0.28,1],"e":[0.96,0.62,0.52,1]},{"t":9}]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"mouth_teeth","tt":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[51.5,73.438,0]},"a":{"a":0,"k":[85.5,-388.562,0]},"s":{"a":1,"k":[{"i":{"x":[0.388,0.388,0.667],"y":[1,1,0.667]},"o":{"x":[0.559,0.559,0.333],"y":[0,0,0.333]},"n":["0p388_1_0p559_0","0p388_1_0p559_0","0p667_0p667_0p333_0p333"],"t":5,"s":[150,150,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0.167]},"n":["0p833_1_0p167_0","0p833_1_0p167_0","0p833_0p833_0p167_0p167"],"t":28,"s":[100,100,100],"e":[150,150,100]},{"t":54}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-8.284,0],[0,-4.418],[8.284,0],[0,4.418]],"o":[[8.284,0],[0,4.418],[-8.284,0],[0,-4.418]],"v":[[88,-393],[103,-385],[88,-377],[73,-385]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.85,0.53,0.43,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"mouth","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[50,65,0]},"a":{"a":0,"k":[84,-397,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.851,"y":1},"o":{"x":0.837,"y":0},"n":"0p851_1_0p837_0","t":7,"s":[{"i":[[-4.971,0],[0,-2.5],[4.971,0],[0,2.219]],"o":[[4.971,0],[0,2.594],[-4.971,0],[0,-2.344]],"v":[[84,-398.906],[91.5,-397],[84,-395],[76.75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406.812],[93,-397],[84,-386.75],[75,-397]],"c":true}]},{"i":{"x":0.577,"y":1},"o":{"x":0.563,"y":0},"n":"0p577_1_0p563_0","t":14,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406.812],[93,-397],[84,-386.75],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-405.5],[93,-397],[84,-389],[75,-397]],"c":true}]},{"i":{"x":0.615,"y":1},"o":{"x":0.586,"y":0},"n":"0p615_1_0p586_0","t":21,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-405.5],[93,-397],[84,-389],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406],[93,-397],[84,-388],[75,-397]],"c":true}]},{"i":{"x":0.531,"y":0.201},"o":{"x":0.778,"y":0},"n":"0p531_0p201_0p778_0","t":30,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-406],[93,-397],[84,-388],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-403.375],[93,-397],[84,-389.625],[75,-397]],"c":true}]},{"i":{"x":0.683,"y":1},"o":{"x":0.587,"y":1},"n":"0p683_1_0p587_1","t":46,"s":[{"i":[[-4.971,0],[0,-4.971],[4.971,0],[0,4.971]],"o":[[4.971,0],[0,4.971],[-4.971,0],[0,-4.971]],"v":[[84,-403.375],[93,-397],[84,-389.625],[75,-397]],"c":true}],"e":[{"i":[[-4.971,0],[0,-2.5],[4.971,0],[0,2.219]],"o":[[4.971,0],[0,2.594],[-4.971,0],[0,-2.344]],"v":[[84,-398.906],[91.5,-397],[84,-395],[76.75,-397]],"c":true}]},{"t":65}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.96,0.62,0.52,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":92,"st":0,"bm":0,"sr":1}]},{"id":"comp_45","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"round_normal","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[-252,-412,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-17.673,0],[0,-17.673],[17.673,0],[0,17.673]],"o":[[17.673,0],[0,17.673],[-17.673,0],[0,-17.673]],"v":[[-252,-444],[-220,-412],[-252,-380],[-284,-412]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.88,0.59,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":300,"st":0,"bm":0,"sr":1}]}],"layers":[{"ddd":0,"ind":0,"ty":0,"nm":"eyes_O","parent":2,"refId":"comp_43","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.304],"y":[1]},"o":{"x":[0.446],"y":[0]},"n":["0p304_1_0p446_0"],"t":0,"s":[-11],"e":[0]},{"i":{"x":[0.304],"y":[0.304]},"o":{"x":[0.167],"y":[0.167]},"n":["0p304_0p304_0p167_0p167"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.049],"y":[1]},"o":{"x":[0.438],"y":[0]},"n":["0p049_1_0p438_0"],"t":46,"s":[0],"e":[-11]},{"t":90}]},"p":{"a":1,"k":[{"i":{"x":0.304,"y":1},"o":{"x":0.446,"y":0},"n":"0p304_1_0p446_0","t":0,"s":[45,50,0],"e":[50,50,0],"to":[1.33333337306976,1.125,0],"ti":[-1.33333337306976,1.1875,0]},{"i":{"x":0.304,"y":1},"o":{"x":0.167,"y":0},"n":"0p304_1_0p167_0","t":15,"s":[50,50,0],"e":[50,50,0],"to":[1.33333337306976,-1.1875,0],"ti":[-1.33333337306976,1.1875,0]},{"i":{"x":0.049,"y":1},"o":{"x":0.438,"y":0},"n":"0p049_1_0p438_0","t":46,"s":[50,50,0],"e":[45,50,0],"to":[1.33333337306976,-1.1875,0],"ti":[-1.33333337306976,-1.125,0]},{"t":90}]},"a":{"a":0,"k":[50,50,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":100,"h":100,"ip":0,"op":91,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":0,"nm":"mouth_O","parent":0,"refId":"comp_44","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.366],"y":[1]},"o":{"x":[0.446],"y":[0]},"n":["0p366_1_0p446_0"],"t":0,"s":[9],"e":[0]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":15,"s":[0],"e":[0]},{"i":{"x":[0.049],"y":[1]},"o":{"x":[0.501],"y":[0]},"n":["0p049_1_0p501_0"],"t":46,"s":[0],"e":[9]},{"t":90}]},"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[50,50,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":100,"h":100,"ip":0,"op":91,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":0,"nm":"base_normal","refId":"comp_45","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.425],"y":[0.675]},"o":{"x":[0.515],"y":[0]},"n":["0p425_0p675_0p515_0"],"t":0,"s":[-7],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.477],"y":[0.942]},"n":["0p667_1_0p477_0p942"],"t":15,"s":[0],"e":[2]},{"i":{"x":[0.531],"y":[0.354]},"o":{"x":[0.333],"y":[0]},"n":["0p531_0p354_0p333_0"],"t":30,"s":[2],"e":[0]},{"i":{"x":[0.361],"y":[1]},"o":{"x":[0.33],"y":[0.357]},"n":["0p361_1_0p33_0p357"],"t":46,"s":[0],"e":[-7]},{"t":90}]},"p":{"a":0,"k":[50,84.5,0]},"a":{"a":0,"k":[50,84.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":100,"h":100,"ip":0,"op":91,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/gears.json b/example/resource/gears.json new file mode 100644 index 0000000000..13b2a0ee1f --- /dev/null +++ b/example/resource/gears.json @@ -0,0 +1 @@ +{"v":"4.5.7","fr":30,"ip":0,"op":52,"w":128,"h":128,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":3,"nm":"Null 5","ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":25,"s":[90],"e":[0]},{"t":52}]},"p":{"a":0,"k":[64,64,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ip":0,"op":53,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"gear3","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[360],"e":[0]},{"t":52}]},"p":{"s":true,"x":{"a":0,"k":19.125},"y":{"a":0,"k":22.125}},"a":{"a":0,"k":[28,30,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.627,0.306],[0,0],[0,0],[0,0],[1.704,-0.597],[0,0],[0,0],[0,0],[1.186,-1.384],[0,0],[0,0],[0,0],[0.33,-1.753],[0,0],[0,0],[0,0],[-0.6,-1.701],[0,0],[0,0],[0,0],[-1.387,-1.186],[0,0],[0,0],[0,0],[-0.127,-0.045],[-1.627,-0.306],[0,0],[0,0],[0,0],[-1.703,0.598],[0,0],[0,0],[0,0],[-1.185,1.383],[0,0],[0,0],[0,0],[-0.329,1.754],[0,0],[0,0],[0,0],[0.6,1.703],[0,0],[0,0],[0,0],[1.386,1.188],[0,0],[0,0],[0,0],[0.126,0.045]],"o":[[-1.591,-0.564],[0,0],[0,0],[0,0],[-1.779,0.307],[0,0],[0,0],[0,0],[-1.371,1.14],[0,0],[0,0],[0,0],[-0.63,1.709],[0,0],[0,0],[0,0],[0.31,1.777],[0,0],[0,0],[0,0],[1.145,1.369],[0,0],[0,0],[0,0],[0.127,0.047],[1.59,0.564],[0,0],[0,0],[0,0],[1.779,-0.308],[0,0],[0,0],[0,0],[1.371,-1.142],[0,0],[0,0],[0,0],[0.631,-1.708],[0,0],[0,0],[0,0],[-0.311,-1.78],[0,0],[0,0],[0,0],[-1.145,-1.371],[0,0],[0,0],[0,0],[-0.125,-0.047],[-0.126,-0.044]],"v":[[105.253,4.747],[100.419,3.445],[97.651,8.16],[91.588,8.111],[88.885,3.362],[83.651,4.72],[83.618,10.179],[78.347,13.166],[73.623,10.395],[69.778,14.184],[72.485,18.94],[69.421,24.162],[63.947,24.118],[62.513,29.322],[67.238,32.093],[67.2,38.151],[62.449,40.843],[63.816,46.073],[69.283,46.117],[72.28,51.386],[69.513,56.102],[73.312,59.946],[78.07,57.251],[83.302,60.32],[83.266,65.787],[83.646,65.925],[88.479,67.227],[91.245,62.513],[97.309,62.56],[100.012,67.31],[105.245,65.951],[105.279,60.493],[110.55,57.506],[115.275,60.278],[119.119,56.488],[116.412,51.731],[119.477,46.511],[124.95,46.553],[126.383,41.349],[121.659,38.579],[121.697,32.52],[126.449,29.83],[125.08,24.598],[119.616,24.555],[116.618,19.286],[119.384,14.571],[115.584,10.724],[110.827,13.421],[105.596,10.352],[105.63,4.884],[105.253,4.747]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-9.941,0],[0,-9.941],[9.941,0],[0,9.941]],"o":[[9.941,0],[0,9.941],[-9.941,0],[0,-9.941]],"v":[[94.463,17.334],[112.463,35.334],[94.463,53.334],[76.463,35.334]],"c":true}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.25,0.37,0.44,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-66.463,-5.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":4,"mn":"ADBE Vector Group"}],"ip":0,"op":53,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"gear2","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-360],"e":[0]},{"t":52}]},"p":{"s":true,"x":{"a":0,"k":-22.5},"y":{"a":0,"k":-2.25}},"a":{"a":0,"k":[-36,-4,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[1.982,-0.286],[0,0],[0,0],[0,0],[1.588,-1.254],[0,0],[0,0],[0,0],[0.734,-1.84],[0,0],[0,0],[0,0],[-0.285,-1.981],[0,0],[0,0],[0,0],[-1.254,-1.589],[0,0],[0,0],[0,0],[-1.839,-0.735],[0,0],[0,0],[0,0],[-1.982,0.287],[0,0],[0,0],[0,0],[-1.587,1.254],[0,0],[0,0],[0,0],[-0.734,1.838],[0,0],[0,0],[0,0],[0.287,1.982],[0,0],[0,0],[0,0],[1.255,1.588],[0,0],[0,0],[0,0],[1.838,0.734]],"o":[[0,0],[0,0],[0,0],[-2.001,-0.045],[0,0],[0,0],[0,0],[-1.737,0.951],[0,0],[0,0],[0,0],[-1.052,1.727],[0,0],[0,0],[0,0],[-0.046,2.003],[0,0],[0,0],[0,0],[0.951,1.736],[0,0],[0,0],[0,0],[1.727,1.054],[0,0],[0,0],[0,0],[2.003,0.044],[0,0],[0,0],[0,0],[1.736,-0.95],[0,0],[0,0],[0,0],[1.053,-1.726],[0,0],[0,0],[0,0],[0.044,-2.001],[0,0],[0,0],[0,0],[-0.952,-1.738],[0,0],[0,0],[0,0],[-1.727,-1.053],[-1.838,-0.734]],"v":[[43.8,-32.098],[39.776,-27.554],[33.19,-28.898],[31.27,-34.644],[25.285,-34.281],[24.075,-28.343],[17.7,-26.211],[13.157,-30.235],[8.16,-26.928],[10.083,-21.173],[5.628,-16.139],[-0.317,-17.35],[-2.993,-11.989],[1.549,-7.964],[0.207,-1.377],[-5.538,0.543],[-5.176,6.53],[0.762,7.74],[2.891,14.117],[-1.132,18.662],[2.175,23.66],[7.929,21.736],[12.96,26.192],[11.749,32.139],[17.11,34.817],[21.132,30.273],[27.718,31.613],[29.637,37.362],[35.623,36.999],[36.833,31.06],[43.207,28.929],[47.752,32.952],[52.748,29.646],[50.825,23.89],[55.281,18.856],[61.225,20.068],[63.902,14.708],[59.359,10.683],[60.701,4.096],[66.448,2.174],[66.084,-3.812],[60.147,-5.023],[58.017,-11.399],[62.04,-15.943],[58.733,-20.942],[52.979,-19.019],[47.948,-23.475],[49.159,-29.421],[43.8,-32.098]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.046,0],[0,-11.046],[11.046,0],[0,11.046]],"o":[[11.046,0],[0,11.046],[-11.046,0],[0,-11.046]],"v":[[30.463,-18.666],[50.463,1.334],[30.463,21.334],[10.463,1.334]],"c":true}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.89,0.34,0.3,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-66.463,-5.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":4,"mn":"ADBE Vector Group"}],"ip":0,"op":53,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"gear1","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[360],"e":[0]},{"t":52}]},"p":{"s":true,"x":{"a":0,"k":17.063},"y":{"a":0,"k":-23.437}},"a":{"a":0,"k":[24,-34,0]},"s":{"a":0,"k":[75,75,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.357,0.446],[0,0],[0,0],[0,0],[1.525,-0.316],[0,0],[0,0],[0,0],[1.17,-1.05],[0,0],[0,0],[0,0],[0.479,-1.462],[0,0],[0,0],[0,0],[-0.322,-1.524],[0,0],[0,0],[0,0],[-1.053,-1.172],[0,0],[0,0],[0,0],[-0.103,-0.053],[-1.358,-0.446],[0,0],[0,0],[0,0],[-1.524,0.318],[0,0],[0,0],[0,0],[-1.169,1.05],[0,0],[0,0],[0,0],[-0.478,1.463],[0,0],[0,0],[0,0],[0.322,1.525],[0,0],[0,0],[0,0],[1.053,1.174],[0,0],[0,0],[0,0],[0.102,0.053]],"o":[[-1.298,-0.664],[0,0],[0,0],[0,0],[-1.557,0.062],[0,0],[0,0],[0,0],[-1.301,0.82],[0,0],[0,0],[0,0],[-0.731,1.392],[0,0],[0,0],[0,0],[0.065,1.557],[0,0],[0,0],[0,0],[0.826,1.303],[0,0],[0,0],[0,0],[0.103,0.055],[1.297,0.663],[0,0],[0,0],[0,0],[1.556,-0.062],[0,0],[0,0],[0,0],[1.301,-0.821],[0,0],[0,0],[0,0],[0.732,-1.391],[0,0],[0,0],[0,0],[-0.066,-1.557],[0,0],[0,0],[0,0],[-0.826,-1.304],[0,0],[0,0],[0,0],[-0.102,-0.054],[-0.103,-0.052]],"v":[[103.129,-53.638],[99.14,-55.302],[96.242,-51.581],[91.061,-52.312],[89.282,-56.683],[84.652,-56.115],[84.01,-51.446],[79.164,-49.487],[75.435,-52.395],[71.719,-49.589],[73.501,-45.211],[70.293,-41.09],[65.615,-41.749],[63.803,-37.459],[67.534,-34.55],[66.821,-29.369],[62.454,-27.604],[63.036,-22.972],[67.707,-22.315],[69.68,-17.464],[66.782,-13.743],[69.6,-10.021],[73.973,-11.788],[78.105,-8.567],[77.46,-3.891],[77.769,-3.73],[81.757,-2.067],[84.653,-5.788],[89.836,-5.059],[91.615,-0.687],[96.244,-1.256],[96.887,-5.923],[101.731,-7.882],[105.462,-4.973],[109.177,-7.78],[107.396,-12.158],[110.604,-16.279],[115.282,-15.621],[117.092,-19.912],[113.363,-22.82],[114.076,-28.001],[118.443,-29.765],[117.86,-34.397],[113.19,-35.054],[111.218,-39.904],[114.114,-43.626],[111.296,-47.35],[106.923,-45.582],[102.792,-48.802],[103.436,-53.479],[103.129,-53.638]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-8.837,0],[0,-8.837],[8.836,0],[0,8.837]],"o":[[8.836,0],[0,8.837],[-8.837,0],[0,-8.837]],"v":[[90.463,-44.666],[106.463,-28.666],[90.463,-12.666],[74.463,-28.666]],"c":true}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.39,0.5,0.56,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-66.463,-5.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":4,"mn":"ADBE Vector Group"}],"ip":0,"op":53,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/gears_or_settings.json b/example/resource/gears_or_settings.json new file mode 100644 index 0000000000..668465fab0 --- /dev/null +++ b/example/resource/gears_or_settings.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":25,"ip":0,"op":29,"w":261,"h":299,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"gear Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[91],"e":[0]},{"t":29}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[65.543,243.492,0],"e":[66.114,246.141,0],"to":[0.63389188051224,0.43371549248695,0],"ti":[-0.59447288513184,-1.12922275066376,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":1,"s":[66.114,246.141,0],"e":[66.79,248.814,0],"to":[0.41561776399612,0.78948098421097,0],"ti":[-0.45528426766396,-1.02199518680573,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[66.79,248.814,0],"e":[67.639,251.325,0],"to":[0.3837648332119,0.86145251989365,0],"ti":[-0.43365067243576,-0.97296315431595,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[67.639,251.325,0],"e":[68.655,253.812,0],"to":[0.39388379454613,0.88373994827271,0],"ti":[-0.45162639021873,-0.9361160993576,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":4,"s":[68.655,253.812,0],"e":[69.789,256.264,0],"to":[0.42802980542183,0.8872058391571,0],"ti":[-0.49433445930481,-0.91032445430756,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[69.789,256.264,0],"e":[71.114,258.581,0],"to":[0.48347863554955,0.89033323526382,0],"ti":[-0.56523299217224,-0.93818730115891,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6,"s":[71.114,258.581,0],"e":[72.489,260.831,0],"to":[2.14385366439819,3.55841970443726,0],"ti":[-0.56523299217224,-0.93818730115891,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[72.489,260.831,0],"e":[74.039,263.038,0],"to":[0.66254264116287,1.09970414638519,0],"ti":[-0.56497228145599,-0.77992361783981,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8,"s":[74.039,263.038,0],"e":[75.676,265.237,0],"to":[0.67640376091003,0.93375080823898,0],"ti":[-0.79516309499741,-0.82775580883026,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9,"s":[75.676,265.237,0],"e":[77.505,267.325,0],"to":[0.68977969884872,0.71805286407471,0],"ti":[-0.97716957330704,-0.82866209745407,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[77.505,267.325,0],"e":[79.389,269.272,0],"to":[0.76325196027756,0.64725506305695,0],"ti":[-0.82630759477615,-0.56484717130661,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11,"s":[79.389,269.272,0],"e":[81.407,271.087,0],"to":[0.83111488819122,0.56813335418701,0],"ti":[-0.88650888204575,-0.55724161863327,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[81.407,271.087,0],"e":[83.475,272.848,0],"to":[0.85700911283493,0.53869867324829,0],"ti":[-0.89429974555969,-0.50983655452728,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[83.475,272.848,0],"e":[85.579,274.422,0],"to":[0.88868284225464,0.50663435459137,0],"ti":[-0.92676615715027,-0.45997801423073,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":14,"s":[85.579,274.422,0],"e":[87.872,275.881,0],"to":[0.92115861177444,0.45719486474991,0],"ti":[-0.93775117397308,-0.39359641075134,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[87.872,275.881,0],"e":[90.159,277.311,0],"to":[0.95279586315155,0.39991104602814,0],"ti":[-1.10174834728241,-0.50261902809143,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16,"s":[90.159,277.311,0],"e":[92.506,278.622,0],"to":[1.1385383605957,0.51940268278122,0],"ti":[-0.95087832212448,-0.2986201941967,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[92.506,278.622,0],"e":[95.023,279.586,0],"to":[0.99073857069016,0.31113818287849,0],"ti":[-0.93247872591019,-0.34245449304581,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[95.023,279.586,0],"e":[97.558,280.658,0],"to":[0.93090575933456,0.34187683463097,0],"ti":[-0.92517024278641,-0.03547479957342,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19,"s":[97.558,280.658,0],"e":[100.144,281.54,0],"to":[0.95009499788284,0.03643051534891,0],"ti":[-0.93971288204193,-0.2205313295126,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[100.144,281.54,0],"e":[102.775,282.08,0],"to":[1.01888990402222,0.23911255598068,0],"ti":[-1.10344433784485,-0.17690135538578,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21,"s":[102.775,282.08,0],"e":[105.473,282.795,0],"to":[1.20659899711609,0.19343885779381,0],"ti":[-0.9462838768959,0.08564107865095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[105.473,282.795,0],"e":[108.081,283.204,0],"to":[1.06814050674438,-0.09666941314936,0],"ti":[-0.91514319181442,-0.08660132437944,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[108.081,283.204,0],"e":[110.765,283.459,0],"to":[1.16727662086487,0.11046107113361,0],"ti":[-0.86166793107986,0.15333108603954,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24,"s":[110.765,283.459,0],"e":[113.543,283.492,0],"to":[1.8156601190567,-0.32309100031853,0],"ti":[-0.0203275885433,-0.0203275885433,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[113.543,283.492,0],"e":[116.293,283.367,0],"to":[0.02718277275562,0.02718277275562,0],"ti":[-0.04166666790843,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":26,"s":[116.293,283.367,0],"e":[118.918,283.117,0],"to":[0.04166666790843,0,0],"ti":[0.04166666790843,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27,"s":[118.918,283.117,0],"e":[121.668,282.867,0],"to":[-0.04166666790843,0,0],"ti":[0.04166666790843,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28,"s":[121.668,282.867,0],"e":[124.168,282.242,0],"to":[-0.04166666790843,0,0],"ti":[0.04166666790843,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":29,"s":[124.168,282.242,0],"e":[124.168,282.367,0],"to":[-0.04166666790843,0,0],"ti":[0.04166666790843,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[144,280,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16.838,0],[0,16.837],[-16.837,0],[0,-16.839]],"o":[[-16.837,0],[0,-16.839],[16.838,0],[0,16.837]],"v":[[0,30.48],[-30.48,-0.001],[0,-30.48],[30.48,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.356,1.169],[0,0],[0,0],[0,0],[0.889,0.829],[0,0],[0,0],[0,0],[1.195,0.278],[0,0],[0,0],[0,0],[1.169,-0.347],[0,0],[0,0],[0,0],[0.823,-0.892],[0,0],[0,0],[0,0],[0.286,-1.197],[0,0],[0,0],[0,0],[-0.357,-1.165],[0,0],[0,0],[0,0],[-0.881,-0.832],[0,0],[0,0],[0,0],[-1.197,-0.277],[0,0],[0,0],[0,0],[-1.169,0.356],[0,0],[0,0],[0,0],[-0.829,0.883],[0,0],[0,0],[0,0],[-0.277,1.197],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.811,-0.911],[0,0],[0,0],[0,0],[-1.157,-0.377],[0,0],[0,0],[0,0],[-1.197,0.25],[0,0],[0,0],[0,0],[-0.9,0.812],[0,0],[0,0],[0,0],[-0.376,1.159],[0,0],[0,0],[0,0],[0.247,1.198],[0,0],[0,0],[0,0],[0.813,0.901],[0,0],[0,0],[0,0],[1.157,0.376],[0,0],[0,0],[0,0],[1.205,-0.257],[0,0],[0,0],[0,0],[0.911,-0.812],[0,0],[0,0],[0,0],[0.377,-1.165],[0,0],[0,0],[0,0],[-0.25,-1.208]],"v":[[40.709,-12.329],[44.006,-19.519],[39.294,-27.681],[31.648,-28.402],[29.097,-31.015],[28.354,-38.909],[20.181,-43.617],[13.217,-40.431],[9.676,-41.423],[5.097,-47.871],[-4.333,-47.871],[-8.774,-41.622],[-12.337,-40.718],[-19.529,-44.005],[-27.688,-39.295],[-28.411,-31.648],[-31.014,-29.094],[-38.91,-28.353],[-43.626,-20.182],[-40.442,-13.217],[-41.431,-9.676],[-47.871,-5.094],[-47.871,4.334],[-41.628,8.773],[-40.719,12.334],[-44.013,19.529],[-39.293,27.689],[-31.647,28.412],[-29.104,31.015],[-28.354,38.908],[-20.192,43.626],[-13.225,40.442],[-9.686,41.432],[-5.104,47.871],[4.334,47.871],[8.766,41.629],[12.327,40.719],[19.519,44.014],[27.681,39.293],[28.402,31.648],[31.013,29.102],[38.909,28.351],[43.618,20.181],[40.432,13.224],[41.422,9.686],[47.872,5.105],[47.872,-4.334],[41.62,-8.764]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.701,231.739],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":29,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"01","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[415.5,245,0],"ix":2},"a":{"a":0,"k":[360,300,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":720,"h":600,"ip":0,"op":29,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"01","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[345.5,185,0],"ix":2},"a":{"a":0,"k":[360,300,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":720,"h":600,"ip":0,"op":29,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/heart.json b/example/resource/heart.json new file mode 100644 index 0000000000..08b20396b1 --- /dev/null +++ b/example/resource/heart.json @@ -0,0 +1 @@ +{"v":"5.1.7","fr":29.9700012207031,"ip":0,"op":24.00000097754,"w":100,"h":100,"nm":"heart","ddd":0,"assets":[{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":130,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-135,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-45,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Shape Layer 2 Comp 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":900.000036657751,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0.281]},"n":["0p667_1_0p333_0p281"],"t":3,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":9,"s":[100],"e":[0]},{"t":17.0000006924242}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":0.567},"o":{"x":0.333,"y":0.406},"n":"0p667_0p567_0p333_0p406","t":3,"s":[39.878,39.582,0],"e":[39.878,22.253,0],"to":[0,-0.83333331346512,0],"ti":[0,2.48720121383667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.5},"n":"0p667_1_0p333_0p5","t":9,"s":[39.878,22.253,0],"e":[39.878,2.25,0],"to":[0,-8.33440494537354,0],"ti":[0,3.3337619304657,0]},{"t":17.0000006924242}],"ix":2},"a":{"a":0,"k":[-0.122,-27.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[15.897,15.897,-17.409]},"o":{"x":[0.333,0.333,0.333],"y":[-44.172,-44.172,107.618]},"n":["0p667_15p897_0p333_-44p172","0p667_15p897_0p333_-44p172","0p667_-17p409_0p333_107p618"],"t":3,"s":[78.68,78.68,100],"e":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[-0.562,-0.562,24.545]},"n":["0p667_1_0p333_-0p562","0p667_1_0p333_-0p562","0p667_1_0p333_24p545"],"t":9,"s":[78,78,100],"e":[54,54,100]},{"t":17.0000006924242}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.66,6.66],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.18431372549,0.56862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.17,-26.594],"ix":2},"a":{"a":0,"k":[0,1.076],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0.281]},"n":["0p667_1_0p333_0p281"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":6,"s":[100],"e":[0]},{"t":17.0000006924242}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":0.567},"o":{"x":0.333,"y":0.406},"n":"0p667_0p567_0p333_0p406","t":0,"s":[49.878,39.582,0],"e":[49.878,22.253,0],"to":[0,-2.35414934158325,0],"ti":[0,2.48720121383667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.687},"n":"0p667_1_0p333_0p687","t":6,"s":[49.878,22.253,0],"e":[49.878,2.25,0],"to":[0,-8.33440494537354,0],"ti":[0,3.3337619304657,0]},{"t":17.0000006924242}],"ix":2},"a":{"a":0,"k":[-0.122,-27.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[15.897,15.897,-17.409]},"o":{"x":[0.333,0.333,0.333],"y":[-44.172,-44.172,107.618]},"n":["0p667_15p897_0p333_-44p172","0p667_15p897_0p333_-44p172","0p667_-17p409_0p333_107p618"],"t":0,"s":[78.68,78.68,100],"e":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[-0.773,-0.773,33.75]},"n":["0p667_1_0p333_-0p773","0p667_1_0p333_-0p773","0p667_1_0p333_33p75"],"t":6,"s":[78,78,100],"e":[54,54,100]},{"t":17.0000006924242}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.66,6.66],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.309803921569,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.17,-26.594],"ix":2},"a":{"a":0,"k":[0,1.076],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0.281]},"n":["0p667_1_0p333_0p281"],"t":5,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":11,"s":[100],"e":[0]},{"t":19.0000007738859}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":0.567},"o":{"x":0.333,"y":0.406},"n":"0p667_0p567_0p333_0p406","t":5,"s":[59.878,39.582,0],"e":[59.878,22.253,0],"to":[0,-2.35414934158325,0],"ti":[0,2.48720121383667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.5},"n":"0p667_1_0p333_0p5","t":11,"s":[59.878,22.253,0],"e":[59.878,2.25,0],"to":[0,-8.33440494537354,0],"ti":[0,3.3337619304657,0]},{"t":19.0000007738859}],"ix":2},"a":{"a":0,"k":[-0.122,-27.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[15.897,15.897,-17.409]},"o":{"x":[0.333,0.333,0.333],"y":[-44.172,-44.172,107.618]},"n":["0p667_15p897_0p333_-44p172","0p667_15p897_0p333_-44p172","0p667_-17p409_0p333_107p618"],"t":5,"s":[78.68,78.68,100],"e":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[-0.562,-0.562,24.545]},"n":["0p667_1_0p333_-0p562","0p667_1_0p333_-0p562","0p667_1_0p333_24p545"],"t":11,"s":[78,78,100],"e":[54,54,100]},{"t":19.0000007738859}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.66,6.66],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.868822583965,0.051056981554,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.17,-26.594],"ix":2},"a":{"a":0,"k":[0,1.076],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5.00000020365417,"op":905.000036861406,"st":5.00000020365417,"bm":0}]}],"layers":[{"ddd":0,"ind":3,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.085,49.972,0],"ix":2},"a":{"a":0,"k":[20.392,17.022,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.486,0.486,0.333],"y":[0,0,0]},"n":["0p667_1_0p486_0","0p667_1_0p486_0","0p667_1_0p333_0"],"t":0,"s":[0,0,100],"e":[119,119,100]},{"i":{"x":[0.576,0.576,0.667],"y":[1,1,1]},"o":{"x":[0.439,0.439,0.333],"y":[0,0,0]},"n":["0p576_1_0p439_0","0p576_1_0p439_0","0p667_1_0p333_0"],"t":5,"s":[119,119,100],"e":[82,82,100]},{"i":{"x":[0.288,0.288,0.667],"y":[1,1,1]},"o":{"x":[0.152,0.152,0.333],"y":[0,0,0]},"n":["0p288_1_0p152_0","0p288_1_0p152_0","0p667_1_0p333_0"],"t":10,"s":[82,82,100],"e":[100,100,100]},{"t":15.0000006109625}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.008,2.091],[-2.887,0.06],[0,0],[-2.098,-2.123],[0,0],[0,0],[-3.003,0.063],[0,0],[-2.092,-2.008],[-0.059,-2.889],[2.542,-1.428],[0.178,8.815]],"o":[[2.007,-2.09],[0,0],[3.002,-0.062],[0,0],[0,0],[2.009,-2.205],[0,0],[2.89,-0.058],[2.09,2.008],[0.229,11.336],[-7.185,-3.885],[-0.059,-2.89]],"v":[[-17.06,-13.009],[-9.471,-16.342],[-9.465,-16.342],[-1.555,-13.145],[-0.209,-11.783],[1.081,-13.198],[8.851,-16.714],[8.855,-16.714],[16.579,-13.69],[19.913,-6.096],[0.38,16.772],[-20.083,-5.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964999988032,0.310000011968,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.392,17.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Shape Layer 2 Comp 1","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[86,86,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":3.00000012219251,"op":903.000036779944,"st":3.00000012219251,"bm":0},{"ddd":0,"ind":6,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":100,"sh":100,"sc":"#ffffff","ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/hourglass.json b/example/resource/hourglass.json new file mode 100644 index 0000000000..8f54d57f4a --- /dev/null +++ b/example/resource/hourglass.json @@ -0,0 +1 @@ +{"v":"5.0.3","fr":24,"ip":0,"op":46,"w":1280,"h":720,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[719.269,437.649,0],"ix":2},"a":{"a":0,"k":[81.853,109.045,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-15.782,6.528],[0,-19.879]],"o":[[0,0],[0,0],[0,-19.879],[15.81,6.551],[0,0]],"v":[[49.861,99.744],[-49.855,99.744],[-49.855,49.873],[-0.011,4.538],[49.861,49.873]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,19.879],[0,0],[0,0],[0,0],[15.787,-6.528]],"o":[[0,0],[0,0],[0,0],[0,19.901],[-15.782,-6.528]],"v":[[-49.855,-49.873],[-49.855,-99.717],[49.861,-99.717],[49.861,-49.873],[-0.011,-4.54]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[16.932,7.99],[0,23.823],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-16.938,-7.99],[0,-23.795],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-23.795],[16.932,-7.99],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,23.823],[-16.938,7.99],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[81.6,99.744],[58.939,99.744],[58.939,49.873],[9.067,-0.001],[58.939,-49.873],[58.939,-99.717],[81.6,-99.717],[81.6,-108.795],[-81.6,-108.795],[-81.6,-99.717],[-58.933,-99.717],[-58.933,-49.873],[-9.061,-0.001],[-58.933,49.873],[-58.933,99.744],[-81.6,99.744],[-81.6,108.795],[81.6,108.795]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[81.85,109.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":4}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":32,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 10 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[719.431,537.721,0],"e":[719.431,537,0],"to":[0,-0.90864837169647,0],"ti":[0,1.77124309539795,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[719.431,537,0],"e":[719.431,537,0],"to":[0,-0.35245817899704,0],"ti":[0,0.40625029802322,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[719.431,537,0],"e":[719.431,537.722,0],"to":[0,-0.05667289346457,0],"ti":[0,0.15397024154663,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[719.431,537.722,0],"e":[719.431,513.721,0],"to":[0,-2.94422245025635,0],"ti":[0,0.72574734687805,0]},{"t":41}],"ix":2},"a":{"a":0,"k":[61.419,0.91,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,0.39,100],"e":[100,7.248,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":4,"s":[100,7.248,100],"e":[100,65.273,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":9,"s":[100,65.273,100],"e":[102,103.253,100]},{"t":24}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.218,1.013],[0,0],[0,0],[0,0],[0,0],[0,0],[14.228,-18.623],[8.547,0.072],[0,0],[0.008,0.001],[0.037,0.001],[0,0],[0.001,0],[0,0],[0.203,0.01],[0,0],[0.028,0.007],[12.494,16.755]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[6.458,1.052],[-12.475,16.329],[0,0],[-0.007,0],[-0.037,-0.001],[0,0],[-0.001,-0.001],[0,0],[-0.196,0.005],[0,0],[-0.028,-0.002],[-9.007,-0.572],[-13.433,-18.017]],"v":[[-54.95,-35.66],[-2.777,-35.66],[-2.777,-35.659],[2.537,-35.659],[2.537,-35.66],[54.71,-35.66],[41.714,8.278],[0.017,35.588],[0.017,35.595],[-0.005,35.589],[-0.12,35.593],[-0.119,35.556],[-0.121,35.555],[-0.12,35.593],[-0.722,35.574],[-0.722,35.595],[-0.806,35.571],[-42.953,5.945]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.418,35.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 9 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":16}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":24,"st":12,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 8 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":15}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":23,"st":11,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":14}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":22,"st":10,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 6 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":11}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":19,"st":7,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":9}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":17,"st":5,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":14,"st":2,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[718.431,432.721,0],"ix":2},"a":{"a":0,"k":[61.419,69.91,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[88.882,63.763,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":10,"s":[88.882,63.763,100],"e":[84.435,49.34,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[84.435,49.34,100],"e":[65.373,33.486,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[65.373,33.486,100],"e":[39.758,11.315,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":24,"s":[39.758,11.315,100],"e":[30.803,-0.129,100]},{"t":27}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.218,1.013],[0,0],[0,0],[0,0],[0,0],[0,0],[14.228,-18.623],[8.547,0.072],[0,0],[0.008,0.001],[0.037,0.001],[0,0],[0.001,0],[0,0],[0.203,0.01],[0,0],[0.028,0.007],[12.494,16.755]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[6.458,1.052],[-12.475,16.329],[0,0],[-0.007,0],[-0.037,-0.001],[0,0],[-0.001,-0.001],[0,0],[-0.196,0.005],[0,0],[-0.028,-0.002],[-9.007,-0.572],[-13.433,-18.017]],"v":[[-54.95,-35.66],[-2.777,-35.66],[-2.777,-35.659],[2.537,-35.659],[2.537,-35.66],[54.71,-35.66],[41.714,8.278],[0.017,35.588],[0.017,35.595],[-0.005,35.589],[-0.12,35.593],[-0.119,35.556],[-0.121,35.555],[-0.12,35.593],[-0.722,35.574],[-0.722,35.595],[-0.806,35.571],[-42.953,5.945]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.418,35.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":0,"nm":"egg timer","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[0],"e":[180]},{"t":40}],"ix":10},"p":{"a":0,"k":[628,388,0],"ix":2},"a":{"a":0,"k":[719,437,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1400,"h":980,"ip":0,"op":47,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/jolly_walker.json b/example/resource/jolly_walker.json new file mode 100644 index 0000000000..f220364204 --- /dev/null +++ b/example/resource/jolly_walker.json @@ -0,0 +1 @@ +{"v":"5.1.7","fr":60,"ip":0,"op":64,"w":1000,"h":1000,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 18","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116,48.775,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[29,21],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509803922,0.472901018928,0.332656650917,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-61.5,-268.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-5.37,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 9","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[62,-208.226,0],"ix":2},"a":{"a":0,"k":[66,-203,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.75,-10.109],[50.39,14.18]],"o":[[2.75,10.109],[-199.5,-56.141]],"v":[[22.75,-166.25],[187,-207.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.515529318417,0.158323714312,0.56862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.295640145096,0.337768345253,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[473.375,533.528,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[64,64,100],"ix":6}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 16","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[112,81.633,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[45.25,43.75],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.149019607843,0.138734346278,0.129734727448,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-26.875,-228.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 7","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-722.596,-191.386,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[190.549,190.549,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17.5,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}],"e":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27.5,"s":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}],"e":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.5,"s":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}],"e":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50,"s":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}],"e":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}],"e":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}]},{"t":62.5}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":88,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392156863,0.792156862745,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":38,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-34.433,21.811],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17.5,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}],"e":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27.5,"s":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}],"e":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.5,"s":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}],"e":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50,"s":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}],"e":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}],"e":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}]},{"t":62.5}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3505421358,0.408821913775,0.513725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":38,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-34.433,21.811],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 13","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.5,60.633,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[81,-30.5],[1,-55],[4.822,26.865],[12,-3.5]],"o":[[17,0.5],[-1,55],[-3.5,-19.5],[-12.517,3.651]],"v":[[26,-151],[90.5,-115],[134,-114],[103.5,-116]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392156863,0.792156862745,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.333333333333,0.302657961378,0.275817003437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 15","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.5,-15.534,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[7,9],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392156863,0.792156862745,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.066666666667,0.06220479853,0.058300654093,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[29.75,-136.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 17","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-15.876,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[-46,-106],[-1,-39],[0.333,-16.457]],"o":[[0,0],[19.372,44.64],[1,39],[-0.264,13.036]],"v":[[-46.5,-199.5],[-26,-73],[-74,-17],[-55,62]],"c":false}],"e":[{"i":[[0,0],[-45,-76.444],[-1,-39],[-7,-11]],"o":[[0,0],[48.57,82.508],[1,39],[7,11]],"v":[[-46.5,-199.5],[-34,-69],[-87,3],[-55,52.667]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16,"s":[{"i":[[0,0],[-45,-76.444],[-1,-39],[-7,-11]],"o":[[0,0],[48.57,82.508],[1,39],[7,11]],"v":[[-46.5,-199.5],[-34,-69],[-87,3],[-55,52.667]],"c":false}],"e":[{"i":[[0,0],[-45.25,-83.833],[-1,-39],[-7,-11]],"o":[[0,0],[53,114.666],[1,39],[7,11]],"v":[[-46.5,-199.5],[-32,-70],[-83.75,-2],[-56,47]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28,"s":[{"i":[[0,0],[-45.25,-83.833],[-1,-39],[-7,-11]],"o":[[0,0],[53,114.666],[1,39],[7,11]],"v":[[-46.5,-199.5],[-32,-70],[-83.75,-2],[-56,47]],"c":false}],"e":[{"i":[[0,0],[-46,-106],[-1,-39],[7.333,-21.791]],"o":[[0,0],[19.372,44.64],[1,39],[-4.159,12.357]],"v":[[-46.5,-199.5],[-26,-73],[-74,-17],[-54.667,62]],"c":false}]},{"t":64}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Smoke","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[112.981,9.615],[-55.288,-84.135],[31.25,-50.481],[-21.635,-103.365],[0,0],[-60.096,2.404],[36.058,33.654],[-36.058,48.077]],"o":[[-112.981,-9.615],[55.288,84.135],[-31.25,50.481],[21.635,103.365],[0,0],[60.096,-2.404],[-36.058,-33.654],[36.058,-48.077]],"v":[[242.788,-550.481],[55.288,-444.712],[144.231,-322.115],[91.346,-230.769],[114.192,-111.808],[170.673,-230.769],[199.519,-341.346],[225.962,-432.692]],"c":true}],"e":[{"i":[[112.981,9.615],[-96.264,-29.473],[57.824,13.462],[-21.635,-103.365],[0,0],[-48.542,-35.51],[36.058,33.654],[-36.058,48.077]],"o":[[-112.981,-9.615],[80.712,24.712],[-68.231,-15.885],[21.635,103.365],[0,0],[39.327,28.769],[-36.058,-33.654],[36.058,-48.077]],"v":[[242.788,-550.481],[55.288,-444.712],[144.231,-322.115],[91.346,-230.769],[114.192,-80.808],[154.673,-258.769],[201.519,-387.346],[229.962,-470.692]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8,"s":[{"i":[[112.981,9.615],[-96.264,-29.473],[57.824,13.462],[-21.635,-103.365],[0,0],[-48.542,-35.51],[36.058,33.654],[-36.058,48.077]],"o":[[-112.981,-9.615],[80.712,24.712],[-68.231,-15.885],[21.635,103.365],[0,0],[39.327,28.769],[-36.058,-33.654],[36.058,-48.077]],"v":[[242.788,-550.481],[55.288,-444.712],[144.231,-322.115],[91.346,-230.769],[114.192,-80.808],[154.673,-258.769],[201.519,-387.346],[229.962,-470.692]],"c":true}],"e":[{"i":[[112.981,9.615],[-87.484,-41.186],[41.769,-49.885],[0.654,-89.231],[0,0],[-62.101,24.769],[26.909,45.489],[-2.598,62.232]],"o":[[-112.981,-9.615],[75.264,37.445],[-64.231,34.115],[-0.774,105.602],[0,0],[51.899,-21.231],[-25.112,-42.451],[0.896,-21.451]],"v":[[242.788,-550.481],[33.288,-480.712],[112.231,-358.115],[109.346,-230.769],[114.192,-111.808],[158.101,-346.769],[189.091,-441.489],[297.104,-496.549]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[112.981,9.615],[-87.484,-41.186],[41.769,-49.885],[0.654,-89.231],[0,0],[-62.101,24.769],[26.909,45.489],[-2.598,62.232]],"o":[[-112.981,-9.615],[75.264,37.445],[-64.231,34.115],[-0.774,105.602],[0,0],[51.899,-21.231],[-25.112,-42.451],[0.896,-21.451]],"v":[[242.788,-550.481],[33.288,-480.712],[112.231,-358.115],[109.346,-230.769],[114.192,-111.808],[158.101,-346.769],[189.091,-441.489],[297.104,-496.549]],"c":true}],"e":[{"i":[[112.981,9.615],[-78.703,-52.9],[50.042,-32.703],[-3.126,-89.638],[0,0],[-53.494,-19.261],[103.637,2.208],[-57.183,4.784]],"o":[[-112.981,-9.615],[69.816,50.179],[-54.958,42.297],[5.338,104.992],[0,0],[131.178,5.041],[-45.661,-7.411],[49.753,-19.593]],"v":[[118.788,-608.481],[13.288,-504.893],[126.958,-456.297],[102.437,-230.769],[109.192,-104.808],[217.53,-428.769],[217.026,-526.541],[342.247,-542.407]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[{"i":[[112.981,9.615],[-78.703,-52.9],[50.042,-32.703],[-3.126,-89.638],[0,0],[-53.494,-19.261],[103.637,2.208],[-57.183,4.784]],"o":[[-112.981,-9.615],[69.816,50.179],[-54.958,42.297],[5.338,104.992],[0,0],[131.178,5.041],[-45.661,-7.411],[49.753,-19.593]],"v":[[118.788,-608.481],[13.288,-504.893],[126.958,-456.297],[102.437,-230.769],[109.192,-104.808],[217.53,-428.769],[217.026,-526.541],[342.247,-542.407]],"c":true}],"e":[{"i":[[112.981,9.615],[-69.923,-64.613],[36.032,-50.21],[-11.503,-96.941],[0,0],[-55.97,-11.137],[42.808,17.215],[-49.261,21.019]],"o":[[-112.981,-9.615],[34.962,26.325],[-46.241,43.042],[11.449,104.382],[0,0],[59.791,-10.481],[-42.06,-17.252],[46.571,-21.492]],"v":[[242.788,-550.481],[-8.962,-482.325],[146.435,-431.729],[99.528,-230.769],[114.192,-80.808],[174.209,-325.519],[220.711,-395.843],[317.89,-488.764]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44,"s":[{"i":[[112.981,9.615],[-69.923,-64.613],[36.032,-50.21],[-11.503,-96.941],[0,0],[-55.97,-11.137],[42.808,17.215],[-49.261,21.019]],"o":[[-112.981,-9.615],[34.962,26.325],[-46.241,43.042],[11.449,104.382],[0,0],[59.791,-10.481],[-42.06,-17.252],[46.571,-21.492]],"v":[[242.788,-550.481],[-8.962,-482.325],[146.435,-431.729],[99.528,-230.769],[114.192,-80.808],[174.209,-325.519],[220.711,-395.843],[317.89,-488.764]],"c":true}],"e":[{"i":[[112.981,9.615],[-61.142,-76.326],[-60.613,-54.039],[12.381,-73.231],[0,0],[-60.087,14.469],[38.758,27.078],[-33.533,19.121]],"o":[[-112.981,-9.615],[52.912,36.257],[58.387,63.961],[-3.619,30.769],[0,0],[63.913,-24.531],[-27.996,-27.255],[48.467,-34.879]],"v":[[242.788,-550.481],[29.588,-459.757],[157.613,-402.961],[123.619,-244.769],[116.192,-125.808],[208.087,-297.469],[213.496,-414.245],[295.533,-471.121]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56,"s":[{"i":[[112.981,9.615],[-61.142,-76.326],[-60.613,-54.039],[12.381,-73.231],[0,0],[-60.087,14.469],[38.758,27.078],[-33.533,19.121]],"o":[[-112.981,-9.615],[52.912,36.257],[58.387,63.961],[-3.619,30.769],[0,0],[63.913,-24.531],[-27.996,-27.255],[48.467,-34.879]],"v":[[242.788,-550.481],[29.588,-459.757],[157.613,-402.961],[123.619,-244.769],[116.192,-125.808],[208.087,-297.469],[213.496,-414.245],[295.533,-471.121]],"c":true}],"e":[{"i":[[112.981,9.615],[-55.288,-84.135],[31.25,-50.481],[-21.635,-103.365],[0,0],[-60.096,2.404],[36.058,33.654],[-36.058,48.077]],"o":[[-112.981,-9.615],[55.288,84.135],[-31.25,50.481],[21.635,103.365],[0,0],[60.096,-2.404],[-36.058,-33.654],[36.058,-48.077]],"v":[[242.788,-550.481],[55.288,-444.712],[144.231,-322.115],[91.346,-230.769],[114.192,-120.808],[170.673,-230.769],[199.519,-341.346],[225.962,-432.692]],"c":true}]},{"t":64}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392156863,0.792156862745,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215686275,0.572369624119,0.513879274854,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 6","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-734.029,-245.947,0],"e":[-734.029,-219.947,0],"to":[0,4.33333349227905,0],"ti":[0,-0.16666667163372,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[-734.029,-219.947,0],"e":[-734.029,-244.947,0],"to":[0,0.16666667163372,0],"ti":[0,-0.66666668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[-734.029,-244.947,0],"e":[-734.029,-215.947,0],"to":[0,0.66666668653488,0],"ti":[0,0.16666667163372,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.5,"s":[-734.029,-215.947,0],"e":[-734.029,-245.947,0],"to":[0,-0.16666667163372,0],"ti":[0,5,0]},{"t":62.5}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[190.549,190.549,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[86,46],[0,81.5]],"o":[[5.25,65.5],[-13.5,23.75]],"v":[[21.75,-128.617],[187.5,-124.617]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745008282,0.11613999909,0.11613999909,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.839215686275,0.488893965179,0.075693960751,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.462745008282,0.11613999909,0.11613999909,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039215686,0.369550158931,0.369550158931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745008282,0.11613999909,0.11613999909,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.202591765161,0.294117647059,0.184544417437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149,-145.016],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[26,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745008282,0.11613999909,0.11613999909,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.294117647059,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83,-147.016],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[90,10],[-112,-29]],"o":[[-76.632,-8.515],[183,31]],"v":[[103,-245],[75,-101]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745008282,0.11613999909,0.11613999909,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392156863,0.793133844114,0.6266820571,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[93.244,89.796],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 5","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-534,-91.727,0],"ix":2},"a":{"a":0,"k":[-534,-93,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-53.354,-5.716],[11.433,4.764]],"o":[[0,0],[53.354,5.716],[-11.433,-4.764]],"v":[[-593.975,-391.175],[-512.039,-350.208],[-472.024,-394.987]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745098039,0.116139939252,0.116139939252,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.819607843137,0.634472895604,0.472479816512,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.621,-35.311],[0,0],[53.354,102.896]],"o":[[60.976,30.488],[0,0],[-53.354,-102.896]],"v":[[-612.077,-360.852],[-406.285,-183.642],[-432.961,-362.757]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745098039,0.116139939252,0.116139939252,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.820607503255,0.90875453575,0.909803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[156.945,-46.504],[-81.707,-337.869],[-82.422,-4.303],[-8.438,24.609]],"o":[[-47.894,-0.995],[142.121,77.797],[103.681,2.048],[36.658,-97.977]],"v":[[-541.317,-407.522],[-758.009,-69.107],[-472.491,14.264],[-337.506,-50.217]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745098039,0.116139939252,0.116139939252,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.25731640984,0.296602675494,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0.635],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745098039,0.116139939252,0.116139939252,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.25731640984,0.296602675494,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 4","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.64,"y":1},"o":{"x":0.36,"y":0},"n":"0p64_1_0p36_0","t":0,"s":[90.625,22.472,0],"e":[90.625,69.472,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.64,"y":1},"o":{"x":0.36,"y":0},"n":"0p64_1_0p36_0","t":10,"s":[90.625,69.472,0],"e":[90.625,1.14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.64,"y":1},"o":{"x":0.36,"y":0},"n":"0p64_1_0p36_0","t":25,"s":[90.625,1.14,0],"e":[90.625,22.472,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.64,"y":1},"o":{"x":0.36,"y":0},"n":"0p64_1_0p36_0","t":32.5,"s":[90.625,22.472,0],"e":[90.625,69.472,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.64,"y":1},"o":{"x":0.36,"y":0},"n":"0p64_1_0p36_0","t":40,"s":[90.625,69.472,0],"e":[90.625,1.14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.64,"y":1},"o":{"x":0.36,"y":0},"n":"0p64_1_0p36_0","t":55,"s":[90.625,1.14,0],"e":[90.625,22.472,0],"to":[0,0,0],"ti":[0,-3.55530524253845,0]},{"t":62.5}],"ix":2},"a":{"a":0,"k":[-534,-71,0],"ix":1},"s":{"a":0,"k":[82,82,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[79.512,-28.718],[128.927,-3.537],[-105.08,0],[-2.52,105.05]],"o":[[-104.42,37.713],[-2.52,105.05],[105.08,0],[-117.463,-15.766]],"v":[[19.512,30.024],[-216.488,6.098],[0,209],[210.39,8.537]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745098039,0.116139939252,0.116139939252,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039215686,0.369550158931,0.369550158931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-544,-76],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 2","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-632.018,37.043,0],"ix":2},"a":{"a":0,"k":[-60,14,0],"ix":1},"s":{"a":0,"k":[121.951,121.951,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.698039215686,0.36862745098,0.36862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":60,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-211.78,-154.468],[58.25,-115.367]],"o":[[202.25,147.517],[0,0]],"v":[[-90,-8.717],[-32,356.915]],"c":false}],"e":[{"i":[[-133.513,-186.523],[173.558,-170.346]],"o":[[111.25,101.551],[-158.442,143.306]],"v":[[-90,-8.717],[-76.308,313.653]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[-133.513,-186.523],[173.558,-170.346]],"o":[[111.25,101.551],[-158.442,143.306]],"v":[[-90,-8.717],[-76.308,313.653]],"c":false}],"e":[{"i":[[-55.245,-218.577],[164.087,-143.863]],"o":[[57.635,179.132],[-150.018,116.536]],"v":[[-90,-8.717],[-170.15,338.802]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[-55.245,-218.577],[164.087,-143.863]],"o":[[57.635,179.132],[-150.018,116.536]],"v":[[-90,-8.717],[-170.15,338.802]],"c":false}],"e":[{"i":[[-16.111,-234.604],[138.952,-127.777]],"o":[[21.481,187.035],[-125.216,98.487]],"v":[[-90,-22.8],[-191.59,327.852]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[{"i":[[-16.111,-234.604],[138.952,-127.777]],"o":[[21.481,187.035],[-125.216,98.487]],"v":[[-90,-22.8],[-191.59,327.852]],"c":false}],"e":[{"i":[[-65.833,-253.727],[124.101,-98.778]],"o":[[49.727,191.652],[-57.787,45.995]],"v":[[-90,-8.717],[-201.875,297.204]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[{"i":[[-65.833,-253.727],[124.101,-98.778]],"o":[[49.727,191.652],[-57.787,45.995]],"v":[[-90,-8.717],[-201.875,297.204]],"c":false}],"e":[{"i":[[-21.003,-232.601],[107.195,-65.321]],"o":[[99.25,220.522],[-193.086,117.66]],"v":[[-90,-8.717],[-190.937,279.009]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[{"i":[[-21.003,-232.601],[107.195,-65.321]],"o":[[99.25,220.522],[-193.086,117.66]],"v":[[-90,-8.717],[-190.937,279.009]],"c":false}],"e":[{"i":[[-148.188,-180.512],[224.852,-167.321]],"o":[[140.352,98.004],[-61.947,30.61]],"v":[[-90,-8.717],[-40.125,310.123]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[-148.188,-180.512],[224.852,-167.321]],"o":[[140.352,98.004],[-61.947,30.61]],"v":[[-90,-8.717],[-40.125,310.123]],"c":false}],"e":[{"i":[[-211.78,-154.468],[58.25,-115.367]],"o":[[202.25,147.517],[0,0]],"v":[[-90,-8.717],[-32,356.915]],"c":false}]},{"t":64}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.368627458811,0.368627458811,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":84,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[6,-3.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,110.951],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-211.78,-154.468],[58.25,-115.367]],"o":[[202.25,147.517],[0,0]],"v":[[-90,-8.717],[-32,356.915]],"c":false}],"e":[{"i":[[-55.245,-218.577],[164.087,-143.863]],"o":[[57.635,179.132],[-150.018,116.536]],"v":[[-90,-8.717],[-170.15,338.802]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[-55.245,-218.577],[164.087,-143.863]],"o":[[57.635,179.132],[-150.018,116.536]],"v":[[-90,-8.717],[-170.15,338.802]],"c":false}],"e":[{"i":[[-16.111,-234.604],[138.952,-127.777]],"o":[[21.481,187.035],[-125.216,98.487]],"v":[[-90,-22.8],[-191.59,327.852]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[{"i":[[-16.111,-234.604],[138.952,-127.777]],"o":[[21.481,187.035],[-125.216,98.487]],"v":[[-90,-22.8],[-191.59,327.852]],"c":false}],"e":[{"i":[[42.589,-258.645],[101.25,-103.65]],"o":[[-32.75,198.891],[-51.609,52.833]],"v":[[-90,-8.717],[-201.875,297.204]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[{"i":[[42.589,-258.645],[101.25,-103.65]],"o":[[-32.75,198.891],[-51.609,52.833]],"v":[[-90,-8.717],[-201.875,297.204]],"c":false}],"e":[{"i":[[-21.003,-232.601],[107.195,-65.321]],"o":[[99.25,220.522],[-193.086,117.66]],"v":[[-90,-8.717],[-190.937,279.009]],"c":false}]},{"t":40}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":0,"k":82,"ix":2},"o":{"a":0,"k":3,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.301545565736,0.301545565736,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":85,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[6,-3.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,110.951],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 1","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-518.22,-17.104,0],"ix":2},"a":{"a":0,"k":[-15,0,0],"ix":1},"s":{"a":0,"k":[121.951,121.951,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[90.037,-113.557]],"o":[[0,0],[-9.963,20.23]],"v":[[-14,-0.605],[-155.438,325.087]],"c":false}],"e":[{"i":[[0,0],[297.769,-151.903]],"o":[[0,0],[-379.918,193.811]],"v":[[-14,-0.605],[-156.769,291.605]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[{"i":[[0,0],[297.769,-151.903]],"o":[[0,0],[-379.918,193.811]],"v":[[-14,-0.605],[-156.769,291.605]],"c":false}],"e":[{"i":[[-90.055,-74.065],[232.29,-219.388]],"o":[[112.662,92.658],[-307.839,225.975]],"v":[[-14,-0.605],[33.559,333.973]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24,"s":[{"i":[[-90.055,-74.065],[232.29,-219.388]],"o":[[112.662,92.658],[-307.839,225.975]],"v":[[-14,-0.605],[33.559,333.973]],"c":false}],"e":[{"i":[[-38.901,-103.432],[102.224,-185.126]],"o":[[97.037,74.012],[-206.978,304.292]],"v":[[-14,-0.605],[74.562,328.242]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[{"i":[[-38.901,-103.432],[102.224,-185.126]],"o":[[97.037,74.012],[-206.978,304.292]],"v":[[-14,-0.605],[74.562,328.242]],"c":false}],"e":[{"i":[[0,0],[196.5,-285.56]],"o":[[0,0],[-196.5,285.56]],"v":[[-14,-0.605],[-154.125,358.267]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[0,0],[196.5,-285.56]],"o":[[0,0],[-196.5,285.56]],"v":[[-14,-0.605],[-154.125,358.267]],"c":false}],"e":[{"i":[[0,0],[128.141,-141.768]],"o":[[0,0],[-72.142,108.673]],"v":[[-14,-0.605],[-160.729,329.106]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[0,0],[128.141,-141.768]],"o":[[0,0],[-72.142,108.673]],"v":[[-14,-0.605],[-160.729,329.106]],"c":false}],"e":[{"i":[[0,0],[90.037,-113.557]],"o":[[0,0],[-9.963,20.23]],"v":[[-14,-0.605],[-155.438,325.087]],"c":false}]},{"t":64}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.564705908298,0.325536340475,0.325536340475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":84,"ix":5},"lc":1,"lj":1,"ml":1,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,110.951],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-38.901,-103.432],[160.037,-206.954]],"o":[[97.037,74.012],[-206.978,304.292]],"v":[[-14,-0.605],[74.562,328.242]],"c":false},"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":0,"k":82,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.298039227724,0.257131874561,0.257131874561,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":83,"ix":5},"lc":2,"lj":1,"ml":1,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,110.951],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.462745098039,0.116139939252,0.116139939252,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":21,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 11","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-473.929,-195.197,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[190.549,190.549,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false},"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":87,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.792156875134,0.627451002598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":34,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-23,18],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47.5,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}],"e":[{"i":[[0,0],[-0.628,-24.436],[11.2,-26.205]],"o":[[0,0],[2.298,43.346],[-15.553,37.24]],"v":[[53.75,-76],[33.35,43.5],[152.35,61.2]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":64,"s":[{"i":[[0,0],[-0.628,-24.436],[11.2,-26.205]],"o":[[0,0],[2.298,43.346],[-15.553,37.24]],"v":[[53.75,-76],[33.35,43.5],[152.35,61.2]],"c":false}],"e":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":65,"s":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":72.5,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}],"e":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}],"e":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87.5,"s":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}],"e":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":92.5,"s":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}],"e":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}]},{"t":100}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3505421358,0.408821913775,0.513725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":34,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-23,18],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":98,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":37.5,"op":637.5,"st":37.5,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 10","parent":11,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[100],"e":[0]},{"t":37.5}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-467.26,-195.197,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[190.549,190.549,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-25,"s":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-15,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-7.5,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}],"e":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2.5,"s":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}],"e":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17.5,"s":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}],"e":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}],"e":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}],"e":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}]},{"t":37.5}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":89,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.792156875134,0.627451002598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":34,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-33.48,18],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-25,"s":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-15,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-3,30],[65,155]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-7.5,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[21,30],[113,135]],"c":false}],"e":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2.5,"s":[{"i":[[0,0],[-2.031,-21.152],[10,-25.348]],"o":[[0,0],[4,41.652],[-14.837,37.609]],"v":[[54,-76],[35,45],[157,53]],"c":false}],"e":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[0,0],[12,-54],[22,-33.92]],"o":[[0,0],[-13.019,58.587],[-22,33.92]],"v":[[54,-76],[-2,50],[92,115]],"c":false}],"e":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17.5,"s":[{"i":[[0,0],[20,-44.091],[22,-33.92]],"o":[[0,0],[-24.793,54.656],[-22,33.92]],"v":[[54,-76],[-27,23],[20,140]],"c":false}],"e":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[{"i":[[0,0],[11.429,-44.49],[36.429,-47.205]],"o":[[0,0],[-14.932,58.129],[-9.825,31.173]],"v":[[54,-76],[-46.429,16.143],[-59.429,144.857]],"c":false}],"e":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[11.657,-48.294],[16.257,-68.462]],"o":[[0,0],[-14.167,58.313],[-13.895,29.104]],"v":[[54,-76],[-33.457,16.086],[-17.257,158.114]],"c":false}],"e":[{"i":[[0,0],[12,-54],[0,-36]],"o":[[0,0],[-13.019,58.587],[0,32.803]],"v":[[54,-76],[-36,25],[21,152]],"c":false}]},{"t":37.5}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3505421358,0.408821913775,0.513725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":34,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-33.48,18],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-25,"op":575,"st":-25,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 21","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[819.189,10],"ix":2},"p":{"a":0,"k":[0,40],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.498039215686,0.473137260886,0.462883504232,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3,-269],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[214.09,100],"ix":3},"r":{"a":0,"k":17,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[819.189,25],"ix":2},"p":{"a":0,"k":[0,40],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.328235312069,0.313218000823,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1,-263],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[214.09,100],"ix":3},"r":{"a":0,"k":17,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[819.189,10],"ix":2},"p":{"a":0,"k":[0,40],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.498039215686,0.474509803922,0.462745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.5,-175],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[214.09,100],"ix":3},"r":{"a":0,"k":17,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 4","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[819.189,25],"ix":2},"p":{"a":0,"k":[0,40],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.329411764706,0.313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-3,-167],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[214.09,100],"ix":3},"r":{"a":0,"k":17,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 20","parent":20,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.339,76.282,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":2,"s":{"a":0,"k":[53.057,259],"ix":2},"p":{"a":0,"k":[0,14],"ix":3},"r":{"a":0,"k":36,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.347681681315,0.329411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"rp","c":{"a":0,"k":45,"ix":1},"o":{"a":0,"k":-14,"ix":2},"m":1,"ix":4,"tr":{"ty":"tr","p":{"a":0,"k":[99,30],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false},{"ty":"tr","p":{"a":0,"k":[-513,-315],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[75,100],"ix":3},"r":{"a":0,"k":-6,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":4,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 2","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":2,"s":{"a":0,"k":[53.057,259],"ix":2},"p":{"a":0,"k":[0,14],"ix":3},"r":{"a":0,"k":36,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156887054,0.511262953281,0.483014255762,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"rp","c":{"a":0,"k":45,"ix":1},"o":{"a":0,"k":-14,"ix":2},"m":1,"ix":4,"tr":{"ty":"tr","p":{"a":0,"k":[99,30],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false},{"ty":"tr","p":{"a":0,"k":[-506,-317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[75,100],"ix":3},"r":{"a":0,"k":-6,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":4,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape Layer 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[484,827,0],"ix":2},"a":{"a":0,"k":[-55,362,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.859,0.859,1.183]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,-0.183]},"n":["0p833_0p859_0p167_0p167","0p833_0p859_0p167_0p167","0p833_1p183_0p167_-0p183"],"t":0,"s":[83,83,100],"e":[74,74,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.873,0.873,1.796]},"o":{"x":[0.167,0.167,0.167],"y":[0.128,0.128,-0.796]},"n":["0p833_0p873_0p167_0p128","0p833_0p873_0p167_0p128","0p833_1p796_0p167_-0p796"],"t":12,"s":[74,74,100],"e":[85,85,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.856,0.856,0.651]},"o":{"x":[0.167,0.167,0.167],"y":[0.142,0.142,0.349]},"n":["0p833_0p856_0p167_0p142","0p833_0p856_0p167_0p142","0p833_0p651_0p167_0p349"],"t":24,"s":[85,85,100],"e":[75,75,100]},{"i":{"x":[0.77,0.77,0.833],"y":[0.809,0.809,0.97]},"o":{"x":[0.186,0.186,0.167],"y":[0.154,0.154,0.03]},"n":["0p77_0p809_0p186_0p154","0p77_0p809_0p186_0p154","0p833_0p97_0p167_0p03"],"t":40,"s":[75,75,100],"e":[87,87,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.868,0.868,0.607]},"o":{"x":[0.167,0.167,0.167],"y":[0.135,0.135,0.393]},"n":["0p833_0p868_0p167_0p135","0p833_0p868_0p167_0p135","0p833_0p607_0p167_0p393"],"t":56,"s":[87,87,100],"e":[83,83,100]},{"t":64}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[520,178],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3505421358,0.408821913775,0.513725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.57647061348,0.454901963472,0.411764711142,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-54,361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[92,92],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":16,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 19","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[556.846,775.484,0],"e":[182.5,664.5,0],"to":[-62.3910217285156,-18.4974060058594,0],"ti":[62.3910217285156,18.4974060058594,0]},{"t":64}],"ix":2},"a":{"a":0,"k":[-1035,52,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[46,43.579],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1430,303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[67,67],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[76,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-401.563,351.938],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 10","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[76,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-776,241],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[46.444,44],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-790,-54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[46,43.579],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1248,296],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[76,72],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1230,134],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[58,58],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[69.667,66],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1502,-247],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":3,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[69.667,66],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1127.625,-136.063],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[46.444,44],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.576470588235,0.454155117858,0.411441788019,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-415.562,57],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":-46,"ix":4},"sa":{"a":0,"k":18,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2416,-620],[-2648,8],[864,1156],[1088,444]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.454901960784,0.416844805549,0.383544802198,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098039216,0.739073211072,0.667128020642,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-256,-165],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":1,"nm":"Medium Turquoise Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[1750,519,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sw":3500,"sh":1038,"sc":"#45d28b","ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/like.json b/example/resource/like.json new file mode 100644 index 0000000000..95c14168e9 --- /dev/null +++ b/example/resource/like.json @@ -0,0 +1 @@ +{"assets":[],"layers":[{"ddd":0,"ind":0,"ty":1,"nm":"品蓝色 纯色 1","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_0p667_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.537],"y":[0]},"n":["0p667_1_0p537_0"],"t":5,"s":[100],"e":[0]},{"t":17}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[400,320,0],"e":[408,274,0],"to":[1.33333337306976,-7.66666650772095,0],"ti":[-1.33333337306976,7.66666650772095,0]},{"t":17}]},"a":{"k":[400,300,0]},"s":{"k":[{"i":{"x":[0.518,0.518,0.667],"y":[1,1,0.667]},"o":{"x":[0.16,0.16,0.333],"y":[0.329,0.329,0.333]},"n":["0p518_1_0p16_0p329","0p518_1_0p16_0p329","0p667_0p667_0p333_0p333"],"t":5,"s":[0,0,100],"e":[160,160,100]},{"t":17}]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"k":{"i":[[0,0],[3.675,0],[0,0],[2.623,1.039],[10.49,18.686],[8.393,0],[0,0],[5.767,-5.706],[-0.526,-6.747],[8.391,-4.158],[2.101,0],[0,0],[0,-4.152],[0,0],[-4.196,0],[0,0],[-1.574,1.04],[-1.051,-0.52],[-31.47,0],[-9.441,41.527],[-2.097,6.748],[5.768,7.267]],"o":[[-7.342,-8.823],[0,0],[-12.065,0],[14.688,-23.358],[-5.772,-9.866],[0,0],[-3.671,-0.52],[-3.672,3.633],[4.198,46.715],[-1.572,-1.556],[0,0],[-4.198,0],[0,0],[0,4.155],[0,0],[2.097,0],[0.525,1.036],[0,0],[31.47,0],[2.098,-9.345],[3.671,-14.014],[0,0]],"v":[[521.158,276.64],[498.604,267.817],[454.021,267.817],[433.565,265.741],[435.663,188.92],[414.159,173.864],[413.112,173.864],[395.279,178.534],[390.561,194.626],[337.06,270.932],[331.816,268.856],[280.411,268.856],[272.544,276.642],[272.544,419.386],[280.411,427.172],[332.339,427.172],[338.111,425.096],[340.208,427.172],[464.514,426.652],[517.49,333.736],[523.785,308.82],[521.16,276.637]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 1"}],"sw":800,"sh":600,"sc":"#00b1ff","ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":1,"nm":"品蓝色 纯色 3","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11,"s":[0],"e":[100]},{"t":15}]},"r":{"k":0},"p":{"k":[400,300,0]},"a":{"k":[400,300,0]},"s":{"k":[100,100,100]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"k":{"i":[[0,0],[3.675,0],[0,0],[2.623,1.039],[10.49,18.686],[8.393,0],[0,0],[5.767,-5.706],[-0.526,-6.747],[8.391,-4.158],[2.101,0],[0,0],[0,-4.152],[0,0],[-4.196,0],[0,0],[-1.574,1.04],[-1.051,-0.52],[-31.47,0],[-9.441,41.527],[-2.097,6.748],[5.768,7.267]],"o":[[-7.342,-8.823],[0,0],[-12.065,0],[14.688,-23.358],[-5.772,-9.866],[0,0],[-3.671,-0.52],[-3.672,3.633],[4.198,46.715],[-1.572,-1.556],[0,0],[-4.198,0],[0,0],[0,4.155],[0,0],[2.097,0],[0.525,1.036],[0,0],[31.47,0],[2.098,-9.345],[3.671,-14.014],[0,0]],"v":[[521.158,276.64],[498.604,267.817],[454.021,267.817],[433.565,265.741],[435.663,188.92],[414.159,173.864],[413.112,173.864],[395.279,178.534],[390.561,194.626],[337.06,270.932],[331.816,268.856],[280.411,268.856],[272.544,276.642],[272.544,419.386],[280.411,427.172],[332.339,427.172],[338.111,425.096],[340.208,427.172],[464.514,426.652],[517.49,333.736],[523.785,308.82],[521.16,276.637]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 3"},{"inv":false,"mode":"s","pt":{"k":{"i":[[0,0],[2.097,-9.861],[18.887,0],[6.816,0],[0,0],[-1.052,0.52],[5.769,62.291],[0.525,0],[-3.147,0],[0,0],[-2.098,-4.669],[12.067,-18.166],[-1.052,-2.596],[-21.503,0],[0,0],[-2.101,-2.597],[2.618,-8.822]],"o":[[-2.098,7.267],[-7.343,32.183],[-30.419,0],[0,0],[1.047,0],[2.624,-1.036],[0,-2.597],[0.525,-0.52],[0,0],[2.098,0],[8.392,15.571],[-4.199,6.23],[4.198,7.267],[0,0],[2.098,0],[3.671,2.597],[0,0]],"v":[[508.045,304.672],[501.75,330.626],[463.984,411.599],[339.679,412.119],[339.679,287.025],[342.303,286.505],[406.292,193.589],[406.292,189.956],[411.537,189.435],[413.634,189.435],[420.977,196.702],[418.353,259.51],[416.781,273.524],[452.971,283.903],[498.081,283.903],[507.524,286.5],[508.049,304.668]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 1"},{"inv":false,"mode":"s","pt":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[323.943,411.599],[287.753,411.599],[287.753,284.428],[323.943,284.428]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 2"}],"sw":800,"sh":600,"sc":"#00b1ff","ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":1,"nm":"品蓝色 纯色 2","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11,"s":[0],"e":[27]},{"t":16}]},"r":{"k":0},"p":{"k":[400,300,0]},"a":{"k":[400,300,0]},"s":{"k":[100,100,100]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"k":{"i":[[0,0],[3.675,0],[0,0],[2.623,1.039],[10.49,18.686],[8.393,0],[0,0],[5.767,-5.706],[-0.526,-6.747],[8.391,-4.158],[2.101,0],[0,0],[0,-4.152],[0,0],[-4.196,0],[0,0],[-1.574,1.04],[-1.051,-0.52],[-31.47,0],[-9.441,41.527],[-2.097,6.748],[5.768,7.267]],"o":[[-7.342,-8.823],[0,0],[-12.065,0],[14.688,-23.358],[-5.772,-9.866],[0,0],[-3.671,-0.52],[-3.672,3.633],[4.198,46.715],[-1.572,-1.556],[0,0],[-4.198,0],[0,0],[0,4.155],[0,0],[2.097,0],[0.525,1.036],[0,0],[31.47,0],[2.098,-9.345],[3.671,-14.014],[0,0]],"v":[[521.158,276.64],[498.604,267.817],[454.021,267.817],[433.565,265.741],[435.663,188.92],[414.159,173.864],[413.112,173.864],[395.279,178.534],[390.561,194.626],[337.06,270.932],[331.816,268.856],[280.411,268.856],[272.544,276.642],[272.544,419.386],[280.411,427.172],[332.339,427.172],[338.111,425.096],[340.208,427.172],[464.514,426.652],[517.49,333.736],[523.785,308.82],[521.16,276.637]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 1"}],"sw":800,"sh":600,"sc":"#00b1ff","ip":0,"op":50,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":1,"nm":"灰色 纯色 1","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[400,300,0]},"a":{"k":[400,300,0]},"s":{"k":[100,100,100]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"k":{"i":[[0,0],[3.675,0],[0,0],[2.623,1.039],[10.49,18.686],[8.393,0],[0,0],[5.767,-5.706],[-0.526,-6.747],[8.391,-4.158],[2.101,0],[0,0],[0,-4.152],[0,0],[-4.196,0],[0,0],[-1.574,1.04],[-1.051,-0.52],[-31.47,0],[-9.441,41.527],[-2.097,6.748],[5.768,7.267]],"o":[[-7.342,-8.823],[0,0],[-12.065,0],[14.688,-23.358],[-5.772,-9.866],[0,0],[-3.671,-0.52],[-3.672,3.633],[4.198,46.715],[-1.572,-1.556],[0,0],[-4.198,0],[0,0],[0,4.155],[0,0],[2.097,0],[0.525,1.036],[0,0],[31.47,0],[2.098,-9.345],[3.671,-14.014],[0,0]],"v":[[521.158,276.64],[498.604,267.817],[454.021,267.817],[433.565,265.741],[435.663,188.92],[414.159,173.864],[413.112,173.864],[395.279,178.534],[390.561,194.626],[337.06,270.932],[331.816,268.856],[280.411,268.856],[272.544,276.642],[272.544,419.386],[280.411,427.172],[332.339,427.172],[338.111,425.096],[340.208,427.172],[464.514,426.652],[517.49,333.736],[523.785,308.82],[521.16,276.637]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 3"},{"inv":false,"mode":"s","pt":{"k":{"i":[[0,0],[2.097,-9.861],[18.887,0],[6.816,0],[0,0],[-1.052,0.52],[5.769,62.291],[0.525,0],[-3.147,0],[0,0],[-2.098,-4.669],[12.067,-18.166],[-1.052,-2.596],[-21.503,0],[0,0],[-2.101,-2.597],[2.618,-8.822]],"o":[[-2.098,7.267],[-7.343,32.183],[-30.419,0],[0,0],[1.047,0],[2.624,-1.036],[0,-2.597],[0.525,-0.52],[0,0],[2.098,0],[8.392,15.571],[-4.199,6.23],[4.198,7.267],[0,0],[2.098,0],[3.671,2.597],[0,0]],"v":[[508.045,304.672],[501.75,330.626],[463.984,411.599],[339.679,412.119],[339.679,287.025],[342.303,286.505],[406.292,193.589],[406.292,189.956],[411.537,189.435],[413.634,189.435],[420.977,196.702],[418.353,259.51],[416.781,273.524],[452.971,283.903],[498.081,283.903],[507.524,286.5],[508.049,304.668]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 1"},{"inv":false,"mode":"s","pt":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[323.943,411.599],[287.753,411.599],[287.753,284.428],[323.943,284.428]],"c":true}},"o":{"k":100},"x":{"k":0},"nm":"蒙版 2"}],"sw":800,"sh":600,"sc":"#8c8c8c","ip":0,"op":37,"st":0,"bm":0,"sr":1}],"v":"4.5.4","ddd":0,"ip":0,"op":50,"fr":25,"w":800,"h":600} \ No newline at end of file diff --git a/example/resource/loader.json b/example/resource/loader.json new file mode 100644 index 0000000000..fe28cdf95c --- /dev/null +++ b/example/resource/loader.json @@ -0,0 +1 @@ +{"v":"4.5.7","fr":25,"ip":0,"op":250,"w":800,"h":600,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":3,"nm":"Resize","ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,300,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[150,150,100]}},"ao":0,"ip":0,"op":250,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[-180],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[0],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[5],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75,"s":[0],"e":[36]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[36],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":85,"s":[90],"e":[95]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86,"s":[95],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":95,"s":[90],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[90],"e":[270]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115,"s":[270],"e":[-180]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":116,"s":[-180],"e":[-180]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[-180],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":151,"s":[5],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":159,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":170,"s":[0],"e":[36]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":176,"s":[36],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[90],"e":[95]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":181,"s":[95],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":190,"s":[90],"e":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":200,"s":[90],"e":[270]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":210,"s":[270],"e":[-180]},{"t":211}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[0,0,0],"e":[0,-5,0],"to":[0,-0.83333331346512,0],"ti":[0,0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[0,-5,0],"e":[0,-5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[0,-5,0],"e":[0,0,0],"to":[0,0.83333331346512,0],"ti":[0.08333333581686,-0.91666668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":115,"s":[0,0,0],"e":[-0.5,0.5,0],"to":[-0.08333333581686,0.91666668653488,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":116,"s":[-0.5,0.5,0],"e":[0,0,0],"to":[0,0,0],"ti":[-0.08333333581686,0.91666668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":170,"s":[0,0,0],"e":[0,-5,0],"to":[0.08333333581686,-0.91666668653488,0],"ti":[0,0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":180,"s":[0,-5,0],"e":[0,-5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":200,"s":[0,-5,0],"e":[0,0,0],"to":[0,0.83333331346512,0],"ti":[0.08333333581686,-0.91666668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":210,"s":[0,0,0],"e":[-0.5,0.5,0],"to":[-0.08333333581686,0.91666668653488,0],"ti":[0.08333333581686,-0.08333333581686,0]},{"t":211}]},"a":{"a":0,"k":[-0.5,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[0,0,100],"e":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":23,"s":[80,80,100],"e":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":25,"s":[110,110,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":30,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":40,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":116,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":135,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":211,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":220,"s":[100,100,100],"e":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":225,"s":[110,110,100],"e":[80,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":228,"s":[80,80,100],"e":[0,0,100]},{"t":231}]}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-35],[-35,-35],[-35,35],[35,35]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-36.5],[-35,-21],[-35,21],[35,36.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-36.5],[-35,-21],[-35,21],[35,36.75]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34,-35.25],[-36,-35],[-36,35],[34,34.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34,-35.25],[-36,-35],[-36,35],[34,34.875]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-35],[-35,-35],[-35,35],[35,35]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":170,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-35],[-35,-35],[-35,35],[35,35]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-36.5],[-35,-21],[-35,21],[35,36.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":176,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-36.5],[-35,-21],[-35,21],[35,36.75]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":180,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":200,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35,-38.75],[-35,0],[-35,0],[35,39.375]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34,-35.25],[-36,-35],[-36,35],[34,34.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":210,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34,-35.25],[-36,-35],[-36,35],[34,34.875]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34,-35.25],[-36,-35],[-36,35],[34,34.875]],"c":true}]},{"t":220}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"rd","nm":"Round Corners 1","r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[50],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[34],"e":[27.778]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[27.778],"e":[8.333]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[8.333],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[0],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115,"s":[50],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":116,"s":[50],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[34],"e":[27.778]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":140,"s":[27.778],"e":[8.333]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":145,"s":[8.333],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":170,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":200,"s":[0],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":210,"s":[50],"e":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":211,"s":[50],"e":[64]},{"t":220}]},"mn":"ADBE Vector Filter - RC"}],"ip":0,"op":250,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/loader_animation.json b/example/resource/loader_animation.json new file mode 100644 index 0000000000..c6453f8b2b --- /dev/null +++ b/example/resource/loader_animation.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":74,"ip":0,"op":171,"w":128,"h":199,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":143,"s":[100],"e":[0]},{"t":156}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47,"s":[67.5,-5,0],"e":[67.5,116.75,0],"to":[0,20.2916660308838,0],"ti":[1.04942238330841,18.8896026611328,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[67.5,116.75,0],"e":[39.5,116.75,0],"to":[-0.04166666790843,-0.75,0],"ti":[7.02829837799072,-5.70764303207397,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":130,"s":[39.5,116.75,0],"e":[15.25,131,0],"to":[-13.0033321380615,10.5599355697632,0],"ti":[0,0,0]},{"t":156}],"ix":2},"a":{"a":0,"k":[1,-1.5,0],"ix":1},"s":{"a":0,"k":[29.167,29.167,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392156863,0.123029596665,0.123029596665,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1,-1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47,"op":172,"st":47,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":98,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":100,"s":[100],"e":[0]},{"t":111}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":100,"s":[71,120,0],"e":[80,116.625,0],"to":[1.5,-0.5625,0],"ti":[-1.5,0.5625,0]},{"t":110}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[14.065,14.065,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392156863,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":172,"st":98,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":98,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":100,"s":[100],"e":[0]},{"t":111}],"ix":11},"r":{"a":0,"k":206.765,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":100,"s":[62.25,119.125,0],"e":[49.25,117.625,0],"to":[-2.16666674613953,-0.25,0],"ti":[2.16666674613953,0.25,0]},{"t":111}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[-11.341,-16.193,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392156863,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":172,"st":98,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":125,"s":[100],"e":[0]},{"t":138}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":29,"s":[67.5,-5,0],"e":[67.5,116.75,0],"to":[0,20.2916660308838,0],"ti":[1.04942238330841,18.8896026611328,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[67.5,116.75,0],"e":[33.5,111.25,0],"to":[-0.04166666790843,-0.75,0],"ti":[7.02829837799072,-5.70764303207397,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112,"s":[33.5,111.25,0],"e":[3,121.75,0],"to":[-13.0033321380615,10.5599355697632,0],"ti":[0,0,0]},{"t":138}],"ix":2},"a":{"a":0,"k":[1,-1.5,0],"ix":1},"s":{"a":0,"k":[29.167,29.167,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.138299740062,0.81568627451,0.047981542699,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1,-1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":172,"st":29,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":80,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":82,"s":[100],"e":[0]},{"t":93}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":82,"s":[71,120,0],"e":[80,116.625,0],"to":[1.5,-0.5625,0],"ti":[-1.5,0.5625,0]},{"t":92}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[14.065,14.065,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.137254901961,0.81568627451,0.047058823529,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":172,"st":80,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":80,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":82,"s":[100],"e":[0]},{"t":93}],"ix":11},"r":{"a":0,"k":206.765,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":82,"s":[62.25,119.125,0],"e":[49.25,117.625,0],"to":[-2.16666674613953,-0.25,0],"ti":[2.16666674613953,0.25,0]},{"t":93}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[-11.341,-16.193,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.137254901961,0.81568627451,0.047058823529,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":172,"st":80,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":65,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":67,"s":[100],"e":[0]},{"t":78}],"ix":11},"r":{"a":0,"k":206.765,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":67,"s":[62.25,119.125,0],"e":[49.25,117.625,0],"to":[-2.16666674613953,-0.25,0],"ti":[2.16666674613953,0.25,0]},{"t":78}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[-11.341,-16.193,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,0.858823529412,0.090196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":172,"st":65,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":65,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":67,"s":[100],"e":[0]},{"t":78}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":67,"s":[71,120,0],"e":[80,116.625,0],"to":[1.5,-0.5625,0],"ti":[-1.5,0.5625,0]},{"t":77}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[14.065,14.065,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,0.858823529412,0.090196078431,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":65,"op":172,"st":65,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":111,"s":[100],"e":[0]},{"t":124}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":14,"s":[67.5,-5,0],"e":[67.5,116.75,0],"to":[0,20.2916660308838,0],"ti":[1.04942238330841,18.8896026611328,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":65,"s":[67.5,116.75,0],"e":[34.25,108.5,0],"to":[-0.04166666790843,-0.75,0],"ti":[7.74652624130249,-6.27588701248169,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":97,"s":[34.25,108.5,0],"e":[10.25,114.25,0],"to":[-11.3133344650269,9.16555500030518,0],"ti":[0,0,0]},{"t":123}],"ix":2},"a":{"a":0,"k":[1,-1.5,0],"ix":1},"s":{"a":0,"k":[29.167,29.167,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,0.857477644378,0.089842366237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1,-1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":14,"op":172,"st":14,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":152,"s":[100],"e":[0]},{"t":165}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56,"s":[67.5,-5,0],"e":[67.5,116.75,0],"to":[0,20.2916660308838,0],"ti":[1.04942238330841,18.8896026611328,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":107,"s":[67.5,116.75,0],"e":[91.25,106,0],"to":[-0.04166666790843,-0.75,0],"ti":[-18.7426891326904,-16.4572200775146,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":139,"s":[91.25,106,0],"e":[121.25,105.25,0],"to":[16.5734615325928,14.5525054931641,0],"ti":[0,0,0]},{"t":165}],"ix":2},"a":{"a":0,"k":[1,-1.5,0],"ix":1},"s":{"a":0,"k":[29.167,29.167,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.568120021446,0.007843136787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1,-1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":56,"op":172,"st":56,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 17","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":107,"s":[100],"e":[0]},{"t":118}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":107,"s":[71,120,0],"e":[80,116.625,0],"to":[1.5,-0.5625,0],"ti":[-1.5,0.5625,0]},{"t":117}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[14.065,14.065,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.56862745098,0.007843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":105,"op":172,"st":105,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 16","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[85]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":107,"s":[85],"e":[0]},{"t":118}],"ix":11},"r":{"a":0,"k":206.765,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":107,"s":[62.25,119.125,0],"e":[49.25,117.625,0],"to":[-2.16666674613953,-0.25,0],"ti":[2.16666674613953,0.25,0]},{"t":118}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[-11.341,-16.193,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.56862745098,0.007843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":105,"op":172,"st":105,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 15","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":134,"s":[100],"e":[0]},{"t":147}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[67.5,-5,0],"e":[67.5,116.75,0],"to":[0,20.2916660308838,0],"ti":[1.04942238330841,18.8896026611328,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88,"s":[67.5,116.75,0],"e":[91.25,106,0],"to":[-0.04166666790843,-0.75,0],"ti":[-12.3503103256226,-21.6702175140381,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":120,"s":[91.25,106,0],"e":[121.25,122.75,0],"to":[10.5734605789185,18.5525054931641,0],"ti":[0,0,0]},{"t":146}],"ix":2},"a":{"a":0,"k":[1,-1.5,0],"ix":1},"s":{"a":0,"k":[29.167,29.167,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.107927718817,0.642268401501,0.949019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1,-1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":172,"st":37,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 14","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":86,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":88,"s":[100],"e":[0]},{"t":99}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":88,"s":[71,120,0],"e":[80,116.625,0],"to":[1.5,-0.5625,0],"ti":[-1.5,0.5625,0]},{"t":98}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[14.065,14.065,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109803921569,0.643137254902,0.949019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":86,"op":172,"st":86,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 13","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":86,"s":[0],"e":[85]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":88,"s":[85],"e":[0]},{"t":99}],"ix":11},"r":{"a":0,"k":206.765,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":88,"s":[62.25,119.125,0],"e":[49.25,117.625,0],"to":[-2.16666674613953,-0.25,0],"ti":[2.16666674613953,0.25,0]},{"t":99}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[-11.341,-16.193,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109803921569,0.643137254902,0.949019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":86,"op":172,"st":86,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":49,"s":[0],"e":[85]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":51,"s":[85],"e":[0]},{"t":62}],"ix":11},"r":{"a":0,"k":206.765,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":51,"s":[62.25,119.125,0],"e":[49.25,117.625,0],"to":[-2.16666674613953,-0.25,0],"ti":[2.16666674613953,0.25,0]},{"t":62}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[-11.341,-16.193,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0,0.549019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":49,"op":172,"st":49,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":49,"s":[1],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":51,"s":[100],"e":[0]},{"t":62}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":51,"s":[71,120,0],"e":[80,116.625,0],"to":[1.5,-0.5625,0],"ti":[-1.5,0.5625,0]},{"t":61}],"ix":2},"a":{"a":0,"k":[19.552,26.661,0],"ix":1},"s":{"a":0,"k":[14.065,14.065,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.5,-0.375],[10.625,-5.625],[0,0],[0.375,0.125]],"o":[[-3.375,-0.5],[-10.625,5.625],[0,0],[7.875,-5.25]],"v":[[28.125,22],[11.75,25.875],[14.5,31.25],[27,27.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0,0.549019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":49,"op":172,"st":49,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[100],"e":[0]},{"t":109}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[67.5,-5,0],"e":[67.5,116.75,0],"to":[0,20.2916660308838,0],"ti":[1.04942238330841,18.8896026611328,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51,"s":[67.5,116.75,0],"e":[91.25,106,0],"to":[-0.04166666790843,-0.75,0],"ti":[-16.4489860534668,-18.7499160766602,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[91.25,106,0],"e":[116.75,116,0],"to":[10.5734605789185,12.0525054931641,0],"ti":[0,0,0]},{"t":109}],"ix":2},"a":{"a":0,"k":[1,-1.5,0],"ix":1},"s":{"a":0,"k":[29.167,29.167,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0,0.549019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1,-1.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":172,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/loading_animation.json b/example/resource/loading_animation.json new file mode 100644 index 0000000000..c7de61b8e0 --- /dev/null +++ b/example/resource/loading_animation.json @@ -0,0 +1 @@ +{"assets":[],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"形状图层 5","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":8,"s":[100],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":24,"s":[30],"e":[100]},{"t":40}]},"r":{"k":0},"p":{"k":[187.875,77.125,0]},"a":{"k":[-76.375,-2.875,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":8,"s":[100,100,100],"e":[200,200,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":24,"s":[200,200,100],"e":[100,100,100]},{"t":40}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[18,18]},"p":{"k":[0,0]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"k":[1,1,1,1]},"o":{"k":100},"w":{"k":0},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"k":[0.87,0.42,0.56,1]},"o":{"k":100},"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[-76.482,-3.482],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":40,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 4","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":6,"s":[100],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":22,"s":[30],"e":[100]},{"t":36}]},"r":{"k":0},"p":{"k":[162.125,76.625,0]},"a":{"k":[-76.375,-2.875,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":6,"s":[100,100,100],"e":[200,200,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":22,"s":[200,200,100],"e":[100,100,100]},{"t":36}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[18,18]},"p":{"k":[0,0]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"k":[1,1,1,1]},"o":{"k":100},"w":{"k":0},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"k":[0.81,0.55,0.82,1]},"o":{"k":100},"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[-76.482,-3.482],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":40,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"形状图层 3","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":4,"s":[100],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":20,"s":[30],"e":[100]},{"t":32}]},"r":{"k":0},"p":{"k":[135.625,76.625,0]},"a":{"k":[-76.375,-2.875,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":4,"s":[100,100,100],"e":[200,200,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":20,"s":[200,200,100],"e":[100,100,100]},{"t":32}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[18,18]},"p":{"k":[0,0]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"k":[1,1,1,1]},"o":{"k":100},"w":{"k":0},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"k":[0.47,0.31,0.62,1]},"o":{"k":100},"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[-76.482,-3.482],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":40,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"形状图层 2","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":2,"s":[100],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":16,"s":[30],"e":[100]},{"t":28}]},"r":{"k":0},"p":{"k":[109.375,76.625,0]},"a":{"k":[-76.625,-3.125,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":2,"s":[100,100,100],"e":[200,200,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":16,"s":[200,200,100],"e":[100,100,100]},{"t":28}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[18,18]},"p":{"k":[0,0]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"k":[1,1,1,1]},"o":{"k":100},"w":{"k":0},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"k":[0.54,0.81,0.89,1]},"o":{"k":100},"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[-76.482,-3.482],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":40,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"形状图层 1","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[100],"e":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":12,"s":[30],"e":[100]},{"t":24}]},"r":{"k":0},"p":{"k":[82.625,76.625,0]},"a":{"k":[-76.625,-3.375,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":0,"s":[100,100,100],"e":[200,200,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p833_0p833_0p333_0","0p833_0p833_0p333_0","0p833_0p833_0p333_0p333"],"t":12,"s":[200,200,100],"e":[100,100,100]},{"t":24}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[18,18]},"p":{"k":[0,0]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"k":[1,1,1,1]},"o":{"k":100},"w":{"k":0},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"fl","c":{"k":[0.34,0.45,0.78,1]},"o":{"k":100},"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[-76.482,-3.482],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":40,"st":0,"bm":0,"sr":1}],"v":"4.5.4","ddd":0,"ip":0,"op":40,"fr":24,"w":280,"h":160} \ No newline at end of file diff --git a/example/resource/mnemonics.json b/example/resource/mnemonics.json new file mode 100644 index 0000000000..5c2020b29a --- /dev/null +++ b/example/resource/mnemonics.json @@ -0,0 +1 @@ +{"v":"5.0.0","fr":25,"ip":0,"op":101,"w":1080,"h":1080,"nm":"mnemonics","ddd":1,"assets":[{"id":"comp_15","layers":[{"ddd":1,"ind":1,"ty":4,"nm":"pink circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":0,"k":-7,"ix":9},"rz":{"a":0,"k":0,"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[933.891,385.891,0],"ix":2,"x":"var $bm_rt;\nvar l;\nl = thisComp.layer('pink line.Point1');\nvar point = thisComp.layer('pink line.Point1').content('Simple Path').content('Path 1').path.pointOnPath(div(thisComp.layer('pink line.Point1').content('Point Trim').offset, 360));\n$bm_rt = hasParent ? parent.fromComp(l.toComp(point)) : l.toComp(point);"},"a":{"a":0,"k":[-33.109,-122.109,0],"ix":1},"s":{"a":0,"k":[61,61,61],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wayfinder Follower","np":4,"mn":"Pseudo/WayfinderFollower","ix":1,"en":1,"ef":[{"ty":0,"nm":"Position","mn":"Pseudo/WayfinderFollower-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.502],"y":[1]},"o":{"x":[0.503],"y":[0]},"n":["0p502_1_0p503_0"],"t":0,"s":[97],"e":[3]},{"i":{"x":[0.502],"y":[1]},"o":{"x":[0.495],"y":[0]},"n":["0p502_1_0p495_0"],"t":50,"s":[3],"e":[97]},{"t":100}],"ix":1}},{"ty":0,"nm":"Offset","mn":"Pseudo/WayfinderFollower-0002","ix":2,"v":{"a":0,"k":0,"ix":2}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[49.781,49.781],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.721568627451,0.756862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22.1,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-33.109,-122.109],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":226,"st":0,"bm":0},{"ddd":1,"ind":2,"ty":4,"nm":"pink line","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":0,"k":0,"ix":9},"rz":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p5_1_0p333_0"],"t":0,"s":[-10],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.498],"y":[0]},"n":["0p667_1_0p498_0"],"t":50,"s":[10],"e":[-10]},{"t":100}],"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[540,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wayfinder Leader","np":5,"mn":"Pseudo/WayfinderLeader","ix":1,"en":1,"ef":[{"ty":0,"nm":"Start","mn":"Pseudo/WayfinderLeader-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":0,"nm":"End","mn":"Pseudo/WayfinderLeader-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset","mn":"Pseudo/WayfinderLeader-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-100,0],[-100,0],[-100,0],[-100,0]],"o":[[100,0],[100,0],[100,0],[100,0],[0,0]],"v":[[-400,-25],[-200,25],[0,-25],[200,25],[400,-25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.941176470588,0.486274509804,0.521568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Simple Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(1).value;"},"e":{"a":0,"k":100,"ix":2,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(2).value;"},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(3).value;"},"m":2,"ix":2,"nm":"Main Path Trim","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":226,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"pink line.Point1","cl":"Point1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-100,0],[-100,0],[-100,0],[-100,0]],"o":[[100,0],[100,0],[100,0],[100,0],[0,0]],"v":[[-400,-25],[-200,25],[0,-25],[200,25],[400,-25]],"c":false},"ix":2,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Contents')('Path 1')('Path');"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Position');"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Anchor Point');"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Scale');"},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Rotation');"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Opacity');"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Skew');"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Skew Axis');"},"nm":"Transform"}],"nm":"Simple Path","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2,"x":"var $bm_rt;\n$bm_rt = 0.0001;"},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\nvar mainTrim, start, end, pos, offset, trim, pointOffset, pointOffset, point;\nmainTrim = parent.content('Main Path Trim');\nstart = mainTrim.start;\nend = mainTrim.end;\npos = thisComp.layer('pink circle').effect('Wayfinder Follower')(1);\noffset = mainTrim.offset;\ntrim = sub(360, mul(thisProperty.propertyGroup(1).end, 3.6));\npointOffset = thisComp.layer('pink circle').effect('Wayfinder Follower')(2);\nif (pointOffset < 0)\n pointOffset = sub(360, mod(Math.abs(pointOffset), 360));\npoint = mod(sum(mul(div(pos, 100), trim), pointOffset), 360);\n$bm_rt = sum(linear(point, 0, 360, mul(div(start, 100), 360), mul(div(end, 100), trim)), offset);"},"m":2,"ix":3,"nm":"Point Trim","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":226,"st":0,"bm":0}]},{"id":"comp_16","layers":[{"ddd":1,"ind":1,"ty":4,"nm":"purple line","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":0,"k":0,"ix":9},"rz":{"a":1,"k":[{"i":{"x":[0.503],"y":[1]},"o":{"x":[0.496],"y":[0]},"n":["0p503_1_0p496_0"],"t":0,"s":[10],"e":[-10]},{"i":{"x":[0.497],"y":[1]},"o":{"x":[0.495],"y":[0]},"n":["0p497_1_0p495_0"],"t":50,"s":[-10],"e":[10]},{"t":100}],"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[540,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wayfinder Leader","np":5,"mn":"Pseudo/WayfinderLeader","ix":1,"en":1,"ef":[{"ty":0,"nm":"Start","mn":"Pseudo/WayfinderLeader-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":0,"nm":"End","mn":"Pseudo/WayfinderLeader-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset","mn":"Pseudo/WayfinderLeader-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0]],"o":[[57.143,0],[57.143,0],[57.143,0],[57.143,0],[57.143,0],[57.143,0],[57.143,0],[0,0]],"v":[[-400,-25],[-285.714,25],[-171.429,-25],[-57.143,25],[57.143,-25],[171.429,25],[285.714,-25],[400,25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.470588235294,0.356862745098,0.654901960784,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Simple Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(1).value;"},"e":{"a":0,"k":100,"ix":2,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(2).value;"},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(3).value;"},"m":2,"ix":2,"nm":"Main Path Trim","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":226,"st":0,"bm":0},{"ddd":1,"ind":2,"ty":4,"nm":"small purple circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":0,"k":-2,"ix":9},"rz":{"a":0,"k":0,"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[138.573,471.552,0],"ix":2,"x":"var $bm_rt;\nvar l;\nl = thisComp.layer('purple line.Point1');\nvar point = thisComp.layer('purple line.Point1').content('Simple Path').content('Path 1').path.pointOnPath(div(thisComp.layer('purple line.Point1').content('Point Trim').offset, 360));\n$bm_rt = hasParent ? parent.fromComp(l.toComp(point)) : l.toComp(point);"},"a":{"a":0,"k":[106.148,-378.979,0],"ix":1},"s":{"a":0,"k":[127.821,127.821,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wayfinder Follower","np":4,"mn":"Pseudo/WayfinderFollower","ix":1,"en":1,"ef":[{"ty":0,"nm":"Position","mn":"Pseudo/WayfinderFollower-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.485],"y":[1]},"o":{"x":[0.495],"y":[0]},"n":["0p485_1_0p495_0"],"t":0,"s":[3],"e":[97]},{"i":{"x":[0.503],"y":[1]},"o":{"x":[0.508],"y":[0]},"n":["0p503_1_0p508_0"],"t":50,"s":[97],"e":[3]},{"t":100}],"ix":1}},{"ty":0,"nm":"Offset","mn":"Pseudo/WayfinderFollower-0002","ix":2,"v":{"a":0,"k":0,"ix":2}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[32.712,32.712],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176470588,0.682352941176,0.803921568627,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[106.148,-378.979],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":226,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"purple line.Point1","cl":"Point1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0],[-57.143,0]],"o":[[57.143,0],[57.143,0],[57.143,0],[57.143,0],[57.143,0],[57.143,0],[57.143,0],[0,0]],"v":[[-400,-25],[-285.714,25],[-171.429,-25],[-57.143,25],[57.143,-25],[171.429,25],[285.714,-25],[400,25]],"c":false},"ix":2,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Contents')('Path 1')('Path');"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1.345,81.745],"ix":2,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Position');"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Anchor Point');"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Scale');"},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Rotation');"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Opacity');"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Skew');"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\n$bm_rt = parent.content('Simple Path')('Transform')('Skew Axis');"},"nm":"Transform"}],"nm":"Simple Path","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2,"x":"var $bm_rt;\n$bm_rt = 0.0001;"},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\nvar mainTrim, start, end, pos, offset, trim, pointOffset, pointOffset, point;\nmainTrim = parent.content('Main Path Trim');\nstart = mainTrim.start;\nend = mainTrim.end;\npos = thisComp.layer('small purple circle').effect('Wayfinder Follower')(1);\noffset = mainTrim.offset;\ntrim = sub(360, mul(thisProperty.propertyGroup(1).end, 3.6));\npointOffset = thisComp.layer('small purple circle').effect('Wayfinder Follower')(2);\nif (pointOffset < 0)\n pointOffset = sub(360, mod(Math.abs(pointOffset), 360));\npoint = mod(sum(mul(div(pos, 100), trim), pointOffset), 360);\n$bm_rt = sum(linear(point, 0, 360, mul(div(start, 100), 360), mul(div(end, 100), trim)), offset);"},"m":2,"ix":3,"nm":"Point Trim","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":226,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,541,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[76,76,100],"ix":6}},"ao":0,"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"centre yellow circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2},"a":{"a":0,"k":[-411.797,-229.797,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.234,0.234,0.667],"y":[0.954,0.954,1]},"o":{"x":[0.125,0.125,0.333],"y":[0.419,0.419,0]},"n":["0p234_0p954_0p125_0p419","0p234_0p954_0p125_0p419","0p667_1_0p333_0"],"t":24,"s":[100,100,100],"e":[127.4,127.4,100]},{"i":{"x":[0.552,0.552,0.667],"y":[0.914,0.914,1]},"o":{"x":[0.456,0.456,0.333],"y":[-0.096,-0.096,0]},"n":["0p552_0p914_0p456_-0p096","0p552_0p914_0p456_-0p096","0p667_1_0p333_0"],"t":26,"s":[127.4,127.4,100],"e":[96,96,100]},{"i":{"x":[0.198,0.198,0.667],"y":[1,1,1]},"o":{"x":[0.358,0.358,0.167],"y":[-0.128,-0.128,0]},"n":["0p198_1_0p358_-0p128","0p198_1_0p358_-0p128","0p667_1_0p167_0"],"t":34,"s":[96,96,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0","0p667_1_0p167_0"],"t":38,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.234,0.234,0.667],"y":[0.954,0.954,1]},"o":{"x":[0.125,0.125,0.333],"y":[0.419,0.419,0]},"n":["0p234_0p954_0p125_0p419","0p234_0p954_0p125_0p419","0p667_1_0p333_0"],"t":74,"s":[100,100,100],"e":[127.4,127.4,100]},{"i":{"x":[0.552,0.552,0.667],"y":[0.914,0.914,1]},"o":{"x":[0.456,0.456,0.333],"y":[-0.096,-0.096,0]},"n":["0p552_0p914_0p456_-0p096","0p552_0p914_0p456_-0p096","0p667_1_0p333_0"],"t":76,"s":[127.4,127.4,100],"e":[96,96,100]},{"i":{"x":[0.198,0.198,0.667],"y":[1,1,1]},"o":{"x":[0.358,0.358,0.167],"y":[-0.128,-0.128,0]},"n":["0p198_1_0p358_-0p128","0p198_1_0p358_-0p128","0p667_1_0p167_0"],"t":84,"s":[96,96,100],"e":[100,100,100]},{"t":88}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.262,0],[0,-12.262],[12.262,0],[0,12.262]],"o":[[12.262,0],[0,12.262],[-12.262,0],[0,-12.262]],"v":[[0,-22.203],[22.203,0],[0,22.203],[-22.203,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[-411.797,-229.797],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235294819,0.929411768913,0.35686275363,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"large circle R","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,59,0],"ix":2},"a":{"a":0,"k":[41.106,-37.462,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[398.419,-356.462],[39.106,-356.462],[39.106,302.245],[398.419,302.245]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ef":[{"ty":5,"nm":"Wayfinder Leader","np":5,"mn":"Pseudo/WayfinderLeader","ix":1,"en":1,"ef":[{"ty":0,"nm":"Start","mn":"Pseudo/WayfinderLeader-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":0,"nm":"End","mn":"Pseudo/WayfinderLeader-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset","mn":"Pseudo/WayfinderLeader-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-153.567,0],[0,-153.567],[153.567,0],[0,153.567]],"o":[[153.567,0],[0,153.567],[-153.567,0],[0,-153.567]],"v":[[0,-278.058],[278.058,0],[0,278.058],[-278.058,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.629320750517,0.552072622262,0.71171875,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[41.106,-37.462],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(1).value;"},"e":{"a":0,"k":100,"ix":2,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(2).value;"},"o":{"a":0,"k":0,"ix":3,"x":"var $bm_rt;\n$bm_rt = effect('Wayfinder Leader')(3).value;"},"m":2,"ix":2,"nm":"Main Path Trim","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"pink line & circle","parent":1,"refId":"comp_15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.026,82.711,0],"ix":2},"a":{"a":0,"k":[540,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1080,"h":1080,"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"purple line and circle","parent":1,"refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.105,65.921,0],"ix":2},"a":{"a":0,"k":[540,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1080,"h":1080,"ip":0,"op":101,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"large circle L","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,59,0],"ix":2},"a":{"a":0,"k":[41.106,-37.462,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[42.419,-356.462],[-316.894,-356.462],[-316.894,302.245],[42.419,302.245]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[556.115,556.115],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.629320750517,0.552072622262,0.71171875,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[41.106,-37.462],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":101,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/movie_loading.json b/example/resource/movie_loading.json new file mode 100644 index 0000000000..93990ccce6 --- /dev/null +++ b/example/resource/movie_loading.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":100,"h":100,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[287.27],"e":[646.501]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[646.501],"e":[1006.517]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[1006.517],"e":[1366.011]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[1366.011],"e":[1725.391]},{"t":149.000006068894}],"ix":10},"p":{"a":0,"k":[49.123,50.123,0],"ix":2},"a":{"a":0,"k":[-17.377,-13.377,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[25.928,25.928],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":163.000006639126,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[214.668],"e":[574.301]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[574.301],"e":[935.271]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[935.271],"e":[1295.556]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[1295.556],"e":[1655.136]},{"t":149.000006068894}],"ix":10},"p":{"a":0,"k":[49.123,50.123,0],"ix":2},"a":{"a":0,"k":[-17.377,-13.377,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[25.928,25.928],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":163.000006639126,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[143.536],"e":[503.692]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[503.692],"e":[863.287]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[863.287],"e":[1223.296]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[1223.296],"e":[1582.854]},{"t":149.000006068894}],"ix":10},"p":{"a":0,"k":[49.123,50.123,0],"ix":2},"a":{"a":0,"k":[-17.377,-13.377,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[25.928,25.928],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":163.000006639126,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[70.817],"e":[430.711]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[430.711],"e":[791.651]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[791.651],"e":[1150.155]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[1150.155],"e":[1510.652]},{"t":149.000006068894}],"ix":10},"p":{"a":0,"k":[49.123,50.123,0],"ix":2},"a":{"a":0,"k":[-17.377,-13.377,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[25.928,25.928],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":163.000006639126,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[0],"e":[360]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[360],"e":[720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[720],"e":[1080]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[1080],"e":[1440]},{"t":149.000006068894}],"ix":10},"p":{"a":0,"k":[49.123,50.123,0],"ix":2},"a":{"a":0,"k":[-17.377,-13.377,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[25.928,25.928],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":163.000006639126,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.373,50.123,0],"ix":2},"a":{"a":0,"k":[1.623,-1.377,0],"ix":1},"s":{"a":0,"k":[45.779,45.779,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[25.928,25.928],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.123,50.623,0],"ix":2},"a":{"a":0,"k":[1.623,-1.377,0],"ix":1},"s":{"a":0,"k":[101.278,101.278,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[78.246,78.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.623,-1.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162.000006598395,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[34.906,4.721],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[23.498,36.876],"ix":2},"a":{"a":0,"k":[0.344,0.2],"ix":1},"s":{"a":0,"k":[100,92.67],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":167.000006802049,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/telegram.json b/example/resource/telegram.json new file mode 100644 index 0000000000..c0bb08e3ba --- /dev/null +++ b/example/resource/telegram.json @@ -0,0 +1 @@ +{"v":"4.10.1","fr":29.9700012207031,"ip":0,"op":120.0000048877,"w":200,"h":320,"nm":"telegram","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"paperplane","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-2.953,-6.222,0],"ix":2},"a":{"a":0,"k":[-2.453,-6.222,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.132,-4.625],[0,0],[0,0],[-2.25,-2.25],[0,0],[0,0],[-5.125,0.312],[0,0],[0,0],[2.75,3.5]],"o":[[0,0],[0,0],[-0.125,4.375],[0,0],[0,0],[2.25,2.25],[0,0],[0,0],[4.243,-0.259],[0,0],[0,0],[-3.169,-4.033]],"v":[[27.125,-46.625],[-39.25,-23.5],[-44.75,-17.125],[-40.125,-10.25],[-22.625,-2.125],[-13.25,3.125],[-8,11],[0.75,29.625],[8.5,35.813],[15.125,29.25],[38.75,-36.25],[38.5,-46.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"logo circle","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.5,-15,0],"ix":2},"a":{"a":0,"k":[1.5,-14.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[175,175],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.172549019608,0.647058823529,0.878431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.5,-14.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"mother","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[102,239,0],"e":[102,160,0],"to":[0,-13.1666669845581,0],"ti":[0,26.3333339691162,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":6,"s":[102,160,0],"e":[102,81,0],"to":[0,-26.3333339691162,0],"ti":[0,13.1666669845581,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":19,"s":[102,81,0],"e":[102,81,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":21,"s":[102,81,0],"e":[102,156,0],"to":[0,12.5,0],"ti":[0,-26.3333339691162,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[102,156,0],"e":[102,239,0],"to":[0,26.3333339691162,0],"ti":[0,-0.66666668653488,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":28,"s":[102,239,0],"e":[102,160,0],"to":[0,0.66666668653488,0],"ti":[0,26.3333339691162,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":34,"s":[102,160,0],"e":[102,81,0],"to":[0,-26.3333339691162,0],"ti":[0,13.1666669845581,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":47,"s":[102,81,0],"e":[102,81,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":49,"s":[102,81,0],"e":[102,156,0],"to":[0,12.5,0],"ti":[0,-26.3333339691162,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":53,"s":[102,156,0],"e":[102,239,0],"to":[0,26.3333339691162,0],"ti":[0,-9.83333301544189,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":56,"s":[102,239,0],"e":[102,215,0],"to":[0,9.83333301544189,0],"ti":[0,4,0]},{"t":60.0000024438501}],"ix":2},"a":{"a":0,"k":[1.5,-14.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[100,71.429,100],"e":[82,98.966,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":6,"s":[82,98.966,100],"e":[100,77.143,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0","0p667_1_0p167_0"],"t":19,"s":[100,77.143,100],"e":[100,77.143,100]},{"i":{"x":[0.703,0.703,0.703],"y":[1,1,1]},"o":{"x":[0.185,0.185,0.185],"y":[0,0,0]},"n":["0p703_1_0p185_0","0p703_1_0p185_0","0p703_1_0p185_0"],"t":21,"s":[100,77.143,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":25,"s":[100,100,100],"e":[100,71.429,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":28,"s":[100,71.429,100],"e":[82.857,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":34,"s":[82.857,100,100],"e":[100,77.143,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0","0p667_1_0p167_0"],"t":47,"s":[100,77.143,100],"e":[100,77.143,100]},{"i":{"x":[0.703,0.703,0.703],"y":[1,1,1]},"o":{"x":[0.185,0.185,0.185],"y":[0,0,0]},"n":["0p703_1_0p185_0","0p703_1_0p185_0","0p703_1_0p185_0"],"t":49,"s":[100,77.143,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":53,"s":[100,100,100],"e":[100,71.429,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":56,"s":[100,71.429,100],"e":[100,100,100]},{"t":60.0000024438501}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[175,175],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.172549019608,0.647058823529,0.878431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.5,-14.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[102,303.6,0],"ix":2},"a":{"a":0,"k":[-4,329,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[60,60,100],"e":[42,42,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":6,"s":[42,42,100],"e":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_1_0p333_0","0p833_1_0p333_0","0p833_1_0p333_0"],"t":19,"s":[60,60,100],"e":[55,55,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0","0p667_1_0p167_0"],"t":25,"s":[55,55,100],"e":[60,60,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":28,"s":[60,60,100],"e":[42,42,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":34,"s":[42,42,100],"e":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_1_0p333_0","0p833_1_0p333_0","0p833_1_0p333_0"],"t":47,"s":[60,60,100],"e":[55,55,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0","0p667_1_0p167_0"],"t":53,"s":[55,55,100],"e":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0","0p833_1_0p167_0"],"t":56,"s":[60,60,100],"e":[55,55,100]},{"t":60.0000024438501}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[380,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333333333,0.933333333333,0.933333333333,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-4,329],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[74.737,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/worm.json b/example/resource/worm.json new file mode 100644 index 0000000000..37e108ea9a --- /dev/null +++ b/example/resource/worm.json @@ -0,0 +1 @@ +{"v":"4.12.3","fr":60,"ip":0,"op":241,"w":800,"h":600,"nm":"worm_lottie","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.75,-5.5]],"o":[[0,0],[-4.75,5.5]],"v":[[67.125,146.75],[59.375,147.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.286274509804,0.301960784314,0.419607873056,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[406.875,329,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.071,0],[0,-2.071],[-2.071,0],[0,2.071]],"o":[[-2.071,0],[0,2.071],[2.071,0],[0,-2.071]],"v":[[0,-3.75],[-3.75,0],[0,3.75],[3.75,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.286274509804,0.301960784314,0.419607873056,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.125,110.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[44.414,44.414],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-167,157],[141,157]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":10,"ix":1}},{"n":"o","nm":"offset","v":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":0,"s":[0],"e":[60]},{"t":60,"s":[60],"h":1},{"t":120,"s":[60],"h":1}],"ix":7,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 5","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.77],"y":[0]},"n":["0p833_0p833_0p77_0"],"t":120,"s":[21],"e":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[11],"e":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":175,"s":[21],"e":[21]},{"t":240}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[0.08,-1.677,0],"ix":2},"a":{"a":0,"k":[245.226,98.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.579,0],[0,-2.579],[-2.579,0],[0,2.579]],"o":[[-2.579,0],[0,2.579],[2.579,0],[0,-2.579]],"v":[[-18.5,3.33],[-23.17,8],[-18.5,12.67],[-13.83,8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280,66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18,3]],"o":[[0,0],[18,-3]],"v":[[245.5,98.5],[260,75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":241,"st":120,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 4","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.859],"y":[1]},"o":{"x":[0.709],"y":[0]},"n":["0p859_1_0p709_0"],"t":120,"s":[0],"e":[-10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.325],"y":[0]},"n":["0p833_0p833_0p325_0"],"t":172,"s":[-10],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":177,"s":[0],"e":[0]},{"t":240}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[1.226,-4,0],"ix":2},"a":{"a":0,"k":[245.226,98.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.485,0],[0,-2.485],[-2.485,0],[0,2.485]],"o":[[-2.485,0],[0,2.485],[2.485,0],[0,-2.485]],"v":[[-18.5,3.5],[-23,8],[-18.5,12.5],[-14,8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280,66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18,3]],"o":[[0,0],[18,-3]],"v":[[245.5,98.5],[260,75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":241,"st":120,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 3","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.77],"y":[0]},"n":["0p833_0p833_0p77_0"],"t":0,"s":[21],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":51,"s":[4],"e":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[21],"e":[21]},{"t":120}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[0.08,-1.677,0],"ix":2},"a":{"a":0,"k":[245.226,98.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.579,0],[0,-2.579],[-2.579,0],[0,2.579]],"o":[[-2.579,0],[0,2.579],[2.579,0],[0,-2.579]],"v":[[-18.5,3.33],[-23.17,8],[-18.5,12.67],[-13.83,8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280,66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18,3]],"o":[[0,0],[18,-3]],"v":[[245.5,98.5],[260,75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 2","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.709],"y":[0]},"n":["0p833_0p833_0p709_0"],"t":0,"s":[0],"e":[-22]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53,"s":[-22],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":57,"s":[0],"e":[0]},{"t":120}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[1.226,-4,0],"ix":2},"a":{"a":0,"k":[245.226,98.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":60,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.485,0],[0,-2.485],[-2.485,0],[0,2.485]],"o":[[-2.485,0],[0,2.485],[2.485,0],[0,-2.485]],"v":[[-18.5,3.5],[-23,8],[-18.5,12.5],[-14,8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280,66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18,3]],"o":[[0,0],[18,-3]],"v":[[245.5,98.5],[260,75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":3,"nm":"front head","parent":13,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[121,202,0],"e":[181,202,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[181,202,0],"e":[181,202,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":3,"nm":"front","parent":13,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[68,202,0],"e":[128,202,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[128,202,0],"e":[128,202,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"hump","parent":13,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[47,155,0],"e":[67,202,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[67,202,0],"e":[107,155,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":3,"nm":"back","parent":13,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[17,202,0],"e":[-3,202,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[-3,202,0],"e":[77,202,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":3,"nm":"back","parent":13,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-25,202,0],"e":[-45,202,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[-45,202,0],"e":[35,202,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[400,300,0],"e":[340,300,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[340,300,0],"e":[340,300,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.0]","np":3,"mn":"ADBE Layer Control","ix":1,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":12,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.1]","np":3,"mn":"ADBE Layer Control","ix":2,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":11,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.2]","np":3,"mn":"ADBE Layer Control","ix":3,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.3]","np":3,"mn":"ADBE Layer Control","ix":4,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":9,"ix":1}}]},{"ty":5,"nm":"Shape Layer 1: Path 1 [1.1.4]","np":3,"mn":"ADBE Layer Control","ix":5,"en":1,"ef":[{"ty":10,"nm":"Layer","mn":"ADBE Layer Control-0001","ix":1,"v":{"a":0,"k":8,"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-28,0],[-26,0],[-17,0],[0,0]],"o":[[0,0],[28,0],[29,0],[17,0],[0,0]],"v":[[-105,142],[-63,142],[-23,95],[8,142],[61,142]],"c":false},"ix":2,"x":"var $bm_rt;\nvar nullLayerNames = [\n 'Shape Layer 1: Path 1 [1.1.0]',\n 'Shape Layer 1: Path 1 [1.1.1]',\n 'Shape Layer 1: Path 1 [1.1.2]',\n 'Shape Layer 1: Path 1 [1.1.3]',\n 'Shape Layer 1: Path 1 [1.1.4]'\n ];\nvar origPath = thisProperty;\nvar origPoints = origPath.points();\nvar origInTang = origPath.inTangents();\nvar origOutTang = origPath.outTangents();\nvar getNullLayers = [];\nfor (var i = 0; i < nullLayerNames.length; i++) {\n try {\n getNullLayers.push(effect(nullLayerNames[i])('ADBE Layer Control-0001'));\n } catch (err) {\n getNullLayers.push(null);\n }\n}\nfor (var i = 0; i < getNullLayers.length; i++) {\n if (getNullLayers[i] != null && getNullLayers[i].index != thisLayer.index) {\n origPoints[i] = fromCompToSurface(getNullLayers[i].toComp(getNullLayers[i].anchorPoint));\n }\n}\n$bm_rt = createPath(origPoints, origInTang, origOutTang, origPath.isClosed());"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":17,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"worm","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[434,115,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[211,211,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[4.017]},{"t":241}],"ix":2},"w":800,"h":600,"ip":0,"op":241,"st":0,"bm":0}]} \ No newline at end of file From 7f7cde6b3003027a733fee5ca1f92e3ca44d1264 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 11:09:36 +0900 Subject: [PATCH 133/672] lottie/render: Draw layers form back to front in the composition layer. Change-Id: I41c0aedef7cc76e768c6d4776f7a29b3b1cab474 --- src/lottie/lottieitem.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 9785b4a80a..1dd37e8f78 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -380,8 +380,9 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } - for (auto &i : mLayers) { - i->render(painter, mask); + for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { + LOTLayerItem *layer = *i; + layer->render(painter, mask); } } From 12c88ff4b0ddf780aec98b3ebce62d44d4f62a90 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 11:52:00 +0900 Subject: [PATCH 134/672] lottie: few more resource for testing. Change-Id: I11c1bd4d87ca79416698a9f9b6ba9b68d859892d --- example/resource/a_mountain.json | 1 + example/resource/funky_chicken.json | 1 + example/resource/gradient_animated_background.json | 1 + example/resource/leap_frog_loader.json | 1 + example/resource/party_penguin.json | 1 + example/resource/peli-canon.json | 1 + example/resource/square_wheel.json | 1 + example/resource/triib_manage.json | 1 + 8 files changed, 8 insertions(+) create mode 100644 example/resource/a_mountain.json create mode 100644 example/resource/funky_chicken.json create mode 100644 example/resource/gradient_animated_background.json create mode 100644 example/resource/leap_frog_loader.json create mode 100644 example/resource/party_penguin.json create mode 100644 example/resource/peli-canon.json create mode 100644 example/resource/square_wheel.json create mode 100644 example/resource/triib_manage.json diff --git a/example/resource/a_mountain.json b/example/resource/a_mountain.json new file mode 100644 index 0000000000..65fed4be0b --- /dev/null +++ b/example/resource/a_mountain.json @@ -0,0 +1 @@ +{"v":"5.1.15","fr":25,"ip":0,"op":89,"w":300,"h":300,"nm":"MountainCircle","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"CloudA contornos","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[65,155,0],"e":[136,155,0],"to":[11.8333330154419,0,0],"ti":[-11.8333330154419,0,0]},{"t":88}],"ix":2},"a":{"a":0,"k":[21.25,16.25,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":10,"s":[100,0,100],"e":[100,110,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":17,"s":[100,110,100],"e":[100,90,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":22,"s":[100,90,100],"e":[100,100,100]},{"t":24}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.418],[4.418,0],[0,4.418],[-4.418,0]],"o":[[0,4.418],[-4.418,0],[0,-4.418],[4.418,0]],"v":[[8,0],[0,8],[-8,0],[0,-8]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-78,149],[222,149],[222,-151],[-78,-151]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-78,-151],[222,-151],[222,149],[-78,149]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.929000016755,0.929000016755,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.25,12.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.627],[6.627,0],[0,6.627],[-6.627,0]],"o":[[0,6.627],[-6.627,0],[0,-6.627],[6.627,0]],"v":[[12,0],[0,12],[-12,0],[0,-12]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72,141],[228,141],[228,-159],[-72,-159]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72,-159],[228,-159],[228,141],[-72,141]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.929000016755,0.929000016755,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.25,20.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.075],[6.075,0],[0,6.075],[-6.075,0]],"o":[[0,6.075],[-6.075,0],[0,-6.075],[6.075,0]],"v":[[11,0],[0,11],[-11,0],[0,-11]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-65,150],[235,150],[235,-150],[-65,-150]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-65,-150],[235,-150],[235,150],[-65,150]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.929000016755,0.929000016755,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.25,11.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.18],[7.18,0],[0,7.18],[-7.18,0]],"o":[[0,7.18],[-7.18,0],[0,-7.18],[7.18,0]],"v":[[13,0],[0,13],[-13,0],[0,-13]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-57,145],[243,145],[243,-155],[-57,-155]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-57,-155],[243,-155],[243,145],[-57,145]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.929000016755,0.929000016755,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.25,16.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Circle 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[137.25,137.25,0],"ix":1},"s":{"a":0,"k":[97.333,97.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-75.663],[75.663,0],[0,75.663],[-75.663,0]],"o":[[0,75.663],[-75.663,0],[0,-75.663],[75.663,0]],"v":[[137,0],[0,137],[-137,0],[0,-137]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,150],[150,150],[150,-150],[-150,-150]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,-150],[150,-150],[150,150],[-150,150]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.626999978458,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.25,137.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Sun contornos","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.25,"y":1},"o":{"x":0.75,"y":0},"n":"0p25_1_0p75_0","t":11,"s":[182,-13,0],"e":[182,83,0],"to":[0,16,0],"ti":[0,-13.6666669845581,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.75,"y":0},"n":"0p25_1_0p75_0","t":29,"s":[182,83,0],"e":[182,69,0],"to":[0,13.6666669845581,0],"ti":[0,2.33333325386047,0]},{"t":33}],"ix":2},"a":{"a":0,"k":[20.25,20.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-11.05],[11.05,0],[0,0]],"o":[[0,11.05],[0,0],[11.05,0]],"v":[[10,0],[-10,20],[-10,-20]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-192,207],[108,207],[108,-93],[-192,-93]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-192,-93],[108,-93],[108,207],[-192,207]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.611999990426,0.071000005685,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.25,20.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-11.046],[11.046,0],[0,11.046],[-11.046,0]],"o":[[0,11.046],[-11.046,0],[0,-11.046],[11.046,0]],"v":[[20,0],[0,20],[-20,0],[0,-20]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-182,207],[118,207],[118,-93],[-182,-93]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-182,-93],[118,-93],[118,207],[-182,207]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.769000004787,0.059000000299,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.25,20.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Circle 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[137.25,137.25,0],"ix":1},"s":{"a":0,"k":[97.333,97.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-75.663],[75.663,0],[0,75.663],[-75.663,0]],"o":[[0,75.663],[-75.663,0],[0,-75.663],[75.663,0]],"v":[[137,0],[0,137],[-137,0],[0,-137]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,150],[150,150],[150,-150],[-150,-150]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,-150],[150,-150],[150,150],[-150,150]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.626999978458,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.25,137.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"MountainF contornos","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,280.135,0],"ix":2},"a":{"a":0,"k":[113.88,151.115,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":0,"s":[100,0,100],"e":[100,110,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":7,"s":[100,110,100],"e":[100,90,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":12,"s":[100,90,100],"e":[100,100,100]},{"t":14}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[30.77,0],[14.62,5.52],[0,0],[-0.921,-0.9]],"o":[[-22.529,17.55],[-16.54,0],[0,0],[1.17,-0.03],[0,0]],"v":[[64.32,48.55],[-17.32,76.55],[-64.32,68.01],[-64.32,-76.52],[-61.039,-75.22]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-167.32,93.55],[132.68,93.55],[132.68,-206.45],[-167.32,-206.45]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-167.32,-206.45],[132.68,-206.45],[132.68,93.55],[-167.32,93.55]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.172999991623,0.243000000598,0.313999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.2,77.429],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[30.77,0],[23.34,38.3],[0,0],[-1.987,-1.96]],"o":[[-22.529,17.55],[-48.13,0],[0,0],[1.634,-2.264],[0,0]],"v":[[97.635,48.864],[15.995,76.865],[-97.635,12.995],[-34.613,-74.329],[-27.725,-74.905]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-134.005,93.865],[165.995,93.865],[165.995,-206.135],[-134.005,-206.135]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-134.005,-206.135],[165.995,-206.135],[165.995,93.865],[-134.005,93.865]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.204000001795,0.286000001197,0.368999974868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.885,77.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"CloudB contornos","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[181.824,192.221,0],"e":[216.824,192.221,0],"to":[5.83333349227905,0,0],"ti":[-5.83333349227905,0,0]},{"t":88}],"ix":2},"a":{"a":0,"k":[14.733,8.87,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":17,"s":[100,0,100],"e":[100,110,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":24,"s":[100,110,100],"e":[100,90,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":29,"s":[100,90,100],"e":[100,100,100]},{"t":31}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.392,-3.246],[3.246,0.392],[-0.391,3.246],[-3.246,-0.392]],"o":[[-0.391,3.246],[-3.246,-0.391],[0.391,-3.246],[3.246,0.391]],"v":[[5.877,0.708],[-0.709,5.878],[-5.878,-0.709],[0.708,-5.878]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-190.038,106.159],[109.962,106.159],[109.962,-193.841],[-190.038,-193.841]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-190.038,-193.841],[109.962,-193.841],[109.962,106.159],[-190.038,106.159]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.948,10.49],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.245,-2.028],[2.029,0.245],[-0.244,2.029],[-2.029,-0.244]],"o":[[-0.244,2.029],[-2.029,-0.245],[0.244,-2.029],[2.029,0.245]],"v":[[3.673,0.442],[-0.443,3.673],[-3.674,-0.443],[0.443,-3.674]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-191.304,110.478],[108.696,110.478],[108.696,-189.522],[-191.304,-189.522]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-191.304,-189.522],[108.696,-189.522],[108.696,110.478],[-191.304,110.478]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.213,6.171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.391,-3.246],[3.246,0.391],[-0.39,3.246],[-3.246,-0.391]],"o":[[-0.392,3.246],[-3.246,-0.392],[0.392,-3.246],[3.246,0.392]],"v":[[5.878,0.708],[-0.709,5.878],[-5.879,-0.708],[0.708,-5.878]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-173.609,105.902],[126.391,105.902],[126.391,-194.098],[-173.609,-194.098]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-173.609,-194.098],[126.391,-194.098],[126.391,105.902],[-173.609,105.902]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.518,10.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.538,-4.464],[4.464,0.539],[-0.538,4.464],[-4.464,-0.538]],"o":[[-0.537,4.463],[-4.463,-0.538],[0.538,-4.463],[4.463,0.538]],"v":[[8.082,0.974],[-0.975,8.081],[-8.082,-0.974],[0.975,-8.082]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-182.779,107.779],[117.221,107.779],[117.221,-192.221],[-182.779,-192.221]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-182.779,-192.221],[117.221,-192.221],[117.221,107.779],[-182.779,107.779]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.689,8.87],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Circle 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[137.25,137.25,0],"ix":1},"s":{"a":0,"k":[96.667,96.667,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-75.663],[75.663,0],[0,75.663],[-75.663,0]],"o":[[0,75.663],[-75.663,0],[0,-75.663],[75.663,0]],"v":[[137,0],[0,137],[-137,0],[0,-137]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,150],[150,150],[150,-150],[-150,-150]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,-150],[150,-150],[150,150],[-150,150]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.626999978458,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.25,137.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"MountainB contornos","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[174.57,280.73,0],"ix":2},"a":{"a":0,"k":[0.249,105.98,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":0,"s":[100,0,100],"e":[100,110,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":7,"s":[100,110,100],"e":[100,90,100]},{"i":{"x":[0.25,0.25,0.667],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.333],"y":[0,0,0]},"n":["0p25_1_0p75_0","0p25_1_0p75_0","0p667_1_0p333_0"],"t":12,"s":[100,90,100],"e":[100,100,100]},{"t":14}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[36.889,-6.891],[0,0]],"o":[[-19.399,30.58],[0,0],[0,0]],"v":[[43.91,-6.726],[-43.91,52.866],[8.52,-52.866]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-218.48,72.135],[81.52,72.135],[81.52,-227.865],[-218.48,-227.865]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-218.48,-227.865],[81.52,-227.865],[81.52,72.135],[-218.48,72.135]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109999997008,0.165000002992,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.159,53.116],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[137.25,137.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-75.663],[75.663,0],[0,75.663],[-75.663,0]],"o":[[0,75.663],[-75.663,0],[0,-75.663],[75.663,0]],"v":[[137,0],[0,137],[-137,0],[0,-137]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,150],[150,150],[150,-150],[-150,-150]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-150,-150],[150,-150],[150,150],[-150,150]],"c":true},"ix":2},"nm":"Trazado 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Combinar trazados 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.626999978458,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.25,137.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":89,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/funky_chicken.json b/example/resource/funky_chicken.json new file mode 100644 index 0000000000..9870f71602 --- /dev/null +++ b/example/resource/funky_chicken.json @@ -0,0 +1 @@ +{"v":"5.1.14","fr":30,"ip":0,"op":32,"w":512,"h":512,"nm":"cipa 3","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"cipa","refId":"comp_1","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[442,468,0],"ix":2},"a":{"a":0,"k":[450,450,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":900,"h":900,"ip":0,"op":32,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Слой-фигура 1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[442,440,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[103.311,100,100],"e":[85,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":8,"s":[85,100,100],"e":[103.311,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":16,"s":[103.311,100,100],"e":[85,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":24,"s":[85,100,100],"e":[103.311,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":32,"s":[103.311,100,100],"e":[85,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":40,"s":[85,100,100],"e":[103.311,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":49,"s":[103.311,100,100],"e":[85,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":57,"s":[85,100,100],"e":[103.311,100,100]},{"t":65}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[327.625,10.68],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Контур прямоугольника 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.582368259804,0.582368259804,0.582368259804,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[42.812,290.66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,132.703],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Прямоугольник 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":32,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Кривые ochki","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[297.64,420.945,0],"ix":2},"a":{"a":0,"k":[297.64,420.945,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[62.833,-11.624],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.215,12.99],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[98.247,-45.334],[59.58,56.999],[-31.331,-27.111],[-83.333,-10.978],[-101.333,5.021],[-101.666,62.354],[-124.333,70.354],[-115.333,-4.812],[-102.501,-17.593],[-31.331,-50.778],[46.914,-70.334],[90.247,-78.376]],"c":false}],"e":[{"i":[[0,0],[59.667,-10],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.424,11.803],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[134.139,-50.603],[88.999,52.688],[5.999,-32.978],[-100.333,-6.978],[-118.333,9.021],[-118.666,66.354],[-141.333,74.354],[-132.333,-0.812],[-119.501,-13.594],[5.999,-56.646],[76.334,-74.646],[124.143,-83.369]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[59.667,-10],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.424,11.803],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[134.139,-50.603],[88.999,52.688],[5.999,-32.978],[-100.333,-6.978],[-118.333,9.021],[-118.666,66.354],[-141.333,74.354],[-132.333,-0.812],[-119.501,-13.594],[5.999,-56.646],[76.334,-74.646],[124.143,-83.369]],"c":false}],"e":[{"i":[[0,0],[62.833,-11.624],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.215,12.99],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[98.247,-45.334],[59.58,56.999],[-31.331,-27.111],[-83.333,-10.978],[-101.333,5.021],[-101.666,62.354],[-124.333,70.354],[-115.333,-4.812],[-102.501,-17.594],[-31.331,-50.778],[46.914,-70.334],[90.247,-78.376]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[260.333,426.312],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[3.34,20.121],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-40.586,-15.689],[-6.773,-7.368],[-35.44,22.897]],"c":true}],"e":[{"i":[[4.375,20.5],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.638,-21.232],[27.639,-11.958],[-1.901,17.366]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[4.375,20.5],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.638,-21.232],[27.639,-11.958],[-1.901,17.366]],"c":true}],"e":[{"i":[[3.34,20.121],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-40.586,-15.689],[-6.773,-7.368],[-35.44,22.897]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[399.167,397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-37.857,7.499],[-8.502,7.569],[-38.857,-1.626]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.965,2.23],[25.91,2.98],[-2.965,-6.895]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.965,2.23],[25.91,2.98],[-2.965,-6.895]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-37.857,7.499],[-8.502,7.569],[-38.857,-1.626]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.783999992819,0.039000002543,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[398.812,383.062],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[4.125,20.75],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-40.586,-15.689],[-6.773,-7.368],[-36.586,22.311]],"c":true}],"e":[{"i":[[4.125,20.75],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.694,-20.958],[27.639,-11.958],[-0.694,17.042]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[4.125,20.75],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.694,-20.958],[27.639,-11.958],[-0.694,17.042]],"c":true}],"e":[{"i":[[4.125,20.75],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-40.586,-15.689],[-6.773,-7.368],[-36.586,22.311]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.579999976065,0.039000002543,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[399.167,397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-78.198,17.874],[7.634,11.583],[26,-3.667],[0,0]],"o":[[0,0],[54.631,-12.487],[-9.667,-14.667],[-25.958,3.661],[0,0]],"v":[[-84.836,-16.046],[-6.919,60.121],[27.414,-54.546],[-38.744,-60.302],[-96.586,-50.296]],"c":false}],"e":[{"i":[[0,0],[-69.656,15.715],[7.634,11.583],[26,-3.667],[0,0]],"o":[[0,0],[54.666,-12.334],[-9.667,-14.667],[-25.958,3.661],[0,0]],"v":[[-48.944,-21.315],[22.501,55.81],[56.834,-58.858],[-5.833,-64.858],[-62.69,-55.289]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-69.656,15.715],[7.634,11.583],[26,-3.667],[0,0]],"o":[[0,0],[54.666,-12.334],[-9.667,-14.667],[-25.958,3.661],[0,0]],"v":[[-48.944,-21.315],[22.501,55.81],[56.834,-58.858],[-5.833,-64.858],[-62.69,-55.289]],"c":false}],"e":[{"i":[[0,0],[-78.198,17.874],[7.634,11.583],[26,-3.667],[0,0]],"o":[[0,0],[54.631,-12.487],[-9.667,-14.667],[-25.958,3.661],[0,0]],"v":[[-84.836,-16.046],[-6.919,60.121],[27.414,-54.546],[-38.744,-60.302],[-96.586,-50.296]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[444.166,398.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[-47.667,7.666],[0,0],[0,0],[60.667,-11],[0,0],[0,0]],"o":[[0,0],[0,0],[47.667,-7.667],[0,0],[0,0],[-60.666,11],[0,0],[0,0]],"v":[[-159.381,42.754],[-82.245,6.333],[43.747,-23.188],[151.414,-38.522],[140.08,-40.522],[41.08,-27.522],[-85.934,3.188],[-155.787,36.774]],"c":true}],"e":[{"i":[[0,0],[0,0],[-47.667,7.666],[0,0],[0,0],[60.667,-11],[0,0],[0,0]],"o":[[0,0],[0,0],[47.667,-7.667],[0,0],[0,0],[-60.666,11],[0,0],[0,0]],"v":[[-175.833,43.833],[-44.833,-0.167],[77.643,-28.181],[180.833,-42.833],[169.5,-44.833],[74.976,-32.515],[-48.833,-4.167],[-172.501,39.501]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[-47.667,7.666],[0,0],[0,0],[60.667,-11],[0,0],[0,0]],"o":[[0,0],[0,0],[47.667,-7.667],[0,0],[0,0],[-60.666,11],[0,0],[0,0]],"v":[[-175.833,43.833],[-44.833,-0.167],[77.643,-28.181],[180.833,-42.833],[169.5,-44.833],[74.976,-32.515],[-48.833,-4.167],[-172.501,39.501]],"c":true}],"e":[{"i":[[0,0],[0,0],[-47.667,7.666],[0,0],[0,0],[60.667,-11],[0,0],[0,0]],"o":[[0,0],[0,0],[47.667,-7.667],[0,0],[0,0],[-60.666,11],[0,0],[0,0]],"v":[[-159.381,42.754],[-82.245,6.333],[43.747,-23.188],[151.414,-38.522],[140.08,-40.522],[41.08,-27.522],[-85.934,3.188],[-155.787,36.774]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039000002543,0.732999973671,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[307.833,374.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[2,-5],[-2.084,-0.811],[-1.333,2.333],[0,0],[-3,1.666]],"o":[[0,0],[0,0],[0,0],[-2,5],[6,2.333],[1.333,-2.333],[0,0],[3,-1.667]],"v":[[39.712,-40.466],[37.379,-61.133],[-33.958,-29.666],[-45.625,-16.666],[-52.958,59.667],[-31.958,49.667],[-31.291,-14.666],[-24.625,-20.666]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[2,-5],[-2.084,-0.811],[-1.333,2.333],[0,0],[-3,1.666]],"o":[[0,0],[0,0],[0,0],[-2,5],[6,2.333],[1.333,-2.333],[0,0],[3,-1.667]],"v":[[77.042,-46.333],[74.709,-67],[-50.958,-25.666],[-62.625,-12.666],[-69.958,63.667],[-48.958,53.667],[-48.291,-10.666],[-41.625,-16.666]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[2,-5],[-2.084,-0.811],[-1.333,2.333],[0,0],[-3,1.666]],"o":[[0,0],[0,0],[0,0],[-2,5],[6,2.333],[1.333,-2.333],[0,0],[3,-1.667]],"v":[[77.042,-46.333],[74.709,-67],[-50.958,-25.666],[-62.625,-12.666],[-69.958,63.667],[-48.958,53.667],[-48.291,-10.666],[-41.625,-16.666]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[2,-5],[-2.084,-0.811],[-1.333,2.333],[0,0],[-3,1.666]],"o":[[0,0],[0,0],[0,0],[-2,5],[6,2.333],[1.333,-2.333],[0,0],[3,-1.667]],"v":[[39.712,-40.466],[37.379,-61.133],[-33.958,-29.666],[-45.625,-16.666],[-52.958,59.667],[-31.958,49.667],[-31.291,-14.666],[-24.625,-20.666]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109999997008,0.313999998803,0.596000043084,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.292,438.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-49.105,-45.549],[-1.36,-53.772],[11.473,-44.105],[-14.527,49.228],[-89.438,-19.882],[-80.438,-36.382]],"c":true}],"e":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-11.774,-51.417],[32.536,-58.765],[45.369,-49.098],[14.893,44.917],[-52.107,-25.749],[-43.107,-42.249]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-11.774,-51.417],[32.536,-58.765],[45.369,-49.098],[14.893,44.917],[-52.107,-25.749],[-43.107,-42.249]],"c":true}],"e":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-49.104,-45.549],[-1.36,-53.772],[11.473,-44.105],[-14.527,49.228],[-89.438,-19.882],[-80.438,-36.382]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.411999990426,0.063000002094,0.325,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[333.107,419.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-6.5,-8.5],[-7.25,2.25],[-1.75,-1],[2.5,-10.25],[0,0],[-8,0.75],[0,0],[1.25,14.75],[10.5,-1],[0.5,2],[-2.093,12.324],[0,0]],"o":[[0,0],[5.075,6.637],[7.25,-2.25],[1.75,1],[-2.5,10.25],[0,0],[8,-0.75],[0,0],[-0.587,-6.926],[-4.41,0.42],[-0.5,-2],[2.25,-13.25],[0,0]],"v":[[-51.58,-38.633],[-56.08,10.617],[-39.58,15.617],[-29.83,12.617],[-31.08,38.367],[-35.827,50.306],[-14.419,53.061],[-2.169,50.811],[4.581,3.561],[-9.919,-8.689],[-24.919,-6.939],[-22.669,-31.939],[-20.419,-47.189]],"c":true}],"e":[{"i":[[0,0],[-6.5,-8.5],[-7.25,2.25],[-1.75,-1],[2.5,-10.25],[0,0],[-8,0.75],[0,0],[1.25,14.75],[10.5,-1],[0.5,2],[-2.093,12.324],[0,0]],"o":[[0,0],[5.075,6.637],[7.25,-2.25],[1.75,1],[-2.5,10.25],[0,0],[8,-0.75],[0,0],[-0.587,-6.926],[-4.41,0.42],[-0.5,-2],[2.25,-13.25],[0,0]],"v":[[-14.25,-44.5],[-18.75,4.75],[-2.25,9.75],[7.5,6.75],[6.25,32.5],[0.75,48],[15,48.75],[27.25,46.5],[34,-0.75],[19.5,-13],[4.5,-11.25],[6.75,-36.25],[9,-51.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-6.5,-8.5],[-7.25,2.25],[-1.75,-1],[2.5,-10.25],[0,0],[-8,0.75],[0,0],[1.25,14.75],[10.5,-1],[0.5,2],[-2.093,12.324],[0,0]],"o":[[0,0],[5.075,6.637],[7.25,-2.25],[1.75,1],[-2.5,10.25],[0,0],[8,-0.75],[0,0],[-0.587,-6.926],[-4.41,0.42],[-0.5,-2],[2.25,-13.25],[0,0]],"v":[[-14.25,-44.5],[-18.75,4.75],[-2.25,9.75],[7.5,6.75],[6.25,32.5],[0.75,48],[15,48.75],[27.25,46.5],[34,-0.75],[19.5,-13],[4.5,-11.25],[6.75,-36.25],[9,-51.5]],"c":true}],"e":[{"i":[[0,0],[-6.5,-8.5],[-7.25,2.25],[-1.75,-1],[2.5,-10.25],[0,0],[-8,0.75],[0,0],[1.25,14.75],[10.5,-1],[0.5,2],[-2.093,12.324],[0,0]],"o":[[0,0],[5.075,6.637],[7.25,-2.25],[1.75,1],[-2.5,10.25],[0,0],[8,-0.75],[0,0],[-0.587,-6.926],[-4.41,0.42],[-0.5,-2],[2.25,-13.25],[0,0]],"v":[[-51.58,-38.633],[-56.08,10.617],[-39.58,15.617],[-29.83,12.617],[-31.08,38.367],[-35.827,50.306],[-14.419,53.061],[-2.169,50.811],[4.581,3.561],[-9.919,-8.689],[-24.919,-6.939],[-22.669,-31.939],[-20.419,-47.189]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.477999997606,0.830999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[325.5,416.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-49.105,-45.549],[-1.36,-53.772],[11.473,-44.105],[-14.527,49.228],[-89.438,-19.882],[-80.438,-36.382]],"c":true}],"e":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-11.774,-51.417],[32.536,-58.765],[45.369,-49.098],[14.893,44.917],[-52.107,-25.749],[-43.107,-42.249]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-11.774,-51.417],[32.536,-58.765],[45.369,-49.098],[14.893,44.917],[-52.107,-25.749],[-43.107,-42.249]],"c":true}],"e":[{"i":[[-17.553,4.111],[-4.534,0],[-3,-8.333],[48.215,-10.557],[1,8.333],[-6.167,2.5]],"o":[[18.5,-4.333],[4.666,0],[3,8.333],[-51,11.167],[-1,-8.334],[6.969,-2.826]],"v":[[-49.104,-45.549],[-1.36,-53.772],[11.473,-44.105],[-14.527,49.228],[-89.438,-19.882],[-80.438,-36.382]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.337000020345,0.74900004069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[333.107,419.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 10","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[59.667,-10],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.424,11.803],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[98.247,-45.522],[59.58,56.811],[-31.331,-27.299],[-83.333,-11.166],[-101.333,4.834],[-101.666,62.167],[-124.333,70.167],[-115.333,-5],[-102.501,-17.781],[-31.331,-50.966],[46.914,-70.522],[90.914,-78.189]],"c":false}],"e":[{"i":[[0,0],[59.667,-10],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.424,11.803],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[134.139,-50.791],[88.999,52.5],[5.999,-33.166],[-100.333,-7.166],[-118.333,8.834],[-118.666,66.167],[-141.333,74.167],[-132.333,-1],[-119.501,-13.781],[5.999,-56.833],[76.334,-74.833],[124.81,-83.182]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[59.667,-10],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.424,11.803],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[134.139,-50.791],[88.999,52.5],[5.999,-33.166],[-100.333,-7.166],[-118.333,8.834],[-118.666,66.167],[-141.333,74.167],[-132.333,-1],[-119.501,-13.781],[5.999,-56.833],[76.334,-74.833],[124.81,-83.182]],"c":false}],"e":[{"i":[[0,0],[59.667,-10],[0,0],[17.986,-6.775],[0.333,-10.334],[3,-6],[2.333,7.333],[-2.726,8.808],[-4.655,2.007],[0,0],[-25.667,5.333],[0,0]],"o":[[0,0],[-70.424,11.803],[0.12,-1.267],[-12.802,4.822],[-0.333,10.333],[-3,6],[-2.333,-7.333],[2.167,-7],[30.525,-13.156],[0,0],[25.666,-5.333],[0,0]],"v":[[98.247,-45.522],[59.58,56.811],[-31.331,-27.299],[-83.333,-11.166],[-101.333,4.834],[-101.666,62.167],[-124.333,70.167],[-115.333,-5],[-102.501,-17.781],[-31.331,-50.966],[46.914,-70.522],[90.914,-78.189]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.430999995213,0.694000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.333,426.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-41.42,-47.106],[2.244,-51.507],[14.446,-41.056],[-17.352,50.465],[-83.282,-24.017],[-73.267,-39.921]],"c":true}],"e":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-8.509,-51.662],[31.663,-55.819],[43.866,-45.368],[12.068,46.153],[-45.895,-29.254],[-35.88,-45.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-8.509,-51.662],[31.663,-55.819],[43.866,-45.368],[12.068,46.153],[-45.895,-29.254],[-35.88,-45.158]],"c":true}],"e":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-41.42,-47.106],[2.244,-51.507],[14.446,-41.056],[-17.352,50.465],[-83.282,-24.017],[-73.267,-39.921]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.411999990426,0.063000002094,0.325,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[448.707,398.839],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-5.954,-8.891],[-7.377,1.792],[-1.684,-1.108],[3.137,-10.073],[0,0],[-8.032,0.247],[0,0],[0.323,14.799],[10.542,-0.34],[0.374,2.028],[-2.861,12.169],[0,0]],"o":[[0,0],[4.649,6.942],[7.377,-1.791],[1.684,1.108],[-3.138,10.074],[0,0],[8.031,-0.248],[0,0],[-0.152,-6.95],[-4.428,0.143],[-0.374,-2.027],[3.076,-13.083],[0,0]],"v":[[-47.969,-40.476],[-53.586,7.757],[-40.39,14.489],[-28.476,11.967],[-31.406,36.59],[-34.839,52.005],[-17.172,53.403],[-4.805,51.924],[4.892,5.191],[-8.812,-7.945],[-23.892,-7.139],[-20.08,-31.949],[-16.878,-47.027]],"c":true}],"e":[{"i":[[0,0],[-5.954,-8.891],[-7.377,1.792],[-1.684,-1.108],[3.137,-10.073],[0,0],[-8.032,0.247],[0,0],[0.323,14.799],[10.542,-0.34],[0.374,2.028],[-2.861,12.169],[0,0]],"o":[[0,0],[4.649,6.942],[7.377,-1.791],[1.684,1.108],[-3.138,10.074],[0,0],[8.031,-0.248],[0,0],[-0.152,-6.95],[-4.428,0.143],[-0.374,-2.027],[3.076,-13.083],[0,0]],"v":[[-11.103,-45.809],[-14.204,2.38],[1.95,8.404],[7.393,6.703],[4.532,32.324],[2.548,46.767],[12.247,49.091],[24.614,47.612],[34.311,0.879],[20.607,-12.256],[5.527,-11.45],[9.339,-36.26],[12.541,-51.338]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-5.954,-8.891],[-7.377,1.792],[-1.684,-1.108],[3.137,-10.073],[0,0],[-8.032,0.247],[0,0],[0.323,14.799],[10.542,-0.34],[0.374,2.028],[-2.861,12.169],[0,0]],"o":[[0,0],[4.649,6.942],[7.377,-1.791],[1.684,1.108],[-3.138,10.074],[0,0],[8.031,-0.248],[0,0],[-0.152,-6.95],[-4.428,0.143],[-0.374,-2.027],[3.076,-13.083],[0,0]],"v":[[-11.103,-45.809],[-14.204,2.38],[1.95,8.404],[7.393,6.703],[4.532,32.324],[2.548,46.767],[12.247,49.091],[24.614,47.612],[34.311,0.879],[20.607,-12.256],[5.527,-11.45],[9.339,-36.26],[12.541,-51.338]],"c":true}],"e":[{"i":[[0,0],[-5.954,-8.891],[-7.377,1.792],[-1.684,-1.108],[3.137,-10.073],[0,0],[-8.032,0.247],[0,0],[0.323,14.799],[10.542,-0.34],[0.374,2.028],[-2.861,12.169],[0,0]],"o":[[0,0],[4.649,6.942],[7.377,-1.791],[1.684,1.108],[-3.138,10.074],[0,0],[8.031,-0.248],[0,0],[-0.152,-6.95],[-4.428,0.143],[-0.374,-2.027],[3.076,-13.083],[0,0]],"v":[[-47.969,-40.476],[-53.586,7.757],[-40.39,14.489],[-28.476,11.967],[-31.406,36.59],[-34.839,52.005],[-17.172,53.402],[-4.805,51.923],[4.892,5.19],[-8.812,-7.944],[-23.892,-7.138],[-20.08,-31.948],[-16.878,-47.026]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.477999997606,0.830999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[440.991,396.264],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-41.42,-47.106],[2.244,-51.507],[14.446,-41.056],[-17.352,50.465],[-83.282,-24.017],[-73.267,-39.921]],"c":true}],"e":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-8.509,-51.662],[31.663,-55.819],[43.866,-45.368],[12.068,46.153],[-45.895,-29.254],[-35.88,-45.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-8.509,-51.662],[31.663,-55.819],[43.866,-45.368],[12.068,46.153],[-45.895,-29.254],[-35.88,-45.158]],"c":true}],"e":[{"i":[[-17.776,3.003],[-4.526,-0.284],[-2.472,-8.504],[48.781,-7.515],[0.475,8.379],[-6.31,2.109]],"o":[[18.735,-3.166],[4.657,0.292],[2.472,8.505],[-51.599,7.949],[-0.477,-8.38],[7.133,-2.383]],"v":[[-41.42,-47.106],[2.244,-51.507],[14.446,-41.056],[-17.352,50.465],[-83.282,-24.017],[-73.267,-39.921]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.337000020345,0.74900004069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[448.707,398.839],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 14","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-76.291,14.727],[13,1.667],[28.667,-1.333],[0,0]],"o":[[0,0],[71.119,-13.729],[-5.96,-0.764],[-28.667,1.333],[0,0]],"v":[[-98.253,-47.606],[-19.919,59.394],[14.747,-63.273],[-25.586,-65.606],[-99.919,-54.273]],"c":true}],"e":[{"i":[[0,0],[-63.044,12.094],[13,1.667],[28.667,-1.333],[0,0]],"o":[[0,0],[71.135,-13.646],[-5.96,-0.764],[-28.667,1.333],[0,0]],"v":[[-64.358,-52.599],[9.5,55.083],[44.166,-67.584],[3.833,-69.917],[-66.024,-59.266]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-63.044,12.094],[13,1.667],[28.667,-1.333],[0,0]],"o":[[0,0],[71.135,-13.646],[-5.96,-0.764],[-28.667,1.333],[0,0]],"v":[[-64.358,-52.599],[9.5,55.083],[44.166,-67.584],[3.833,-69.917],[-66.024,-59.266]],"c":true}],"e":[{"i":[[0,0],[-76.291,14.727],[13,1.667],[28.667,-1.333],[0,0]],"o":[[0,0],[71.119,-13.729],[-5.96,-0.764],[-28.667,1.333],[0,0]],"v":[[-98.253,-47.606],[-19.919,59.394],[14.747,-63.273],[-25.586,-65.606],[-99.919,-54.273]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.430999995213,0.694000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[450.167,401.584],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 15","np":2,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Кривые volosy","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[297.64,420.945,0],"ix":2},"a":{"a":0,"k":[297.64,420.945,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-4.493,1.259],[-1.676,-26.43],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0]],"o":[[-0.5,-15.667],[11.036,-3.092],[1.084,17.083],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0]],"v":[[-108.667,29],[-106.417,9.25],[-90.834,50.75],[-90.834,85.417],[-63.5,89.417],[-27.5,88.75],[-76.167,8.75],[-59.834,-36.667],[-33.834,-36],[-8.5,-55.333],[13.501,-56],[29.5,-71.333],[60.833,-63.333],[109.166,-91.333]],"c":false}],"e":[{"i":[[0,0],[-4.493,1.259],[-3.812,-26.207],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0]],"o":[[-0.5,-15.667],[11.036,-3.092],[2.667,18.333],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0]],"v":[[-108.667,29],[-99.667,8.5],[-67.834,52],[-67.834,86.667],[-40.5,90.667],[8.187,87.118],[-48.69,9.318],[-39.834,-36.667],[-13.834,-36],[11.5,-55.333],[33.5,-56],[49.5,-71.333],[80.833,-63.333],[118.166,-91.333]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-4.493,1.259],[-3.812,-26.207],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0]],"o":[[-0.5,-15.667],[11.036,-3.092],[2.667,18.333],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0]],"v":[[-108.667,29],[-99.667,8.5],[-67.834,52],[-67.834,86.667],[-40.5,90.667],[8.187,87.118],[-48.69,9.318],[-39.834,-36.667],[-13.834,-36],[11.5,-55.333],[33.5,-56],[49.5,-71.333],[80.833,-63.333],[118.166,-91.333]],"c":false}],"e":[{"i":[[0,0],[-4.493,1.259],[-1.676,-26.43],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0]],"o":[[-0.5,-15.667],[11.036,-3.092],[1.084,17.083],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0]],"v":[[-108.667,29],[-106.417,9.25],[-90.834,50.75],[-90.834,85.417],[-63.5,89.417],[-27.5,88.75],[-76.167,8.75],[-59.834,-36.667],[-33.834,-36],[-8.5,-55.333],[13.5,-56],[29.5,-71.333],[60.833,-63.333],[109.166,-91.333]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[278.5,378.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-4.493,1.259],[-3.812,-26.207],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0],[53.5,4.5],[48,-26.5],[-2,-29]],"o":[[-0.5,-15.667],[11.036,-3.092],[2.667,18.333],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0],[-47.501,-3.995],[-48,26.5],[2,29]],"v":[[-96.417,54.914],[-94.167,35.164],[-78.584,76.664],[-78.584,111.332],[-51.25,115.332],[-15.25,114.664],[-63.917,34.664],[-47.584,-10.753],[-21.584,-10.086],[3.75,-29.418],[25.75,-30.086],[41.75,-45.418],[73.083,-37.418],[121.416,-65.418],[76.25,-113.253],[-65.25,-87.253],[-127.75,15.747]],"c":true}],"e":[{"i":[[0,0],[-4.493,1.259],[-3.812,-26.207],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0],[53.5,4.5],[48,-26.5],[-2,-29]],"o":[[-0.5,-15.667],[11.036,-3.092],[2.667,18.333],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0],[-47.501,-3.995],[-48,26.5],[2,29]],"v":[[-96.417,54.914],[-87.417,34.414],[-55.584,77.914],[-55.584,112.582],[-28.25,116.582],[20.436,113.033],[-36.441,35.233],[-27.584,-10.753],[-1.584,-10.086],[23.75,-29.418],[45.75,-30.086],[61.75,-45.418],[93.083,-37.418],[130.416,-65.418],[76.25,-113.253],[-65.25,-87.253],[-127.75,15.747]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-4.493,1.259],[-3.812,-26.207],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0],[53.5,4.5],[48,-26.5],[-2,-29]],"o":[[-0.5,-15.667],[11.036,-3.092],[2.667,18.333],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0],[-47.501,-3.995],[-48,26.5],[2,29]],"v":[[-96.417,54.914],[-87.417,34.414],[-55.584,77.914],[-55.584,112.582],[-28.25,116.582],[20.436,113.033],[-36.441,35.233],[-27.584,-10.753],[-1.584,-10.086],[23.75,-29.418],[45.75,-30.086],[61.75,-45.418],[93.083,-37.418],[130.416,-65.418],[76.25,-113.253],[-65.25,-87.253],[-127.75,15.747]],"c":true}],"e":[{"i":[[0,0],[-4.493,1.259],[-3.812,-26.207],[0,0],[-16,-0.667],[0,0],[1.333,32.667],[0,0],[-14,4],[0,0],[-11.334,4],[0,0],[-21.269,2.127],[0,0],[53.5,4.5],[48,-26.5],[-2,-29]],"o":[[-0.5,-15.667],[11.036,-3.092],[2.667,18.333],[0,0],[16,0.666],[0,0],[-1.333,-32.667],[0,0],[14,-4],[0,0],[11.333,-4],[0,0],[33.333,-3.334],[0,0],[-47.501,-3.995],[-48,26.5],[2,29]],"v":[[-96.417,54.914],[-94.167,35.164],[-78.584,76.664],[-78.584,111.332],[-51.25,115.332],[-15.25,114.664],[-63.917,34.664],[-47.584,-10.753],[-21.584,-10.086],[3.75,-29.418],[25.75,-30.086],[41.75,-45.418],[73.083,-37.418],[121.416,-65.418],[76.25,-113.253],[-65.25,-87.253],[-127.75,15.747]],"c":true}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180000005984,0.035000000748,0.144999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[266.25,352.752],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Кривые R_ruka","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[196.296,490.712,0],"ix":2},"a":{"a":0,"k":[196.293,491.186,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[13.227,-15.815],[-7,-6],[-13.802,5.751],[0,0]],"o":[[0,0],[-11.499,13.749],[7,6],[13.663,-5.693],[0,0]],"v":[[17.67,-35.5],[-6.308,-13.159],[-19.412,28.154],[10.657,13.007],[31.33,7.739]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[168.83,506.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.969,15.418],[13.227,-15.815],[-7,-6],[-13.802,5.751],[0,0]],"o":[[0,0],[-11.499,13.749],[7,6],[13.663,-5.693],[0,0]],"v":[[15.516,-35.5],[-8.462,-13.159],[-21.566,28.154],[8.503,13.007],[29.175,7.739]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.875,0.039000002543,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.56,505.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Кривые telo","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[2],"e":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[15],"e":[2]},{"t":40}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[449.64,462.945,0],"e":[449.64,439.945,0],"to":[0,-3.83333325386047,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[449.64,439.945,0],"e":[449.64,462.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[449.64,462.945,0],"e":[449.64,439.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[449.64,439.945,0],"e":[449.64,462.945,0],"to":[0,0,0],"ti":[0,-3.83333325386047,0]},{"t":40}],"ix":2},"a":{"a":0,"k":[297.64,420.945,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[100,97,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":5,"s":[100,97,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":10,"s":[100,100,100],"e":[100,103,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":15,"s":[100,103,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[100,100,100],"e":[100,97,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":25,"s":[100,97,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":30,"s":[100,100,100],"e":[100,103,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":35,"s":[100,103,100],"e":[100,100,100]},{"t":40}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-69.333,11.333],[0,0]],"o":[[0,0],[69.333,-11.334],[0,0]],"v":[[-94.243,-3.694],[-16.919,36.694],[-99.586,-41.973]],"c":false}],"e":[{"i":[[0,0],[-69.333,11.333],[0,0]],"o":[[0,0],[69.333,-11.334],[0,0]],"v":[[-59.666,-8],[13.667,32.667],[-69,-46]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-69.333,11.333],[0,0]],"o":[[0,0],[69.333,-11.334],[0,0]],"v":[[-59.666,-8],[13.667,32.667],[-69,-46]],"c":false}],"e":[{"i":[[0,0],[-69.333,11.333],[0,0]],"o":[[0,0],[69.333,-11.334],[0,0]],"v":[[-94.243,-3.694],[-16.919,36.694],[-99.586,-41.973]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705999995213,0.011999999776,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[448.333,423.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[-71.333,14],[0,0],[0,0]],"o":[[0,0],[0,0],[78.024,-15.313],[0,0],[0,0]],"v":[[-105.345,-5.167],[-75.449,-13.199],[17.988,59.833],[23.988,-65.833],[-112.012,-25.833]],"c":false}],"e":[{"i":[[0,0],[0,0],[-71.333,14],[0,0],[0,0]],"o":[[0,0],[0,0],[78.024,-15.313],[0,0],[0,0]],"v":[[-105.345,-5.167],[-41.012,-19.499],[40.988,54.833],[46.988,-70.833],[-112.012,-25.833]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[-71.333,14],[0,0],[0,0]],"o":[[0,0],[0,0],[78.024,-15.313],[0,0],[0,0]],"v":[[-105.345,-5.167],[-41.012,-19.499],[40.988,54.833],[46.988,-70.833],[-112.012,-25.833]],"c":false}],"e":[{"i":[[0,0],[0,0],[-71.333,14],[0,0],[0,0]],"o":[[0,0],[0,0],[78.024,-15.313],[0,0],[0,0]],"v":[[-105.345,-5.167],[-75.449,-13.199],[17.988,59.833],[23.988,-65.833],[-112.012,-25.833]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705999995213,0.011999999776,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[300.345,427.167],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.333,19.334],[-73.334,27.334],[-30,-32],[19.411,-53.972],[60.441,-6.199],[4.666,100.667]],"o":[[-3.588,-52.03],[104.531,-38.961],[30,32],[-27.333,76],[-78,8],[-2.105,-45.407]],"v":[[-166.578,-27.52],[-85.911,-160.186],[120.422,-90.186],[150.755,89.147],[8.755,191.147],[-163.911,59.147]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[339.578,452.853],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[0,0],[-63.626,-57.679],[0,0],[64.667,41.999],[3.334,67.333],[0,0]],"o":[[0,0],[71.333,64.667],[0,0],[-60.325,-39.181],[-3.333,-67.333],[0,0]],"v":[[-88.333,-130.667],[-39.667,42],[120.333,94],[-47.001,88.667],[-117.001,-46.667],[-117.001,-125.999]],"c":false}],"e":[{"i":[[0,0],[-63.626,-57.679],[0,0],[64.667,41.999],[3.334,67.333],[0,0]],"o":[[0,0],[71.333,64.667],[0,0],[-60.325,-39.181],[-3.333,-67.333],[0,0]],"v":[[-76.333,-130.667],[-21.667,36],[120.333,94],[-47.001,88.667],[-117.001,-46.667],[-117.001,-125.999]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[-63.626,-57.679],[0,0],[64.667,41.999],[3.334,67.333],[0,0]],"o":[[0,0],[71.333,64.667],[0,0],[-60.325,-39.181],[-3.333,-67.333],[0,0]],"v":[[-76.333,-130.667],[-21.667,36],[120.333,94],[-47.001,88.667],[-117.001,-46.667],[-117.001,-125.999]],"c":false}],"e":[{"i":[[0,0],[-63.626,-57.679],[0,0],[64.667,41.999],[3.334,67.333],[0,0]],"o":[[0,0],[71.333,64.667],[0,0],[-60.325,-39.181],[-3.333,-67.333],[0,0]],"v":[[-88.333,-130.667],[-39.667,42],[120.333,94],[-47.001,88.667],[-117.001,-46.667],[-117.001,-125.999]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705999995213,0.011999999776,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[290.667,535.333],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.333,19.334],[-73.334,27.334],[-30,-32],[19.411,-53.972],[60.441,-6.199],[4.666,100.667]],"o":[[-3.588,-52.03],[104.531,-38.961],[30,32],[-27.333,76],[-78,8],[-2.105,-45.407]],"v":[[-166.578,-27.52],[-85.911,-160.186],[120.422,-90.186],[150.755,89.147],[8.755,191.147],[-163.911,59.147]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.875,0.039000002543,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[339.578,452.853],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 5","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Кривые L_noga 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":20,"s":[0],"e":[34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":30,"s":[34],"e":[67]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":40,"s":[67],"e":[34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":50,"s":[34],"e":[0]},{"t":60}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":20,"s":[577.14,653.445,0],"e":[485.14,672.445,0],"to":[-14.5833330154419,8.58333301544189,0],"ti":[40.7188301086426,-1.91244661808014,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":30,"s":[485.14,672.445,0],"e":[397.14,653.945,0],"to":[-47.4723854064941,2.2296416759491,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":40,"s":[397.14,653.945,0],"e":[485.14,646.445,0],"to":[0,0,0],"ti":[-17.2466659545898,0.14780442416668,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":50,"s":[485.14,646.445,0],"e":[577.14,653.445,0],"to":[60.0219345092773,-0.51438969373703,0],"ti":[13.1223392486572,-7.72343397140503,0]},{"t":60}],"ix":2},"a":{"a":0,"k":[425.14,624.445,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.323,-8.378],[-6.738,22.378],[18.988,-0.711]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.169,-8.122],[-11.207,15.154],[14.192,-2.049]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.169,-8.122],[-11.207,15.154],[14.192,-2.049]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.328,-3.35],[-12.728,12.696],[12.56,-2.505]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.328,-3.35],[-12.728,12.696],[12.56,-2.505]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.777,-4.082],[-13.794,13.763],[9.374,-2.623]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.777,-4.082],[-13.794,13.763],[9.374,-2.623]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.271,-0.383],[-14.861,14.83],[10.232,1.691]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":34,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.271,-0.383],[-14.861,14.83],[10.232,1.691]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.417,4.837],[-16.861,16.831],[13,13.368]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":40,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.417,4.837],[-16.861,16.831],[13,13.368]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.55,25.291],[-26.4,-1.895],[-14.663,36.832]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":47,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.55,25.291],[-26.4,-1.895],[-14.663,36.832]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.323,-8.378],[-6.738,22.378],[18.988,-0.711]],"c":false}]},{"t":60}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[455.594,644.211],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[5.023,8.361],[0,0]],"o":[[0,0],[0,0],[-6.791,-11.305],[0,0]],"v":[[29.083,14.289],[1.022,26.044],[-15.293,6.51],[-25.084,-16.544]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[19.49,0.585],[-4.978,16.544],[-16.289,-2.108],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[19.49,0.585],[-4.978,16.544],[-16.289,-2.108],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[17.209,2.001],[-6.041,17.565],[-11.82,-3.225],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[17.209,2.001],[-6.041,17.565],[-11.82,-3.225],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[18.972,7.85],[-7.105,18.585],[-7.352,-4.342],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":34,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[18.972,7.85],[-7.105,18.585],[-7.352,-4.342],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[21.289,28.144],[-9.1,20.498],[1.029,-6.436],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":40,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[21.289,28.144],[-9.1,20.498],[1.029,-6.436],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.706,8.543],[0,0]],"o":[[0,0],[0,0],[-5.449,-9.892],[0,0]],"v":[[-17,40.956],[-18.639,1.771],[-4.062,-18.442],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":47,"s":[{"i":[[0,0],[0,0],[4.706,8.543],[0,0]],"o":[[0,0],[0,0],[-5.449,-9.892],[0,0]],"v":[[-17,40.956],[-18.639,1.771],[-4.062,-18.442],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[5.023,8.361],[0,0]],"o":[[0,0],[0,0],[-6.791,-11.305],[0,0]],"v":[[29.083,14.289],[1.022,26.044],[-15.293,6.51],[-25.084,-16.544]],"c":false}]},{"t":60}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[447.833,640.544],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":60,"st":20,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Кривые L_noga 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":-20,"s":[0],"e":[34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":-10,"s":[34],"e":[67]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[67],"e":[34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":10,"s":[34],"e":[0]},{"t":20}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":-20,"s":[577.14,653.445,0],"e":[485.14,672.445,0],"to":[-14.5833330154419,8.58333301544189,0],"ti":[40.7188301086426,-1.91244661808014,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":-10,"s":[485.14,672.445,0],"e":[397.14,653.945,0],"to":[-47.4723854064941,2.2296416759491,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[397.14,653.945,0],"e":[485.14,646.445,0],"to":[0,0,0],"ti":[-17.2466659545898,0.14780442416668,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":10,"s":[485.14,646.445,0],"e":[577.14,653.445,0],"to":[60.0219345092773,-0.51438969373703,0],"ti":[13.1223392486572,-7.72343397140503,0]},{"t":20}],"ix":2},"a":{"a":0,"k":[425.14,624.445,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":-20,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.323,-8.378],[-6.738,22.378],[18.988,-0.711]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.169,-8.122],[-11.207,15.154],[14.192,-2.049]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-12,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.169,-8.122],[-11.207,15.154],[14.192,-2.049]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.328,-3.35],[-12.728,12.696],[12.56,-2.505]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-10,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.328,-3.35],[-12.728,12.696],[12.56,-2.505]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.777,-4.082],[-13.794,13.763],[9.374,-2.623]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-8,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.777,-4.082],[-13.794,13.763],[9.374,-2.623]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.271,-0.383],[-14.861,14.83],[10.232,1.691]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":-6,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.271,-0.383],[-14.861,14.83],[10.232,1.691]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.417,4.837],[-16.861,16.831],[13,13.368]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.417,4.837],[-16.861,16.831],[13,13.368]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.55,25.291],[-26.4,-1.895],[-14.663,36.832]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":7,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.55,25.291],[-26.4,-1.895],[-14.663,36.832]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.323,-8.378],[-6.738,22.378],[18.988,-0.711]],"c":false}]},{"t":20}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[455.594,644.211],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":-20,"s":[{"i":[[0,0],[0,0],[5.023,8.361],[0,0]],"o":[[0,0],[0,0],[-6.791,-11.305],[0,0]],"v":[[29.083,14.289],[1.022,26.044],[-15.293,6.51],[-25.084,-16.544]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[19.49,0.585],[-4.978,16.544],[-16.289,-2.108],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-10,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[19.49,0.585],[-4.978,16.544],[-16.289,-2.108],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[17.209,2.001],[-6.041,17.565],[-11.82,-3.225],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-8,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[17.209,2.001],[-6.041,17.565],[-11.82,-3.225],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[18.972,7.85],[-7.105,18.585],[-7.352,-4.342],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":-6,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[18.972,7.85],[-7.105,18.585],[-7.352,-4.342],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[21.289,28.144],[-9.1,20.498],[1.029,-6.436],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[21.289,28.144],[-9.1,20.498],[1.029,-6.436],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.706,8.543],[0,0]],"o":[[0,0],[0,0],[-5.449,-9.892],[0,0]],"v":[[-17,40.956],[-18.639,1.771],[-4.062,-18.442],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":7,"s":[{"i":[[0,0],[0,0],[4.706,8.543],[0,0]],"o":[[0,0],[0,0],[-5.449,-9.892],[0,0]],"v":[[-17,40.956],[-18.639,1.771],[-4.062,-18.442],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[5.023,8.361],[0,0]],"o":[[0,0],[0,0],[-6.791,-11.305],[0,0]],"v":[[29.083,14.289],[1.022,26.044],[-15.293,6.51],[-25.084,-16.544]],"c":false}]},{"t":20}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[447.833,640.544],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":-20,"op":20,"st":-20,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Кривые L_noga","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":0,"s":[0],"e":[34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":10,"s":[34],"e":[67]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":20,"s":[67],"e":[34]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":30,"s":[34],"e":[0]},{"t":40}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[577.14,653.445,0],"e":[485.14,672.445,0],"to":[-14.5833330154419,8.58333301544189,0],"ti":[40.7188301086426,-1.91244661808014,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":10,"s":[485.14,672.445,0],"e":[397.14,653.945,0],"to":[-47.4723854064941,2.2296416759491,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":20,"s":[397.14,653.945,0],"e":[485.14,646.445,0],"to":[0,0,0],"ti":[-17.2466659545898,0.14780442416668,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":30,"s":[485.14,646.445,0],"e":[577.14,653.445,0],"to":[60.0219345092773,-0.51438969373703,0],"ti":[13.1223392486572,-7.72343397140503,0]},{"t":40}],"ix":2},"a":{"a":0,"k":[425.14,624.445,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.323,-8.378],[-6.738,22.378],[18.988,-0.711]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.169,-8.122],[-11.207,15.154],[14.192,-2.049]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.169,-8.122],[-11.207,15.154],[14.192,-2.049]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.328,-3.35],[-12.728,12.696],[12.56,-2.505]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.328,-3.35],[-12.728,12.696],[12.56,-2.505]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.777,-4.082],[-13.794,13.763],[9.374,-2.623]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.777,-4.082],[-13.794,13.763],[9.374,-2.623]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.271,-0.383],[-14.861,14.83],[10.232,1.691]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":14,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.271,-0.383],[-14.861,14.83],[10.232,1.691]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.417,4.837],[-16.861,16.831],[13,13.368]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.417,4.837],[-16.861,16.831],[13,13.368]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.55,25.291],[-26.4,-1.895],[-14.663,36.832]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":27,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.55,25.291],[-26.4,-1.895],[-14.663,36.832]],"c":false}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.323,-8.378],[-6.738,22.378],[18.988,-0.711]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[455.594,644.211],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[{"i":[[0,0],[0,0],[5.023,8.361],[0,0]],"o":[[0,0],[0,0],[-6.791,-11.305],[0,0]],"v":[[29.083,14.289],[1.022,26.044],[-15.293,6.51],[-25.084,-16.544]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[19.49,0.585],[-4.978,16.544],[-16.289,-2.108],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[19.49,0.585],[-4.978,16.544],[-16.289,-2.108],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[17.209,2.001],[-6.041,17.565],[-11.82,-3.225],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[17.209,2.001],[-6.041,17.565],[-11.82,-3.225],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[18.972,7.85],[-7.105,18.585],[-7.352,-4.342],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":14,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[18.972,7.85],[-7.105,18.585],[-7.352,-4.342],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[21.289,28.144],[-9.1,20.498],[1.029,-6.436],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[4.542,8.632],[0,0]],"o":[[0,0],[0,0],[-8.023,-15.246],[0,0]],"v":[[21.289,28.144],[-9.1,20.498],[1.029,-6.436],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[4.706,8.543],[0,0]],"o":[[0,0],[0,0],[-5.449,-9.892],[0,0]],"v":[[-17,40.956],[-18.639,1.771],[-4.062,-18.442],[-29.554,-28.296]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":27,"s":[{"i":[[0,0],[0,0],[4.706,8.543],[0,0]],"o":[[0,0],[0,0],[-5.449,-9.892],[0,0]],"v":[[-17,40.956],[-18.639,1.771],[-4.062,-18.442],[-29.554,-28.296]],"c":false}],"e":[{"i":[[0,0],[0,0],[5.023,8.361],[0,0]],"o":[[0,0],[0,0],[-6.791,-11.305],[0,0]],"v":[[29.083,14.289],[1.022,26.044],[-15.293,6.51],[-25.084,-16.544]],"c":false}]},{"t":40}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[447.833,640.544],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Кривые volosy_back","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.64,439.945,0],"ix":2},"a":{"a":0,"k":[278.64,439.945,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":0,"s":[100,100,100],"e":[100,96,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_1_0p333_0","0p833_0p833_0p333_0","0p833_1_0p333_0"],"t":5,"s":[100,96,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":10,"s":[100,100,100],"e":[100,104,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_1_0p333_0","0p833_0p833_0p333_0","0p833_1_0p333_0"],"t":15,"s":[100,104,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":20,"s":[100,100,100],"e":[100,96,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_1_0p333_0","0p833_0p833_0p333_0","0p833_1_0p333_0"],"t":25,"s":[100,96,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"n":["0p667_1_0p167_0","0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":30,"s":[100,100,100],"e":[100,104,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p833_1_0p333_0","0p833_0p833_0p333_0","0p833_1_0p333_0"],"t":35,"s":[100,104,100],"e":[100,100,100]},{"t":40}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[18.333,4.667],[0,0],[20.667,14.666],[0,0],[6.667,28],[0,0],[-4.333,20.667],[0,0],[-4.333,9.334],[0,0],[-21,18],[0,0],[-22.661,8.664],[0,0],[-15,2],[0,0],[-25.333,-2.333],[0,0],[-18,-10.334],[0,0],[-13.334,-9],[0,0],[-5,-21.667],[0,0],[4.334,-16.667],[0,0],[3.666,-9],[0,0]],"o":[[0,0],[-18.334,-4.667],[0,0],[-20.667,-14.667],[0,0],[-5.9,-24.781],[0,0],[4.333,-20.667],[0,0],[4.333,-9.333],[0,0],[21,-18],[0,0],[22.666,-8.667],[0,0],[15,-2],[0,0],[25.334,2.334],[0,0],[18,10.333],[0,0],[13.333,9],[0,0],[5,21.666],[0,0],[-4.333,16.667],[0,0],[-3.667,9],[0,0]],"v":[[-65.883,165.167],[-99.217,171.167],[-121.883,149.167],[-159.883,142.834],[-178.551,110.167],[-215.883,75.166],[-205.216,31.834],[-213.883,-10.833],[-194.883,-36.5],[-192.883,-55.5],[-176.551,-67.166],[-161.551,-113.167],[-115.883,-123.167],[-88.217,-157.167],[-49.217,-151.5],[-23.217,-171.833],[5.449,-163.5],[44.449,-173.5],[78.449,-156.833],[119.449,-154.167],[144.449,-121.5],[175.783,-116.833],[191.783,-88.5],[213.45,-62.166],[208.45,-28.166],[217.45,5.167],[199.783,30.167],[199.783,49.5],[179.117,62.167]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[253.883,287.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[13.333,9],[0,0],[18,10.333],[0,0],[25.334,2.333],[0,0],[15,-2],[0,0],[22.667,-8.667],[0,0],[21,-18],[0,0],[4.333,-9.334],[0,0],[4.333,-20.666],[0,0],[-10.61,20.795],[0,0],[-5.334,7],[0,0],[-20.667,14.667],[0,0],[-24.166,9.916],[0,0],[-17.177,2.417],[0,0],[-23.667,-3.667],[0,0],[-17.666,-8],[0,0],[-13,-11],[0,0],[-7.25,-4.75]],"o":[[-5,-21.667],[0,0],[-13.334,-9],[0,0],[-18,-10.333],[0,0],[-25.333,-2.334],[0,0],[-15,2],[0,0],[-22.66,8.665],[0,0],[-21,18],[0,0],[-4.334,9.333],[0,0],[-4.334,20.667],[0,0],[8.333,-16.333],[0,0],[5.333,-7],[0,0],[20.667,-14.667],[0,0],[21.189,-8.695],[0,0],[22.5,-3.167],[0,0],[23.667,3.666],[0,0],[17.667,8],[0,0],[13,11],[0,0],[7.25,4.75]],"v":[[215.833,9.834],[194.167,-16.499],[178.167,-44.833],[146.833,-49.499],[121.833,-82.167],[80.833,-84.833],[46.833,-101.499],[7.834,-91.499],[-20.834,-99.833],[-46.833,-79.499],[-85.833,-85.167],[-113.5,-51.167],[-159.167,-41.167],[-174.167,4.833],[-190.5,16.501],[-192.5,35.501],[-211.5,61.167],[-202.833,103.833],[-202.5,62.167],[-178.167,43.167],[-177.5,21.833],[-160.167,13.167],[-147.167,-28.167],[-104.5,-38.083],[-79.833,-70.499],[-41.833,-63.833],[-18.499,-84.167],[10.833,-72.833],[46.833,-86.499],[82.167,-64.499],[115.833,-69.499],[141,-39.833],[174.5,-34.333],[189.833,-9.499],[202.5,-3.583]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.430999995213,0.216000007181,0.654999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[251.5,215.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[18.333,4.667],[0,0],[20.667,14.666],[0,0],[6.667,28],[0,0],[-4.333,20.667],[0,0],[-4.333,9.334],[0,0],[-21,18],[0,0],[-22.661,8.664],[0,0],[-15,2],[0,0],[-25.333,-2.333],[0,0],[-18,-10.334],[0,0],[-13.334,-9],[0,0],[-5,-21.667],[0,0],[4.334,-16.667],[0,0],[3.666,-9],[0,0]],"o":[[0,0],[-18.334,-4.667],[0,0],[-20.667,-14.667],[0,0],[-5.9,-24.781],[0,0],[4.333,-20.667],[0,0],[4.333,-9.333],[0,0],[21,-18],[0,0],[22.666,-8.667],[0,0],[15,-2],[0,0],[25.334,2.334],[0,0],[18,10.333],[0,0],[13.333,9],[0,0],[5,21.666],[0,0],[-4.333,16.667],[0,0],[-3.667,9],[0,0]],"v":[[-65.883,165.167],[-99.217,171.167],[-121.883,149.167],[-159.883,142.834],[-178.551,110.167],[-215.883,75.166],[-205.216,31.834],[-213.883,-10.833],[-194.883,-36.5],[-192.883,-55.5],[-176.551,-67.166],[-161.551,-113.167],[-115.883,-123.167],[-88.217,-157.167],[-49.217,-151.5],[-23.217,-171.833],[5.449,-163.5],[44.449,-173.5],[78.449,-156.833],[119.449,-154.167],[144.449,-121.5],[175.783,-116.833],[191.783,-88.5],[213.45,-62.166],[208.45,-28.166],[217.45,5.167],[199.783,30.167],[199.783,49.5],[179.117,62.167]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180000005984,0.035000000748,0.144999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[253.883,287.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Кривые L_ruka","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[461.575,424.56,0],"ix":2},"a":{"a":0,"k":[454.176,425.589,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-16.006,-12.996],[5.725,-7.226],[14.647,3.007],[0,0]],"o":[[0,0],[13.914,11.297],[-5.723,7.228],[-14.5,-2.976],[0,0]],"v":[[-27.114,-31.501],[5.777,-13.773],[26.534,24.273],[-5.875,15.152],[-32.259,13.552]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.830999995213,0.26699999641,0.019999999626,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[487.767,436.625],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.69,18.569],[-16.006,-12.996],[5.724,-7.228],[14.647,3.007],[0,0]],"o":[[0,0],[13.915,11.297],[-5.724,7.227],[-14.499,-2.977],[0,0]],"v":[[-22.341,-31.501],[10.55,-13.773],[31.307,24.274],[-1.102,15.153],[-27.485,13.552]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.875,0.039000002543,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[482.32,436.17],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"cipa 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,266,0],"ix":2},"a":{"a":0,"k":[450,450,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"w":900,"h":900,"ip":0,"op":32,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/gradient_animated_background.json b/example/resource/gradient_animated_background.json new file mode 100644 index 0000000000..f9ce52d41e --- /dev/null +++ b/example/resource/gradient_animated_background.json @@ -0,0 +1 @@ +{"v":"4.6.10","fr":15,"ip":0,"op":155,"w":1080,"h":1920,"nm":"background","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[540,960,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1160,880]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"st","c":{"a":0,"k":[0.9960784,0.7843137,0.145098,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"gf","o":{"a":0,"k":100},"r":1,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,0.511,0.89,0.283,0.5,0.334,0.873,0.583,1,0.156,0.857,0.882],"e":[0,0.726,0.283,0.89,0.5,0.441,0.356,0.886,1,0.156,0.429,0.882]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[0,0.726,0.283,0.89,0.5,0.441,0.356,0.886,1,0.156,0.429,0.882],"e":[0,0.89,0.283,0.283,0.5,0.886,0.553,0.219,1,0.882,0.823,0.156]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[0,0.89,0.283,0.283,0.5,0.886,0.553,0.219,1,0.882,0.823,0.156],"e":[0,0,0.312,0.737,0.5,0.078,0.597,0.754,1,0.156,0.882,0.771]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":91,"s":[0,0,0.312,0.737,0.5,0.078,0.597,0.754,1,0.156,0.882,0.771],"e":[0,0.51,0.89,0.282,0.5,0.333,0.873,0.582,1,0.157,0.855,0.882]},{"t":120}]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-430.769,-404.573],"e":[23.726,-364.48],"to":[75.7491683959961,6.68213844299316],"ti":[-123.915840148926,-8.51547145843506]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[23.726,-364.48],"e":[312.726,-353.48],"to":[123.915840148926,8.51547145843506],"ti":[-1.00208830833435,-1.83333337306976]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[312.726,-353.48],"e":[29.739,-353.48],"to":[1.00208830833435,1.83333337306976],"ti":[120.055290222168,0.60746711492538]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":91,"s":[29.739,-353.48],"e":[-407.606,-357.125],"to":[-120.055290222168,-0.60746711492538],"ti":[72.8907089233398,0.60746711492538]},{"t":120}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[374.412,342.611],"e":[22.822,357.191],"to":[-58.5984153747559,2.42986845970154],"ti":[132.520950317383,-7.89707231521606]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[22.822,357.191],"e":[-420.714,389.994],"to":[-132.520950317383,7.89707231521606],"ti":[-4.68509674072266,-7.89707231521606]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[-420.714,389.994],"e":[50.932,404.573],"to":[4.68509674072266,7.89707231521606],"ti":[-132.918350219727,4.25226974487305]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":91,"s":[50.932,404.573],"e":[376.797,364.48],"to":[132.918350219727,-4.25226974487305],"ti":[-54.3107261657715,6.68213844299316]},{"t":120}]},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[93.29,219.491],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":155,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":1,"nm":"Deep Red Solid 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[540,960,0]},"a":{"a":0,"k":[540,960,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"sw":1080,"sh":1920,"sc":"#be2a2a","ip":0,"op":155,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/leap_frog_loader.json b/example/resource/leap_frog_loader.json new file mode 100644 index 0000000000..cac502dfb5 --- /dev/null +++ b/example/resource/leap_frog_loader.json @@ -0,0 +1 @@ +{"v":"5.1.10","fr":24,"ip":24,"op":72,"w":600,"h":600,"nm":"Loader 7","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":24,"s":[388.699,300,0],"e":[268.699,300,0],"to":[-34,49,0],"ti":[25.30078125,45.5,0]},{"t":36,"s":[268.699,300,0],"h":1},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":48,"s":[268.699,300,0],"e":[208.699,300,0],"to":[-19.69921875,-42,0],"ti":[2.5,-26,0]},{"t":60,"s":[208.699,300,0],"h":1},{"t":72,"s":[208.699,300,0],"h":1}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = div(effect('Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[-247.301,-57.301,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":5,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Friction","np":3,"mn":"ADBE Slider Control","ix":6,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[25.398,25.398],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.532643995098,0.532643995098,0.532643995098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298039215686,0.298039215686,0.298039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-247.301,-57.301],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":24,"s":[328.699,300,0],"e":[388.699,300,0],"to":[15.80078125,-29.5,0],"ti":[-20.4083786010742,-15.2806444168091,0]},{"t":36,"s":[388.699,300,0],"h":1},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":48,"s":[388.699,300,0],"e":[268.699,300,0],"to":[-21.9206390380859,-56.3496513366699,0],"ti":[22.5,-58.25,0]},{"t":60,"s":[268.699,300,0],"h":1},{"t":72,"s":[268.699,300,0],"h":1}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = div(effect('Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[-247.301,-57.301,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[25.398,25.398],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.532643995098,0.532643995098,0.532643995098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298039215686,0.298039215686,0.298039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-247.301,-57.301],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":24,"s":[268.699,300,0],"e":[208.699,300,0],"to":[-12,25,0],"ti":[2.80078125,18,0]},{"t":36,"s":[208.699,300,0],"h":1},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":48,"s":[208.699,300,0],"e":[328.699,300,0],"to":[30.80078125,67,0],"ti":[-17.5,54,0]},{"t":60,"s":[328.699,300,0],"h":1},{"t":72,"s":[328.699,300,0],"h":1}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = div(effect('Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[-247.301,-57.301,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[25.398,25.398],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.532643995098,0.532643995098,0.532643995098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298039215686,0.298039215686,0.298039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-247.301,-57.301],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":24,"s":[208.699,300,0],"e":[328.699,300,0],"to":[18.30078125,-59.5,0],"ti":[-12,-47.5,0]},{"t":36,"s":[328.699,300,0],"h":1},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"n":"0p7_1_0p3_0","t":48,"s":[328.699,300,0],"e":[388.699,300,0],"to":[7.66105842590332,31.200023651123,0],"ti":[-8.19921875,40,0]},{"t":60,"s":[388.699,300,0],"h":1},{"t":72,"s":[388.699,300,0],"h":1}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = div(effect('Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[-247.301,-57.301,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Position - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[25.398,25.398],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.532643995098,0.532643995098,0.532643995098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298039215686,0.298039215686,0.298039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-247.301,-57.301],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/party_penguin.json b/example/resource/party_penguin.json new file mode 100644 index 0000000000..06bb8ac28d --- /dev/null +++ b/example/resource/party_penguin.json @@ -0,0 +1 @@ +{"v":"4.10.2","fr":30,"ip":0,"op":58,"w":800,"h":800,"nm":"Fancy 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"GLOBAL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[54,551,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Hat Outlines","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.158,"y":1},"o":{"x":0.075,"y":0.312},"n":"0p158_1_0p075_0p312","t":14,"s":[555.632,379.901,0],"e":[568.441,362.019,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.842,"y":1},"o":{"x":1,"y":0},"n":"0p842_1_1_0","t":29,"s":[568.441,362.019,0],"e":[555.632,379.901,0],"to":[0,0,0],"ti":[0,0,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[555.632,379.901,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.296,0.995],[0,0],[0.995,-1.296],[-1.296,-0.995],[0,0],[-0.995,1.296]],"o":[[0,0],[-1.296,-0.995],[-0.996,1.297],[0,0],[1.297,0.995],[0.995,-1.296]],"v":[[28.034,17.79],[-24.43,-22.485],[-28.578,-21.94],[-28.033,-17.791],[24.43,22.484],[28.578,21.939]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[555.56,383.074],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.026,3.091],[0,0],[3.091,-4.026],[0,0],[0,0],[0,0]],"o":[[0,0],[-4.026,-3.091],[0,0],[0,0],[0,0],[3.091,-4.026]],"v":[[19.117,-2.46],[-2.198,-18.822],[-15.085,-17.129],[-23.902,-5.643],[11.993,21.914],[20.811,10.428]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[562.183,374.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Tie Outlines","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[502.404,453,0],"ix":2},"a":{"a":0,"k":[502.404,453,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.852,0.654],[0,0],[0.654,-0.852],[0,0],[-0.852,-0.654],[0,0],[-0.654,0.852],[0,0]],"o":[[0,0],[-0.852,-0.654],[0,0],[-0.654,0.852],[0,0],[0.852,0.654],[0,0],[0.654,-0.852]],"v":[[6.301,-1.525],[-0.156,-6.48],[-2.893,-6.12],[-6.661,-1.214],[-6.301,1.525],[0.155,6.48],[2.893,6.121],[6.66,1.215]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[501.763,453.567],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.864,1.125],[0,0],[1.467,0.227],[0,0],[-0.761,-1.42],[0,0]],"o":[[0,0],[0.904,-1.178],[0,0],[-1.592,-0.246],[0,0],[0.67,1.25]],"v":[[0.98,7.35],[8.825,-2.868],[7.574,-5.988],[-6.948,-8.229],[-8.967,-5.376],[-2.291,7.083]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[512.737,462.455],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.864,1.125],[0,0],[-0.598,-1.359],[0,0],[1.568,0.368],[0,0]],"o":[[0,0],[0.904,-1.178],[0,0],[0.649,1.474],[0,0],[-1.381,-0.324]],"v":[[-8.442,2.354],[-0.597,-7.865],[2.74,-7.462],[8.657,5.987],[6.423,8.675],[-7.339,5.445]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[491.688,444.06],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Legs Right","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[411.027,495.735,0],"ix":2},"a":{"a":0,"k":[411.027,495.735,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.8,-3.743],[-3.758,4.746]],"o":[[-3.743,4.8],[4.774,3.723],[0,0]],"v":[[-6.793,-9.596],[-4.88,5.873],[10.536,4.028]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[410.821,497.93],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Legs Left","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[483.024,549.985,0],"ix":2},"a":{"a":0,"k":[483.024,549.985,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.8,-3.743],[-3.758,4.746]],"o":[[-3.743,4.8],[4.774,3.723],[0,0]],"v":[[-6.793,-9.596],[-4.88,5.873],[10.536,4.028]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[481.814,552.431],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Eyes","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[528.919,419.966,0],"ix":2},"a":{"a":0,"k":[528.919,419.966,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[498.824,384.003],[487.435,399.044],[565.432,458.108],[576.822,443.068]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[493.78,392.277],[491.988,393.65],[566.012,450.516],[567.804,449.143]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[493.78,392.277],[491.988,393.65],[566.012,450.516],[567.804,449.143]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[498.824,384.003],[487.435,399.044],[565.432,458.108],[576.822,443.068]],"c":true}]},{"t":25}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.335,3.042],[3.043,2.335],[2.336,-3.042],[-3.042,-2.336]],"o":[[2.336,-3.042],[-3.042,-2.336],[-2.335,3.043],[3.042,2.335]],"v":[[5.508,4.229],[4.228,-5.508],[-5.509,-4.229],[-4.229,5.509]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[556.462,441.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.335,3.042],[3.043,2.335],[2.336,-3.042],[-3.042,-2.336]],"o":[[2.335,-3.042],[-3.042,-2.336],[-2.335,3.043],[3.042,2.335]],"v":[[5.509,4.229],[4.228,-5.508],[-5.509,-4.229],[-4.229,5.509]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[501.377,398.823],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"belly","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[499.737,455.46,0],"ix":2},"a":{"a":0,"k":[499.737,455.46,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.652,-6.643],[6.642,-8.652],[0,0],[0,0]],"o":[[6.642,-8.652],[8.652,6.642],[0,0],[0,0],[0,0]],"v":[[-0.947,-30.385],[26.746,-34.023],[30.385,-6.332],[-5.695,40.667],[-37.027,16.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[540.039,460.227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.652,-6.642],[6.642,-8.652],[0,0],[0,0]],"o":[[6.642,-8.652],[8.652,6.642],[0,0],[0,0],[0,0]],"v":[[-0.947,-30.385],[26.746,-34.024],[30.385,-6.332],[-5.695,40.666],[-37.027,16.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[483.324,416.688],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.347,9.496],[0,0],[0,0],[0,0],[-13.318,-10.225],[0,0],[-10.132,13.198],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-10.132,13.199],[0,0],[13.318,10.224],[0,0],[0,0],[0,0],[-8.762,3.9]],"v":[[11.966,-28.935],[18.368,-74.081],[-15.857,-70.098],[-62.668,-9.121],[-56.898,33.289],[-17.082,63.857],[25.379,58.471],[72.799,-3.298],[70.701,-34.535],[29.089,-16.01]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[493.819,462.152],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Body","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.37],"y":[1]},"o":{"x":[0.45],"y":[0]},"n":["0p37_1_0p45_0"],"t":0,"s":[50],"e":[-14.62]},{"i":{"x":[0.674],"y":[-0.319]},"o":{"x":[0.341],"y":[0]},"n":["0p674_-0p319_0p341_0"],"t":19,"s":[-14.62],"e":[-14.418]},{"i":{"x":[0.56],"y":[1]},"o":{"x":[0.64],"y":[0.067]},"n":["0p56_1_0p64_0p067"],"t":23,"s":[-14.418],"e":[50]},{"t":56}],"ix":10},"p":{"a":0,"k":[459.201,356.344,0],"ix":2},"a":{"a":0,"k":[449.08,358.479,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":6,"s":[100,100,100],"e":[131,78,100]},{"i":{"x":[0.27,0.27,0.27],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p27_1_0p167_0p167","0p27_1_0p167_0p167","0p27_1_0p167_0"],"t":10,"s":[131,78,100],"e":[100,100,100]},{"t":17}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.465,7.119],[7.118,5.465],[5.465,-7.118],[-7.119,-5.465]],"o":[[5.465,-7.119],[-7.119,-5.465],[-5.466,7.119],[7.119,5.465]],"v":[[12.89,9.896],[9.896,-12.889],[-12.889,-9.895],[-9.895,12.89]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952999997606,0.808000033509,0.395999983245,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[555.002,442.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.92,1.1],[-3.672,-2.82],[1.116,-4.212],[1.755,1.347]],"o":[[-1.755,-1.348],[3.781,-2.167],[3.673,2.82],[-0.567,2.139],[0,0]],"v":[[-7.978,-1.473],[-7.691,-6.658],[4.632,-5.83],[8.617,5.861],[3.682,7.478]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[521.655,428.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.126,-0.646],[2.156,1.654],[-0.656,2.472],[-1.03,-0.791]],"o":[[1.03,0.791],[-2.219,1.271],[-2.155,-1.655],[0.332,-1.255],[0,0]],"v":[[4.682,0.864],[4.513,3.908],[-2.719,3.421],[-5.056,-3.44],[-2.161,-4.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[519.534,432.603],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.652,-6.643],[6.642,-8.652],[0,0],[0,0]],"o":[[6.642,-8.652],[8.652,6.642],[0,0],[0,0],[0,0]],"v":[[-0.947,-30.385],[26.746,-34.023],[30.385,-6.332],[-5.695,40.667],[-37.027,16.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[540.039,460.227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.652,-6.642],[6.642,-8.652],[0,0],[0,0]],"o":[[6.642,-8.652],[8.652,6.642],[0,0],[0,0],[0,0]],"v":[[-0.947,-30.385],[26.746,-34.024],[30.385,-6.332],[-5.695,40.666],[-37.027,16.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[483.324,416.688],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.01,5.381],[-5.087,6.626],[0,0],[0,0]],"o":[[-5.087,6.626],[-7.009,-5.381],[0,0],[0,0],[0,0]],"v":[[1.419,23.922],[-20.483,26.176],[-23.964,4.436],[3.667,-31.556],[29.05,-12.07]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[527.549,419.108],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.347,9.496],[0,0],[0,0],[0,0],[-13.318,-10.225],[0,0],[-10.132,13.198],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-10.132,13.199],[0,0],[13.318,10.224],[0,0],[0,0],[0,0],[-8.762,3.9]],"v":[[11.966,-28.935],[18.368,-74.081],[-15.857,-70.098],[-62.668,-9.121],[-56.898,33.289],[-17.082,63.857],[25.379,58.471],[72.799,-3.298],[70.701,-34.535],[29.089,-16.01]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[493.819,462.152],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[35.29,27.092],[0,0],[27.092,-35.29],[0,0],[-14.019,-10.762],[0,0],[-10.762,14.018],[0,0]],"o":[[0,0],[-35.29,-27.092],[0,0],[-10.762,14.018],[0,0],[14.018,10.761],[0,0],[27.092,-35.289]],"v":[[61.762,-78.449],[61.762,-78.449],[-51.19,-63.604],[-92.936,-9.225],[-87.039,35.645],[-10.009,94.779],[34.86,88.882],[76.606,34.503]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[442.313,523.242],"ix":2},"a":{"a":0,"k":[-52.793,64.655],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Glass Outlines","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[601.505,484.344,0],"ix":2},"a":{"a":0,"k":[601.505,484.344,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.306,-5.957],[-6.185,0.826],[-8.305,-3.702],[-3.784,5.958]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[592.294,492.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.586,-1.251],[0,0],[1.347,0.192],[0,0],[-0.612,1.05],[0,0]],"o":[[0,0],[0.577,1.232],[0,0],[-1.204,-0.171],[0,0],[0.695,-1.194]],"v":[[1.794,-8.294],[8.957,7.011],[7.165,9.432],[-7.684,7.32],[-8.922,4.763],[-1.237,-8.43]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[609.898,479.757],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Arm R Outlines","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.41],"y":[1]},"o":{"x":[0.59],"y":[0]},"n":["0p41_1_0p59_0"],"t":0,"s":[38],"e":[-42]},{"i":{"x":[0.41],"y":[1]},"o":{"x":[0.59],"y":[0]},"n":["0p41_1_0p59_0"],"t":28,"s":[-42],"e":[38]},{"t":53}],"ix":10},"p":{"a":0,"k":[575.043,479.064,0],"ix":2},"a":{"a":0,"k":[575.043,479.064,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22.26,22.26],"ix":2},"p":{"a":0,"k":[4,-5],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.117646998985,0.121569001441,0.333332974303,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[570.715,484.126],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.105,0.259],[0,0],[0,0],[-2.281,5.643],[5.595,2.31]],"o":[[0,0],[0,0],[5.644,2.281],[2.269,-5.613],[-6.747,-2.786]],"v":[[-7.052,-14.471],[-15.484,6.389],[-1.134,12.19],[13.215,6.102],[7.208,-8.214]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[585.274,482.801],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Arm L Outlines","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[460.434,386.251,0],"ix":2},"a":{"a":0,"k":[460.434,386.251,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.265,-0.087],[0,0],[0,0],[5.784,-1.897],[-1.843,-5.766]],"o":[[0,0],[0,0],[-1.897,-5.784],[-5.752,1.886],[2.223,6.953]],"v":[[-7.56,15.327],[13.819,8.316],[8.996,-6.392],[-4.91,-13.43],[-11.977,0.394]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[452.776,378.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"chandelier base","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[344.204,-453.167,0],"ix":2},"a":{"a":0,"k":[445.204,67.833,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.771,0],[0,0],[0,10.771],[0,0],[-4.486,0],[0,0],[0,-4.486],[0,0]],"o":[[0,0],[-10.771,0],[0,0],[0,-4.486],[0,0],[4.486,0],[0,0],[0,10.771]],"v":[[14.55,16.216],[-14.55,16.216],[-34.053,-3.287],[-34.053,-8.093],[-25.931,-16.216],[25.931,-16.216],[34.053,-8.093],[34.053,-3.287]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[448.062,70.049],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.689,0],[0,0],[0,4.69],[0,0],[-1.953,0],[0,0],[0,-1.953],[0,0]],"o":[[0,0],[-4.689,0],[0,0],[0,-1.953],[0,0],[1.953,0],[0,0],[0,4.69]],"v":[[6.334,7.059],[-6.335,7.059],[-14.825,-1.431],[-14.825,-3.523],[-11.289,-7.059],[11.289,-7.059],[14.825,-3.523],[14.825,-1.431]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[448.063,90.319],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"chandelier bottom 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.57],"y":[0]},"n":["0p16_1_0p57_0"],"t":3,"s":[22],"e":[-22]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.57],"y":[0]},"n":["0p16_1_0p57_0"],"t":21.473,"s":[-22],"e":[-21.933]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.57],"y":[0]},"n":["0p16_1_0p57_0"],"t":26,"s":[-21.933],"e":[22]},{"t":55}],"ix":10},"p":{"a":0,"k":[346.204,-429.167,0],"ix":2},"a":{"a":0,"k":[445.992,91.903,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.487,-12.331],[7.486,-12.331],[7.486,12.331],[-7.487,12.331]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.523,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[366.388,306.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.393,0],[0,0],[0,5.392],[0,0],[2.246,0],[0,0],[0,-2.245],[0,0]],"o":[[0,0],[5.392,0],[0,0],[0,-2.245],[0,0],[-2.246,0],[0,0],[0,5.392]],"v":[[-7.284,8.118],[7.285,8.118],[17.048,-1.645],[17.048,-4.052],[12.983,-8.118],[-12.983,-8.118],[-17.048,-4.052],[-17.048,-1.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.914,315.483],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.093,-12.691],[0.261,-4.766],[0,0],[1.729,-3.557],[4.702,22.165]],"o":[[-7.974,-14.081],[-2.124,3.8],[0,0],[-0.232,4.257],[-8.24,16.946],[0,0]],"v":[[36.922,-47.763],[6.956,-47.724],[3.435,-34.5],[-0.245,32.901],[-3.113,44.897],[-36.922,37.465]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.776,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[404.283,275.725],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[10.727,-12.691],[0.393,-4.766],[0,0],[2.616,-3.556],[7.111,22.164]],"o":[[0,0],[-12.059,-14.08],[-3.212,3.8],[0,0],[-0.351,4.256],[-12.461,16.947],[0,0]],"v":[[60.66,-36.493],[51.008,-47.764],[5.693,-47.725],[0.37,-34.501],[-5.196,32.9],[-9.535,44.896],[-60.66,37.464]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.414,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[388.878,273.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.311,-8.748],[5.311,-8.748],[5.311,8.748],[-5.311,8.748]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.499,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[328.433,304.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.826,0],[0,0],[0,3.826],[0,0],[1.593,0],[0,0],[0,-1.593],[0,0]],"o":[[0,0],[3.825,0],[0,0],[0,-1.593],[0,0],[-1.594,0],[0,0],[0,3.826]],"v":[[-5.168,5.759],[5.168,5.759],[12.095,-1.167],[12.095,-2.874],[9.21,-5.759],[-9.21,-5.759],[-12.095,-2.874],[-12.095,-1.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[328.807,310.135],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.487,-12.331],[-7.487,-12.331],[-7.487,12.331],[7.487,12.331]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.523,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[532.021,305.346],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.393,0],[0,0],[0,5.392],[0,0],[-2.246,0],[0,0],[0,-2.245],[0,0]],"o":[[0,0],[-5.392,0],[0,0],[0,-2.245],[0,0],[2.246,0],[0,0],[0,5.392]],"v":[[7.285,8.118],[-7.284,8.118],[-17.048,-1.645],[-17.048,-4.052],[-12.982,-8.118],[12.983,-8.118],[17.049,-4.052],[17.049,-1.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[531.494,313.861],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.093,-12.691],[-0.261,-4.766],[0,0],[-1.729,-3.557],[-4.702,22.165]],"o":[[7.974,-14.081],[2.124,3.8],[0,0],[0.232,4.257],[8.24,16.946],[0,0]],"v":[[-36.921,-47.763],[-6.956,-47.724],[-3.435,-34.5],[0.245,32.901],[3.113,44.897],[36.922,37.465]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.776,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[494.125,274.103],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-10.727,-12.691],[-0.393,-4.766],[0,0],[-2.616,-3.556],[-7.111,22.164]],"o":[[0,0],[12.059,-14.081],[3.212,3.8],[0,0],[0.351,4.256],[12.461,16.947],[0,0]],"v":[[-60.66,-36.493],[-51.008,-47.762],[-5.693,-47.725],[-0.37,-34.501],[5.196,32.9],[9.535,44.896],[60.66,37.464]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.414,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[509.53,272.212],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.311,-8.748],[-5.311,-8.748],[-5.311,8.748],[5.311,8.748]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.499,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[569.975,302.473],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.826,0],[0,0],[0,3.826],[0,0],[-1.593,0],[0,0],[0,-1.593],[0,0]],"o":[[0,0],[-3.825,0],[0,0],[0,-1.593],[0,0],[1.594,0],[0,0],[0,3.826]],"v":[[5.168,5.759],[-5.168,5.759],[-12.095,-1.167],[-12.095,-2.874],[-9.21,-5.759],[9.21,-5.759],[12.095,-2.874],[12.095,-1.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[569.601,308.513],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,3.927],[3.927,0],[0,-3.927],[-3.927,0]],"o":[[0,-3.927],[-3.927,0],[0,3.927],[3.927,0]],"v":[[7.11,0],[0,-7.11],[-7.11,0],[0,7.11]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.188,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[448.063,157.884],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":3,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,5.821],[5.821,0],[0,-5.821],[-5.821,0]],"o":[[0,-5.821],[-5.821,0],[0,5.821],[5.821,0]],"v":[[10.54,0],[0,-10.54],[-10.54,0],[0,10.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.243,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[448.063,357.338],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":3,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[448.062,90.319],[448.062,347.609]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.243,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944999964097,0.776000019148,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":3,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":218,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/peli-canon.json b/example/resource/peli-canon.json new file mode 100644 index 0000000000..d7a78c7a00 --- /dev/null +++ b/example/resource/peli-canon.json @@ -0,0 +1 @@ +{"v":"4.10.2","fr":24,"ip":0,"op":105,"w":1500,"h":1500,"nm":"Interactive link","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"RECOIL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.24],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p24_1_0p167_0p167"],"t":33.6,"s":[0],"e":[-8]},{"i":{"x":[0.24],"y":[1]},"o":{"x":[0.167],"y":[0.182]},"n":["0p24_1_0p167_0p182"],"t":41.6,"s":[-8],"e":[0]},{"t":60.8}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.48,"y":1},"o":{"x":0.52,"y":0},"n":"0p48_1_0p52_0","t":33.6,"s":[960,540,0],"e":[806,540,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.48,"y":1},"o":{"x":0.52,"y":0},"n":"0p48_1_0p52_0","t":36.8,"s":[806,540,0],"e":[960,540,0],"to":[0,0,0],"ti":[0,0,0]},{"t":57.6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Smoke Move","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.64,"y":0},"n":"0p833_1_0p64_0","t":32.8,"s":[960,540,0],"e":[466,540,0],"to":[0,0,0],"ti":[0,0,0]},{"t":72.8}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":15.2,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Smoke Size","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[237.027,-106.941,0],"ix":2},"a":{"a":0,"k":[-46,36,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.56,0.56,0.56],"y":[0,0,0]},"n":["0p833_0p833_0p56_0","0p833_0p833_0p56_0","0p833_1_0p56_0"],"t":32.8,"s":[0,0,100],"e":[100,100,100]},{"t":36}],"ix":6}},"ao":0,"ip":32.8,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Smoke 4","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.56,"y":0},"n":"0p833_0p833_0p56_0","t":32.8,"s":[77,125,0],"e":[102,174,0],"to":[0,0,0],"ti":[0,0,0]},{"t":52}],"ix":2},"a":{"a":0,"k":[434.027,-253.941,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,17.667]},"o":{"x":[0.56,0.56,0.56],"y":[0,0,0]},"n":["0p833_0p833_0p56_0","0p833_0p833_0p56_0","0p833_17p667_0p56_0"],"t":32.8,"s":[48,48,100],"e":[0,0,100]},{"t":52}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[127.148,127.148],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[434.027,-253.941],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[117.417,117.417],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32.8,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Smoke 3","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.56,"y":0},"n":"0p833_0p833_0p56_0","t":32.8,"s":[95,-5,0],"e":[-67,-145,0],"to":[0,0,0],"ti":[0,0,0]},{"t":66.4}],"ix":2},"a":{"a":0,"k":[434.027,-253.941,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,17.667]},"o":{"x":[0.56,0.56,0.56],"y":[0,0,0]},"n":["0p833_0p833_0p56_0","0p833_0p833_0p56_0","0p833_17p667_0p56_0"],"t":32.8,"s":[48,48,100],"e":[0,0,100]},{"t":66.4}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":38.4,"s":[80.71,80.71],"e":[0,0]},{"t":62.4}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":38.4,"s":[-43.263,-88],"e":[-2,-423],"to":[0,0],"ti":[0,0]},{"t":62.4}],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[483.273,-188.457],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[127.148,127.148],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[434.027,-253.941],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[117.417,117.417],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":32.8,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Smoke 2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.56,"y":0},"n":"0p833_0p833_0p56_0","t":32.8,"s":[117,59,0],"e":[300,308,0],"to":[0,0,0],"ti":[0,0,0]},{"t":68}],"ix":2},"a":{"a":0,"k":[434.027,-253.941,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,17.667]},"o":{"x":[0.56,0.56,0.56],"y":[0,0,0]},"n":["0p833_0p833_0p56_0","0p833_0p833_0p56_0","0p833_17p667_0p56_0"],"t":32.8,"s":[100,100,100],"e":[0,0,100]},{"t":60}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":35.2,"s":[99.664,99.664],"e":[0,0]},{"t":52.8}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.2,"s":[0,-59],"e":[204,-115.733],"to":[0,0],"ti":[0,0]},{"t":52.8}],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[433.914,-183.835],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":35.2,"s":[99.664,99.664],"e":[0,0]},{"t":62.4}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.2,"s":[0,-59],"e":[42,101],"to":[0,0],"ti":[0,0]},{"t":62.4}],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[433.914,-183.835],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[127.148,127.148],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[434.027,-253.941],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[117.417,117.417],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":32.8,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Smoke","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.56,"y":0},"n":"0p833_0p833_0p56_0","t":32.8,"s":[23,5,0],"e":[23,-80,0],"to":[0,0,0],"ti":[0,0,0]},{"t":66.4}],"ix":2},"a":{"a":0,"k":[434.027,-253.941,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,17.667]},"o":{"x":[0.56,0.56,0.56],"y":[0,0,0]},"n":["0p833_0p833_0p56_0","0p833_0p833_0p56_0","0p833_17p667_0p56_0"],"t":32.8,"s":[100,100,100],"e":[0,0,100]},{"t":66.4}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[127.148,127.148],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.941176470588,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[434.027,-253.941],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[117.417,117.417],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32.8,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"gun mask","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-1.035,"ix":10},"p":{"a":0,"k":[-13.325,60.246,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[133.333,133.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[224.133,457.844],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254991718,0.2588239782,0.427451010311,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952940996955,0.941175991881,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.066,192.922],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"gun quick","parent":13,"tt":2,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[-46.405,49.873,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[133.333,133.333,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Body Main","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p52_1_0p167_0p167"],"t":0,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":3.378,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.889]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p889_0p48_0"],"t":11.822,"s":[0],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.333]},"n":["0p52_1_0p167_0p333"],"t":15.2,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":18.578,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.889]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p889_0p48_0"],"t":27.022,"s":[0],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.333]},"n":["0p52_1_0p167_0p333"],"t":30.4,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":33.778,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.889]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p889_0p48_0"],"t":42.222,"s":[0],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.333]},"n":["0p52_1_0p167_0p333"],"t":45.6,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":48.978,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.889]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p889_0p48_0"],"t":57.422,"s":[0],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.333]},"n":["0p52_1_0p167_0p333"],"t":60.8,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":64.178,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.889]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p889_0p48_0"],"t":72.622,"s":[0],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.333]},"n":["0p52_1_0p167_0p333"],"t":76,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":79.378,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p833_0p48_0"],"t":87.822,"s":[0],"e":[3]},{"t":91.2}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p52_1_0p167_0p167","t":0,"s":[10.895,75.112,0],"e":[10.895,57.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":4.222,"s":[10.895,57.112,0],"e":[10.895,105.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.9},"o":{"x":0.48,"y":0},"n":"0p833_0p9_0p48_0","t":12.667,"s":[10.895,105.112,0],"e":[10.895,75.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.278},"n":"0p52_1_0p167_0p278","t":15.2,"s":[10.895,75.112,0],"e":[10.895,57.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":19.422,"s":[10.895,57.112,0],"e":[10.895,105.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.9},"o":{"x":0.48,"y":0},"n":"0p833_0p9_0p48_0","t":27.867,"s":[10.895,105.112,0],"e":[10.895,75.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.278},"n":"0p52_1_0p167_0p278","t":30.4,"s":[10.895,75.112,0],"e":[10.895,57.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":34.622,"s":[10.895,57.112,0],"e":[10.895,105.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.9},"o":{"x":0.48,"y":0},"n":"0p833_0p9_0p48_0","t":43.067,"s":[10.895,105.112,0],"e":[10.895,75.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.278},"n":"0p52_1_0p167_0p278","t":45.6,"s":[10.895,75.112,0],"e":[10.895,57.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":49.822,"s":[10.895,57.112,0],"e":[10.895,105.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.9},"o":{"x":0.48,"y":0},"n":"0p833_0p9_0p48_0","t":58.267,"s":[10.895,105.112,0],"e":[10.895,75.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.278},"n":"0p52_1_0p167_0p278","t":60.8,"s":[10.895,75.112,0],"e":[10.895,57.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":65.022,"s":[10.895,57.112,0],"e":[10.895,105.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.9},"o":{"x":0.48,"y":0},"n":"0p833_0p9_0p48_0","t":73.467,"s":[10.895,105.112,0],"e":[10.895,75.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.278},"n":"0p52_1_0p167_0p278","t":76,"s":[10.895,75.112,0],"e":[10.895,57.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":80.222,"s":[10.895,57.112,0],"e":[10.895,105.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.9},"o":{"x":0.48,"y":0},"n":"0p833_0p9_0p48_0","t":88.667,"s":[10.895,105.112,0],"e":[10.895,75.112,0],"to":[0,0,0],"ti":[0,0,0]},{"t":91.2}],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[75,75,100],"ix":6}},"ao":0,"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"wing 5","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":0,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":10.133,"s":[146],"e":[59]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":15.2,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":25.333,"s":[146],"e":[59]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":30.4,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":40.533,"s":[146],"e":[59]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":45.6,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":55.733,"s":[146],"e":[59]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":60.8,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":70.933,"s":[146],"e":[59]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":76,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":86.133,"s":[146],"e":[59]},{"t":91.2}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":0,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":10.133,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":15.2,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":25.333,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":30.4,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":40.533,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":45.6,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":55.733,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":60.8,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":70.933,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":76,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":86.133,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"t":91.2}],"ix":2},"a":{"a":0,"k":[336.892,14.647,0],"ix":1},"s":{"a":0,"k":[-65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":0,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5.742,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":7.656,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":10.133,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.541,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":13.005,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":15.2,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.942,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":22.856,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":25.333,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":26.741,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":28.205,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":30.4,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36.142,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":38.056,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":40.533,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.941,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":43.405,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":45.6,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.342,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":53.256,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":55.733,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":57.141,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":58.605,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":60.8,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":66.542,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":68.456,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":70.933,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":72.341,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":73.805,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":76,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.742,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":83.656,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":86.133,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87.541,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":89.005,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"t":91.2}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152941176471,0.2,0.239215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[174.225,86.647],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Top Beak Outlines","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.26],"y":[1]},"o":{"x":[0.55],"y":[0]},"n":["0p26_1_0p55_0"],"t":2.109,"s":[0],"e":[-68]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":8.727,"s":[-68],"e":[-62]},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.161],"y":[0]},"n":["0p25_1_0p161_0"],"t":12.8,"s":[-62],"e":[-62]},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.396],"y":[0]},"n":["0p25_1_0p396_0"],"t":72,"s":[-62],"e":[-68]},{"i":{"x":[0.25],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p25_1_0p167_0"],"t":75.2,"s":[-68],"e":[0]},{"t":80}],"ix":10},"p":{"a":0,"k":[14.53,13.181,0],"ix":2},"a":{"a":0,"k":[7.365,40.329,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.537,0],[0,0],[0,-19.537],[0,0],[0,0],[0,0]],"o":[[0,0],[-19.537,0],[0,0],[0,0],[0,0],[0,-19.537]],"v":[[114.406,-21.413],[-114.407,-21.413],[-149.782,13.962],[-149.782,21.413],[149.781,21.413],[149.781,13.962]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337000020345,0.258999992819,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.031,21.663],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Bottom Beak Outlines","parent":15,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.26],"y":[1]},"o":{"x":[0.55],"y":[0]},"n":["0p26_1_0p55_0"],"t":1.6,"s":[0],"e":[18]},{"i":{"x":[0.26],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p26_1_0p167_0"],"t":8.8,"s":[18],"e":[18]},{"i":{"x":[0.26],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p26_1_0p167_0"],"t":72,"s":[18],"e":[0]},{"t":77.6}],"ix":10},"p":{"a":0,"k":[112.476,79.031,0],"ix":2},"a":{"a":0,"k":[10.209,15.628,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-77.12,0],[-0.52,76.997]],"o":[[0.52,76.997],[77.119,0],[0,0]],"v":[[-140.209,-69.629],[0,69.629],[140.209,-69.629]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.866999966491,0.776000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.209,79.629],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"small mask 2","parent":15,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":8.868,"ix":10},"p":{"a":0,"k":[162.027,67.974,0],"ix":2},"a":{"a":0,"k":[38.875,-61.949,0],"ix":1},"s":{"a":0,"k":[133.333,133.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[53.75,31.898],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254991718,0.2588239782,0.427451010311,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952940996955,0.941175991881,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.875,-61.949],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Head","parent":17,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p52_1_0p167_0p167"],"t":0,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":4.222,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.909]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p909_0p48_0"],"t":11.822,"s":[-6],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.509]},"n":["0p52_1_0p167_0p509"],"t":15.2,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":19.422,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.909]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p909_0p48_0"],"t":27.022,"s":[-6],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.509]},"n":["0p52_1_0p167_0p509"],"t":30.4,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":34.622,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.909]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p909_0p48_0"],"t":42.222,"s":[-6],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.509]},"n":["0p52_1_0p167_0p509"],"t":45.6,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":49.822,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.909]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p909_0p48_0"],"t":57.422,"s":[-6],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.509]},"n":["0p52_1_0p167_0p509"],"t":60.8,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":65.022,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.909]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p909_0p48_0"],"t":72.622,"s":[-6],"e":[3]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.509]},"n":["0p52_1_0p167_0p509"],"t":76,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":80.222,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p833_0p48_0"],"t":87.822,"s":[-6],"e":[3]},{"t":91.2}],"ix":10},"p":{"a":0,"k":[16.908,51.505,0],"ix":2},"a":{"a":0,"k":[16.908,51.505,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,5.418],[5.418,0],[0,-5.418],[-5.418,0]],"o":[[0,-5.418],[-5.418,0],[0,5.418],[5.418,0]],"v":[[9.81,0],[0,-9.81],[-9.81,0],[0,9.81]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0.075},"n":"0p35_1_0p167_0p075","t":2.4,"s":[93.656,43.492],"e":[80.656,43.492],"to":[0,0],"ti":[0,0]},{"i":{"x":0.35,"y":0.35},"o":{"x":0.167,"y":0.167},"n":"0p35_0p35_0p167_0p167","t":9.6,"s":[80.656,43.492],"e":[80.656,43.492],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":76.8,"s":[80.656,43.492],"e":[93.656,43.492],"to":[0,0],"ti":[0,0]},{"t":80.8}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.333],[-34.333,0],[0,34.333],[34.333,0]],"o":[[0,34.333],[34.333,0],[0,-34.333],[-34.333,0]],"v":[[-62.166,0],[0,62.166],[62.166,0],[0,-62.166]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.067,62.416],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.557,0],[0,0]],"o":[[0,0],[-2.85,4.769],[0,0],[0,0]],"v":[[10.193,-21.154],[-8.623,10.328],[-2.48,21.154],[11.473,21.154]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.723,57.927],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"small mask","parent":15,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":8.868,"ix":10},"p":{"a":0,"k":[157.188,77.464,0],"ix":2},"a":{"a":0,"k":[38.875,-61.949,0],"ix":1},"s":{"a":0,"k":[133.333,133.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[53.75,31.898],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254991718,0.2588239782,0.427451010311,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952940996955,0.941175991881,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.875,-61.949],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Neck","parent":10,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.35],"y":[1]},"o":{"x":[0.167],"y":[0.137]},"n":["0p35_1_0p167_0p137"],"t":0,"s":[0],"e":[-24]},{"i":{"x":[0.35],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p35_1_0p167_0"],"t":23.2,"s":[-24],"e":[-24]},{"i":{"x":[0.35],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p35_1_0p167_0"],"t":75.2,"s":[-24],"e":[0]},{"t":84.8}],"ix":10},"p":{"a":0,"k":[8.184,36.832,0],"ix":2},"a":{"a":0,"k":[20.509,191.313,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-31.721,0],[0,31.721]],"o":[[0,0],[0,0],[0,31.721],[31.721,0],[0,0]],"v":[[57.436,-96.172],[-57.436,-96.172],[-57.436,38.736],[0,96.172],[57.436,38.736]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[77.216,158.588],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Front Leg Outlines","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3.378,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.932]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p932_0p25_0"],"t":12.667,"s":[22.178],"e":[2.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-2.223]},"n":["0p42_1_0p167_-2p223"],"t":15.2,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18.578,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.932]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p932_0p25_0"],"t":27.867,"s":[22.178],"e":[2.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-2.223]},"n":["0p42_1_0p167_-2p223"],"t":30.4,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33.778,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.932]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p932_0p25_0"],"t":43.067,"s":[22.178],"e":[2.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-2.223]},"n":["0p42_1_0p167_-2p223"],"t":45.6,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48.978,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.932]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p932_0p25_0"],"t":58.267,"s":[22.178],"e":[2.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-2.223]},"n":["0p42_1_0p167_-2p223"],"t":60.8,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64.178,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.932]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p932_0p25_0"],"t":73.467,"s":[22.178],"e":[2.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-2.223]},"n":["0p42_1_0p167_-2p223"],"t":76,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79.378,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p833_0p25_0"],"t":88.667,"s":[22.178],"e":[2.178]},{"t":91.2}],"ix":10},"p":{"a":0,"k":[-99.14,166.91,0],"ix":2},"a":{"a":0,"k":[65.762,6.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.577,-6.966],[0,0],[0.694,-2.36],[3.024,0.418],[0,0],[0.975,-2.897],[3.412,2.33],[0.591,1.594],[0,0]],"o":[[0,0],[1.688,2.108],[-0.861,2.928],[0,0],[-3.028,-0.418],[-1.319,3.917],[-1.291,-0.881],[0,0],[-3.103,-8.367]],"v":[[-7.838,-25.886],[22.348,11.824],[23.751,18.958],[16.853,23.219],[14.624,22.911],[7.724,27.182],[-1.725,30.521],[-4.652,26.768],[-21.342,-18.242]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.31,60.893],"ix":2},"a":{"a":0,"k":[-9.385,-16.997],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2.533,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p882_0p25_0"],"t":12.667,"s":[-25],"e":[6]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.282]},"n":["0p42_1_0p167_0p282"],"t":15.2,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17.733,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p882_0p25_0"],"t":27.867,"s":[-25],"e":[6]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.282]},"n":["0p42_1_0p167_0p282"],"t":30.4,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32.933,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p882_0p25_0"],"t":43.067,"s":[-25],"e":[6]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.282]},"n":["0p42_1_0p167_0p282"],"t":45.6,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48.133,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p882_0p25_0"],"t":58.267,"s":[-25],"e":[6]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.282]},"n":["0p42_1_0p167_0p282"],"t":60.8,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63.333,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p882_0p25_0"],"t":73.467,"s":[-25],"e":[6]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.282]},"n":["0p42_1_0p167_0p282"],"t":76,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78.533,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p833_0p25_0"],"t":88.667,"s":[-25],"e":[6]},{"t":91.2}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.75,2.75],[0,0],[-2.75,2.75],[0,0],[-2.75,-2.75],[2.75,-2.75],[0,0]],"o":[[0,0],[-2.75,-2.75],[0,0],[2.75,-2.75],[2.75,2.75],[0,0],[-2.75,2.75]],"v":[[-31.045,31.045],[-31.045,31.045],[-31.045,21.045],[21.045,-31.045],[31.045,-31.045],[31.045,-21.045],[-21.045,31.045]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.478,34.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Bottom Body Outlines","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-51.067,125.81,0],"ix":2},"a":{"a":0,"k":[174.225,86.647,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[73.071,73.071],"ix":2},"p":{"a":0,"k":[79,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254991718,0.2588239782,0.427451010311,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[233.351,-3.486],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-95.692,0],[-0.645,95.54]],"o":[[0.645,95.54],[95.692,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[174.225,86.647],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Back Leg","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5.067,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.964]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p964_0p36_0"],"t":13.511,"s":[22.178],"e":[0.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-0.85]},"n":["0p42_1_0p167_-0p85"],"t":15.2,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20.267,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.964]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p964_0p36_0"],"t":28.711,"s":[22.178],"e":[0.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-0.85]},"n":["0p42_1_0p167_-0p85"],"t":30.4,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35.467,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.964]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p964_0p36_0"],"t":43.911,"s":[22.178],"e":[0.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-0.85]},"n":["0p42_1_0p167_-0p85"],"t":45.6,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.667,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.964]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p964_0p36_0"],"t":59.111,"s":[22.178],"e":[0.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-0.85]},"n":["0p42_1_0p167_-0p85"],"t":60.8,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":65.867,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.964]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p964_0p36_0"],"t":74.311,"s":[22.178],"e":[0.178]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[-0.85]},"n":["0p42_1_0p167_-0p85"],"t":76,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81.067,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p833_0p36_0"],"t":89.511,"s":[22.178],"e":[0.178]},{"t":91.2}],"ix":10},"p":{"a":0,"k":[182.152,135.748,0],"ix":2},"a":{"a":0,"k":[65.762,6.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.577,-6.966],[0,0],[0.694,-2.36],[3.024,0.418],[0,0],[0.975,-2.897],[3.412,2.33],[0.591,1.594],[0,0]],"o":[[0,0],[1.688,2.108],[-0.861,2.928],[0,0],[-3.028,-0.418],[-1.319,3.917],[-1.291,-0.881],[0,0],[-3.103,-8.367]],"v":[[-7.838,-25.886],[22.348,11.824],[23.751,18.958],[16.853,23.219],[14.624,22.911],[7.724,27.182],[-1.725,30.521],[-4.652,26.768],[-21.342,-18.242]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.31,60.893],"ix":2},"a":{"a":0,"k":[-9.385,-16.997],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":4.222,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p917_0p36_0"],"t":13.511,"s":[-23],"e":[0]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.28]},"n":["0p42_1_0p167_0p28"],"t":15.2,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":19.422,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p917_0p36_0"],"t":28.711,"s":[-23],"e":[0]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.28]},"n":["0p42_1_0p167_0p28"],"t":30.4,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":34.622,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p917_0p36_0"],"t":43.911,"s":[-23],"e":[0]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.28]},"n":["0p42_1_0p167_0p28"],"t":45.6,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":49.822,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p917_0p36_0"],"t":59.111,"s":[-23],"e":[0]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.28]},"n":["0p42_1_0p167_0p28"],"t":60.8,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":65.022,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p917_0p36_0"],"t":74.311,"s":[-23],"e":[0]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.28]},"n":["0p42_1_0p167_0p28"],"t":76,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":80.222,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p833_0p36_0"],"t":89.511,"s":[-23],"e":[0]},{"t":91.2}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.75,2.75],[0,0],[-2.75,2.75],[0,0],[-2.75,-2.75],[2.75,-2.75],[0,0]],"o":[[0,0],[-2.75,-2.75],[0,0],[2.75,-2.75],[2.75,2.75],[0,0],[-2.75,2.75]],"v":[[-31.045,31.045],[-31.045,31.045],[-31.045,21.045],[21.045,-31.045],[31.045,-31.045],[31.045,-21.045],[-21.045,31.045]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.478,34.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91.2,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"muzzle top","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.01},"n":"0p833_1_0p167_0p01","t":0,"s":[1.365,-0.526,0],"e":[107.365,-0.526,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.104},"n":"0p25_1_0p167_0p104","t":12,"s":[107.365,-0.526,0],"e":[124.365,-0.526,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0},"n":"0p25_1_0p167_0","t":32,"s":[124.365,-0.526,0],"e":[81.052,-0.138,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.016},"n":"0p833_1_0p167_0p016","t":36,"s":[81.052,-0.138,0],"e":[107.365,-0.526,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.48,"y":0.48},"o":{"x":0,"y":0},"n":"0p48_0p48_0_0","t":40.8,"s":[107.365,-0.526,0],"e":[107.365,-0.526,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.48,"y":1},"o":{"x":0.52,"y":0},"n":"0p48_1_0p52_0","t":68,"s":[107.365,-0.526,0],"e":[39.052,-0.138,0],"to":[0,0,0],"ti":[0,0,0]},{"t":74.4}],"ix":2},"a":{"a":0,"k":[-67.077,-188.693,0],"ix":1},"s":{"a":0,"k":[101.719,87.719,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":12,"s":[56.154,114.613],"e":[81.154,114.613]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":32,"s":[81.154,114.613],"e":[56.154,114.613]},{"t":36}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":7,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152941176471,0.2,0.239215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-51.347,-187.696],"ix":2},"a":{"a":0,"k":[28.612,1.172],"ix":1},"s":{"a":0,"k":[84.896,85.078],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"cannon tip","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"n":"0p833_0p833_0p33_0","t":-4.8,"s":[-71.354,-187.749,0],"e":[-59.36,-187.377,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p67_1_0p167_0p167","t":-0.8,"s":[-59.36,-187.377,0],"e":[-63.359,-187.305,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":0.67},"o":{"x":0.33,"y":0.33},"n":"0p67_0p67_0p33_0p33","t":1.6,"s":[-63.359,-187.305,0],"e":[-63.359,-187.305,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.33,"y":0},"n":"0p67_1_0p33_0","t":14.4,"s":[-63.359,-187.305,0],"e":[-54.306,-187.474,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.33,"y":0},"n":"0p67_1_0p33_0","t":32,"s":[-54.306,-187.474,0],"e":[-67.24,-187.253,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.33,"y":0},"n":"0p67_1_0p33_0","t":36.8,"s":[-67.24,-187.253,0],"e":[-63.359,-187.305,0],"to":[0,0,0],"ti":[0,0,0]},{"t":41.6}],"ix":2},"a":{"a":0,"k":[320.141,-109.805,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[38.281,69.609],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[320.141,-109.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 11","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.336,-0.031,0],"ix":2},"a":{"a":0,"k":[-100.117,-188.035,0],"ix":1},"s":{"a":0,"k":[87.719,87.719,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20.234,77.93],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.866666666667,0.776470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-100.117,-188.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.4,"op":71.2,"st":-91.2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"circle 4","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.329,-2.022,0],"ix":2},"a":{"a":0,"k":[176.195,-111.805,0],"ix":1},"s":{"a":0,"k":[87.719,87.719,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15.609,15.609],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.866666666667,0.776470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.195,-111.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"circle 3","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8.797,-2.022,0],"ix":2},"a":{"a":0,"k":[176.195,-111.805,0],"ix":1},"s":{"a":0,"k":[87.719,87.719,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15.609,15.609],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.866666666667,0.776470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.195,-111.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"circle 2","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.735,-2.022,0],"ix":2},"a":{"a":0,"k":[176.195,-111.805,0],"ix":1},"s":{"a":0,"k":[87.719,87.719,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15.609,15.609],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.866666666667,0.776470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.195,-111.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Main Cannon","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.32],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p32_1_0p167_0"],"t":0,"s":[-76.287],"e":[-39.287]},{"i":{"x":[0.32],"y":[1]},"o":{"x":[0.167],"y":[0.227]},"n":["0p32_1_0p167_0p227"],"t":13.6,"s":[-39.287],"e":[7.379]},{"i":{"x":[0.32],"y":[1]},"o":{"x":[0.167],"y":[0.37]},"n":["0p32_1_0p167_0p37"],"t":18.4,"s":[7.379],"e":[4.379]},{"i":{"x":[0.621],"y":[1.105]},"o":{"x":[0.288],"y":[0]},"n":["0p621_1p105_0p288_0"],"t":20,"s":[4.379],"e":[6.847]},{"i":{"x":[0.631],"y":[1]},"o":{"x":[0.299],"y":[0.069]},"n":["0p631_1_0p299_0p069"],"t":24.8,"s":[6.847],"e":[3.379]},{"i":{"x":[0.598],"y":[9.405]},"o":{"x":[0.268],"y":[0]},"n":["0p598_9p405_0p268_0"],"t":30.4,"s":[3.379],"e":[3.178]},{"i":{"x":[0.647],"y":[0.988]},"o":{"x":[0.314],"y":[0.095]},"n":["0p647_0p988_0p314_0p095"],"t":48.8,"s":[3.178],"e":[9.235]},{"i":{"x":[0.644],"y":[1]},"o":{"x":[0.311],"y":[-0.018]},"n":["0p644_1_0p311_-0p018"],"t":56.8,"s":[9.235],"e":[4.379]},{"i":{"x":[0.48],"y":[1]},"o":{"x":[0.52],"y":[0]},"n":["0p48_1_0p52_0"],"t":68,"s":[4.379],"e":[-58.621]},{"t":74.4}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.144},"n":"0p25_1_0p167_0p144","t":32.8,"s":[61.277,-85.284,0],"e":[41.255,-85.689,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.25,"y":1},"o":{"x":0.167,"y":0.144},"n":"0p25_1_0p167_0p144","t":36.8,"s":[41.255,-85.689,0],"e":[61.277,-85.284,0],"to":[0,0,0],"ti":[0,0,0]},{"t":42.4}],"ix":2},"a":{"a":0,"k":[-61.324,3.45,0],"ix":1},"s":{"a":0,"k":[69.18,69.18,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-16.8,"s":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[40.221,-26.561],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[40.221,31.773]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[75.833,-29.167],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[75.833,29.167]],"c":true}]},{"i":{"x":0.32,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p32_1_0p167_0p167","t":-13.6,"s":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[75.833,-29.167],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[75.833,29.167]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[9.87,-28.07],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[9.87,30.263]],"c":true}]},{"i":{"x":0.32,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p32_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[9.87,-28.07],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[9.87,30.263]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[75.833,-29.167],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[75.833,29.167]],"c":true}]},{"i":{"x":0.48,"y":1},"o":{"x":0.167,"y":0},"n":"0p48_1_0p167_0","t":10.4,"s":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[75.833,-29.167],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[75.833,29.167]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[75.833,-29.167],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[75.833,29.167]],"c":true}]},{"i":{"x":0.48,"y":1},"o":{"x":0.52,"y":0},"n":"0p48_1_0p52_0","t":68,"s":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[75.833,-29.167],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[75.833,29.167]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,-16.108],[0,0],[-16.108,0],[0,0]],"o":[[0,0],[-16.108,0],[0,0],[0,16.108],[0,0],[0,0]],"v":[[9.87,-28.07],[-46.667,-29.167],[-75.833,0],[-75.833,0],[-46.667,29.167],[9.87,30.263]],"c":true}]},{"t":74.4}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152941176471,0.2,0.239215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"tip","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-3.2,"s":[-63.901,-230.501,0],"e":[-63.761,-243.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-0.8,"s":[-63.761,-243.5,0],"e":[-63.75,-244.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":1.6}],"ix":2},"a":{"a":0,"k":[-63.75,-244,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-55.5,-250.5],[-72,-237.5],[-55.5,-238]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"sight top 2","parent":7,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"n":"0p833_0p833_0p33_0","t":-6.4,"s":[-3.643,-15.564,0],"e":[-2.062,-40.969,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.569,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p569_1_0p167_0p167","t":-1.6,"s":[-2.062,-40.969,0],"e":[-2.174,-7.462,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.66,"y":1},"o":{"x":0.326,"y":0},"n":"0p66_1_0p326_0","t":13.6,"s":[-2.174,-7.462,0],"e":[-2.174,-37.462,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.706,"y":0.706},"o":{"x":0.334,"y":0.334},"n":"0p706_0p706_0p334_0p334","t":16,"s":[-2.174,-37.462,0],"e":[-2.174,-37.462,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.167,"y":0},"n":"0p67_1_0p167_0","t":32.8,"s":[-2.174,-37.462,0],"e":[-1.941,-21.675,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.167,"y":0},"n":"0p67_1_0p167_0","t":38.165,"s":[-1.941,-21.675,0],"e":[-2.012,-40.967,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.167,"y":0},"n":"0p67_1_0p167_0","t":43.53,"s":[-2.012,-40.967,0],"e":[-2.174,-37.462,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":0.67},"o":{"x":0.167,"y":0.167},"n":"0p67_0p67_0p167_0p167","t":48,"s":[-2.174,-37.462,0],"e":[-2.174,-37.462,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.67,"y":1},"o":{"x":0.167,"y":0},"n":"0p67_1_0p167_0","t":68,"s":[-2.174,-37.462,0],"e":[-2.174,-4.462,0],"to":[0,0,0],"ti":[0,0,0]},{"t":72}],"ix":2},"a":{"a":0,"k":[170.521,-153.707,0],"ix":1},"s":{"a":0,"k":[55.839,73.652,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[77.043,37.414],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.866666666667,0.776470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.521,-153.707],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":106.4,"st":-91.2,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"swivel","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":2.662,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.32,"y":1},"o":{"x":0.27,"y":0},"n":"0p32_1_0p27_0","t":1.6,"s":[1087.278,777.499,0],"e":[1113.149,531.355,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.332,"y":0.332},"o":{"x":0.173,"y":0.173},"n":"0p332_0p332_0p173_0p173","t":12.8,"s":[1113.149,531.355,0],"e":[1113.149,531.355,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.24,"y":1},"o":{"x":0.325,"y":0},"n":"0p24_1_0p325_0","t":66.4,"s":[1113.149,531.355,0],"e":[1114.638,517.183,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.24,"y":1},"o":{"x":0.43,"y":0},"n":"0p24_1_0p43_0","t":72.8,"s":[1114.638,517.183,0],"e":[1087.278,777.499,0],"to":[0,0,0],"ti":[0,0,0]},{"t":84}],"ix":2},"a":{"a":0,"k":[62.977,-55.023,0],"ix":1},"s":{"a":0,"k":[164.787,164.787,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[62.047,62.047],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.337254901961,0.258823529412,0.427450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152941176471,0.2,0.239215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.977,-55.023],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":243.2,"st":-44.8,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Body Main","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p52_1_0p167_0p167"],"t":0,"s":[3],"e":[4]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":3.2,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p833_0p48_0"],"t":11.2,"s":[0],"e":[3]},{"t":14.4}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p52_1_0p167_0p167","t":0,"s":[970.895,615.112,0],"e":[970.895,597.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"n":"0p52_1_0p48_0","t":4,"s":[970.895,597.112,0],"e":[970.895,645.112,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.48,"y":0},"n":"0p833_0p833_0p48_0","t":12,"s":[970.895,645.112,0],"e":[970.895,615.112,0],"to":[0,0,0],"ti":[0,0,0]},{"t":14.4}],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[75,75,100],"ix":6}},"ao":0,"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"wing 5","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":0,"s":[59],"e":[146]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.79],"y":[0]},"n":["0p39_1_0p79_0"],"t":9.6,"s":[146],"e":[59]},{"t":14.4}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.79,"y":0},"n":"0p833_0p833_0p79_0","t":0,"s":[0.267,50.477,0],"e":[-11.733,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.79,"y":0},"n":"0p833_1_0p79_0","t":9.6,"s":[-11.733,50.477,0],"e":[0.267,50.477,0],"to":[0,0,0],"ti":[0,0,0]},{"t":14.4}],"ix":2},"a":{"a":0,"k":[336.892,14.647,0],"ix":1},"s":{"a":0,"k":[-65,65,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":0,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5.44,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":7.253,"s":[{"i":[[-24.545,-97.308],[-33.816,0],[-8.099,99.396],[30.355,0.919]],"o":[[24.545,97.308],[33.816,0],[0,0],[-30.355,-0.919]],"v":[[9.497,81.606],[126.549,226.875],[186.89,-79.109],[23.772,-83.224]],"c":true}],"e":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.75,"y":0},"n":"0p833_0p833_0p75_0","t":9.6,"s":[{"i":[[-32.666,-125.331],[0,0],[-12.173,101.503],[0,0]],"o":[[32.666,125.331],[0,0],[0,0],[0,0]],"v":[[34.21,123.997],[161.316,256.65],[193.949,-75.126],[41.189,-104.236]],"c":true}],"e":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.934,"s":[{"i":[[-21.953,-84.231],[-31.381,0],[-8.392,99.548],[28.169,0.853]],"o":[[22.165,115.562],[31.381,0],[0,0],[-28.169,-0.853]],"v":[[5.328,68.178],[121.151,203.71],[187.398,-78.822],[25.027,-84.737]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p39_1_0p167_0p167","t":12.32,"s":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[85.898,2.602]],"o":[[0.645,95.54],[95.692,0],[0,0],[-85.898,-2.602]],"v":[[-173.975,-86.397],[38.84,95.215],[173.975,-86.397],[-8.097,-44.775]],"c":true}],"e":[{"i":[[0,0],[-95.692,0],[-0.645,95.54],[0,0]],"o":[[0.645,95.54],[95.692,0],[0,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397],[3.736,-86.397]],"c":true}]},{"t":14.4}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152941176471,0.2,0.239215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[174.225,86.647],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Top Beak Outlines","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116.797,76.583,0],"ix":2},"a":{"a":0,"k":[7.365,40.329,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.537,0],[0,0],[0,-19.537],[0,0],[0,0],[0,0]],"o":[[0,0],[-19.537,0],[0,0],[0,0],[0,0],[0,-19.537]],"v":[[114.406,-21.413],[-114.407,-21.413],[-149.782,13.962],[-149.782,21.413],[149.781,21.413],[149.781,13.962]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337000020345,0.258999992819,0.426999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.031,21.663],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Bottom Beak Outlines","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[112.476,79.031,0],"ix":2},"a":{"a":0,"k":[10.209,15.628,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-77.12,0],[-0.52,76.997]],"o":[[0.52,76.997],[77.119,0],[0,0]],"v":[[-140.209,-69.629],[0,69.629],[140.209,-69.629]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.866999966491,0.776000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.209,79.629],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Head","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p52_1_0p167_0p167"],"t":0,"s":[3],"e":[5]},{"i":{"x":[0.52],"y":[1]},"o":{"x":[0.48],"y":[0]},"n":["0p52_1_0p48_0"],"t":4,"s":[5],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.48],"y":[0]},"n":["0p833_0p833_0p48_0"],"t":11.2,"s":[-6],"e":[3]},{"t":14.4}],"ix":10},"p":{"a":0,"k":[16.908,51.505,0],"ix":2},"a":{"a":0,"k":[16.908,51.505,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,5.418],[5.418,0],[0,-5.418],[-5.418,0]],"o":[[0,-5.418],[-5.418,0],[0,5.418],[5.418,0]],"v":[[9.81,0],[0,-9.81],[-9.81,0],[0,9.81]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.656,43.492],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.333],[-34.333,0],[0,34.333],[34.333,0]],"o":[[0,34.333],[34.333,0],[0,-34.333],[-34.333,0]],"v":[[-62.166,0],[0,62.166],[62.166,0],[0,-62.166]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.067,62.416],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.557,0],[0,0]],"o":[[0,0],[-2.85,4.769],[0,0],[0,0]],"v":[[10.193,-21.154],[-8.623,10.328],[-2.48,21.154],[11.473,21.154]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.723,57.927],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Neck","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[63.25,62.357,0],"ix":2},"a":{"a":0,"k":[75.575,216.838,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-31.721,0],[0,31.721]],"o":[[0,0],[0,0],[0,31.721],[31.721,0],[0,0]],"v":[[57.436,-96.172],[-57.436,-96.172],[-57.436,38.736],[0,96.172],[57.436,38.736]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[77.216,158.588],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Front Leg Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[2.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3.2,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p833_0p25_0"],"t":12,"s":[22.178],"e":[2.178]},{"t":14.4}],"ix":10},"p":{"a":0,"k":[-99.14,166.91,0],"ix":2},"a":{"a":0,"k":[65.762,6.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.577,-6.966],[0,0],[0.694,-2.36],[3.024,0.418],[0,0],[0.975,-2.897],[3.412,2.33],[0.591,1.594],[0,0]],"o":[[0,0],[1.688,2.108],[-0.861,2.928],[0,0],[-3.028,-0.418],[-1.319,3.917],[-1.291,-0.881],[0,0],[-3.103,-8.367]],"v":[[-7.838,-25.886],[22.348,11.824],[23.751,18.958],[16.853,23.219],[14.624,22.911],[7.724,27.182],[-1.725,30.521],[-4.652,26.768],[-21.342,-18.242]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.31,60.893],"ix":2},"a":{"a":0,"k":[-9.385,-16.997],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[6],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2.4,"s":[19],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.25],"y":[0]},"n":["0p833_0p833_0p25_0"],"t":12,"s":[-25],"e":[6]},{"t":14.4}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.75,2.75],[0,0],[-2.75,2.75],[0,0],[-2.75,-2.75],[2.75,-2.75],[0,0]],"o":[[0,0],[-2.75,-2.75],[0,0],[2.75,-2.75],[2.75,2.75],[0,0],[-2.75,2.75]],"v":[[-31.045,31.045],[-31.045,31.045],[-31.045,21.045],[21.045,-31.045],[31.045,-31.045],[31.045,-21.045],[-21.045,31.045]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.478,34.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Bottom Body Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-51.067,125.81,0],"ix":2},"a":{"a":0,"k":[174.225,86.647,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-95.692,0],[-0.645,95.54]],"o":[[0.645,95.54],[95.692,0],[0,0]],"v":[[-173.975,-86.397],[0,86.397],[173.975,-86.397]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.941000007181,0.922000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[174.225,86.647],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Back Leg","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[0.178],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":4.8,"s":[3],"e":[22.178]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p833_0p36_0"],"t":12.8,"s":[22.178],"e":[0.178]},{"t":14.4}],"ix":10},"p":{"a":0,"k":[-43.14,174.91,0],"ix":2},"a":{"a":0,"k":[65.762,6.163,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.577,-6.966],[0,0],[0.694,-2.36],[3.024,0.418],[0,0],[0.975,-2.897],[3.412,2.33],[0.591,1.594],[0,0]],"o":[[0,0],[1.688,2.108],[-0.861,2.928],[0,0],[-3.028,-0.418],[-1.319,3.917],[-1.291,-0.881],[0,0],[-3.103,-8.367]],"v":[[-7.838,-25.886],[22.348,11.824],[23.751,18.958],[16.853,23.219],[14.624,22.911],[7.724,27.182],[-1.725,30.521],[-4.652,26.768],[-21.342,-18.242]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.31,60.893],"ix":2},"a":{"a":0,"k":[-9.385,-16.997],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p42_1_0p167_0p167"],"t":0,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p779_0p167_0p221"],"t":4,"s":[17],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.36],"y":[0]},"n":["0p833_0p833_0p36_0"],"t":12.8,"s":[-23],"e":[0]},{"t":14.4}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.75,2.75],[0,0],[-2.75,2.75],[0,0],[-2.75,-2.75],[2.75,-2.75],[0,0]],"o":[[0,0],[-2.75,-2.75],[0,0],[2.75,-2.75],[2.75,2.75],[0,0],[-2.75,2.75]],"v":[[-31.045,31.045],[-31.045,31.045],[-31.045,21.045],[21.045,-31.045],[31.045,-31.045],[31.045,-21.045],[-21.045,31.045]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152999997606,0.2,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.478,34.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.4,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pelican Transition - fast","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[750,750,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":14.4,"op":105.6,"st":14.4,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Pelican loop","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[750,750,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":14.4,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/square_wheel.json b/example/resource/square_wheel.json new file mode 100644 index 0000000000..1543adbe7c --- /dev/null +++ b/example/resource/square_wheel.json @@ -0,0 +1 @@ +{"v":"5.1.20","fr":60,"ip":0,"op":120,"w":256,"h":256,"nm":"square wheel","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"roda","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[810]},{"t":119}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-24,231.5,0],"e":[-21.87,229.6,0],"to":[0.35499998927116,-0.31666666269302,0],"ti":[-0.74666666984558,0.58666664361954,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":1,"s":[-21.87,229.6,0],"e":[-19.52,227.98,0],"to":[0.74666666984558,-0.58666664361954,0],"ti":[-0.8116666674614,0.49333333969116,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[-19.52,227.98,0],"e":[-17,226.64,0],"to":[0.8116666674614,-0.49333333969116,0],"ti":[-0.86333334445953,0.39500001072884,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[-17,226.64,0],"e":[-14.34,225.61,0],"to":[0.86333334445953,-0.39500001072884,0],"ti":[-0.90499997138977,0.28999999165535,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":4,"s":[-14.34,225.61,0],"e":[-11.57,224.9,0],"to":[0.90499997138977,-0.28999999165535,0],"ti":[-0.93333333730698,0.18166667222977,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[-11.57,224.9,0],"e":[-8.74,224.52,0],"to":[0.93333333730698,-0.18166667222977,0],"ti":[-0.94666665792465,0.07000000029802,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6,"s":[-8.74,224.52,0],"e":[-5.89,224.48,0],"to":[0.94666665792465,-0.07000000029802,0],"ti":[-0.94833332300186,-0.04333333298564,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[-5.89,224.48,0],"e":[-3.05,224.78,0],"to":[0.94833332300186,0.04333333298564,0],"ti":[-0.9366666674614,-0.1566666662693,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8,"s":[-3.05,224.78,0],"e":[-0.27,225.42,0],"to":[0.9366666674614,0.1566666662693,0],"ti":[-0.91166669130325,-0.26666668057442,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":9,"s":[-0.27,225.42,0],"e":[2.42,226.38,0],"to":[0.91166669130325,0.26666668057442,0],"ti":[-0.87333333492279,-0.37166666984558,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[2.42,226.38,0],"e":[4.97,227.65,0],"to":[0.87333333492279,0.37166666984558,0],"ti":[-0.82333332300186,-0.47333332896233,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.166},"n":"0p833_0p832_0p167_0p166","t":11,"s":[4.97,227.65,0],"e":[7.36,229.22,0],"to":[0.82333332300186,0.47333332896233,0],"ti":[-0.76333332061768,-0.56833332777023,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.166},"n":"0p833_0p847_0p167_0p166","t":12,"s":[7.36,229.22,0],"e":[9.55,231.06,0],"to":[0.76333332061768,0.56833332777023,0],"ti":[-0.71333330869675,-0.12999999523163,0]},{"i":{"x":0.833,"y":0.818},"o":{"x":0.167,"y":0.184},"n":"0p833_0p818_0p167_0p184","t":13,"s":[9.55,231.06,0],"e":[11.64,230,0],"to":[0.71333330869675,0.12999999523163,0],"ti":[-0.7316666841507,0.45833334326744,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.153},"n":"0p833_0p833_0p167_0p153","t":14,"s":[11.64,230,0],"e":[13.94,228.31,0],"to":[0.7316666841507,-0.45833334326744,0],"ti":[-0.79833334684372,0.51499998569489,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":15,"s":[13.94,228.31,0],"e":[16.43,226.91,0],"to":[0.79833334684372,-0.51499998569489,0],"ti":[-0.85333335399628,0.41666665673256,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16,"s":[16.43,226.91,0],"e":[19.06,225.81,0],"to":[0.85333335399628,-0.41666665673256,0],"ti":[-0.89666664600372,0.3133333325386,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":17,"s":[19.06,225.81,0],"e":[21.81,225.03,0],"to":[0.89666664600372,-0.3133333325386,0],"ti":[-0.92666667699814,0.20499999821186,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[21.81,225.03,0],"e":[24.62,224.58,0],"to":[0.92666667699814,-0.20499999821186,0],"ti":[-0.94499999284744,0.09499999880791,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":19,"s":[24.62,224.58,0],"e":[27.48,224.46,0],"to":[0.94499999284744,-0.09499999880791,0],"ti":[-0.94999998807907,-0.01833333261311,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[27.48,224.46,0],"e":[30.32,224.69,0],"to":[0.94999998807907,0.01833333261311,0],"ti":[-0.93999999761581,-0.13166666030884,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":21,"s":[30.32,224.69,0],"e":[33.12,225.25,0],"to":[0.93999999761581,0.13166666030884,0],"ti":[-0.91833335161209,-0.24166665971279,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[33.12,225.25,0],"e":[35.83,226.14,0],"to":[0.91833335161209,0.24166665971279,0],"ti":[-0.88333332538605,-0.34833332896233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[35.83,226.14,0],"e":[38.42,227.34,0],"to":[0.88333332538605,0.34833332896233,0],"ti":[-0.83666664361954,-0.45166665315628,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":24,"s":[38.42,227.34,0],"e":[40.85,228.85,0],"to":[0.83666664361954,0.45166665315628,0],"ti":[-0.77666664123535,-0.54833334684372,0]},{"i":{"x":0.833,"y":0.854},"o":{"x":0.167,"y":0.167},"n":"0p833_0p854_0p167_0p167","t":25,"s":[40.85,228.85,0],"e":[43.08,230.63,0],"to":[0.77666664123535,0.54833334684372,0],"ti":[-0.71833330392838,-0.26166665554047,0]},{"i":{"x":0.833,"y":0.806},"o":{"x":0.167,"y":0.194},"n":"0p833_0p806_0p167_0p194","t":26,"s":[43.08,230.63,0],"e":[45.16,230.42,0],"to":[0.71833330392838,0.26166665554047,0],"ti":[-0.72166669368744,0.32666665315628,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.146},"n":"0p833_0p833_0p167_0p146","t":27,"s":[45.16,230.42,0],"e":[47.41,228.67,0],"to":[0.72166669368744,-0.32666665315628,0],"ti":[-0.78333336114883,0.53666669130325,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":28,"s":[47.41,228.67,0],"e":[49.86,227.2,0],"to":[0.78333336114883,-0.53666669130325,0],"ti":[-0.84166663885117,0.43999999761581,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":29,"s":[49.86,227.2,0],"e":[52.46,226.03,0],"to":[0.84166663885117,-0.43999999761581,0],"ti":[-0.88833332061768,0.33833333849907,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":30,"s":[52.46,226.03,0],"e":[55.19,225.17,0],"to":[0.88833332061768,-0.33833333849907,0],"ti":[-0.92166668176651,0.23000000417233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[55.19,225.17,0],"e":[57.99,224.65,0],"to":[0.92166668176651,-0.23000000417233,0],"ti":[-0.94166666269302,0.11833333224058,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":32,"s":[57.99,224.65,0],"e":[60.84,224.46,0],"to":[0.94166666269302,-0.11833333224058,0],"ti":[-0.94999998807907,0.0066666668281,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33,"s":[60.84,224.46,0],"e":[63.69,224.61,0],"to":[0.94999998807907,-0.0066666668281,0],"ti":[-0.94333332777023,-0.10666666924953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":34,"s":[63.69,224.61,0],"e":[66.5,225.1,0],"to":[0.94333332777023,0.10666666924953,0],"ti":[-0.92500001192093,-0.21666666865349,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[66.5,225.1,0],"e":[69.24,225.91,0],"to":[0.92500001192093,0.21666666865349,0],"ti":[-0.8933333158493,-0.32499998807907,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":36,"s":[69.24,225.91,0],"e":[71.86,227.05,0],"to":[0.8933333158493,0.32499998807907,0],"ti":[-0.84666669368744,-0.43000000715256,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[71.86,227.05,0],"e":[74.32,228.49,0],"to":[0.84666669368744,0.43000000715256,0],"ti":[-0.79000002145767,-0.52666664123535,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.166},"n":"0p833_0p851_0p167_0p166","t":38,"s":[74.32,228.49,0],"e":[76.6,230.21,0],"to":[0.79000002145767,0.52666664123535,0],"ti":[-0.72833335399628,-0.39166668057442,0]},{"i":{"x":0.833,"y":0.81},"o":{"x":0.167,"y":0.19},"n":"0p833_0p81_0p167_0p19","t":39,"s":[76.6,230.21,0],"e":[78.69,230.84,0],"to":[0.72833335399628,0.39166668057442,0],"ti":[-0.71499997377396,0.19666667282581,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.148},"n":"0p833_0p834_0p167_0p148","t":40,"s":[78.69,230.84,0],"e":[80.89,229.03,0],"to":[0.71499997377396,-0.19666667282581,0],"ti":[-0.7683333158493,0.55666667222977,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41,"s":[80.89,229.03,0],"e":[83.3,227.5,0],"to":[0.7683333158493,-0.55666667222977,0],"ti":[-0.8299999833107,0.46166667342186,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[83.3,227.5,0],"e":[85.87,226.26,0],"to":[0.8299999833107,-0.46166667342186,0],"ti":[-0.87833333015442,0.36166667938232,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":43,"s":[85.87,226.26,0],"e":[88.57,225.33,0],"to":[0.87833333015442,-0.36166667938232,0],"ti":[-0.91500002145767,0.25499999523163,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44,"s":[88.57,225.33,0],"e":[91.36,224.73,0],"to":[0.91500002145767,-0.25499999523163,0],"ti":[-0.93999999761581,0.14333333075047,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":45,"s":[91.36,224.73,0],"e":[94.21,224.47,0],"to":[0.93999999761581,-0.14333333075047,0],"ti":[-0.94999998807907,0.02999999932945,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[94.21,224.47,0],"e":[97.06,224.55,0],"to":[0.94999998807907,-0.02999999932945,0],"ti":[-0.94499999284744,-0.08166666328907,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47,"s":[97.06,224.55,0],"e":[99.88,224.96,0],"to":[0.94499999284744,0.08166666328907,0],"ti":[-0.93000000715256,-0.19166666269302,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":48,"s":[99.88,224.96,0],"e":[102.64,225.7,0],"to":[0.93000000715256,0.19166666269302,0],"ti":[-0.90166664123535,-0.30166667699814,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":49,"s":[102.64,225.7,0],"e":[105.29,226.77,0],"to":[0.90166664123535,0.30166667699814,0],"ti":[-0.85833334922791,-0.4066666662693,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50,"s":[105.29,226.77,0],"e":[107.79,228.14,0],"to":[0.85833334922791,0.4066666662693,0],"ti":[-0.80333334207535,-0.50499999523163,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.167},"n":"0p833_0p839_0p167_0p167","t":51,"s":[107.79,228.14,0],"e":[110.11,229.8,0],"to":[0.80333334207535,0.50499999523163,0],"ti":[-0.74000000953674,-0.52333331108093,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.173},"n":"0p833_0p825_0p167_0p173","t":52,"s":[110.11,229.8,0],"e":[112.23,231.28,0],"to":[0.74000000953674,0.52333331108093,0],"ti":[-0.71333330869675,0.06499999761581,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"n":"0p833_0p835_0p167_0p159","t":53,"s":[112.23,231.28,0],"e":[114.39,229.41,0],"to":[0.71333330869675,-0.06499999761581,0],"ti":[-0.75333333015442,0.57833331823349,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.168},"n":"0p833_0p833_0p167_0p168","t":54,"s":[114.39,229.41,0],"e":[116.75,227.81,0],"to":[0.75333333015442,-0.57833331823349,0],"ti":[-0.81666666269302,0.48333331942558,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[116.75,227.81,0],"e":[119.29,226.51,0],"to":[0.81666666269302,-0.48333331942558,0],"ti":[-0.86833333969116,0.38333332538605,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56,"s":[119.29,226.51,0],"e":[121.96,225.51,0],"to":[0.86833333969116,-0.38333332538605,0],"ti":[-0.90833336114883,0.27833333611488,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":57,"s":[121.96,225.51,0],"e":[124.74,224.84,0],"to":[0.90833336114883,-0.27833333611488,0],"ti":[-0.93500000238419,0.16833333671093,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58,"s":[124.74,224.84,0],"e":[127.57,224.5,0],"to":[0.93500000238419,-0.16833333671093,0],"ti":[-0.94833332300186,0.05666666850448,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":59,"s":[127.57,224.5,0],"e":[130.43,224.5,0],"to":[0.94833332300186,-0.05666666850448,0],"ti":[-0.94833332300186,-0.05666666850448,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[130.43,224.5,0],"e":[133.26,224.84,0],"to":[0.94833332300186,0.05666666850448,0],"ti":[-0.93500000238419,-0.16833333671093,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":61,"s":[133.26,224.84,0],"e":[136.04,225.51,0],"to":[0.93500000238419,0.16833333671093,0],"ti":[-0.90833336114883,-0.27833333611488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":62,"s":[136.04,225.51,0],"e":[138.71,226.51,0],"to":[0.90833336114883,0.27833333611488,0],"ti":[-0.86833333969116,-0.38333332538605,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[138.71,226.51,0],"e":[141.25,227.81,0],"to":[0.86833333969116,0.38333332538605,0],"ti":[-0.81666666269302,-0.48333331942558,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.167},"n":"0p833_0p832_0p167_0p167","t":64,"s":[141.25,227.81,0],"e":[143.61,229.41,0],"to":[0.81666666269302,0.48333331942558,0],"ti":[-0.75333333015442,-0.57833331823349,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.165},"n":"0p833_0p841_0p167_0p165","t":65,"s":[143.61,229.41,0],"e":[145.77,231.28,0],"to":[0.75333333015442,0.57833331823349,0],"ti":[-0.71333330869675,-0.06499999761581,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.175},"n":"0p833_0p827_0p167_0p175","t":66,"s":[145.77,231.28,0],"e":[147.89,229.8,0],"to":[0.71333330869675,0.06499999761581,0],"ti":[-0.74000000953674,0.52333331108093,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.161},"n":"0p833_0p833_0p167_0p161","t":67,"s":[147.89,229.8,0],"e":[150.21,228.14,0],"to":[0.74000000953674,-0.52333331108093,0],"ti":[-0.80333334207535,0.50499999523163,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":68,"s":[150.21,228.14,0],"e":[152.71,226.77,0],"to":[0.80333334207535,-0.50499999523163,0],"ti":[-0.85833334922791,0.4066666662693,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":69,"s":[152.71,226.77,0],"e":[155.36,225.7,0],"to":[0.85833334922791,-0.4066666662693,0],"ti":[-0.90166664123535,0.30166667699814,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":70,"s":[155.36,225.7,0],"e":[158.12,224.96,0],"to":[0.90166664123535,-0.30166667699814,0],"ti":[-0.93000000715256,0.19166666269302,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71,"s":[158.12,224.96,0],"e":[160.94,224.55,0],"to":[0.93000000715256,-0.19166666269302,0],"ti":[-0.94499999284744,0.08166666328907,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":72,"s":[160.94,224.55,0],"e":[163.79,224.47,0],"to":[0.94499999284744,-0.08166666328907,0],"ti":[-0.94999998807907,-0.02999999932945,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":73,"s":[163.79,224.47,0],"e":[166.64,224.73,0],"to":[0.94999998807907,0.02999999932945,0],"ti":[-0.93999999761581,-0.14333333075047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74,"s":[166.64,224.73,0],"e":[169.43,225.33,0],"to":[0.93999999761581,0.14333333075047,0],"ti":[-0.91500002145767,-0.25499999523163,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[169.43,225.33,0],"e":[172.13,226.26,0],"to":[0.91500002145767,0.25499999523163,0],"ti":[-0.87833333015442,-0.36166667938232,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76,"s":[172.13,226.26,0],"e":[174.7,227.5,0],"to":[0.87833333015442,0.36166667938232,0],"ti":[-0.8299999833107,-0.46166667342186,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":77,"s":[174.7,227.5,0],"e":[177.11,229.03,0],"to":[0.8299999833107,0.46166667342186,0],"ti":[-0.7683333158493,-0.55666667222977,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.166},"n":"0p833_0p852_0p167_0p166","t":78,"s":[177.11,229.03,0],"e":[179.31,230.84,0],"to":[0.7683333158493,0.55666667222977,0],"ti":[-0.71499997377396,-0.19666667282581,0]},{"i":{"x":0.833,"y":0.81},"o":{"x":0.167,"y":0.19},"n":"0p833_0p81_0p167_0p19","t":79,"s":[179.31,230.84,0],"e":[181.4,230.21,0],"to":[0.71499997377396,0.19666667282581,0],"ti":[-0.72833335399628,0.39166668057442,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.149},"n":"0p833_0p834_0p167_0p149","t":80,"s":[181.4,230.21,0],"e":[183.68,228.49,0],"to":[0.72833335399628,-0.39166668057442,0],"ti":[-0.79000002145767,0.52666664123535,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[183.68,228.49,0],"e":[186.14,227.05,0],"to":[0.79000002145767,-0.52666664123535,0],"ti":[-0.84666669368744,0.43000000715256,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":82,"s":[186.14,227.05,0],"e":[188.76,225.91,0],"to":[0.84666669368744,-0.43000000715256,0],"ti":[-0.8933333158493,0.32499998807907,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[188.76,225.91,0],"e":[191.5,225.1,0],"to":[0.8933333158493,-0.32499998807907,0],"ti":[-0.92500001192093,0.21666666865349,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84,"s":[191.5,225.1,0],"e":[194.31,224.61,0],"to":[0.92500001192093,-0.21666666865349,0],"ti":[-0.94333332777023,0.10666666924953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[194.31,224.61,0],"e":[197.16,224.46,0],"to":[0.94333332777023,-0.10666666924953,0],"ti":[-0.94999998807907,-0.0066666668281,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":86,"s":[197.16,224.46,0],"e":[200.01,224.65,0],"to":[0.94999998807907,0.0066666668281,0],"ti":[-0.94166666269302,-0.11833333224058,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87,"s":[200.01,224.65,0],"e":[202.81,225.17,0],"to":[0.94166666269302,0.11833333224058,0],"ti":[-0.92166668176651,-0.23000000417233,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":88,"s":[202.81,225.17,0],"e":[205.54,226.03,0],"to":[0.92166668176651,0.23000000417233,0],"ti":[-0.88833332061768,-0.33833333849907,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":89,"s":[205.54,226.03,0],"e":[208.14,227.2,0],"to":[0.88833332061768,0.33833333849907,0],"ti":[-0.84166663885117,-0.43999999761581,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":90,"s":[208.14,227.2,0],"e":[210.59,228.67,0],"to":[0.84166663885117,0.43999999761581,0],"ti":[-0.78333336114883,-0.53666669130325,0]},{"i":{"x":0.833,"y":0.854},"o":{"x":0.167,"y":0.167},"n":"0p833_0p854_0p167_0p167","t":91,"s":[210.59,228.67,0],"e":[212.84,230.42,0],"to":[0.78333336114883,0.53666669130325,0],"ti":[-0.72166669368744,-0.32666665315628,0]},{"i":{"x":0.833,"y":0.806},"o":{"x":0.167,"y":0.194},"n":"0p833_0p806_0p167_0p194","t":92,"s":[212.84,230.42,0],"e":[214.92,230.63,0],"to":[0.72166669368744,0.32666665315628,0],"ti":[-0.71833330392838,0.26166665554047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.146},"n":"0p833_0p833_0p167_0p146","t":93,"s":[214.92,230.63,0],"e":[217.15,228.85,0],"to":[0.71833330392838,-0.26166665554047,0],"ti":[-0.77666664123535,0.54833334684372,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":94,"s":[217.15,228.85,0],"e":[219.58,227.34,0],"to":[0.77666664123535,-0.54833334684372,0],"ti":[-0.83666664361954,0.45166665315628,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":95,"s":[219.58,227.34,0],"e":[222.17,226.14,0],"to":[0.83666664361954,-0.45166665315628,0],"ti":[-0.88333332538605,0.34833332896233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96,"s":[222.17,226.14,0],"e":[224.88,225.25,0],"to":[0.88333332538605,-0.34833332896233,0],"ti":[-0.91833335161209,0.24166665971279,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":97,"s":[224.88,225.25,0],"e":[227.68,224.69,0],"to":[0.91833335161209,-0.24166665971279,0],"ti":[-0.93999999761581,0.13166666030884,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[227.68,224.69,0],"e":[230.52,224.46,0],"to":[0.93999999761581,-0.13166666030884,0],"ti":[-0.94999998807907,0.01833333261311,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":99,"s":[230.52,224.46,0],"e":[233.38,224.58,0],"to":[0.94999998807907,-0.01833333261311,0],"ti":[-0.94499999284744,-0.09499999880791,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[233.38,224.58,0],"e":[236.19,225.03,0],"to":[0.94499999284744,0.09499999880791,0],"ti":[-0.92666667699814,-0.20499999821186,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.166},"n":"0p833_0p834_0p167_0p166","t":101,"s":[236.19,225.03,0],"e":[238.94,225.81,0],"to":[0.92666667699814,0.20499999821186,0],"ti":[-0.89666664600372,-0.3133333325386,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":102,"s":[238.94,225.81,0],"e":[241.57,226.91,0],"to":[0.89666664600372,0.3133333325386,0],"ti":[-0.85333335399628,-0.41666665673256,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":103,"s":[241.57,226.91,0],"e":[244.06,228.31,0],"to":[0.85333335399628,0.41666665673256,0],"ti":[-0.79833334684372,-0.51499998569489,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.167},"n":"0p833_0p847_0p167_0p167","t":104,"s":[244.06,228.31,0],"e":[246.36,230,0],"to":[0.79833334684372,0.51499998569489,0],"ti":[-0.7316666841507,-0.45833334326744,0]},{"i":{"x":0.833,"y":0.816},"o":{"x":0.167,"y":0.182},"n":"0p833_0p816_0p167_0p182","t":105,"s":[246.36,230,0],"e":[248.45,231.06,0],"to":[0.7316666841507,0.45833334326744,0],"ti":[-0.71333330869675,0.12999999523163,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.153},"n":"0p833_0p834_0p167_0p153","t":106,"s":[248.45,231.06,0],"e":[250.64,229.22,0],"to":[0.71333330869675,-0.12999999523163,0],"ti":[-0.76333332061768,0.56833332777023,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.168},"n":"0p833_0p834_0p167_0p168","t":107,"s":[250.64,229.22,0],"e":[253.03,227.65,0],"to":[0.76333332061768,-0.56833332777023,0],"ti":[-0.82333332300186,0.47333332896233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[253.03,227.65,0],"e":[255.58,226.38,0],"to":[0.82333332300186,-0.47333332896233,0],"ti":[-0.87333333492279,0.37166666984558,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.166},"n":"0p833_0p833_0p167_0p166","t":109,"s":[255.58,226.38,0],"e":[258.27,225.42,0],"to":[0.87333333492279,-0.37166666984558,0],"ti":[-0.91166669130325,0.26666668057442,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":110,"s":[258.27,225.42,0],"e":[261.05,224.78,0],"to":[0.91166669130325,-0.26666668057442,0],"ti":[-0.9366666674614,0.1566666662693,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":111,"s":[261.05,224.78,0],"e":[263.89,224.48,0],"to":[0.9366666674614,-0.1566666662693,0],"ti":[-0.94833332300186,0.04333333298564,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112,"s":[263.89,224.48,0],"e":[266.74,224.52,0],"to":[0.94833332300186,-0.04333333298564,0],"ti":[-0.94666665792465,-0.07000000029802,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":113,"s":[266.74,224.52,0],"e":[269.57,224.9,0],"to":[0.94666665792465,0.07000000029802,0],"ti":[-0.93333333730698,-0.18166667222977,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.167},"n":"0p833_0p834_0p167_0p167","t":114,"s":[269.57,224.9,0],"e":[272.34,225.61,0],"to":[0.93333333730698,0.18166667222977,0],"ti":[-0.90499997138977,-0.28999999165535,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":115,"s":[272.34,225.61,0],"e":[275,226.64,0],"to":[0.90499997138977,0.28999999165535,0],"ti":[-0.86333334445953,-0.39500001072884,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":116,"s":[275,226.64,0],"e":[277.52,227.98,0],"to":[0.86333334445953,0.39500001072884,0],"ti":[-0.8116666674614,-0.49333333969116,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":117,"s":[277.52,227.98,0],"e":[279.87,229.6,0],"to":[0.8116666674614,0.49333333969116,0],"ti":[-0.74666666984558,-0.58666664361954,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":118,"s":[279.87,229.6,0],"e":[282,231.5,0],"to":[0.74666666984558,0.58666664361954,0],"ti":[-0.35499998927116,-0.31666666269302,0]},{"t":119}],"ix":2},"a":{"a":0,"k":[-96,98.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[34,34],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.243137000589,0.082353001015,0.768627989526,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.378575882257,0.034678967794,0.803921568627,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-96,98.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"_square wheel","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2},"a":{"a":0,"k":[128,128,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":256,"h":256,"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/triib_manage.json b/example/resource/triib_manage.json new file mode 100644 index 0000000000..0a5b27e8fe --- /dev/null +++ b/example/resource/triib_manage.json @@ -0,0 +1 @@ +{"v":"5.1.10","fr":29.9700012207031,"ip":0,"op":177.000007209358,"w":174,"h":149,"nm":"Untitled-1","ddd":0,"comps":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 5","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.75,74.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":10047.0004092227,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":66,"s":[-46,31,0],"e":[-46,-33.75,0],"to":[0,-10.7916669845581,0],"ti":[0,10.7916669845581,0]},{"t":95.0000038694293}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[20,25.5,100],"ix":6}},"ao":0,"ip":0,"op":10047.0004092227,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 2 Outlines","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":0,"s":[629.172,75.232,0],"e":[171.672,48.761,0],"to":[-138.75,67.1568603515625,0],"ti":[80.8209686279297,45.4995231628418,0]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":36,"s":[171.672,48.761,0],"e":[171.672,48.761,0],"to":[-1.93182694911957,-1.08755445480347,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":132,"s":[171.672,48.761,0],"e":[631.672,331.114,0],"to":[0,0,0],"ti":[0,0,0]},{"t":152.000006191087}],"ix":2},"a":{"a":0,"k":[16.521,14.514,0],"ix":1},"s":{"a":0,"k":[500,392.157,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.168,0.319],[0,0],[-0.599,-1.491],[0,0],[-0.566,1.885],[-3.712,3.085],[-3.228,1.079]],"o":[[0,0],[-1.59,-0.233],[0,0],[0.732,1.826],[1.386,-4.61],[2.391,-1.987],[2.077,-0.695]],"v":[[13.832,-10.021],[-13.436,-14.031],[-15.672,-11.194],[-6.19,12.438],[-2.268,12.272],[5.237,-1.438],[14.194,-5.99]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.791999966491,0.19199999641,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.52,14.514],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":10047.0004092227,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 4 Outlines","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-132.498,2.875,0],"ix":2},"a":{"a":0,"k":[10,19.267,0],"ix":1},"s":{"a":0,"k":[500,392.157,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.105,"y":0},"n":"0_1_0p105_0","t":135,"s":[{"i":[[5.117,0],[0,0],[0,5.118],[-5.118,0],[0,0],[0,-5.118]],"o":[[0,0],[-5.118,0],[0,-5.118],[0,0],[5.117,0],[0,5.118]],"v":[[40.483,9.267],[-40.483,9.267],[-49.75,0],[-40.483,-9.267],[40.483,-9.267],[49.75,0]],"c":true}],"e":[{"i":[[5.117,0],[0,0],[0,5.118],[-5.118,0],[0,0],[0,-5.118]],"o":[[0,0],[-5.118,0],[0,-5.118],[0,0],[5.117,0],[0,5.118]],"v":[[69.671,9.116],[-40.483,9.267],[-49.75,0],[-40.483,-9.267],[69.671,-9.418],[78.938,-0.151]],"c":true}]},{"t":148.000006028164}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.397579656863,0,0,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[0],"e":[33]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[33],"e":[33]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112,"s":[33],"e":[0]},{"t":115.000004684046}],"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0.607999973671,0.13300000359,0.211999990426,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[59.75,19.267],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":10047.0004092227,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":81,"s":[-72.5,-0.702,0],"e":[-72.5,32.048,0],"to":[0,5.45833349227905,0],"ti":[0,-5.45833349227905,0]},{"t":113.000004602584}],"ix":2},"a":{"a":0,"k":[10,19.267,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":135,"s":[{"i":[[5.117,0],[0,0],[0,5.118],[-5.118,0],[0,0],[0,-5.118]],"o":[[0,0],[-5.118,0],[0,-5.118],[0,0],[5.117,0],[0,5.118]],"v":[[61.328,9.267],[-61.328,9.267],[-70.595,0],[-61.328,-9.267],[61.328,-9.267],[70.595,0]],"c":true}],"e":[{"i":[[5.117,0],[0,0],[0,5.118],[-5.118,0],[0,0],[0,-5.118]],"o":[[0,0],[-5.118,0],[0,-5.118],[0,0],[5.117,0],[0,5.118]],"v":[[18.828,9.403],[-61.328,9.267],[-70.595,0],[-61.328,-9.267],[18.828,-9.131],[28.095,0.136]],"c":true}]},{"t":148.000006028164}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.607999973671,0.13300000359,0.211999990426,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[80.595,19.017],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-10.0000004073083,"op":10037.0004088154,"st":-10.0000004073083,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 3 Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":86,"s":[-72.5,-33.137,0],"e":[-72.5,-1.137,0],"to":[0,5.33333349227905,0],"ti":[0,-5.33333349227905,0]},{"t":113.000004602584}],"ix":2},"a":{"a":0,"k":[10,19.267,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.105,"y":0},"n":"0_1_0p105_0","t":135,"s":[{"i":[[5.118,0],[0,0],[0,5.118],[-5.118,0],[0,0],[0,-5.118]],"o":[[0,0],[-5.118,0],[0,-5.118],[0,0],[5.118,0],[0,5.118]],"v":[[54.455,9.267],[-54.454,9.267],[-63.722,0],[-54.454,-9.267],[54.455,-9.267],[63.722,0]],"c":true}],"e":[{"i":[[5.118,0],[0,0],[0,5.118],[-5.118,0],[0,0],[0,-5.118]],"o":[[0,0],[-5.118,0],[0,-5.118],[0,0],[5.118,0],[0,5.118]],"v":[[69.705,9.346],[-54.454,9.267],[-63.722,0],[-54.454,-9.267],[69.705,-9.188],[78.972,0.079]],"c":true}]},{"t":148.000006028164}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.607999973671,0.13300000359,0.211999990426,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[73.722,19.267],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-10.0000004073083,"op":10037.0004088154,"st":-10.0000004073083,"bm":0}],"markers":[]} \ No newline at end of file From cf784388d0cdba56be23e1d7e92eecedcfdb1412 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 18:03:53 +0900 Subject: [PATCH 135/672] lottie/player: Update dirty flag enum value. Change-Id: I590ac039ca84c6f9b553db017188821ead852abb --- src/lottie/lottieitem.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index c7480df919..9a5c486a9b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -15,11 +15,11 @@ V_USE_NAMESPACE -enum class DirtyFlagBit +enum class DirtyFlagBit : uchar { - None = 0x0001, - Matrix = 0x0010, - Alpha = 0x0100, + None = 0x00, + Matrix = 0x01, + Alpha = 0x02, All = (Matrix | Alpha) }; From 43b23f480230fad9297af097dc8e9fe421c8922e Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 18:06:05 +0900 Subject: [PATCH 136/672] lottie/resource: add more lottie resource. Change-Id: Ife04ca8de9da22e1188b73aa550aae9df4d262de --- example/resource/Indicators1.json | 1 + example/resource/browser.json | 1 + example/resource/loader_4.json | 1 + 3 files changed, 3 insertions(+) create mode 100644 example/resource/Indicators1.json create mode 100644 example/resource/browser.json create mode 100644 example/resource/loader_4.json diff --git a/example/resource/Indicators1.json b/example/resource/Indicators1.json new file mode 100644 index 0000000000..742c48bc0f --- /dev/null +++ b/example/resource/Indicators1.json @@ -0,0 +1 @@ +{"v":"4.6.9","fr":29.9700012207031,"ip":0,"op":427.000017392067,"w":800,"h":600,"nm":"Indicators 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":0,"s":[325.441,300.5,0],"e":[350.147,300.5,0],"to":[4.11765050888062,0,0],"ti":[-8.34681701660156,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":20,"s":[350.147,300.5,0],"e":[375.522,300.5,0],"to":[8.34681701660156,0,0],"ti":[-4.22916650772095,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[375.522,300.5,0],"e":[375.522,300.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":65,"s":[375.522,300.5,0],"e":[400.772,300.5,0],"to":[4.20833349227905,0,0],"ti":[-8.33333301544189,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":85,"s":[400.772,300.5,0],"e":[425.522,300.5,0],"to":[8.33333301544189,0,0],"ti":[-4.125,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":110,"s":[425.522,300.5,0],"e":[425.522,300.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":130,"s":[425.522,300.5,0],"e":[450.853,300.5,0],"to":[4.22176122665405,0,0],"ti":[-8.33941173553467,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":150,"s":[450.853,300.5,0],"e":[475.559,300.5,0],"to":[8.33941173553467,0,0],"ti":[-4.11765050888062,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":175,"s":[475.559,300.5,0],"e":[475.559,300.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":195,"s":[475.559,300.5,0],"e":[450.853,300.5,0],"to":[-4.11765050888062,0,0],"ti":[8.32598400115967,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":215,"s":[450.853,300.5,0],"e":[425.603,300.5,0],"to":[-8.32598400115967,0,0],"ti":[4.20833349227905,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":240,"s":[425.603,300.5,0],"e":[425.603,300.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":260,"s":[425.603,300.5,0],"e":[400.228,300.5,0],"to":[-4.22916650772095,0,0],"ti":[8.34375,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":280,"s":[400.228,300.5,0],"e":[375.54,300.5,0],"to":[-8.34375,0,0],"ti":[4.11458349227905,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":305,"s":[375.54,300.5,0],"e":[375.54,300.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":325,"s":[375.54,300.5,0],"e":[350.147,300.5,0],"to":[-4.232177734375,0,0],"ti":[8.34982776641846,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":345,"s":[350.147,300.5,0],"e":[325.441,300.5,0],"to":[-8.34982776641846,0,0],"ti":[4.11765050888062,0,0]},{"t":370.000015070409}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":0,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":20,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":65,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":85,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":110,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":130,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":150,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":175,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":195,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":215,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":240,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":260,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":280,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":305,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":325,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":345,"s":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[24.706,12.5],[-24.706,12.5],[-37.206,0],[-37.206,0],[-24.706,-12.5],[24.706,-12.5],[37.206,0],[37.206,0]],"c":true}],"e":[{"i":[[6.875,0],[0,0],[0,6.875],[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0]],"o":[[0,0],[-6.875,0],[0,0],[0,-6.875],[0,0],[6.875,0],[0,0],[0,6.875]],"v":[[0,12.5],[0,12.5],[-12.5,0],[-12.5,0],[0,-12.5],[0,-12.5],[12.5,0],[12.5,0]],"c":true}]},{"t":370.000015070409}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":450.000018328876,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":25},"r":{"a":0,"k":0},"p":{"a":0,"k":[375.559,300.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.904,0],[0,-6.903],[-6.903,0],[0,6.903]],"o":[[-6.903,0],[0,6.903],[6.904,0],[0,-6.903]],"v":[[100,-12.5],[87.5,0],[100,12.5],[112.5,0]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.903,0],[0,-6.903],[-6.903,0],[0,6.903]],"o":[[-6.903,0],[0,6.903],[6.903,0],[0,-6.903]],"v":[[50,-12.5],[37.5,0],[50,12.5],[62.5,0]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.904,0],[0,-6.903],[-6.903,0],[0,6.903]],"o":[[-6.903,0],[0,6.903],[6.904,0],[0,-6.903]],"v":[[0,-12.5],[-12.5,0],[0,12.5],[12.5,0]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.903],[6.904,0],[0,6.903],[-6.903,0]],"o":[[0,6.903],[-6.903,0],[0,-6.903],[6.904,0]],"v":[[-61.617,0],[-74.117,12.5],[-86.617,0],[-74.117,-12.5]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[24,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group"}],"ip":0,"op":450.000018328876,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/browser.json b/example/resource/browser.json new file mode 100644 index 0000000000..d7e10a9dd2 --- /dev/null +++ b/example/resource/browser.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":25,"ip":0,"op":149,"w":256,"h":256,"nm":"Composição 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Camada de forma 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.5,23.75,0],"ix":2},"a":{"a":0,"k":[-92,-93.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.32,0.32,0.32],"y":[1.27,1.27,1]},"o":{"x":[0.17,0.17,0.17],"y":[0.89,0.89,0]},"n":["0p32_1p27_0p17_0p89","0p32_1p27_0p17_0p89","0p32_1_0p17_0"],"t":41,"s":[0,0,100],"e":[85,85,100]},{"t":47}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.5,14.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Caminho da elipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.701960784314,0.701960784314,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-92,-93.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Elipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Camada de forma 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48.5,23.75,0],"ix":2},"a":{"a":0,"k":[-92,-93.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.32,0.32,0.32],"y":[1.27,1.27,1]},"o":{"x":[0.17,0.17,0.17],"y":[0.89,0.89,0]},"n":["0p32_1p27_0p17_0p89","0p32_1p27_0p17_0p89","0p32_1_0p17_0"],"t":35,"s":[0,0,100],"e":[85,85,100]},{"t":41}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.5,14.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Caminho da elipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.701960784314,0.701960784314,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-92,-93.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Elipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Camada de forma 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[28.5,23.75,0],"ix":2},"a":{"a":0,"k":[-92,-93.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.32,0.32,0.32],"y":[1.27,1.27,1]},"o":{"x":[0.17,0.17,0.17],"y":[0.89,0.89,0]},"n":["0p32_1p27_0p17_0p89","0p32_1p27_0p17_0p89","0p32_1_0p17_0"],"t":29,"s":[0,0,100],"e":[85,85,100]},{"t":35}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.5,14.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Caminho da elipse 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.701960784314,0.701960784314,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-92,-93.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Elipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"line 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[53.085,245,0],"e":[53.085,200,0],"to":[0,-7.5,0],"ti":[0,7.5,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-73.675,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"n":["0p34_1_0p66_0","0p34_1_0p66_0","0p34_1_0p66_0"],"t":111,"s":[0,100,100],"e":[127.498,100,100]},{"t":126}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.650980392157,0.819607902976,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-14.375,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"line 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[109.085,217.25,0],"e":[109.085,172.25,0],"to":[0,-7.5,0],"ti":[0,7.5,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-117.575,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"n":["0p34_1_0p66_0","0p34_1_0p66_0","0p34_1_0p66_0"],"t":99,"s":[0,88.542,100],"e":[50.947,88.542,100]},{"t":111}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":110,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.286274509804,0.721568627451,0.643137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-58.722,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"line 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[53.085,217.25,0],"e":[53.085,172.25,0],"to":[0,-7.5,0],"ti":[0,7.5,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-117.575,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.9,0.9,0.9],"y":[0,0,0]},"n":["0p1_1_0p9_0","0p1_1_0p9_0","0p1_1_0p9_0"],"t":88,"s":[0,79.167,100],"e":[37.298,88.542,100]},{"t":103}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.89019613827,0.36862745098,0.325490196078,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-58.722,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"line 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[52.835,190.25,0],"e":[52.835,145.25,0],"to":[0,-7.5,0],"ti":[0,7.5,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-117.575,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"n":["0p34_1_0p66_0","0p34_1_0p66_0","0p34_1_0p66_0"],"t":79,"s":[0,100,100],"e":[88.298,100,100]},{"t":94}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.286274509804,0.721568627451,0.643137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-58.722,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[123.585,162.75,0],"e":[123.585,117.75,0],"to":[0,-7.5,0],"ti":[0,7.5,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-117.575,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"n":["0p34_1_0p66_0","0p34_1_0p66_0","0p34_1_0p66_0"],"t":62,"s":[0,100,100],"e":[67.298,100,100]},{"t":72}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.650980392157,0.819607902976,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-58.722,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"line 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[56.335,162.75,0],"e":[56.335,117.75,0],"to":[0,-7.5,0],"ti":[0,7.5,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-115.975,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"n":["0p34_1_0p66_0","0p34_1_0p66_0","0p34_1_0p66_0"],"t":52,"s":[0,100,100],"e":[48.498,100,100]},{"t":65}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.89019613827,0.36862745098,0.325490196078,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-58.722,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"line 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"n":"0p34_1_0p66_0","t":64,"s":[53.085,126.75,0],"e":[53.085,90.75,0],"to":[0,-6,0],"ti":[0,6,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[-72.975,-37.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"n":["0p34_1_0p66_0","0p34_1_0p66_0","0p34_1_0p66_0"],"t":40,"s":[0,100,100],"e":[105.498,100,100]},{"t":53}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[116.75,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254961799,0.937254961799,0.937254961799,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-14.375,-37.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.088,"y":1},"n":"0p34_1_0p088_1","t":16,"s":[127.77,391.572,0],"e":[127.77,145.572,0],"to":[0,-41,0],"ti":[0,41,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[80.876,70.93,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[250.5,245.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":13,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.16862745098,0.254901960784,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.25,-3.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[107.86,108.079],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"index","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.088,"y":1},"n":"0p34_1_0p088_1","t":7,"s":[127.77,402.072,0],"e":[127.77,131.072,0],"to":[0,-45.1666679382324,0],"ti":[0,45.1666679382324,0]},{"t":26}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[92,94.51,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[250.5,245.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":13,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254961799,0.937254961799,0.937254961799,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.25,-3.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[107.86,108.079],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":149,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/loader_4.json b/example/resource/loader_4.json new file mode 100644 index 0000000000..69248a72bb --- /dev/null +++ b/example/resource/loader_4.json @@ -0,0 +1 @@ +{"v":"4.6.9","fr":29.9700012207031,"ip":0,"op":34.0000013848484,"w":800,"h":600,"nm":"Loader","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,300,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[36.812,0],[0,-19.33],[-19.33,0],[-37.125,0],[0,-19.33],[19.33,0]],"o":[[-19.33,0],[0,19.33],[36.688,0],[19.33,0],[0,19.33],[-37.25,0]],"v":[[-44.844,-35],[-79.844,0],[-44.844,35],[44.844,-35],[79.844,0],[44.844,35]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":5.834,"s":[0],"e":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17.11,"s":[20],"e":[20]},{"i":{"x":[0.611],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p611_1_0p167_0p167"],"t":23.334,"s":[20],"e":[40]},{"t":35.0000014255792}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[12],"e":[32]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.666,"s":[32],"e":[32]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p5_1_0p167_0p167"],"t":17.11,"s":[32],"e":[53]},{"t":29.1662511879657}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[-22],"e":[82.925]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":17.11,"s":[82.925],"e":[193]},{"t":35.0000014255792}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":25},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,300,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[36.812,0],[0,-19.33],[-19.33,0],[-37.125,0],[0,-19.33],[19.33,0]],"o":[[-19.33,0],[0,19.33],[36.688,0],[19.33,0],[0,19.33],[-37.25,0]],"v":[[-44.844,-35],[-79.844,0],[-44.844,35],[44.844,-35],[79.844,0],[44.844,35]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]} \ No newline at end of file From 1a65665d9c810a70cb797e7b4d73ca45b1e741c8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 Aug 2018 19:39:01 +0900 Subject: [PATCH 137/672] lottie/render: fixed transparency issue in renderer. Change-Id: I8c1128b5cdd46718deeff6eda21663699dfd4b4c --- src/vector/vdrawhelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 2b075299e3..ee421e02c1 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -459,7 +459,7 @@ static inline Operator getOperator(const VSpanData * data, switch (data->mType) { case VSpanData::Type::Solid: - solidSource = vAlpha(data->mSolid) & 0xFF; + solidSource = (vAlpha(data->mSolid) == 255); op.srcFetch = nullptr; break; case VSpanData::Type::LinearGradient: From 505a208f9329705a7e3f664fed9df14ecb5dac8a Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 11 Aug 2018 20:15:14 +0900 Subject: [PATCH 138/672] lottie/render: fixed issue with + and - operator implementation of VRle. Change-Id: Idd852768fde5bdd731c2a85e8abdee094b39f110 --- src/vector/vrle.cpp | 311 ++++++++++++++++++++++++++++++++------------ src/vector/vrle.h | 16 +-- 2 files changed, 234 insertions(+), 93 deletions(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 69d4f64ed5..67a5e6042f 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -19,6 +19,7 @@ static void rleIntersectWithRle(VRleHelper *, int, int, VRleHelper *, VRleHelper *); static void rleIntersectWithRect(const VRect &, VRleHelper *, VRleHelper *); static void rleAddWithRle(VRleHelper *, VRleHelper *, VRleHelper *); +static void rleSubstractWithRle(VRleHelper *, VRleHelper *, VRleHelper *); static inline uchar divBy255(int x) { @@ -152,28 +153,30 @@ void VRle::VRleData::opIntersect(const VRect &r, VRle::VRleSpanCb cb, } } -void VRle::VRleData::opAdd(const VRle::VRleData &obj1, - const VRle::VRleData &obj2) +// res = a - b; +void VRle::VRleData::opSubstract(const VRle::VRleData &a, + const VRle::VRleData &b) { - // This routine assumes, obj1(span_y) < obj2(span_y). - - // reserve some space for the result vector. - mSpans.reserve(obj1.mSpans.size() + obj2.mSpans.size()); - // if two rle are disjoint - if (!obj1.bbox().intersects(obj2.bbox())) { - copyArrayToVector(obj1.mSpans.data(), obj1.mSpans.size(), mSpans); - copyArrayToVector(obj2.mSpans.data(), obj2.mSpans.size(), mSpans); + if (!a.bbox().intersects(b.bbox())) { + mSpans = a.mSpans; } else { - VRle::Span *ptr = const_cast(obj1.mSpans.data()); - int otherY = obj2.mBbox.top(); + VRle::Span * aPtr = const_cast(a.mSpans.data()); + const VRle::Span *aEnd = a.mSpans.data() + a.mSpans.size(); + VRle::Span * bPtr = const_cast(b.mSpans.data()); + const VRle::Span *bEnd = b.mSpans.data() + b.mSpans.size(); + // 1. forward till both y intersect - while (ptr->y < otherY) ptr++; - int spanToCopy = ptr - obj1.mSpans.data(); - copyArrayToVector(obj1.mSpans.data(), spanToCopy, mSpans); + while ((aPtr != aEnd) && (aPtr->y < bPtr->y)) aPtr++; + int sizeA = aPtr - a.mSpans.data(); + if (sizeA) copyArrayToVector(a.mSpans.data(), sizeA, mSpans); + + // 2. forward b till it intersect with a. + while ((bPtr != bEnd) && (bPtr->y < aPtr->y)) bPtr++; + int sizeB = bPtr - b.mSpans.data(); // 2. calculate the intersect region - VRleHelper tresult, tmp_obj, tmp_other; + VRleHelper tresult, aObj, bObj; std::array array; // setup the tresult object @@ -181,34 +184,94 @@ void VRle::VRleData::opAdd(const VRle::VRleData &obj1, tresult.alloc = array.size(); tresult.spans = array.data(); - // setup tmp object - tmp_obj.size = obj1.mSpans.size() - spanToCopy; - tmp_obj.spans = ptr; + // setup a object + aObj.size = a.mSpans.size() - sizeA; + aObj.spans = aPtr; - // setup tmp clip object - tmp_other.size = obj2.mSpans.size(); - tmp_other.spans = const_cast(obj2.mSpans.data()); + // setup b object + bObj.size = b.mSpans.size() - sizeB; + bObj.spans = bPtr; // run till all the spans are processed - while (tmp_obj.size && tmp_other.size) { - rleAddWithRle(&tmp_other, &tmp_obj, &tresult); + while (aObj.size && bObj.size) { + rleSubstractWithRle(&aObj, &bObj, &tresult); + if (tresult.size) { + copyArrayToVector(tresult.spans, tresult.size, mSpans); + } + tresult.size = 0; + } + // 3. copy the rest of a + if (aObj.size) copyArrayToVector(aObj.spans, aObj.size, mSpans); + } + + mBboxDirty = true; +} + +void VRle::VRleData::opAdd(const VRle::VRleData &a, const VRle::VRleData &b) +{ + // This routine assumes, obj1(span_y) < obj2(span_y). + + // reserve some space for the result vector. + mSpans.reserve(a.mSpans.size() + b.mSpans.size()); + + // if two rle are disjoint + if (!a.bbox().intersects(b.bbox())) { + if (a.mSpans[0].y < b.mSpans[0].y) { + copyArrayToVector(a.mSpans.data(), a.mSpans.size(), mSpans); + copyArrayToVector(b.mSpans.data(), b.mSpans.size(), mSpans); + } else { + copyArrayToVector(b.mSpans.data(), b.mSpans.size(), mSpans); + copyArrayToVector(a.mSpans.data(), a.mSpans.size(), mSpans); + } + } else { + VRle::Span * aPtr = const_cast(a.mSpans.data()); + const VRle::Span *aEnd = a.mSpans.data() + a.mSpans.size(); + VRle::Span * bPtr = const_cast(b.mSpans.data()); + const VRle::Span *bEnd = b.mSpans.data() + b.mSpans.size(); + + // 1. forward a till it intersects with b + while ((aPtr != aEnd) && (aPtr->y < bPtr->y)) aPtr++; + int sizeA = aPtr - a.mSpans.data(); + if (sizeA) copyArrayToVector(a.mSpans.data(), sizeA, mSpans); + + // 2. forward b till it intersects with a + while ((bPtr != bEnd) && (bPtr->y < aPtr->y)) bPtr++; + int sizeB = bPtr - b.mSpans.data(); + if (sizeB) copyArrayToVector(b.mSpans.data(), sizeB, mSpans); + + // 3. calculate the intersect region + VRleHelper tresult, aObj, bObj; + std::array array; + + // setup the tresult object + tresult.size = array.size(); + tresult.alloc = array.size(); + tresult.spans = array.data(); + + // setup a object + aObj.size = a.mSpans.size() - sizeA; + aObj.spans = aPtr; + + // setup b object + bObj.size = b.mSpans.size() - sizeB; + bObj.spans = bPtr; + + // run till all the spans are processed + while (aObj.size && bObj.size) { + rleAddWithRle(&aObj, &bObj, &tresult); if (tresult.size) { copyArrayToVector(tresult.spans, tresult.size, mSpans); } tresult.size = 0; } // 3. copy the rest - if (tmp_other.size) { - copyArrayToVector(tmp_other.spans, tmp_other.size, mSpans); - } - if (tmp_obj.size) { - copyArrayToVector(tmp_obj.spans, tmp_obj.size, mSpans); - } + if (bObj.size) copyArrayToVector(bObj.spans, bObj.size, mSpans); + if (aObj.size) copyArrayToVector(aObj.spans, aObj.size, mSpans); } // update result bounding box - VRegion reg(obj1.bbox()); - reg += obj2.bbox(); + VRegion reg(a.bbox()); + reg += b.bbox(); mBbox = reg.boundingRect(); mBboxDirty = false; } @@ -380,7 +443,8 @@ static void rleIntersectWithRect(const VRect &clip, VRleHelper *tmp_obj, result->size = result->alloc - available; } -void drawSpanlineMul(VRle::Span *spans, int count, uchar *buffer, int offsetX) +void blitDestinationOut(VRle::Span *spans, int count, uchar *buffer, + int offsetX) { uchar *ptr; while (count--) { @@ -388,14 +452,14 @@ void drawSpanlineMul(VRle::Span *spans, int count, uchar *buffer, int offsetX) int l = spans->len; ptr = buffer + x; while (l--) { - uchar cov = *ptr; - *ptr++ = divBy255(spans->coverage * cov); + *ptr = divBy255((255 - spans->coverage) * (*ptr)); + ptr++; } spans++; } } -void drawSpanline(VRle::Span *spans, int count, uchar *buffer, int offsetX) +void blitSrcOver(VRle::Span *spans, int count, uchar *buffer, int offsetX) { uchar *ptr; while (count--) { @@ -403,7 +467,23 @@ void drawSpanline(VRle::Span *spans, int count, uchar *buffer, int offsetX) int l = spans->len; ptr = buffer + x; while (l--) { - *ptr++ = spans->coverage; + *ptr = spans->coverage + divBy255((255 - spans->coverage) * (*ptr)); + ptr++; + } + spans++; + } +} + +void blit(VRle::Span *spans, int count, uchar *buffer, int offsetX) +{ + uchar *ptr; + while (count--) { + int x = spans->x + offsetX; + int l = spans->len; + ptr = buffer + x; + while (l--) { + *ptr = std::max(spans->coverage, *ptr); + ptr++; } spans++; } @@ -414,84 +494,149 @@ int bufferToRle(uchar *buffer, int size, int offsetX, int y, VRle::Span *out) int count = 0; uchar value = buffer[0]; int curIndex = 0; + + size = offsetX < 0 ? size + offsetX : size; for (int i = 0; i < size; i++) { uchar curValue = buffer[0]; if (value != curValue) { - out->y = y; - out->x = offsetX + curIndex; - out->len = i - curIndex; - out->coverage = value; - out++; + if (value) { + out->y = y; + out->x = offsetX + curIndex; + out->len = i - curIndex; + out->coverage = value; + out++; + count++; + } curIndex = i; value = curValue; - count++; } buffer++; } - out->y = y; - out->x = offsetX + curIndex; - out->len = size - curIndex; - out->coverage = value; - count++; + if (value) { + out->y = y; + out->x = offsetX + curIndex; + out->len = size - curIndex; + out->coverage = value; + count++; + } return count; } -static void rleAddWithRle(VRleHelper *tmp_clip, VRleHelper *tmp_obj, - VRleHelper *result) +static void rleAddWithRle(VRleHelper *a, VRleHelper *b, VRleHelper *result) { - std::array rleHolder; + std::array temp; VRle::Span * out = result->spans; int available = result->alloc; - VRle::Span * spans = tmp_obj->spans; - VRle::Span * end = tmp_obj->spans + tmp_obj->size; - VRle::Span * clipSpans = tmp_clip->spans; - VRle::Span * clipEnd = tmp_clip->spans + tmp_clip->size; + VRle::Span * aPtr = a->spans; + VRle::Span * aEnd = a->spans + a->size; + VRle::Span * bPtr = b->spans; + VRle::Span * bEnd = b->spans + b->size; - while (available && spans < end && clipSpans < clipEnd) { - if (spans->y < clipSpans->y) { - *out++ = *spans++; + while (available && aPtr < aEnd && bPtr < bEnd) { + if (aPtr->y < bPtr->y) { + *out++ = *aPtr++; available--; - } else if (clipSpans->y < spans->y) { - *out++ = *clipSpans++; + } else if (bPtr->y < aPtr->y) { + *out++ = *bPtr++; available--; } else { // same y - int y = spans->y; - VRle::Span *spanPtr = spans; - VRle::Span *clipPtr = clipSpans; + VRle::Span *aStart = aPtr; + VRle::Span *bStart = bPtr; - while (spanPtr < end && spanPtr->y == y) spanPtr++; - while (clipPtr < clipEnd && clipPtr->y == y) clipPtr++; + int y = aPtr->y; - int spanLength = (spanPtr - 1)->x + (spanPtr - 1)->len - spans->x; - int clipLength = - (clipPtr - 1)->x + (clipPtr - 1)->len - clipSpans->x; - int offsetX = VMIN(spans->x, clipSpans->x); - std::array array = {0}; - drawSpanline(spans, (spanPtr - spans), array.data(), -offsetX); - drawSpanlineMul(clipSpans, (clipPtr - clipSpans), array.data(), - -offsetX); - VRle::Span *rleHolderPtr = rleHolder.data(); - int size = bufferToRle(array.data(), VMAX(spanLength, clipLength), - offsetX, y, rleHolderPtr); + while (aPtr < aEnd && aPtr->y == y) aPtr++; + while (bPtr < bEnd && bPtr->y == y) bPtr++; + + int aLength = (aPtr - 1)->x + (aPtr - 1)->len; + int bLength = (bPtr - 1)->x + (bPtr - 1)->len; + int offset = std::min(aStart->x, bStart->x); + + std::array array = {{0}}; + blit(aStart, (aPtr - aStart), array.data(), -offset); + blitSrcOver(bStart, (bPtr - bStart), array.data(), -offset); + VRle::Span *tResult = temp.data(); + int size = bufferToRle(array.data(), std::max(aLength, bLength), + offset, y, tResult); if (available >= size) { while (size--) { - *out++ = *rleHolderPtr++; + *out++ = *tResult++; available--; } } else { + aPtr = aStart; + bPtr = bStart; break; } - spans = spanPtr; - clipSpans = clipPtr; } } // update the span list that yet to be processed - tmp_obj->spans = spans; - tmp_obj->size = end - spans; + a->spans = aPtr; + a->size = aEnd - aPtr; // update the clip list that yet to be processed - tmp_clip->spans = clipSpans; - tmp_clip->size = clipEnd - clipSpans; + b->spans = bPtr; + b->size = bEnd - bPtr; + + // update the result + result->size = result->alloc - available; +} + +static void rleSubstractWithRle(VRleHelper *a, VRleHelper *b, + VRleHelper *result) +{ + std::array temp; + VRle::Span * out = result->spans; + int available = result->alloc; + VRle::Span * aPtr = a->spans; + VRle::Span * aEnd = a->spans + a->size; + VRle::Span * bPtr = b->spans; + VRle::Span * bEnd = b->spans + b->size; + + while (available && aPtr < aEnd && bPtr < bEnd) { + if (aPtr->y < bPtr->y) { + *out++ = *aPtr++; + available--; + } else if (bPtr->y < aPtr->y) { + bPtr++; + } else { // same y + VRle::Span *aStart = aPtr; + VRle::Span *bStart = bPtr; + + int y = aPtr->y; + + while (aPtr < aEnd && aPtr->y == y) aPtr++; + while (bPtr < bEnd && bPtr->y == y) bPtr++; + + int aLength = (aPtr - 1)->x + (aPtr - 1)->len; + int bLength = (bPtr - 1)->x + (bPtr - 1)->len; + int offset = std::min(aStart->x, bStart->x); + + std::array array = {{0}}; + blit(aStart, (aPtr - aStart), array.data(), -offset); + blitDestinationOut(bStart, (bPtr - bStart), array.data(), -offset); + VRle::Span *tResult = temp.data(); + int size = bufferToRle(array.data(), std::max(aLength, bLength), + offset, y, tResult); + if (available >= size) { + while (size--) { + *out++ = *tResult++; + available--; + } + } else { + aPtr = aStart; + bPtr = bStart; + break; + } + } + } + // update the span list that yet to be processed + a->spans = aPtr; + a->size = aEnd - aPtr; + + // update the clip list that yet to be processed + b->spans = bPtr; + b->size = bEnd - bPtr; // update the result result->size = result->alloc - available; diff --git a/src/vector/vrle.h b/src/vector/vrle.h index b6a6b97601..9a45824482 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -49,6 +49,7 @@ private: void invert(); void opIntersect(const VRect &, VRle::VRleSpanCb, void *) const; void opAdd(const VRle::VRleData &, const VRle::VRleData &); + void opSubstract(const VRle::VRleData &, const VRle::VRleData &); void opIntersect(const VRle::VRleData &, const VRle::VRleData &); void addRect(const VRect &rect); std::vector mSpans; @@ -101,25 +102,20 @@ inline VRle VRle::operator+(const VRle &o) const if (o.isEmpty()) return *this; VRle result; - if (d->bbox().top() < o.d->bbox().top()) - result.d.write().opAdd(d.read(), o.d.read()); - else - result.d.write().opAdd(o.d.read(), d.read()); + result.d.write().opAdd(d.read(), o.d.read()); return result; } inline VRle VRle::operator-(const VRle &o) const { + if (isEmpty()) return VRle(); if (o.isEmpty()) return *this; - VRle result = o; - result.invert(); + VRle result; + result.d.write().opSubstract(d.read(), o.d.read()); - if (isEmpty()) - return result; - else - return *this + result; + return result; } inline void VRle::reset() From dfecf07d9441820a58f2311db0ae3c6611df51cd Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 13 Aug 2018 13:43:19 +0900 Subject: [PATCH 139/672] lottie/player: call setPos() only if size is already set. Change-Id: If08c49c398d6d8d90ab845020108b368ea204505 --- src/lottie/lottieplayer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 382bf2cec1..f3ca3247c2 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -119,9 +119,10 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); - if (!mSize.isEmpty()) + if (!mSize.isEmpty()) { setSize(mSize); - setPos(0); + setPos(0); + } return true; } return false; From b73a2cfdcf9dc284217ab1f195c2e3d63cbc6a29 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 13 Aug 2018 14:02:00 +0900 Subject: [PATCH 140/672] lottie/render: remove unused functions. Change-Id: Ib8d7319da4af0814072ed60869e053896336298d --- src/vector/vdrawhelper.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 200929856f..bf66854244 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -59,8 +59,6 @@ public: VRasterBuffer() { init(); } void init(); VBitmap::Format prepare(VBitmap *image); - void prepare(int w, int h); - void prepareBuffer(int w, int h); void clear(); void resetBuffer(int val = 0); @@ -77,8 +75,6 @@ public: int bytesPerLine() const { return mBytesPerLine; } int bytesPerPixel() const { return mBytesPerPixel; } - uchar *buffer() const { return mBuffer; } - VBitmap::Format mFormat; VPainter::CompositionMode mCompositionMode; From a36f340a0b71b3419fb61e3a96341e651ab1e539 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 13 Aug 2018 19:07:35 +0900 Subject: [PATCH 141/672] lottieplayer: remove redundant calls. Those calls are useless on load time. Change-Id: If69033eb244078c4f9b9258fcbc71eff17b894c9 --- src/lottie/lottieplayer.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index f3ca3247c2..7c97398e8a 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -119,10 +119,6 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); - if (!mSize.isEmpty()) { - setSize(mSize); - setPos(0); - } return true; } return false; From adddac6180b8b476cf10e5bd27de2fbfa75872e3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 13 Aug 2018 19:29:38 +0900 Subject: [PATCH 142/672] lottieplayer: merge setPos() with renderList() renderList() build render tree based on current Position. merge both api helps user to avoid mistake. Change-Id: Ia158f28b5ab66ec6e20665726a21d7f1c4e4cc13 --- example/lottieview.cpp | 6 ++---- inc/lottieplayer.h | 3 +-- src/lottie/lottieplayer.cpp | 25 +++++++++++++------------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index a59468d3bb..69701912c0 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -162,8 +162,7 @@ void LottieView::seek(float pos) } } } else { - mPlayer->setPos(pos); - const std::vector &renderList = mPlayer->renderList(); + const std::vector &renderList = mPlayer->renderList(pos); update(renderList); } } @@ -186,8 +185,7 @@ void LottieView::render() } mBuffer.buffer = nullptr; } else { - mPlayer->setPos(mPendingPos); - const std::vector &renderList = mPlayer->renderList(); + const std::vector &renderList = mPlayer->renderList(mPendingPos); update(renderList); } } diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 1fcdb77a44..91159771a4 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -46,10 +46,9 @@ public: float playTime() const; - void setPos(float pos); float pos(); - const std::vector &renderList() const; + const std::vector &renderList(float pos) const; // TODO: Consider correct position... void setSize(int width, int height); diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 7c97398e8a..95368afdac 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -7,15 +7,18 @@ #include class LOTPlayerPrivate { + +private: + bool setPos(float pos); + public: LOTPlayerPrivate(); bool setFilePath(std::string path); void setSize(const VSize &sz); VSize size() const; float playTime() const; - bool setPos(float pos); float pos(); - const std::vector &renderList() const; + const std::vector &renderList(float pos); bool render(float pos, const LOTBuffer &buffer); public: @@ -48,13 +51,13 @@ VSize LOTPlayerPrivate::size() const } } -const std::vector &LOTPlayerPrivate::renderList() const +const std::vector &LOTPlayerPrivate::renderList(float pos) { if (!mCompItem) { static std::vector empty; return empty; } - + this->setPos(pos); return mCompItem->renderList(); } @@ -66,7 +69,10 @@ float LOTPlayerPrivate::playTime() const bool LOTPlayerPrivate::setPos(float pos) { - if (!mModel || !mCompItem) return false; + if (!mModel || !mCompItem) { + vWarning << "Invalid data, mModel(?), mCompItem(?)"; + return false; + } if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; @@ -244,19 +250,14 @@ float LOTPlayer::playTime() const return d->playTime(); } -void LOTPlayer::setPos(float pos) -{ - d->setPos(pos); -} - float LOTPlayer::pos() { return d->pos(); } -const std::vector &LOTPlayer::renderList() const +const std::vector &LOTPlayer::renderList(float pos) const { - return d->renderList(); + return d->renderList(pos); } std::future LOTPlayer::render(float pos, LOTBuffer buffer) From 9410d9e32d8aab0e7ba0819677ef2d9fda1cd271 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 13 Aug 2018 20:16:59 +0900 Subject: [PATCH 143/672] lottieplayer: code refactoring. change type to struct and declare type scopes explicitly. Change-Id: If85fbc97917ba324030c3e65765f315e590239ed --- inc/lottieplayer.h | 50 ++++++++++++++++--------------------- src/lottie/lottieplayer.cpp | 4 --- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 91159771a4..1e98f071ff 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -65,32 +65,31 @@ public: #define ChangeFlagPaint 0x0010 #define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) -class LOT_EXPORT LOTNode { -public: - struct PathData { - const float *ptPtr; - int ptCount; - const char * elmPtr; - int elmCount; - }; - struct Color { - unsigned short r, g, b, a; - }; +struct LOTNode { enum BrushType { BrushSolid, BrushGradient }; enum FillRule { EvenOdd, Winding }; - enum JoinStyle { MiterJoin, BevelJoin, RoundJoin }; - enum CapStyle { FlatCap, SquareCap, RoundCap }; + struct PathData { + const float *ptPtr; + int ptCount; + const char* elmPtr; + int elmCount; + }; + + struct Color { + unsigned char r, g, b, a; + }; + struct Stroke { bool enable; int width; CapStyle cap; JoinStyle join; int meterLimit; - float * dashArray; + float* dashArray; int dashArraySize; }; @@ -99,25 +98,18 @@ public: Gradient::Type type; struct { float x, y; - } start, end; - struct { - float x, y; - } center, focal; + } start, end, center, focal; float cradius; float fradius; }; - ~LOTNode(); - LOTNode(); - -public: - int mFlag; - LOTNode::BrushType mType; - FillRule mFillRule; - PathData mPath; - Color mColor; - Stroke mStroke; - Gradient mGradient; + int mFlag; + BrushType mType; + FillRule mFillRule; + PathData mPath; + Color mColor; + Stroke mStroke; + Gradient mGradient; }; #endif // LOTPLAYER_H diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 95368afdac..92566e5b46 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -270,10 +270,6 @@ bool LOTPlayer::renderSync(float pos, LOTBuffer buffer) return d->render(pos, buffer); } -LOTNode::~LOTNode() {} - -LOTNode::LOTNode() {} - void initLogging() { #if defined(__ARM_NEON__) From d0b3aa86dd30d95281d298306a4512451902cbc9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 14 Aug 2018 11:00:15 +0900 Subject: [PATCH 144/672] lottie/render: Fixed valgrind warning for uninitialize member variable. Change-Id: I3c985c00b54d91b936c401febe9dff0d766e1793 --- src/lottie/lottieitem.h | 18 +++++++++--------- src/lottie/lottiemodel.h | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 9a5c486a9b..eebc24ec99 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -238,7 +238,7 @@ protected: LOTRectData *mData; struct Cache { - int mFrameNo; + int mFrameNo{-1}; VPointF mPos; VPointF mSize; float mRoundness; @@ -276,7 +276,7 @@ private: LOTEllipseData *mData; struct Cache { - int mFrameNo; + int mFrameNo{-1}; VPointF mPos; VPointF mSize; }; @@ -320,14 +320,14 @@ private: LOTPolystarData *mData; struct Cache { - int mFrameNo; + int mFrameNo{-1}; VPointF mPos; - float mPoints; - float mInnerRadius; - float mOuterRadius; - float mInnerRoundness; - float mOuterRoundness; - float mRotation; + float mPoints{0}; + float mInnerRadius{0}; + float mOuterRadius{0}; + float mInnerRoundness{0}; + float mOuterRoundness{0}; + float mRotation{0}; }; Cache mCache; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 8d9df61015..b9dba2ccad 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -453,7 +453,7 @@ public: LOTAnimatable mWidth; /* "w" */ CapStyle mCapStyle; /* "lc" */ JoinStyle mJoinStyle; /* "lj" */ - float mMeterLimit; /* "ml" */ + float mMeterLimit{0}; /* "ml" */ LOTDashProperty mDash; bool mEnabled = true; /* "fillEnabled" */ }; @@ -562,7 +562,7 @@ public: LOTAnimatable mWidth; /* "w" */ CapStyle mCapStyle; /* "lc" */ JoinStyle mJoinStyle; /* "lj" */ - float mMeterLimit; /* "ml" */ + float mMeterLimit{0}; /* "ml" */ LOTDashProperty mDash; }; From 2d81a0920d85f4a2be56a963c9292f47a2a035a3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 13 Aug 2018 20:39:13 +0900 Subject: [PATCH 145/672] lottieplayer: apply lazy update. update size when it ready to go. Change-Id: Ic1f27bc3f365526313059d7c9026478c41b557c8 --- src/lottie/lottieplayer.cpp | 58 ++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 92566e5b46..f5fdcee5ac 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -10,6 +10,7 @@ class LOTPlayerPrivate { private: bool setPos(float pos); + bool update(float pos); public: LOTPlayerPrivate(); @@ -35,11 +36,6 @@ private: void LOTPlayerPrivate::setSize(const VSize &sz) { mSize = sz; - if (!mCompItem) { - return; - } - - mCompItem->resize(sz); } VSize LOTPlayerPrivate::size() const @@ -53,11 +49,11 @@ VSize LOTPlayerPrivate::size() const const std::vector &LOTPlayerPrivate::renderList(float pos) { - if (!mCompItem) { + if (!mCompItem || !this->update(pos)) { static std::vector empty; return empty; } - this->setPos(pos); + return mCompItem->renderList(); } @@ -69,19 +65,12 @@ float LOTPlayerPrivate::playTime() const bool LOTPlayerPrivate::setPos(float pos) { - if (!mModel || !mCompItem) { - vWarning << "Invalid data, mModel(?), mCompItem(?)"; - return false; - } - if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; - if (mModel->isStatic()) pos = 0; - if (vCompare(pos, mPos)) return true; + mPos = pos; - int frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); - return mCompItem->update(frameNumber); + return true; } float LOTPlayerPrivate::pos() @@ -89,6 +78,20 @@ float LOTPlayerPrivate::pos() return mPos; } +bool LOTPlayerPrivate::update(float pos) +{ + mCompItem->resize(mSize); + this->setPos(pos); + + int frameNumber; + if (mModel->isStatic()) frameNumber = 0; + else frameNumber = mModel->startFrame() + this->pos() * mModel->frameDuration(); + + if (!mCompItem->update(frameNumber)) return false; + + return true; +} + bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) { if (!mCompItem) return false; @@ -97,22 +100,23 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) if (renderInProgress) vCritical << "Already Rendering Scheduled for this Player"; - mRenderInProgress.store(true); + bool result = false; - bool result; - if (setPos(pos)) { - if (mCompItem->render(buffer)) - result = true; - else - result = false; - } else { - result = false; + if (this->update(pos)) { + + mRenderInProgress.store(true); + + if (mCompItem->render(buffer)) { + result = true; + } + + mRenderInProgress.store(false); } - mRenderInProgress.store(false); + return result; } -LOTPlayerPrivate::LOTPlayerPrivate() : mRenderInProgress(false), mPos(-1) {} +LOTPlayerPrivate::LOTPlayerPrivate() : mRenderInProgress(false), mPos(0) {} bool LOTPlayerPrivate::setFilePath(std::string path) { From 49d374788d08b3a8478c927e7b53dbf26459e05d Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 14 Aug 2018 14:57:36 +0900 Subject: [PATCH 146/672] lottieplayer: simple optmization for deffered update. This skips unnecessary update process from every user render-request. Change-Id: Id3123bdb31879e1c559b6048ccf60d88dccb690f --- src/lottie/lottieplayer.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index f5fdcee5ac..1b23fd8cde 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -30,12 +30,16 @@ public: std::atomic mRenderInProgress; private: - float mPos; + float mPos = 0.0; + bool mChanged = true; }; void LOTPlayerPrivate::setSize(const VSize &sz) { - mSize = sz; + if (mSize != sz) { + mChanged = true; + mSize = sz; + } } VSize LOTPlayerPrivate::size() const @@ -68,6 +72,8 @@ bool LOTPlayerPrivate::setPos(float pos) if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; + if (!vCompare(pos, mPos)) mChanged = true; + mPos = pos; return true; @@ -80,6 +86,9 @@ float LOTPlayerPrivate::pos() bool LOTPlayerPrivate::update(float pos) { + //Nothing updated, skip it. + if (!mChanged) return true; + mCompItem->resize(mSize); this->setPos(pos); @@ -89,6 +98,8 @@ bool LOTPlayerPrivate::update(float pos) if (!mCompItem->update(frameNumber)) return false; + mChanged = false; + return true; } @@ -116,7 +127,7 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) return result; } -LOTPlayerPrivate::LOTPlayerPrivate() : mRenderInProgress(false), mPos(0) {} +LOTPlayerPrivate::LOTPlayerPrivate() : mRenderInProgress(false) {} bool LOTPlayerPrivate::setFilePath(std::string path) { From e6b7dd855116c95fa6252a4b17ea7136d28172a3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 14 Aug 2018 18:57:00 +0900 Subject: [PATCH 147/672] lottieplayer: fix broken animation. A patch occured regression bug, because its depeneded patch was rebased. call setPos() properly even in deferred method. Change-Id: I89fa849304b6e5d260cc88c3863d8879c7bb463b --- src/lottie/lottieplayer.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 1b23fd8cde..d20e4e6c40 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -9,8 +9,8 @@ class LOTPlayerPrivate { private: - bool setPos(float pos); - bool update(float pos); + void setPos(float pos); + bool update(); public: LOTPlayerPrivate(); @@ -53,7 +53,9 @@ VSize LOTPlayerPrivate::size() const const std::vector &LOTPlayerPrivate::renderList(float pos) { - if (!mCompItem || !this->update(pos)) { + this->setPos(pos); + + if (!mCompItem || !this->update()) { static std::vector empty; return empty; } @@ -67,7 +69,7 @@ float LOTPlayerPrivate::playTime() const return float(mModel->frameDuration()) / float(mModel->frameRate()); } -bool LOTPlayerPrivate::setPos(float pos) +void LOTPlayerPrivate::setPos(float pos) { if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; @@ -75,8 +77,6 @@ bool LOTPlayerPrivate::setPos(float pos) if (!vCompare(pos, mPos)) mChanged = true; mPos = pos; - - return true; } float LOTPlayerPrivate::pos() @@ -84,13 +84,12 @@ float LOTPlayerPrivate::pos() return mPos; } -bool LOTPlayerPrivate::update(float pos) +bool LOTPlayerPrivate::update() { //Nothing updated, skip it. if (!mChanged) return true; mCompItem->resize(mSize); - this->setPos(pos); int frameNumber; if (mModel->isStatic()) frameNumber = 0; @@ -113,7 +112,9 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) bool result = false; - if (this->update(pos)) { + this->setPos(pos); + + if (this->update()) { mRenderInProgress.store(true); From 1c4bd6c96671a7391a075ad1af22703397b41b53 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 14 Aug 2018 14:28:46 +0900 Subject: [PATCH 148/672] lottie/example: delete the animator only when its created. Change-Id: Id6a4a7e704a8da298c0cae91a7065b80163f843d --- example/lottieview.cpp | 2 +- example/lottieview.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 69701912c0..5b30fd93be 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -108,7 +108,7 @@ LottieView::~LottieView() if (mRenderTask.valid()) mRenderTask.get(); - ecore_animator_del(mAnimator); + if (mAnimator) ecore_animator_del(mAnimator); if (mVg) evas_object_del(mVg); if (mImage) evas_object_del(mImage); delete mPlayer; diff --git a/example/lottieview.h b/example/lottieview.h index 846610adf8..681fb8b7ac 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -55,7 +55,7 @@ public: int mRepeatCount; LottieView::RepeatMode mRepeatMode; LOTPlayer *mPlayer; - Ecore_Animator *mAnimator; + Ecore_Animator *mAnimator{nullptr}; bool mLoop; int mCurCount; bool mReverse; From 95d9dd1447f93a73abad812c04d7b07cd0d73dfe Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 14 Aug 2018 18:57:43 +0900 Subject: [PATCH 149/672] lottie/player: refactor composition class to keep a precomplayer instead of list of layers. Change-Id: I7398392e52233e4c3d0452b03bcfd46261253601 --- src/lottie/lottieitem.cpp | 53 ++++--------------------------------- src/lottie/lottieitem.h | 4 +-- src/lottie/lottiemodel.h | 2 ++ src/lottie/lottieparser.cpp | 19 +++++++------ 4 files changed, 19 insertions(+), 59 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 1dd37e8f78..9f206841c6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -15,45 +15,12 @@ LOTCompItem::LOTCompItem(LOTModel *model) : mRootModel(model), mUpdateViewBox(false), mCurFrameNo(-1) { - // 1. build layer item list mCompData = model->mRoot.get(); - for (auto &i : mCompData->mChildren) { - LOTLayerData *layerData = dynamic_cast(i.get()); - if (layerData) { - LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerData); - if (layerItem) { - mLayers.push_back(layerItem); - mLayerMap[layerItem->id()] = layerItem; - } - } - } - - // 2. update parent layer - for (auto &i : mLayers) { - int id = i->parentId(); - if (id >= 0) { - auto search = mLayerMap.find(id); - if (search != mLayerMap.end()) { - LOTLayerItem *parentLayer = search->second; - i->setParentLayer(parentLayer); - } - } - } - // 3. update static property of each layer - for (auto &i : mLayers) { - i->updateStaticProperty(); - } - + mRootLayer = std::unique_ptr(createLayerItem(mCompData->mRootLayer.get())); + mRootLayer->updateStaticProperty(); mViewSize = mCompData->size(); } -LOTCompItem::~LOTCompItem() -{ - for (auto &i : mLayers) { - delete i; - } -} - LOTLayerItem *LOTCompItem::createLayerItem(LOTLayerData *layerData) { switch (layerData->mLayerType) { @@ -112,12 +79,8 @@ bool LOTCompItem::update(int frameNo) VMatrix m; m.scale(scale, scale).translate(tx, ty); + mRootLayer->update(frameNo, m, 1.0); - // update the layer from back to front - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->update(frameNo, m, 1.0); - } buildRenderList(); mCurFrameNo = frameNo; mUpdateViewBox = false; @@ -127,10 +90,7 @@ bool LOTCompItem::update(int frameNo) void LOTCompItem::buildRenderList() { mDrawableList.clear(); - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->renderList(mDrawableList); - } + mRootLayer->renderList(mDrawableList); mRenderList.clear(); for (auto &i : mDrawableList) { @@ -159,10 +119,7 @@ bool LOTCompItem::render(const LOTBuffer &buffer) VPainter painter(&bitmap); VRle mask; - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->render(&painter, mask); - } + mRootLayer->render(&painter, mask); return true; } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index eebc24ec99..42721ce6f0 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -31,7 +31,6 @@ class LOTCompItem { public: LOTCompItem(LOTModel *model); - ~LOTCompItem(); static LOTLayerItem * createLayerItem(LOTLayerData *layerData); bool update(int frameNo); void resize(const VSize &size); @@ -44,8 +43,7 @@ private: VSize mViewSize; LOTModel *mRootModel; LOTCompositionData *mCompData; - std::vector mLayers; - std::unordered_map mLayerMap; + std::unique_ptr mRootLayer; bool mUpdateViewBox; int mCurFrameNo; std::vector mRenderList; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index b9dba2ccad..57199b653f 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -330,10 +330,12 @@ public: long mEndFrame = 0; float mFrameRate; LottieBlendMode mBlendMode; + std::shared_ptr mRootLayer; std::unordered_map> mInterpolatorCache; std::unordered_map> mAssets; + }; class LOTLayerData : public LOTGroupData diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index af1304f5a2..822cfa4d2e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -579,12 +579,9 @@ void LottieParserImpl::parseComposition() } } resolveLayerRefs(); - // update the static property of Composition - bool staticFlag = true; - for (auto child : comp->mChildren) { - staticFlag &= child.get()->isStatic(); - } - comp->setStatic(staticFlag); + comp->setStatic(comp->mRootLayer->isStatic()); + comp->mRootLayer->mInFrame = comp->mStartFrame; + comp->mRootLayer->mOutFrame = comp->mEndFrame; mComposition = sharedComposition; } @@ -634,14 +631,20 @@ std::shared_ptr LottieParserImpl::parseAsset() return sharedAsset; } -void LottieParserImpl::parseLayers(LOTCompositionData *composition) +void LottieParserImpl::parseLayers(LOTCompositionData *comp) { + comp->mRootLayer = std::make_shared(); + comp->mRootLayer->mLayerType = LayerType::Precomp; + comp->mRootLayer->mTransform = std::make_shared(); + bool staticFlag = true; RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { std::shared_ptr layer = parseLayer(); - composition->mChildren.push_back(layer); + staticFlag &= layer->isStatic(); + comp->mRootLayer->mChildren.push_back(layer); } + comp->mRootLayer->setStatic(staticFlag); } LottieColor LottieParserImpl::toColor(const char *str) From 12bad1cc4ee8b4eded16f13ffc84f65565923331 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 16 Aug 2018 10:03:07 +0900 Subject: [PATCH 150/672] lottie/render: keep mRle object in valid state after moving the object. Change-Id: I15c377dc53dbe5b87184ca4751c3473f486a3121 --- src/vector/vdrawable.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index c8df216f90..625660ef89 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -17,6 +17,7 @@ void VDrawable::preprocess() mRleTask = VRaster::instance().generateFillInfo( std::move(mPath), std::move(mRle), mFillRule); } + mRle = VRle(); mFlag &= ~DirtyFlag(DirtyState::Path); } } From c326d5464c6f5c153253e1de17016cf8f449c379 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 16 Aug 2018 10:16:49 +0900 Subject: [PATCH 151/672] lottie/parser: inherit from data object instead of group object as composition has only a root layer. Change-Id: I15f07d5d7ae2f8add4ac2b2de92628a33ab492e0 --- src/lottie/lottiemodel.h | 58 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 57199b653f..d130d9669b 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -309,35 +309,6 @@ public: std::vector> mLayers; }; -class LOTCompositionData : public LOTGroupData -{ -public: - void processRepeaterObjects(); - void accept(LOTDataVisitor *visitor) override - {visitor->visit(this); visitor->visitChildren(this);} - LOTCompositionData():LOTGroupData(LOTData::Type::Composition){} - inline long frameDuration()const{return mEndFrame - mStartFrame -1;} - inline long frameRate()const{return mFrameRate;} - inline long startFrame() const {return mStartFrame;} - inline long endFrame() const {return mEndFrame;} - inline VSize size() const { return mSize;} - -public: - std::string mVersion; - VSize mSize; - bool mAnimation = false; - long mStartFrame = 0; - long mEndFrame = 0; - float mFrameRate; - LottieBlendMode mBlendMode; - std::shared_ptr mRootLayer; - std::unordered_map> mInterpolatorCache; - std::unordered_map> mAssets; - -}; - class LOTLayerData : public LOTGroupData { public: @@ -381,6 +352,35 @@ public: std::vector> mMasks; }; +class LOTCompositionData : public LOTData +{ +public: + void processRepeaterObjects(); + void accept(LOTDataVisitor *visitor) override + {visitor->visit(this); mRootLayer->accept(visitor);} + LOTCompositionData():LOTData(LOTData::Type::Composition){} + inline long frameDuration()const{return mEndFrame - mStartFrame -1;} + inline long frameRate()const{return mFrameRate;} + inline long startFrame() const {return mStartFrame;} + inline long endFrame() const {return mEndFrame;} + inline VSize size() const { return mSize;} + +public: + std::string mVersion; + VSize mSize; + bool mAnimation = false; + long mStartFrame = 0; + long mEndFrame = 0; + float mFrameRate; + LottieBlendMode mBlendMode; + std::shared_ptr mRootLayer; + std::unordered_map> mInterpolatorCache; + std::unordered_map> mAssets; + +}; + class LOTTransformData : public LOTData { public: From 308d8cf4baacde817df1206611b3c761cd3d7f40 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 16 Aug 2018 10:36:37 +0900 Subject: [PATCH 152/672] lottie/parser: refactor lottie model objects. Change-Id: I89160d918b36300b4f98a8059106c356e96643d0 --- src/lottie/lottiemodel.h | 284 ++++++++++++++++-------------------- src/lottie/lottieparser.cpp | 6 +- 2 files changed, 130 insertions(+), 160 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index d130d9669b..69523b171f 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -268,15 +268,14 @@ public: Trim, Repeater }; + LOTData(LOTData::Type type): mType(type){} + virtual ~LOTData(){} inline LOTData::Type type() const {return mType;} virtual void accept(LOTDataVisitor *){} - virtual ~LOTData(){} - LOTData(LOTData::Type type): mStatic(true), mType(type){} bool isStatic() const{return mStatic;} void setStatic(bool value) {mStatic = value;} - virtual bool hasChildren() {return false;} public: - bool mStatic; + bool mStatic{true}; LOTData::Type mType; }; @@ -284,7 +283,6 @@ class LOTGroupData: public LOTData { public: LOTGroupData(LOTData::Type type):LOTData(type){} - virtual bool hasChildren() {return true;} public: std::vector> mChildren; std::shared_ptr mTransform; @@ -293,17 +291,14 @@ public: class LOTShapeGroupData : public LOTGroupData { public: + LOTShapeGroupData():LOTGroupData(LOTData::Type::ShapeGroup){} void accept(LOTDataVisitor *visitor) override {visitor->visit(this); visitor->visitChildren(this);} - - LOTShapeGroupData():LOTGroupData(LOTData::Type::ShapeGroup){} }; class LOTLayerData; -class LOTAsset +struct LOTAsset { -public: - LOTAsset(){} int mAssetType; //lottie asset type (precomp/char/image) std::string mRefId; // ref id std::vector> mLayers; @@ -312,65 +307,65 @@ public: class LOTLayerData : public LOTGroupData { public: + LOTLayerData():LOTGroupData(LOTData::Type::Layer){} + bool hasPathOperator() const noexcept {return mHasPathOperator;} + bool hasGradient() const noexcept {return mHasGradient;} + bool hasMask() const noexcept {return mHasMask;} + bool hasRepeater() const noexcept {return mHasRepeater;} + int id() const noexcept{ return mId;} + int parentId() const noexcept{ return mParentId;} + int inFrame() const noexcept{return mInFrame;} + int outFrame() const noexcept{return mOutFrame;} + int startFrame() const noexcept{return mStartFrame;} + int solidWidth() const noexcept{return mSolidLayer.mWidth;} + int solidHeight() const noexcept{return mSolidLayer.mHeight;} + LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} void accept(LOTDataVisitor *visitor) override {visitor->visit(this); visitor->visitChildren(this);} - LOTLayerData():LOTGroupData(LOTData::Type::Layer), - mMatteType(MatteType::None), - mParentId(-1), - mId(-1), - mHasPathOperator(false), mHasMask(false){} - inline bool hasPathOperator() const noexcept {return mHasPathOperator;} - inline int id() const noexcept{ return mId;} - inline int parentId() const noexcept{ return mParentId;} - inline int inFrame() const noexcept{return mInFrame;} - inline int outFrame() const noexcept{return mOutFrame;} - inline int startFrame() const noexcept{return mOutFrame;} - inline int solidWidth() const noexcept{return mSolidLayer.mWidth;} - inline int solidHeight() const noexcept{return mSolidLayer.mHeight;} - inline LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} public: - MatteType mMatteType; - VRect mBound; - LayerType mLayerType; //lottie layer type (solid/shape/precomp) - int mParentId; // Lottie the id of the parent in the composition - int mId; // Lottie the group id used for parenting. - long mInFrame = 0; - long mOutFrame = 0; - long mStartFrame = 0; - LottieBlendMode mBlendMode; - float mTimeStreatch; - std::string mPreCompRefId; - LOTAnimatable mTimeRemap; /* "tm" */ struct SolidLayer { - int mWidth; - int mHeight; + int mWidth{0}; + int mHeight{0}; LottieColor mColor; }; - SolidLayer mSolidLayer; - bool mHasPathOperator; - bool mHasMask; + + MatteType mMatteType{MatteType::None}; + VRect mBound; + LayerType mLayerType; //lottie layer type (solid/shape/precomp) + int mParentId{-1}; // Lottie the id of the parent in the composition + int mId{-1}; // Lottie the group id used for parenting. + long mInFrame{0}; + long mOutFrame{0}; + long mStartFrame{0}; + LottieBlendMode mBlendMode; + float mTimeStreatch{1.0f}; + std::string mPreCompRefId; + LOTAnimatable mTimeRemap; /* "tm" */ + SolidLayer mSolidLayer; + bool mHasPathOperator{false}; + bool mHasMask{false}; + bool mHasRepeater{false}; + bool mHasGradient{false}; std::vector> mMasks; }; class LOTCompositionData : public LOTData { public: + LOTCompositionData():LOTData(LOTData::Type::Composition){} + long frameDuration()const{return mEndFrame - mStartFrame -1;} + long frameRate()const{return mFrameRate;} + long startFrame() const {return mStartFrame;} + long endFrame() const {return mEndFrame;} + VSize size() const { return mSize;} void processRepeaterObjects(); void accept(LOTDataVisitor *visitor) override {visitor->visit(this); mRootLayer->accept(visitor);} - LOTCompositionData():LOTData(LOTData::Type::Composition){} - inline long frameDuration()const{return mEndFrame - mStartFrame -1;} - inline long frameRate()const{return mFrameRate;} - inline long startFrame() const {return mStartFrame;} - inline long endFrame() const {return mEndFrame;} - inline VSize size() const { return mSize;} - public: std::string mVersion; - VSize mSize; - bool mAnimation = false; - long mStartFrame = 0; - long mEndFrame = 0; + VSize mSize; + long mStartFrame{0}; + long mEndFrame{0}; float mFrameRate; LottieBlendMode mBlendMode; std::shared_ptr mRootLayer; @@ -384,80 +379,71 @@ public: class LOTTransformData : public LOTData { public: - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} - LOTTransformData():LOTData(LOTData::Type::Transform), - mRotation(0), - mScale(VPointF(100, 100)), - mPosition(VPointF(0, 0)), - mAnchor(VPointF(0, 0)), - mOpacity(100), - mSkew(0), - mSkewAxis(0), - mStaticMatrix(true){} + LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} VMatrix matrix(int frameNo) const; float opacity(int frameNo) const; void cacheMatrix(); - inline bool staticMatrix() const {return mStaticMatrix;} + bool staticMatrix() const {return mStaticMatrix;} + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} private: VMatrix computeMatrix(int frameNo) const; public: - LOTAnimatable mRotation; /* "r" */ - LOTAnimatable mScale; /* "s" */ - LOTAnimatable mPosition; /* "p" */ - LOTAnimatable mAnchor; /* "a" */ - LOTAnimatable mOpacity; /* "o" */ - LOTAnimatable mSkew; /* "sk" */ - LOTAnimatable mSkewAxis; /* "sa" */ - bool mStaticMatrix; - VMatrix mCachedMatrix; + LOTAnimatable mRotation{0}; /* "r" */ + LOTAnimatable mScale; /* "s" */ + LOTAnimatable mPosition; /* "p" */ + LOTAnimatable mAnchor; /* "a" */ + LOTAnimatable mOpacity{100}; /* "o" */ + LOTAnimatable mSkew{0}; /* "sk" */ + LOTAnimatable mSkewAxis{0}; /* "sa" */ + bool mStaticMatrix{true}; + VMatrix mCachedMatrix; }; class LOTFillData : public LOTData { public: + LOTFillData():LOTData(LOTData::Type::Fill){} + float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + FillRule fillRule() const {return mFillRule;} void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTFillData():LOTData(LOTData::Type::Fill), mFillRule(FillRule::Winding){} - inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} - inline FillRule fillRule() const {return mFillRule;} public: - FillRule mFillRule; /* "r" */ + FillRule mFillRule{FillRule::Winding}; /* "r" */ LOTAnimatable mColor; /* "c" */ - LOTAnimatable mOpacity; /* "o" */ - bool mEnabled = true; /* "fillEnabled" */ + LOTAnimatable mOpacity{100}; /* "o" */ + bool mEnabled{true}; /* "fillEnabled" */ }; struct LOTDashProperty { - LOTDashProperty():mDashCount(0), mStatic(true){} LOTAnimatable mDashArray[5]; /* "d" "g" "o"*/ - int mDashCount; - bool mStatic; + int mDashCount{0}; + bool mStatic{true}; }; class LOTStrokeData : public LOTData { public: + LOTStrokeData():LOTData(LOTData::Type::Stroke){} + float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + float width(int frameNo) const {return mWidth.value(frameNo);} + CapStyle capStyle() const {return mCapStyle;} + JoinStyle joinStyle() const {return mJoinStyle;} + float meterLimit() const{return mMeterLimit;} + bool hasDashInfo() const { return !(mDash.mDashCount == 0);} + int getDashInfo(int frameNo, float *array) const; void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTStrokeData():LOTData(LOTData::Type::Stroke){} - inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} - inline float width(int frameNo) const {return mWidth.value(frameNo);} - inline CapStyle capStyle() const {return mCapStyle;} - inline JoinStyle joinStyle() const {return mJoinStyle;} - inline float meterLimit() const{return mMeterLimit;} - inline bool hasDashInfo() const { return !(mDash.mDashCount == 0);} - int getDashInfo(int frameNo, float *array) const; public: LOTAnimatable mColor; /* "c" */ - LOTAnimatable mOpacity; /* "o" */ - LOTAnimatable mWidth; /* "w" */ + LOTAnimatable mOpacity{100}; /* "o" */ + LOTAnimatable mWidth{0}; /* "w" */ CapStyle mCapStyle; /* "lc" */ JoinStyle mJoinStyle; /* "lj" */ float mMeterLimit{0}; /* "ml" */ LOTDashProperty mDash; - bool mEnabled = true; /* "fillEnabled" */ + bool mEnabled{true}; /* "fillEnabled" */ }; class LottieGradient @@ -519,7 +505,7 @@ inline LottieGradient operator*(float m, const LottieGradient &g) class LOTGradient : public LOTData { public: - LOTGradient(LOTData::Type type):LOTData(type), mColorPoints(-1){} + LOTGradient(LOTData::Type type):LOTData(type){} inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} void update(std::unique_ptr &grad, int frameNo); @@ -529,37 +515,37 @@ public: int mGradientType; /* "t" Linear=1 , Radial = 2*/ LOTAnimatable mStartPoint; /* "s" */ LOTAnimatable mEndPoint; /* "e" */ - LOTAnimatable mHighlightLength; /* "h" */ - LOTAnimatable mHighlightAngle; /* "a" */ - LOTAnimatable mOpacity; /* "o" */ + LOTAnimatable mHighlightLength{0}; /* "h" */ + LOTAnimatable mHighlightAngle{0}; /* "a" */ + LOTAnimatable mOpacity{0}; /* "o" */ LOTAnimatable mGradient; /* "g" */ - int mColorPoints; - bool mEnabled = true; /* "fillEnabled" */ + int mColorPoints{-1}; + bool mEnabled{true}; /* "fillEnabled" */ }; class LOTGFillData : public LOTGradient { public: + LOTGFillData():LOTGradient(LOTData::Type::GFill){} + FillRule fillRule() const {return mFillRule;} void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTGFillData():LOTGradient(LOTData::Type::GFill), mFillRule(FillRule::Winding){} - inline FillRule fillRule() const {return mFillRule;} public: - FillRule mFillRule; /* "r" */ + FillRule mFillRule{FillRule::Winding}; /* "r" */ }; class LOTGStrokeData : public LOTGradient { public: + LOTGStrokeData():LOTGradient(LOTData::Type::GStroke){} + float width(int frameNo) const {return mWidth.value(frameNo);} + CapStyle capStyle() const {return mCapStyle;} + JoinStyle joinStyle() const {return mJoinStyle;} + float meterLimit() const{return mMeterLimit;} + bool hasDashInfo() const { return !(mDash.mDashCount == 0);} + int getDashInfo(int frameNo, float *array) const; void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTGStrokeData():LOTGradient(LOTData::Type::GStroke){} - inline float width(int frameNo) const {return mWidth.value(frameNo);} - inline CapStyle capStyle() const {return mCapStyle;} - inline JoinStyle joinStyle() const {return mJoinStyle;} - inline float meterLimit() const{return mMeterLimit;} - inline bool hasDashInfo() const { return !(mDash.mDashCount == 0);} - int getDashInfo(int frameNo, float *array) const; public: LOTAnimatable mWidth; /* "w" */ CapStyle mCapStyle; /* "lc" */ @@ -571,20 +557,20 @@ public: class LOTPath : public LOTData { public: - LOTPath(LOTData::Type type):LOTData(type), mDirection(1){} + LOTPath(LOTData::Type type):LOTData(type){} VPath::Direction direction() { if (mDirection == 3) return VPath::Direction::CCW; else return VPath::Direction::CW;} public: - int mDirection; + int mDirection{1}; }; class LOTShapeData : public LOTPath { public: + LOTShapeData():LOTPath(LOTData::Type::Shape){} + void process(); void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - void process(); - LOTShapeData():LOTPath(LOTData::Type::Shape){} public: LOTAnimatable mShape; }; @@ -598,30 +584,26 @@ public: Substarct, Intersect }; - LOTMaskData():mInv(false), mIsStatic(true){} - inline float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} - inline bool isStatic() const {return mIsStatic;} + float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} + bool isStatic() const {return mIsStatic;} public: LOTAnimatable mShape; LOTAnimatable mOpacity; - bool mInv; - bool mIsStatic; + bool mInv{false}; + bool mIsStatic{true}; LOTMaskData::Mode mMode; }; class LOTRectData : public LOTPath { public: + LOTRectData():LOTPath(LOTData::Type::Rect){} void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTRectData():LOTPath(LOTData::Type::Rect), - mPos(VPointF(0,0)), - mSize(VPointF(0,0)), - mRound(0){} public: LOTAnimatable mPos; LOTAnimatable mSize; - LOTAnimatable mRound; + LOTAnimatable mRound{0}; }; class LOTEllipseData : public LOTPath @@ -629,9 +611,7 @@ class LOTEllipseData : public LOTPath public: void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTEllipseData():LOTPath(LOTData::Type::Ellipse), - mPos(VPointF(0,0)), - mSize(VPointF(0,0)){} + LOTEllipseData():LOTPath(LOTData::Type::Ellipse){} public: LOTAnimatable mPos; LOTAnimatable mSize; @@ -644,60 +624,46 @@ public: Star = 1, Polygon = 2 }; + LOTPolystarData():LOTPath(LOTData::Type::Polystar){} void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} - LOTPolystarData():LOTPath(LOTData::Type::Polystar), - mType(PolyType::Polygon), - mPos(VPointF(0,0)), - mPointCount(0), - mInnerRadius(0), - mOuterRadius(0), - mInnerRoundness(0), - mOuterRoundness(0), - mRotation(0){} public: - LOTPolystarData::PolyType mType; - LOTAnimatable mPos; - LOTAnimatable mPointCount; - LOTAnimatable mInnerRadius; - LOTAnimatable mOuterRadius; - LOTAnimatable mInnerRoundness; - LOTAnimatable mOuterRoundness; - LOTAnimatable mRotation; + LOTPolystarData::PolyType mType{PolyType::Polygon}; + LOTAnimatable mPos; + LOTAnimatable mPointCount{0}; + LOTAnimatable mInnerRadius{0}; + LOTAnimatable mOuterRadius{0}; + LOTAnimatable mInnerRoundness{0}; + LOTAnimatable mOuterRoundness{0}; + LOTAnimatable mRotation{0}; }; class LOTTrimData : public LOTData { public: - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} enum class TrimType { Simultaneously, Individually }; - LOTTrimData():LOTData(LOTData::Type::Trim), - mStart(0), - mEnd(0), - mOffset(0), - mTrimType(TrimType::Simultaneously){} + LOTTrimData():LOTData(LOTData::Type::Trim){} + void accept(LOTDataVisitor *visitor) final + {visitor->visit(this);} public: - LOTAnimatable mStart; - LOTAnimatable mEnd; - LOTAnimatable mOffset; - LOTTrimData::TrimType mTrimType; + LOTAnimatable mStart{0}; + LOTAnimatable mEnd{0}; + LOTAnimatable mOffset{0}; + LOTTrimData::TrimType mTrimType{TrimType::Simultaneously}; }; class LOTRepeaterData : public LOTGroupData { public: + LOTRepeaterData():LOTGroupData(LOTData::Type::Repeater){} void accept(LOTDataVisitor *visitor) final {visitor->visit(this); visitor->visitChildren(this);} - LOTRepeaterData():LOTGroupData(LOTData::Type::Repeater), - mCopies(0), - mOffset(0){} public: - LOTAnimatable mCopies; - LOTAnimatable mOffset; + LOTAnimatable mCopies{0}; + LOTAnimatable mOffset{0}; }; class LOTModel diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 822cfa4d2e..39cad49315 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -748,6 +748,7 @@ std::shared_ptr LottieParserImpl::parseLayer() } else if (0 == strcmp(key, "refId")) { /*preComp Layer reference id*/ RAPIDJSON_ASSERT(PeekType() == kStringType); layer->mPreCompRefId = std::string(GetString()); + layer->mHasGradient = true; mLayersToUpdate.push_back(sharedLayer); hasLayerRef = true; } else if (0 == strcmp(key, "sr")) { // "Layer Time Stretching" @@ -887,16 +888,20 @@ std::shared_ptr LottieParserImpl::parseObjectTypeAttr() } else if (0 == strcmp(type, "st")) { return parseStrokeObject(); } else if (0 == strcmp(type, "gf")) { + curLayerRef->mHasGradient = true; return parseGFillObject(); } else if (0 == strcmp(type, "gs")) { + curLayerRef->mHasGradient = true; return parseGStrokeObject(); } else if (0 == strcmp(type, "sh")) { return parseShapeObject(); } else if (0 == strcmp(type, "sr")) { return parsePolystarObject(); } else if (0 == strcmp(type, "tm")) { + curLayerRef->mHasPathOperator = true; return parseTrimObject(); } else if (0 == strcmp(type, "rp")) { + curLayerRef->mHasRepeater = true; return parseReapeaterObject(); } else { #ifdef DEBUG_PARSER @@ -1117,7 +1122,6 @@ std::shared_ptr LottieParserImpl::parseTrimObject() } obj->setStatic(obj->mStart.isStatic() && obj->mEnd.isStatic() && obj->mOffset.isStatic()); - curLayerRef->mHasPathOperator = true; return sharedTrim; } From ff13f55ad4f7e480b4a99ff564a4edf2fffcb505 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 14 Aug 2018 17:14:20 +0900 Subject: [PATCH 153/672] lottie: pass matteSource and bitmap to layer's render function matteSource layer has to be handled in other way. For now, matteSource layer does not be applied to layers. But, matteSource layer will be invisible. In some test cases, it helps to check other layers which are overlayed by a wrongly drawn matteSource layer. Anyway, the matte feature will be implemented soon. Change-Id: Ib1e47e7ce9012b73a1729341d130defa561061c6 --- src/lottie/lottieitem.cpp | 52 ++++++++++++++++++++++++++++++++------- src/lottie/lottieitem.h | 6 +++-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 9f206841c6..25056cf4b3 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -119,7 +119,7 @@ bool LOTCompItem::render(const LOTBuffer &buffer) VPainter painter(&bitmap); VRle mask; - mRootLayer->render(&painter, mask); + mRootLayer->render(&painter, mask, nullptr); return true; } @@ -156,8 +156,16 @@ VRle LOTMaskItem::rle() return mRle; } -void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) +void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerItem *matteSource) { + VRle matteRle; + if (matteSource) { + std::vector matteList; + matteSource->renderList(matteList); + for (auto &i : matteList) { + matteRle = matteRle + i->rle(); + } + } std::vector list; renderList(list); VRle mask = inheritMask; @@ -170,12 +178,17 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask) for (auto &i : list) { painter->setBrush(i->mBrush); - if (!mask.isEmpty()) { - VRle rle = i->rle() & mask; - painter->drawRle(VPoint(), rle); - } else { - painter->drawRle(VPoint(), i->rle()); + VRle rle = i->rle(); + if (!mask.isEmpty()) rle = i->rle() & mask; + + if (!matteRle.isEmpty()) { + if (mLayerData->mMatteType == MatteType::AlphaInv) { + rle = rle - matteRle; + } else { + rle = rle & matteRle; + } } + painter->drawRle(VPoint(), rle); } } @@ -326,8 +339,17 @@ void LOTCompLayerItem::updateStaticProperty() } } -void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) +void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerItem *matteSource) { + VRle matteRle; + if (matteSource) { + std::vector matteList; + matteSource->renderList(matteList); + for (auto &i : matteList) { + matteRle = matteRle + i->rle(); + } + } + VRle mask = inheritMask; if (hasMask()) { @@ -337,9 +359,21 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask) mask = mask & inheritMask; } + LOTLayerItem *matteLayer = nullptr; for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { LOTLayerItem *layer = *i; - layer->render(painter, mask); + + if (!matteLayer && layer->hasMatte()) { + matteLayer = layer; + continue; + } + + if (matteLayer) { + matteLayer->render(painter, mask, layer); + matteLayer = nullptr; + } else { + layer->render(painter, mask, nullptr); + } } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 42721ce6f0..6c769e02b3 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -64,7 +64,9 @@ public: VMatrix matrix(int frameNo) const; virtual void renderList(std::vector &list){} virtual void updateStaticProperty(); - virtual void render(VPainter *painter, const VRle &mask); + virtual void render(VPainter *painter, const VRle &mask, LOTLayerItem *matteSource); + bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } + protected: virtual void updateContent() = 0; inline VMatrix combinedMatrix() const {return mCombinedMatrix;} @@ -96,7 +98,7 @@ public: LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; void updateStaticProperty() final; - void render(VPainter *painter, const VRle &mask) final; + void render(VPainter *painter, const VRle &mask, LOTLayerItem *matteSource) final; protected: void updateContent() final; private: From da553c4dab597dd44ab9d071d735211ce9c40838 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 16 Aug 2018 13:37:21 +0900 Subject: [PATCH 154/672] lottie/optimization: keep drawablelist in layer to avoid memory allocation in every frame. Change-Id: I80eebb9e1ab16a424a26a17ce67274c7518efca9 --- src/lottie/lottieitem.cpp | 18 +++++++++--------- src/lottie/lottieitem.h | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 25056cf4b3..5896543cd8 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -160,14 +160,14 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerIt { VRle matteRle; if (matteSource) { - std::vector matteList; - matteSource->renderList(matteList); - for (auto &i : matteList) { + mDrawableList.clear(); + matteSource->renderList(mDrawableList); + for (auto &i : mDrawableList) { matteRle = matteRle + i->rle(); } } - std::vector list; - renderList(list); + mDrawableList.clear(); + renderList(mDrawableList); VRle mask = inheritMask; if (hasMask()) { if (mask.isEmpty()) @@ -176,7 +176,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerIt mask = mask & inheritMask; } - for (auto &i : list) { + for (auto &i : mDrawableList) { painter->setBrush(i->mBrush); VRle rle = i->rle(); if (!mask.isEmpty()) rle = i->rle() & mask; @@ -343,9 +343,9 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLay { VRle matteRle; if (matteSource) { - std::vector matteList; - matteSource->renderList(matteList); - for (auto &i : matteList) { + mDrawableList.clear(); + matteSource->renderList(mDrawableList); + for (auto &i : mDrawableList) { matteRle = matteRle + i->rle(); } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 6c769e02b3..c3d506640d 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -79,6 +79,7 @@ protected: VRle maskRle(const VRect &clipRect); bool hasMask() const {return !mMasks.empty();} protected: + std::vector mDrawableList; std::vector> mMasks; LOTLayerData *mLayerData; LOTLayerItem *mParentLayer; From 1a6b8c8e0e03f9563c2342dab5bb39559d7ecb4f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 16 Aug 2018 14:30:57 +0900 Subject: [PATCH 155/672] lottie/vector: refactor VPath class to use emplace_back instead of push_back to avoid temporary object creation. Change-Id: I0abc1be410a3758c447de8b4600c472f6298bcc7 --- src/vector/vpath.cpp | 113 ++++++++++++++++++++++--------------------- src/vector/vpath.h | 18 +++---- 2 files changed, 67 insertions(+), 64 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index e7411656e7..f12f651197 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -64,33 +64,35 @@ float VPath::VPathData::length() const void VPath::VPathData::checkNewSegment() { if (mNewSegment) { - moveTo(VPointF(0, 0)); + moveTo(0, 0); mNewSegment = false; } } -void VPath::VPathData::moveTo(const VPointF &p) +void VPath::VPathData::moveTo(float x, float y) { - mStartPoint = p; + mStartPoint = {x, y}; mNewSegment = false; - m_elements.push_back(VPath::Element::MoveTo); - m_points.push_back(p); + m_elements.emplace_back(VPath::Element::MoveTo); + m_points.emplace_back(x,y); m_segments++; } -void VPath::VPathData::lineTo(const VPointF &p) + +void VPath::VPathData::lineTo(float x, float y) { checkNewSegment(); - m_elements.push_back(VPath::Element::LineTo); - m_points.push_back(p); + m_elements.emplace_back(VPath::Element::LineTo); + m_points.emplace_back(x,y); } -void VPath::VPathData::cubicTo(const VPointF &c1, const VPointF &c2, - const VPointF &e) + +void VPath::VPathData::cubicTo(float cx1, float cy1, float cx2, float cy2, + float ex, float ey) { checkNewSegment(); - m_elements.push_back(VPath::Element::CubicTo); - m_points.push_back(c1); - m_points.push_back(c2); - m_points.push_back(e); + m_elements.emplace_back(VPath::Element::CubicTo); + m_points.emplace_back(cx1, cy1); + m_points.emplace_back(cx2, cy2); + m_points.emplace_back(ex, ey); } void VPath::VPathData::close() @@ -99,7 +101,7 @@ void VPath::VPathData::close() const VPointF &lastPt = m_points.back(); if (!fuzzyCompare(mStartPoint, lastPt)) { - lineTo(mStartPoint); + lineTo(mStartPoint.x(), mStartPoint.y()); } m_elements.push_back(VPath::Element::Close); mNewSegment = true; @@ -140,12 +142,13 @@ void VPath::VPathData::arcTo(const VRectF &rect, float startAngle, reserve(point_count + 1, point_count / 3 + 1); if (isEmpty() || forceMoveTo) { - moveTo(curve_start); + moveTo(curve_start.x(), curve_start.y()); } else { - lineTo(curve_start); + lineTo(curve_start.x(), curve_start.y()); } for (int i = 0; i < point_count; i += 3) { - cubicTo(pts[i], pts[i + 1], pts[i + 2]); + cubicTo(pts[i].x(), pts[i].y(), pts[i + 1].x(), pts[i + 1].y(), + pts[i + 2].x(), pts[i + 2].y()); } } @@ -173,34 +176,34 @@ void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) reserve(14, 7); // 1Move + 4Cubic + 1Close if (dir == VPath::Direction::CW) { // moveto 12 o'clock. - moveTo(VPointF(x + w2, y)); + moveTo(x + w2, y); // 12 -> 3 o'clock - cubicTo(VPointF(x + w2 + w2k, y), VPointF(x + w, y + h2 - h2k), - VPointF(x + w, y + h2)); + cubicTo(x + w2 + w2k, y, x + w, y + h2 - h2k, + x + w, y + h2); // 3 -> 6 o'clock - cubicTo(VPointF(x + w, y + h2 + h2k), VPointF(x + w2 + w2k, y + h), - VPointF(x + w2, y + h)); + cubicTo(x + w, y + h2 + h2k, x + w2 + w2k, y + h, + x + w2, y + h); // 6 -> 9 o'clock - cubicTo(VPointF(x + w2 - w2k, y + h), VPointF(x, y + h2 + h2k), - VPointF(x, y + h2)); + cubicTo(x + w2 - w2k, y + h, x, y + h2 + h2k, + x, y + h2); // 9 -> 12 o'clock - cubicTo(VPointF(x, y + h2 - h2k), VPointF(x + w2 - w2k, y), - VPointF(x + w2, y)); + cubicTo(x, y + h2 - h2k, x + w2 - w2k, y, + x + w2, y); } else { // moveto 12 o'clock. - moveTo(VPointF(x + w2, y)); + moveTo(x + w2, y); // 12 -> 9 o'clock - cubicTo(VPointF(x + w2 - w2k, y), VPointF(x, y + h2 - h2k), - VPointF(x, y + h2)); + cubicTo(x + w2 - w2k, y, x, y + h2 - h2k, + x, y + h2); // 9 -> 6 o'clock - cubicTo(VPointF(x, y + h2 + h2k), VPointF(x + w2 - w2k, y + h), - VPointF(x + w2, y + h)); + cubicTo(x, y + h2 + h2k, x + w2 - w2k, y + h, + x + w2, y + h); // 6 -> 3 o'clock - cubicTo(VPointF(x + w2 + w2k, y + h), VPointF(x + w, y + h2 + h2k), - VPointF(x + w, y + h2)); + cubicTo(x + w2 + w2k, y + h, x + w, y + h2 + h2k, + x + w, y + h2); // 3 -> 12 o'clock - cubicTo(VPointF(x + w, y + h2 - h2k), VPointF(x + w2 + w2k, y), - VPointF(x + w2, y)); + cubicTo(x + w, y + h2 - h2k, x + w2 + w2k, y, + x + w2, y); } close(); } @@ -216,16 +219,16 @@ void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) reserve(6, 6); // 1Move + 4Line + 1Close if (dir == VPath::Direction::CW) { - moveTo(VPointF(x + w, y)); - lineTo(VPointF(x + w, y + h)); - lineTo(VPointF(x, y + h)); - lineTo(VPointF(x, y)); + moveTo(x + w, y); + lineTo(x + w, y + h); + lineTo(x, y + h); + lineTo(x, y); close(); } else { - moveTo(VPointF(x + w, y)); - lineTo(VPointF(x, y)); - lineTo(VPointF(x, y + h)); - lineTo(VPointF(x + w, y + h)); + moveTo(x + w, y); + lineTo(x, y); + lineTo(x, y + h); + lineTo(x + w, y + h); close(); } } @@ -250,14 +253,14 @@ void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, reserve(14, 7); // 1Move + 4Cubic + 1Close if (dir == VPath::Direction::CW) { - moveTo(VPointF(x + w, y + ry / 2.f)); + moveTo(x + w, y + ry / 2.f); arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0, -90, false); arcTo(VRectF(x, y + h - ry, rx, ry), -90, -90, false); arcTo(VRectF(x, y, rx, ry), -180, -90, false); arcTo(VRectF(x + w - rx, y, rx, ry), -270, -90, false); close(); } else { - moveTo(VPointF(x + w, y + ry / 2.f)); + moveTo(x + w, y + ry / 2.f); arcTo(VRectF(x + w - rx, y, rx, ry), 0, 90, false); arcTo(VRectF(x, y, rx, ry), 90, 90, false); arcTo(VRectF(x, y + h - ry, rx, ry), 180, 90, false); @@ -539,7 +542,7 @@ void VPath::VPathData::addPolystar(float points, float innerRadius, hasRoundness = true; } - moveTo(VPointF(x + cx, y + cy)); + moveTo(x + cx, y + cy); for (int i = 0; i < numPoints; i++) { float radius = longSegment ? outerRadius : innerRadius; @@ -586,11 +589,11 @@ void VPath::VPathData::addPolystar(float points, float innerRadius, cp2y *= partialPointAmount; } - cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), - VPointF(x + cp2x + cx, y + cp2y + cy), - VPointF(x + cx, y + cy)); + cubicTo(previousX - cp1x + cx, previousY - cp1y + cy, + x + cp2x + cx, y + cp2y + cy, + x + cx, y + cy); } else { - lineTo(VPointF(x + cx, y + cy)); + lineTo(x + cx, y + cy); } currentAngle += dTheta * angleDir; @@ -630,7 +633,7 @@ void VPath::VPathData::addPolygon(float points, float radius, float roundness, hasRoundness = true; } - moveTo(VPointF(x + cx, y + cy)); + moveTo(x + cx, y + cy); for (int i = 0; i < numPoints; i++) { previousX = x; @@ -652,10 +655,10 @@ void VPath::VPathData::addPolygon(float points, float radius, float roundness, float cp2x = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dx; float cp2y = radius * roundness * POLYGON_MAGIC_NUMBER * cp2Dy; - cubicTo(VPointF(previousX - cp1x + cx, previousY - cp1y + cy), - VPointF(x + cp2x + cx, y + cp2y + cy), VPointF(x, y)); + cubicTo(previousX - cp1x + cx, previousY - cp1y + cy, + x + cp2x + cx, y + cp2y + cy, x, y); } else { - lineTo(VPointF(x + cx, y + cy)); + lineTo(x + cx, y + cy); } currentAngle += anglePerPoint * angleDir; diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 3292675d18..ff5583a8c2 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -52,9 +52,9 @@ private: VPathData(); VPathData(const VPathData &o); bool isEmpty() const { return m_elements.empty(); } - void moveTo(const VPointF &pt); - void lineTo(const VPointF &pt); - void cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e); + void moveTo(float x, float y); + void lineTo(float x, float y); + void cubicTo(float cx1, float cy1, float cx2, float cy2, float ex, float ey); void close(); void reset(); void reserve(int, int); @@ -96,12 +96,12 @@ inline bool VPath::isEmpty() const inline void VPath::moveTo(const VPointF &p) { - d.write().moveTo(p); + d.write().moveTo(p.x(), p.y()); } inline void VPath::lineTo(const VPointF &p) { - d.write().lineTo(p); + d.write().lineTo(p.x(), p.y()); } inline void VPath::close() @@ -133,23 +133,23 @@ inline float VPath::length() const inline void VPath::cubicTo(const VPointF &c1, const VPointF &c2, const VPointF &e) { - d.write().cubicTo(c1, c2, e); + d.write().cubicTo(c1.x(), c1.y(), c2.x(), c2.y(), e.x(), e.y()); } inline void VPath::lineTo(float x, float y) { - lineTo(VPointF(x, y)); + d.write().lineTo(x, y); } inline void VPath::moveTo(float x, float y) { - moveTo(VPointF(x, y)); + d.write().moveTo(x, y); } inline void VPath::cubicTo(float c1x, float c1y, float c2x, float c2y, float ex, float ey) { - cubicTo(VPointF(c1x, c1y), VPointF(c2x, c2y), VPointF(ex, ey)); + d.write().cubicTo(c1x, c1y, c2x, c2y, ex, ey); } inline void VPath::transform(const VMatrix &m) From 5af0cb88f8c2df0231f9796650e7fefa97326a81 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 16 Aug 2018 19:25:14 +0900 Subject: [PATCH 156/672] lottie/player: refactor lottieplayer. Change-Id: Ia9b484e8be756d2e90f6b0d2a837f56e46f40e4c --- src/lottie/lottieplayer.cpp | 67 ++++++++++--------------------------- 1 file changed, 18 insertions(+), 49 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index d20e4e6c40..379232c54c 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -7,13 +7,9 @@ #include class LOTPlayerPrivate { - -private: - void setPos(float pos); - bool update(); - public: LOTPlayerPrivate(); + void update(float pos); bool setFilePath(std::string path); void setSize(const VSize &sz); VSize size() const; @@ -28,18 +24,13 @@ public: std::unique_ptr mCompItem; VSize mSize; std::atomic mRenderInProgress; - -private: - float mPos = 0.0; - bool mChanged = true; + float mPos = 0.0; }; void LOTPlayerPrivate::setSize(const VSize &sz) { - if (mSize != sz) { - mChanged = true; - mSize = sz; - } + mSize = sz; + if (mCompItem) mCompItem->resize(sz); } VSize LOTPlayerPrivate::size() const @@ -53,13 +44,13 @@ VSize LOTPlayerPrivate::size() const const std::vector &LOTPlayerPrivate::renderList(float pos) { - this->setPos(pos); - - if (!mCompItem || !this->update()) { + if (!mCompItem) { static std::vector empty; return empty; } + update(pos); + return mCompItem->renderList(); } @@ -69,37 +60,22 @@ float LOTPlayerPrivate::playTime() const return float(mModel->frameDuration()) / float(mModel->frameRate()); } -void LOTPlayerPrivate::setPos(float pos) -{ - if (pos > 1.0) pos = 1.0; - if (pos < 0) pos = 0; - - if (!vCompare(pos, mPos)) mChanged = true; - - mPos = pos; -} - float LOTPlayerPrivate::pos() { return mPos; } -bool LOTPlayerPrivate::update() +void LOTPlayerPrivate::update(float pos) { - //Nothing updated, skip it. - if (!mChanged) return true; - - mCompItem->resize(mSize); + if (pos > 1.0) pos = 1.0; + if (pos < 0) pos = 0; + mPos = pos; int frameNumber; if (mModel->isStatic()) frameNumber = 0; - else frameNumber = mModel->startFrame() + this->pos() * mModel->frameDuration(); + else frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); - if (!mCompItem->update(frameNumber)) return false; - - mChanged = false; - - return true; + mCompItem->update(frameNumber); } bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) @@ -110,20 +86,12 @@ bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) if (renderInProgress) vCritical << "Already Rendering Scheduled for this Player"; - bool result = false; + mRenderInProgress.store(true); - this->setPos(pos); + update(pos); + bool result = mCompItem->render(buffer); - if (this->update()) { - - mRenderInProgress.store(true); - - if (mCompItem->render(buffer)) { - result = true; - } - - mRenderInProgress.store(false); - } + mRenderInProgress.store(false); return result; } @@ -141,6 +109,7 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); + if (!mSize.isEmpty()) setSize(mSize); return true; } return false; From 02404178e8b3fe3e65b7c6dbc9323b47a7fd7675 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 17 Aug 2018 13:06:57 +0900 Subject: [PATCH 157/672] lottie/parser: Added support for separate position attribute in transform object. Transform object can have separate x and y or a point object. Change-Id: I0ad0073b3cb958336539ad520434c3284894c6b9 --- src/lottie/lottiemodel.cpp | 7 +++- src/lottie/lottiemodel.h | 3 ++ src/lottie/lottieparser.cpp | 84 +++++++++++++++++++++++-------------- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 934b6ced09..c119950c0a 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -76,7 +76,12 @@ void LOTTransformData::cacheMatrix() VMatrix LOTTransformData::computeMatrix(int frameNo) const { VMatrix m; - m.translate(mPosition.value(frameNo)) + VPointF position = mPosition.value(frameNo); + if (mSeparate) { + position.setX(mX.value(frameNo)); + position.setY(mY.value(frameNo)); + } + m.translate(position) .rotate(mRotation.value(frameNo)) .scale(mScale.value(frameNo) / 100.f) .translate(-mAnchor.value(frameNo)); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 69523b171f..1321d9202e 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -392,11 +392,14 @@ public: LOTAnimatable mRotation{0}; /* "r" */ LOTAnimatable mScale; /* "s" */ LOTAnimatable mPosition; /* "p" */ + LOTAnimatable mX{0}; + LOTAnimatable mY{0}; LOTAnimatable mAnchor; /* "a" */ LOTAnimatable mOpacity{100}; /* "o" */ LOTAnimatable mSkew{0}; /* "sk" */ LOTAnimatable mSkewAxis{0}; /* "sa" */ bool mStaticMatrix{true}; + bool mSeparate{false}; VMatrix mCachedMatrix; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 39cad49315..d4e6db3c29 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -233,6 +233,8 @@ public: void parseKeyFrame(LOTAnimInfo &obj); template void parseProperty(LOTAnimatable &obj); + template + void parsePropertyHelper(LOTAnimatable &obj); void parseShapeKeyFrame(LOTAnimInfo &obj); void parseShapeProperty(LOTAnimatable &obj); @@ -1164,7 +1166,20 @@ std::shared_ptr LottieParserImpl::parseTransformObject() if (0 == strcmp(key, "a")) { parseProperty(obj->mAnchor); } else if (0 == strcmp(key, "p")) { - parseProperty(obj->mPosition); + EnterObject(); + while (const char *key = NextObjectKey()) { + if (0 == strcmp(key, "k")) { + parsePropertyHelper(obj->mPosition); + } else if (0 == strcmp(key, "s")) { + obj->mSeparate = GetBool(); + } else if (obj->mSeparate && (0 == strcmp(key, "x"))) { + parseProperty(obj->mX); + } else if (obj->mSeparate && (0 == strcmp(key, "y"))) { + parseProperty(obj->mY); + }else { + Skip(key); + } + } } else if (0 == strcmp(key, "r")) { parseProperty(obj->mRotation); } else if (0 == strcmp(key, "s")) { @@ -1181,7 +1196,9 @@ std::shared_ptr LottieParserImpl::parseTransformObject() } obj->mStaticMatrix = obj->mAnchor.isStatic() && obj->mPosition.isStatic() && obj->mRotation.isStatic() && obj->mScale.isStatic() && - obj->mSkew.isStatic() && obj->mSkewAxis.isStatic(); + obj->mSkew.isStatic() && obj->mSkewAxis.isStatic() && + obj->mX.isStatic() && obj->mY.isStatic(); + obj->setStatic(obj->mStaticMatrix && obj->mOpacity.isStatic()); if (obj->mStaticMatrix) obj->cacheMatrix(); @@ -1785,6 +1802,38 @@ void LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) } } +template +void LottieParserImpl::parsePropertyHelper(LOTAnimatable &obj) +{ + if (PeekType() == kNumberType) { + /*single value property with no animation*/ + getValue(obj.mValue); + } else { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + /* property with keyframe info*/ + if (PeekType() == kObjectType) { + if (!obj.mAnimInfo) + obj.mAnimInfo = std::make_unique>(); + parseKeyFrame(*obj.mAnimInfo.get()); + } else { + /* Read before modifying. + * as there is no way of knowing if the + * value of the array is either array of numbers + * or array of object without entering the array + * thats why this hack is there + */ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + /*multi value property with no animation*/ + parseArrayValue(obj.mValue); + /*break here as we already reached end of array*/ + break; + } + } + } +} + /* * https://github.com/airbnb/lottie-web/tree/master/docs/json/properties */ @@ -1794,36 +1843,7 @@ void LottieParserImpl::parseProperty(LOTAnimatable &obj) EnterObject(); while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "k")) { - if (PeekType() == kNumberType) { - /*single value property with no animation*/ - getValue(obj.mValue); - } else { - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); - while (NextArrayValue()) { - /* property with keyframe info*/ - if (PeekType() == kObjectType) { - if (!obj.mAnimInfo) - obj.mAnimInfo = std::make_unique>(); - parseKeyFrame(*obj.mAnimInfo.get()); - } else { - /* Read before modifying. - * as there is no way of knowing if the - * value of the array is either array of numbers - * or array of object without entering the array - * thats why this hack is there - */ - RAPIDJSON_ASSERT(PeekType() == kNumberType); - /*multi value property with no animation*/ - parseArrayValue(obj.mValue); - /*break here as we already reached end of array*/ - break; - } - } - } - } else if (0 == strcmp(key, "ix")) { - RAPIDJSON_ASSERT(PeekType() == kNumberType); - obj.mPropertyIndex = GetInt(); + parsePropertyHelper(obj); } else { Skip(key); } From d76883080a5f0659cb4ebd626e1372aa654454ab Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 17 Aug 2018 18:43:37 +0900 Subject: [PATCH 158/672] update gitignore Change-Id: Ib1ccc3feb6155384c1c0bb7e101abbec19c2386c --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f13e7a5407..927c02c5cd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,8 @@ build *.creator* *.config *.files -*.includes \ No newline at end of file +*.includes +html +latex +*.swp +tmp From 9c958d0de5442cb99d2c7ab9b385f3bef04a20d5 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 17 Aug 2018 18:44:03 +0900 Subject: [PATCH 159/672] enable build example in default. enable this under *aggressive development step. Change-Id: I8ff728c94ef899441e8f528609248a9451ac7c0b --- meson_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson_options.txt b/meson_options.txt index 4f55605cc1..d8e58902a5 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -5,7 +5,7 @@ option('test', option('example', type: 'boolean', - value: false, + value: true, description: 'enable example') option('text', From 20823b49fe43b31de27b7ae1b09374ed1feb0e67 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 16 Aug 2018 17:12:43 +0900 Subject: [PATCH 160/672] lottieplayer: Add render option to update buffer forcely. plus code refactoring. Change-Id: Icef131a7df5fa9766ff9cfe7513b1865692719f5 --- inc/lottieplayer.h | 4 +-- src/lottie/lottieplayer.cpp | 54 +++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 1e98f071ff..ee981ae96b 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -53,8 +53,8 @@ public: // TODO: Consider correct position... void setSize(int width, int height); void size(int &width, int &height) const; - std::future render(float pos, LOTBuffer buffer); - bool renderSync(float pos, LOTBuffer buffer); + std::future render(float pos, LOTBuffer buffer, bool forceRender = false); + bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); public: LOTPlayerPrivate *d; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 379232c54c..39f30b22cb 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -7,18 +7,20 @@ #include class LOTPlayerPrivate { + public: LOTPlayerPrivate(); - void update(float pos); + bool update(float pos); bool setFilePath(std::string path); void setSize(const VSize &sz); + void setPos(float pos); VSize size() const; float playTime() const; float pos(); const std::vector &renderList(float pos); - bool render(float pos, const LOTBuffer &buffer); + bool render(float pos, const LOTBuffer &buffer, bool forceRender); -public: +private: std::string mFilePath; std::shared_ptr mModel; std::unique_ptr mCompItem; @@ -30,7 +32,6 @@ public: void LOTPlayerPrivate::setSize(const VSize &sz) { mSize = sz; - if (mCompItem) mCompItem->resize(sz); } VSize LOTPlayerPrivate::size() const @@ -65,33 +66,45 @@ float LOTPlayerPrivate::pos() return mPos; } -void LOTPlayerPrivate::update(float pos) +void LOTPlayerPrivate::setPos(float pos) { if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; mPos = pos; +} + +bool LOTPlayerPrivate::update(float pos) +{ + if (!mCompItem) return false; + + mCompItem->resize(mSize); + setPos(pos); int frameNumber; if (mModel->isStatic()) frameNumber = 0; - else frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); + else frameNumber = mModel->startFrame() + pos() * mModel->frameDuration(); - mCompItem->update(frameNumber); + return mCompItem->update(frameNumber); } -bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) +bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer, bool forceRender) { if (!mCompItem) return false; bool renderInProgress = mRenderInProgress.load(); if (renderInProgress) + { vCritical << "Already Rendering Scheduled for this Player"; + } - mRenderInProgress.store(true); + bool result = true; - update(pos); - bool result = mCompItem->render(buffer); - - mRenderInProgress.store(false); + if (update(pos) || forceRender) + { + mRenderInProgress.store(true); + result = mCompItem->render(buffer); + mRenderInProgress.store(false); + } return result; } @@ -109,7 +122,6 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); - if (!mSize.isEmpty()) setSize(mSize); return true; } return false; @@ -133,6 +145,7 @@ struct RenderTask { LOTPlayerPrivate * playerImpl; float pos; LOTBuffer buffer; + bool forceRender; }; #include @@ -152,7 +165,7 @@ class RenderTaskScheduler { } if (!task && !_q[i].pop(task)) break; - bool result = task->playerImpl->render(task->pos, task->buffer); + bool result = task->playerImpl->render(task->pos, task->buffer, task->forceRender); task->sender.set_value(result); delete task; } @@ -188,12 +201,13 @@ public: } std::future render(LOTPlayerPrivate *impl, float pos, - LOTBuffer &&buffer) + LOTBuffer &&buffer, bool forceRender) { RenderTask *task = new RenderTask(); task->playerImpl = impl; task->pos = pos; task->buffer = std::move(buffer); + task->forceRender = forceRender; return async(task); } }; @@ -245,14 +259,14 @@ const std::vector &LOTPlayer::renderList(float pos) const return d->renderList(pos); } -std::future LOTPlayer::render(float pos, LOTBuffer buffer) +std::future LOTPlayer::render(float pos, LOTBuffer buffer, bool forceRender) { - return render_scheduler.render(d, pos, std::move(buffer)); + return render_scheduler.render(d, pos, std::move(buffer), forceRender); } -bool LOTPlayer::renderSync(float pos, LOTBuffer buffer) +bool LOTPlayer::renderSync(float pos, LOTBuffer buffer, bool forceRender) { - return d->render(pos, buffer); + return d->render(pos, buffer, forceRender); } void initLogging() From ddde576886168e542b7c61901a5933a3d3aed952 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 17 Aug 2018 17:19:08 +0900 Subject: [PATCH 161/672] lotplayer: improve header format. 1. add namespace. 2. remove unnecessary export attribute. 3. hide prviate member. This is one ongoing improvement. Change-Id: I342e4d5e65370190ac55972b02f2fede1aee6d06 --- example/lottieview.cpp | 2 + example/lottieview.h | 3 +- inc/lottieplayer.h | 78 ++++++++++++++++++++----------------- src/lottie/lottieplayer.cpp | 2 + 4 files changed, 47 insertions(+), 38 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 5b30fd93be..4ec334d73f 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,6 +1,8 @@ #include"lottieview.h" #include"lottieplayer.h" +using namespace lotplayer; + static Eina_Bool animator(void *data , double pos) { diff --git a/example/lottieview.h b/example/lottieview.h index 681fb8b7ac..44543abebb 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -16,7 +16,6 @@ #include #include"lottieplayer.h" #include -class LOTPlayer; class LottieView { public: @@ -54,7 +53,7 @@ public: Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - LOTPlayer *mPlayer; + lotplayer::LOTPlayer *mPlayer; Ecore_Animator *mAnimator{nullptr}; bool mLoop; int mCurCount; diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index ee981ae96b..3dbbbc6a0f 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -1,5 +1,5 @@ -#ifndef LOTPLAYER_H -#define LOTPLAYER_H +#ifndef _LOTPLAYER_H_ +#define _LOTPLAYER_H_ #include #include @@ -26,47 +26,18 @@ #endif #endif +//TODO: Hide this. class LOTPlayerPrivate; -class LOTNode; +#define _LOTPLAYER_DECLARE_PRIVATE(A) \ + class A##Private *d; -struct LOT_EXPORT LOTBuffer { - uint32_t *buffer = nullptr; - int width = 0; - int height = 0; - int bytesPerLine = 0; - bool clear = true; -}; - -class LOT_EXPORT LOTPlayer { -public: - ~LOTPlayer(); - LOTPlayer(); - - bool setFilePath(const char *filePath); - - float playTime() const; - - float pos(); - - const std::vector &renderList(float pos) const; - - // TODO: Consider correct position... - void setSize(int width, int height); - void size(int &width, int &height) const; - std::future render(float pos, LOTBuffer buffer, bool forceRender = false); - bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); - -public: - LOTPlayerPrivate *d; -}; +struct LOTNode { #define ChangeFlagNone 0x0000 #define ChangeFlagPath 0x0001 #define ChangeFlagPaint 0x0010 #define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) -struct LOTNode { - enum BrushType { BrushSolid, BrushGradient }; enum FillRule { EvenOdd, Winding }; enum JoinStyle { MiterJoin, BevelJoin, RoundJoin }; @@ -112,4 +83,39 @@ struct LOTNode { Gradient mGradient; }; -#endif // LOTPLAYER_H +struct LOTBuffer { + uint32_t *buffer = nullptr; + int width = 0; + int height = 0; + int bytesPerLine = 0; + bool clear = true; +}; + +namespace lotplayer { + +class LOT_EXPORT LOTPlayer { +public: + ~LOTPlayer(); + LOTPlayer(); + + bool setFilePath(const char *filePath); + + float playTime() const; + + float pos(); + + const std::vector &renderList(float pos) const; + + // TODO: Consider correct position... + void setSize(int width, int height); + void size(int &width, int &height) const; + std::future render(float pos, LOTBuffer buffer, bool forceRender = false); + bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); + +private: + _LOTPLAYER_DECLARE_PRIVATE(LOTPlayer); +}; + +} // namespace lotplayer + +#endif // _LOTPLAYER_H_ diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 39f30b22cb..ecb2c882ef 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -6,6 +6,8 @@ #include +using namespace lotplayer; + class LOTPlayerPrivate { public: From 9ce5e8138f22ee535ccc80320943e37ffd1296e8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 Aug 2018 12:40:22 +0900 Subject: [PATCH 162/672] lottie: build fix. Change-Id: I5405a17d67066fc5cd10d816f4ed044fb8819471 --- src/lottie/lottieplayer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index ecb2c882ef..28a6123b55 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -75,12 +75,12 @@ void LOTPlayerPrivate::setPos(float pos) mPos = pos; } -bool LOTPlayerPrivate::update(float pos) +bool LOTPlayerPrivate::update(float vPos) { if (!mCompItem) return false; mCompItem->resize(mSize); - setPos(pos); + setPos(vPos); int frameNumber; if (mModel->isStatic()) frameNumber = 0; From 5895944d4c6f90d6f3e6a1c8e0bd2eec51db9f54 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 Aug 2018 10:18:33 +0900 Subject: [PATCH 163/672] lottie/player: refactor to use std::find_if instead of unorder_map. Change-Id: Ic146357db1312aa0ff122fa6859a64098e350740 --- src/lottie/lottieitem.cpp | 14 +++++--------- src/lottie/lottieitem.h | 1 - 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 5896543cd8..fd044fdcd9 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1,5 +1,6 @@ #include "lottieitem.h" #include +#include #include "vbitmap.h" #include "vdasher.h" #include "vpainter.h" @@ -309,10 +310,7 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) LOTLayerData *layerModel = dynamic_cast(i.get()); if (layerModel) { LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel); - if (layerItem) { - mLayers.push_back(layerItem); - mLayerMap[layerItem->id()] = layerItem; - } + if (layerItem) mLayers.push_back(layerItem); } } @@ -320,11 +318,9 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) for (auto &i : mLayers) { int id = i->parentId(); if (id >= 0) { - auto search = mLayerMap.find(id); - if (search != mLayerMap.end()) { - LOTLayerItem *parentLayer = search->second; - i->setParentLayer(parentLayer); - } + auto search = std::find_if(mLayers.begin(), mLayers.end(), + [id](const auto& val){ return val->id() == id;}); + if (search != mLayers.end()) i->setParentLayer(*search); } i->setPrecompLayer(this); } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index c3d506640d..c9e01a75d7 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -104,7 +104,6 @@ protected: void updateContent() final; private: std::vector mLayers; - std::unordered_map mLayerMap; int mLastFrame; }; From fa087b44e8ad2d4d9b9ecdd6e140019ea597635b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 Aug 2018 11:22:31 +0900 Subject: [PATCH 164/672] lottie/parser: treat root layer as a special precomp layer. Change-Id: Ic9a2b171ee349f132e52db5395a92587c9e44c08 --- src/lottie/lottieitem.cpp | 3 ++- src/lottie/lottiemodel.h | 2 ++ src/lottie/lottieparser.cpp | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index fd044fdcd9..c835e02287 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -322,7 +322,8 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) [id](const auto& val){ return val->id() == id;}); if (search != mLayers.end()) i->setParentLayer(*search); } - i->setPrecompLayer(this); + // update the precomp layer if its not the root layer. + if (!layerModel->root()) i->setPrecompLayer(this); } } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 1321d9202e..3f162138ab 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -312,6 +312,7 @@ public: bool hasGradient() const noexcept {return mHasGradient;} bool hasMask() const noexcept {return mHasMask;} bool hasRepeater() const noexcept {return mHasRepeater;} + bool root() const noexcept {return mRoot;} int id() const noexcept{ return mId;} int parentId() const noexcept{ return mParentId;} int inFrame() const noexcept{return mInFrame;} @@ -346,6 +347,7 @@ public: bool mHasMask{false}; bool mHasRepeater{false}; bool mHasGradient{false}; + bool mRoot{false}; std::vector> mMasks; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index d4e6db3c29..05b8bb899f 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -636,6 +636,7 @@ std::shared_ptr LottieParserImpl::parseAsset() void LottieParserImpl::parseLayers(LOTCompositionData *comp) { comp->mRootLayer = std::make_shared(); + comp->mRootLayer->mRoot = true; comp->mRootLayer->mLayerType = LayerType::Precomp; comp->mRootLayer->mTransform = std::make_shared(); bool staticFlag = true; From f41c6624e52e4e2702b52d298f795513185bf465 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 Aug 2018 12:36:50 +0900 Subject: [PATCH 165/672] lottie: use unique_ptr instead of raw pointer. Change-Id: Ic5b416c72a96427dff3a99316550d8edb7ffece9 --- src/lottie/lottieitem.cpp | 34 +++++++++++++--------------------- src/lottie/lottieitem.h | 5 ++--- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c835e02287..39d95bfcb4 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -17,28 +17,29 @@ LOTCompItem::LOTCompItem(LOTModel *model) : mRootModel(model), mUpdateViewBox(false), mCurFrameNo(-1) { mCompData = model->mRoot.get(); - mRootLayer = std::unique_ptr(createLayerItem(mCompData->mRootLayer.get())); + mRootLayer = createLayerItem(mCompData->mRootLayer.get()); mRootLayer->updateStaticProperty(); mViewSize = mCompData->size(); } -LOTLayerItem *LOTCompItem::createLayerItem(LOTLayerData *layerData) +std::unique_ptr +LOTCompItem::createLayerItem(LOTLayerData *layerData) { switch (layerData->mLayerType) { case LayerType::Precomp: { - return new LOTCompLayerItem(layerData); + return std::make_unique(layerData); break; } case LayerType::Solid: { - return new LOTSolidLayerItem(layerData); + return std::make_unique(layerData); break; } case LayerType::Shape: { - return new LOTShapeLayerItem(layerData); + return std::make_unique(layerData); break; } case LayerType::Null: { - return new LOTNullLayerItem(layerData); + return std::make_unique(layerData); break; } default: @@ -309,8 +310,8 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) for (auto &i : mLayerData->mChildren) { LOTLayerData *layerModel = dynamic_cast(i.get()); if (layerModel) { - LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel); - if (layerItem) mLayers.push_back(layerItem); + auto layerItem = LOTCompItem::createLayerItem(layerModel); + if (layerItem) mLayers.push_back(std::move(layerItem)); } } @@ -320,7 +321,7 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) if (id >= 0) { auto search = std::find_if(mLayers.begin(), mLayers.end(), [id](const auto& val){ return val->id() == id;}); - if (search != mLayers.end()) i->setParentLayer(*search); + if (search != mLayers.end()) i->setParentLayer((*search).get()); } // update the precomp layer if its not the root layer. if (!layerModel->root()) i->setPrecompLayer(this); @@ -358,7 +359,7 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLay LOTLayerItem *matteLayer = nullptr; for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; + LOTLayerItem *layer = (*i).get(); if (!matteLayer && layer->hasMatte()) { matteLayer = layer; @@ -374,19 +375,11 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLay } } -LOTCompLayerItem::~LOTCompLayerItem() -{ - for (auto &i : mLayers) { - delete i; - } -} - void LOTCompLayerItem::updateContent() { // update the layer from back to front for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->update(frameNo(), combinedMatrix(), combinedAlpha()); + (*i)->update(frameNo(), combinedMatrix(), combinedAlpha()); } } @@ -396,8 +389,7 @@ void LOTCompLayerItem::renderList(std::vector &list) // update the layer from back to front for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = *i; - layer->renderList(list); + (*i)->renderList(list); } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index c9e01a75d7..57da07e1c2 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -31,7 +31,7 @@ class LOTCompItem { public: LOTCompItem(LOTModel *model); - static LOTLayerItem * createLayerItem(LOTLayerData *layerData); + static std::unique_ptr createLayerItem(LOTLayerData *layerData); bool update(int frameNo); void resize(const VSize &size); VSize size() const; @@ -95,7 +95,6 @@ protected: class LOTCompLayerItem: public LOTLayerItem { public: - ~LOTCompLayerItem(); LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; void updateStaticProperty() final; @@ -103,7 +102,7 @@ public: protected: void updateContent() final; private: - std::vector mLayers; + std::vector> mLayers; int mLastFrame; }; From bbdd2e246f870577cda55ccaaefe97888f6cd606 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 17 Aug 2018 21:12:41 +0900 Subject: [PATCH 166/672] lottie: add getImage() API in lottieview Change-Id: Ic72bb47752797811cbe7c464e02c81bcfd0a9a11 --- example/lottieview.h | 1 + 1 file changed, 1 insertion(+) diff --git a/example/lottieview.h b/example/lottieview.h index 44543abebb..d63d117d4e 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -25,6 +25,7 @@ public: }; LottieView(Evas *evas, bool renderMode = true, bool asyncRender = true); ~LottieView(); + Evas_Object * getImage() { return mRenderMode ? mImage : mVg; } void setSize(int w, int h); void setPos(int x, int y); void setFilePath(const char *filePath); From 57b58412b678beb563e0a152f1fa4eb6de504332 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 Aug 2018 16:12:17 +0900 Subject: [PATCH 167/672] lottie/render: handle the case when resulting mask is null. Change-Id: Ie78a1465474ec408bff0deafdff509f3b3a199d8 --- src/lottie/lottieitem.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 39d95bfcb4..7b34854487 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -170,18 +170,25 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerIt } mDrawableList.clear(); renderList(mDrawableList); - VRle mask = inheritMask; + + VRle mask; if (hasMask()) { - if (mask.isEmpty()) - mask = maskRle(painter->clipBoundingRect()); - else + mask = maskRle(painter->clipBoundingRect()); + if (!inheritMask.isEmpty()) mask = mask & inheritMask; + // if resulting mask is empty then return. + if (mask.isEmpty()) + return; + } else { + mask = inheritMask; } for (auto &i : mDrawableList) { painter->setBrush(i->mBrush); VRle rle = i->rle(); - if (!mask.isEmpty()) rle = i->rle() & mask; + if (!mask.isEmpty()) rle = rle & mask; + + if (rle.isEmpty()) continue; if (!matteRle.isEmpty()) { if (mLayerData->mMatteType == MatteType::AlphaInv) { @@ -348,13 +355,16 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLay } } - VRle mask = inheritMask; - + VRle mask; if (hasMask()) { - if (mask.isEmpty()) - mask = maskRle(painter->clipBoundingRect()); - else + mask = maskRle(painter->clipBoundingRect()); + if (!inheritMask.isEmpty()) mask = mask & inheritMask; + // if resulting mask is empty then return. + if (mask.isEmpty()) + return; + } else { + mask = inheritMask; } LOTLayerItem *matteLayer = nullptr; From 083ec1abb8ca17fdcfd2b38523a14f4c645c85e6 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 20 Aug 2018 20:39:46 +0900 Subject: [PATCH 168/672] lottie: apply matte feature to LOTCompLayerItem The LOTCompLayerItem's MatteRle has to be inherited to its all children layers. You can test it with "personal_character.json". Change-Id: I225e16397441f9771286c6fcc821b5050b165ecc --- src/lottie/lottieitem.cpp | 21 +++++++++++++++------ src/lottie/lottieitem.h | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 7b34854487..cab0264971 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -120,8 +120,7 @@ bool LOTCompItem::render(const LOTBuffer &buffer) } VPainter painter(&bitmap); - VRle mask; - mRootLayer->render(&painter, mask, nullptr); + mRootLayer->render(&painter, {}, {}, nullptr); return true; } @@ -158,7 +157,7 @@ VRle LOTMaskItem::rle() return mRle; } -void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerItem *matteSource) +void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { VRle matteRle; if (matteSource) { @@ -167,6 +166,11 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerIt for (auto &i : mDrawableList) { matteRle = matteRle + i->rle(); } + + if (!inheritMatte.isEmpty()) + matteRle = matteRle & inheritMatte; + } else { + matteRle = inheritMatte; } mDrawableList.clear(); renderList(mDrawableList); @@ -344,7 +348,7 @@ void LOTCompLayerItem::updateStaticProperty() } } -void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLayerItem *matteSource) +void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { VRle matteRle; if (matteSource) { @@ -353,6 +357,11 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLay for (auto &i : mDrawableList) { matteRle = matteRle + i->rle(); } + + if (!inheritMatte.isEmpty()) + matteRle = matteRle & inheritMatte; + } else { + matteRle = inheritMatte; } VRle mask; @@ -377,10 +386,10 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, LOTLay } if (matteLayer) { - matteLayer->render(painter, mask, layer); + matteLayer->render(painter, mask, matteRle, layer); matteLayer = nullptr; } else { - layer->render(painter, mask, nullptr); + layer->render(painter, mask, matteRle, nullptr); } } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 57da07e1c2..a29875f513 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -64,7 +64,7 @@ public: VMatrix matrix(int frameNo) const; virtual void renderList(std::vector &list){} virtual void updateStaticProperty(); - virtual void render(VPainter *painter, const VRle &mask, LOTLayerItem *matteSource); + virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } protected: @@ -98,7 +98,7 @@ public: LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; void updateStaticProperty() final; - void render(VPainter *painter, const VRle &mask, LOTLayerItem *matteSource) final; + void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource) final; protected: void updateContent() final; private: From d49fb641e0fda579f6aee2f6d63e1c268c83f00a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 17 Aug 2018 18:41:34 +0900 Subject: [PATCH 169/672] refactor infrastructure. Split common delcaration from lottieplayer.h This common delcaration will be used in c interface header files. Change-Id: Icb3e3f182b2f27fc2d7c9bed36ac29c45c813b66 --- example/lottieview.cpp | 1 - example/lottieview.h | 2 +- inc/{lottieplayer.h => lotcommon.h} | 51 +++++------------------------ inc/lotplayer.h | 41 +++++++++++++++++++++++ inc/meson.build | 2 +- src/lottie/lottieitem.h | 2 +- src/lottie/lottieplayer.cpp | 2 +- 7 files changed, 53 insertions(+), 48 deletions(-) rename inc/{lottieplayer.h => lotcommon.h} (60%) create mode 100644 inc/lotplayer.h diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 4ec334d73f..c9b68d6475 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,5 +1,4 @@ #include"lottieview.h" -#include"lottieplayer.h" using namespace lotplayer; diff --git a/example/lottieview.h b/example/lottieview.h index d63d117d4e..32122ac40f 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -14,7 +14,7 @@ #include #include #include -#include"lottieplayer.h" +#include"lotplayer.h" #include class LottieView { diff --git a/inc/lottieplayer.h b/inc/lotcommon.h similarity index 60% rename from inc/lottieplayer.h rename to inc/lotcommon.h index 3dbbbc6a0f..b8efeb6ba8 100644 --- a/inc/lottieplayer.h +++ b/inc/lotcommon.h @@ -1,8 +1,5 @@ -#ifndef _LOTPLAYER_H_ -#define _LOTPLAYER_H_ - -#include -#include +#ifndef _LOTCOMMON_H_ +#define _LOTCOMMON_H_ #ifdef _WIN32 #ifdef LOT_BUILD @@ -26,11 +23,6 @@ #endif #endif -//TODO: Hide this. -class LOTPlayerPrivate; -#define _LOTPLAYER_DECLARE_PRIVATE(A) \ - class A##Private *d; - struct LOTNode { #define ChangeFlagNone 0x0000 @@ -84,38 +76,11 @@ struct LOTNode { }; struct LOTBuffer { - uint32_t *buffer = nullptr; - int width = 0; - int height = 0; - int bytesPerLine = 0; - bool clear = true; + uint32_t *buffer; + int width; + int height; + int bytesPerLine; + bool clear; }; -namespace lotplayer { - -class LOT_EXPORT LOTPlayer { -public: - ~LOTPlayer(); - LOTPlayer(); - - bool setFilePath(const char *filePath); - - float playTime() const; - - float pos(); - - const std::vector &renderList(float pos) const; - - // TODO: Consider correct position... - void setSize(int width, int height); - void size(int &width, int &height) const; - std::future render(float pos, LOTBuffer buffer, bool forceRender = false); - bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); - -private: - _LOTPLAYER_DECLARE_PRIVATE(LOTPlayer); -}; - -} // namespace lotplayer - -#endif // _LOTPLAYER_H_ +#endif // _LOTCOMMON_H_ diff --git a/inc/lotplayer.h b/inc/lotplayer.h new file mode 100644 index 0000000000..75ccaa403c --- /dev/null +++ b/inc/lotplayer.h @@ -0,0 +1,41 @@ +#ifndef _LOTPLAYER_H_ +#define _LOTPLAYER_H_ + +#include +#include + +#include "lotcommon.h" + +//TODO: Hide this. +class LOTPlayerPrivate; +#define _LOTPLAYER_DECLARE_PRIVATE(A) \ + class A##Private *d; + +namespace lotplayer { + +class LOT_EXPORT LOTPlayer { +public: + ~LOTPlayer(); + LOTPlayer(); + + bool setFilePath(const char *filePath); + + float playTime() const; + + float pos(); + + const std::vector &renderList(float pos) const; + + // TODO: Consider correct position... + void setSize(int width, int height); + void size(int &width, int &height) const; + std::future render(float pos, LOTBuffer buffer, bool forceRender = false); + bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); + +private: + _LOTPLAYER_DECLARE_PRIVATE(LOTPlayer); +}; + +} // namespace lotplayer + +#endif // _LOTPLAYER_H_ diff --git a/inc/meson.build b/inc/meson.build index 0b4bb41f4e..aa65f1f780 100644 --- a/inc/meson.build +++ b/inc/meson.build @@ -1 +1 @@ -install_headers(['lottieplayer.h']) +install_headers(['lotplayer.h', 'lotcommon.h']) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index a29875f513..2cf17b480f 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -9,7 +9,7 @@ #include"vpath.h" #include"vpoint.h" #include"vpathmesure.h" -#include"lottieplayer.h" +#include"lotcommon.h" #include"vpainter.h" #include"vdrawable.h" diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 28a6123b55..825d84f11a 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -1,4 +1,4 @@ -#include +#include #include "lottieitem.h" #include "lottieloader.h" From ca6738b3da5f407e9d4b14c0fd46e3fd3be455df Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 17 Aug 2018 21:43:20 +0900 Subject: [PATCH 170/672] add c interface. Change-Id: Ifc81f35479aa6e0ef18ead5b863ae80b34f98f85 --- example/lottieview.cpp | 2 +- example/lottieview.h | 2 +- inc/lotcommon.h | 8 +-- inc/lotplayer.h | 4 +- src/binding/.lottieplayer.cpp.swp | Bin 0 -> 12288 bytes src/binding/c/lotplayer_capi.h | 27 ++++++++++ src/binding/c/lottieplayer.cpp | 86 ++++++++++++++++++++++++++++++ src/binding/c/meson.build | 8 +++ src/binding/meson.build | 2 + src/lottie/lottieplayer.cpp | 4 +- src/meson.build | 4 +- 11 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 src/binding/.lottieplayer.cpp.swp create mode 100644 src/binding/c/lotplayer_capi.h create mode 100644 src/binding/c/lottieplayer.cpp create mode 100644 src/binding/c/meson.build create mode 100644 src/binding/meson.build diff --git a/example/lottieview.cpp b/example/lottieview.cpp index c9b68d6475..9025db4357 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,6 +1,6 @@ #include"lottieview.h" -using namespace lotplayer; +using namespace lottieplayer; static Eina_Bool animator(void *data , double pos) diff --git a/example/lottieview.h b/example/lottieview.h index 32122ac40f..032cbd07ff 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -54,7 +54,7 @@ public: Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - lotplayer::LOTPlayer *mPlayer; + lottieplayer::LOTPlayer *mPlayer; Ecore_Animator *mAnimator{nullptr}; bool mLoop; int mCurCount; diff --git a/inc/lotcommon.h b/inc/lotcommon.h index b8efeb6ba8..d07369fe09 100644 --- a/inc/lotcommon.h +++ b/inc/lotcommon.h @@ -23,7 +23,7 @@ #endif #endif -struct LOTNode { +typedef struct LOTNode { #define ChangeFlagNone 0x0000 #define ChangeFlagPath 0x0001 @@ -73,14 +73,14 @@ struct LOTNode { Color mColor; Stroke mStroke; Gradient mGradient; -}; +} lotnode; -struct LOTBuffer { +typedef struct LOTBuffer { uint32_t *buffer; int width; int height; int bytesPerLine; bool clear; -}; +} lotbuf; #endif // _LOTCOMMON_H_ diff --git a/inc/lotplayer.h b/inc/lotplayer.h index 75ccaa403c..f1554b1aa9 100644 --- a/inc/lotplayer.h +++ b/inc/lotplayer.h @@ -11,7 +11,7 @@ class LOTPlayerPrivate; #define _LOTPLAYER_DECLARE_PRIVATE(A) \ class A##Private *d; -namespace lotplayer { +namespace lottieplayer { class LOT_EXPORT LOTPlayer { public: @@ -22,7 +22,7 @@ public: float playTime() const; - float pos(); + float pos() const; const std::vector &renderList(float pos) const; diff --git a/src/binding/.lottieplayer.cpp.swp b/src/binding/.lottieplayer.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..e312a378e09c380c9279c04beb74d1bbdba214e1 GIT binary patch literal 12288 zcmeI2OKcNI7{|ZR6VUJor(UW7gs_cYX;q2VG^c`u6i6gOgv7&gcE|BX&hB=1OrTN9 z<4kzoK_G5C!~p>p4jkcxs!AL|w5mWow8!?)s{ff;ZyYx^^w{=W>E~U0XTJHq-_BTx zJX7V#z5B$@VwrGkAbRoS_~Ds#XFoW%o~R+CS*i4m{)aCE-z$Vp|5ilb+JL3;D43Cs zic8A-M*8-(`dP7DY6ePqvJf_FCuLNMBd0Xw`L5?rCwJ_Pq7#Pi8jA0;0XEQSprz`C zorCo0C&Ol`Z{4z4Y#KV)*@Cax02^QfY=8~00XDz}*Z>>&j~h_o0G&dOtCBh=lk-5= zIeE(`Hoykh02^QfY=8~00XDz}*Z><~18m@5XrSg2eYBcraSf8k@Bi)p|KH;G|2NOW-0n1SUZR41tZ{ z_d%lHz|Y_<~18m@bX<(uAAR$B~RV(s^-RoHxiKOq!Xw-{UCJf^2Vb48rw1U64gjmoo zIFb(g4~~vj2=BeR$e@)N`Lb7#VvLQanQT_fn?Sn5W;Ks_M@&=|>`GZ{P3w zZaSdJLHAd>f10VyqMc2TVY{>@M*5_n$4`n`o`9B6b%K_!dZo}Iq(?ST)vx}-a6bX) z`+l{TZF$yDVZ=;=++1Gd8hzXshIQqhZzh55YP_4?J;u!ow9g5IHs?lH)!lhWbwJNY zH2dX4*x$Ys3USgHco+*Nsilwbcq@c@T2AMDjFC?g$gj=HIIKBR Zhs0)js|=C0dcM + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lotplayer_s lotplayer; + +LOT_EXPORT lotplayer *lotplayer_create(void); +LOT_EXPORT int lotplayer_destroy(lotplayer *player); +LOT_EXPORT int lotplayer_set_file(lotplayer *player, const char *file); +LOT_EXPORT int lotplayer_set_size(lotplayer *player, int w, int h); +LOT_EXPORT int lotplayer_get_size(const lotplayer *player, int* w, int* h); +LOT_EXPORT float lotplayer_get_playtime(const lotplayer *player); +LOT_EXPORT float lotplayer_get_pos(const lotplayer *player); +LOT_EXPORT size_t lotplayer_get_node_count(const lotplayer *player, float pos); +LOT_EXPORT const lotnode* lotplayer_get_node(lotplayer *player, float pos, size_t idx); + +#ifdef __cplusplus +} +#endif + +#endif //_LOTPLAYER_CAPI_H_ + diff --git a/src/binding/c/lottieplayer.cpp b/src/binding/c/lottieplayer.cpp new file mode 100644 index 0000000000..9db88d7925 --- /dev/null +++ b/src/binding/c/lottieplayer.cpp @@ -0,0 +1,86 @@ +#include + +extern "C" { + +using namespace lottieplayer; + +using lotplayer = LOTPlayer; + +LOT_EXPORT lotplayer *lotplayer_create(void) +{ + lotplayer* p = new LOTPlayer(); + if (!p) { + //TODO: Print Error + } + return p; +} + +LOT_EXPORT int lotplayer_destroy(lotplayer *player) +{ + if (!player) return -1; + delete(player); + + return 0; +} + +LOT_EXPORT int lotplayer_set_file(lotplayer *player, const char *file) +{ + if (!player) return -1; + bool ret = player->setFilePath(file); + + if (!ret) return -1; + + return 0; +} + +LOT_EXPORT int lotplayer_set_size(lotplayer *player, int w, int h) +{ + if (!player) return -1; + + player->setSize(w, h); + + return 0; +} + +LOT_EXPORT int lotplayer_get_size(const lotplayer *player, int* w, int* h) +{ + if (!player) return -1; + + player->size(*w, *h); + + return 0; +} + +LOT_EXPORT float lotplayer_get_pos(const lotplayer *player) +{ + if (!player) return -1.0f; + + return player->pos(); +} + +LOT_EXPORT size_t lotplayer_get_node_count(const lotplayer *player, float pos) +{ + if (!player) return 0; + + return player->renderList(pos).size(); +} + +LOT_EXPORT float lotplayer_get_playtime(const lotplayer *player) +{ + if (!player) return 0.0f; + + return player->playTime(); +} + +LOT_EXPORT const lotnode* lotplayer_get_node(lotplayer *player, float pos, size_t idx) +{ + if (!player) return nullptr; + + if (idx >= player->renderList(pos).size()) { + return nullptr; + } + + return player->renderList(pos)[idx]; +} + +} diff --git a/src/binding/c/meson.build b/src/binding/c/meson.build new file mode 100644 index 0000000000..223e5f72cd --- /dev/null +++ b/src/binding/c/meson.build @@ -0,0 +1,8 @@ +install_headers(['lotplayer_capi.h']) + +source_file = files('lottieplayer.cpp') + +binding_c_dep = declare_dependency( + include_directories : include_directories('.'), + sources : source_file + ) diff --git a/src/binding/meson.build b/src/binding/meson.build new file mode 100644 index 0000000000..4be25091fe --- /dev/null +++ b/src/binding/meson.build @@ -0,0 +1,2 @@ +subdir('c') +binding_dep = binding_c_dep diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 825d84f11a..da90742297 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -6,7 +6,7 @@ #include -using namespace lotplayer; +using namespace lottieplayer; class LOTPlayerPrivate { @@ -251,7 +251,7 @@ float LOTPlayer::playTime() const return d->playTime(); } -float LOTPlayer::pos() +float LOTPlayer::pos() const { return d->pos(); } diff --git a/src/meson.build b/src/meson.build index 6f6bb37857..dc6a83723a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,8 +1,10 @@ subdir('vector') subdir('lottie') +subdir('binding') -library_deps = [vector_dep] +library_deps = vector_dep library_deps += lottie_dep +library_deps += binding_dep lottie_player_lib = shared_library( 'lottie-player', include_directories : inc, From 8bba2bc8d413b0aff7bc065f2a6e6b36274c209f Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 20 Aug 2018 20:10:32 +0900 Subject: [PATCH 171/672] lottieplayer: handling error code. Change-Id: I24c88fad24b821e18e7071e6bd82a828b8fd358e --- inc/lotcommon.h | 22 +++++++++++++++++--- inc/lotplayer.h | 10 ++++----- src/binding/c/lottieplayer.cpp | 37 ++++++++++++++++++++++------------ 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/inc/lotcommon.h b/inc/lotcommon.h index d07369fe09..8223df1f32 100644 --- a/inc/lotcommon.h +++ b/inc/lotcommon.h @@ -1,5 +1,5 @@ -#ifndef _LOTCOMMON_H_ -#define _LOTCOMMON_H_ +#ifndef _LOT_COMMON_H_ +#define _LOT_COMMON_H_ #ifdef _WIN32 #ifdef LOT_BUILD @@ -23,6 +23,22 @@ #endif #endif + +/** + * @brief Enumeration for Lottie Player error code. + */ +typedef enum +{ + LOT_PLAYER_ERROR_NONE = 0, + LOT_PLAYER_ERROR_NOT_PERMITTED, + LOT_PLAYER_ERROR_OUT_OF_MEMORY, + LOT_PLAYER_ERROR_INVALID_PARAMETER, + LOT_PLAYER_ERROR_RESULT_OUT_OF_RANGE, + LOT_PLAYER_ERROR_ALREADY_IN_PROGRESS, + LOT_PLAYER_ERROR_UNKNOWN +} lotplayer_error_e; + + typedef struct LOTNode { #define ChangeFlagNone 0x0000 @@ -83,4 +99,4 @@ typedef struct LOTBuffer { bool clear; } lotbuf; -#endif // _LOTCOMMON_H_ +#endif // _LOT_COMMON_H_ diff --git a/inc/lotplayer.h b/inc/lotplayer.h index f1554b1aa9..4fa589f824 100644 --- a/inc/lotplayer.h +++ b/inc/lotplayer.h @@ -1,5 +1,5 @@ -#ifndef _LOTPLAYER_H_ -#define _LOTPLAYER_H_ +#ifndef _LOT_PLAYER_H_ +#define _LOT_PLAYER_H_ #include #include @@ -8,7 +8,7 @@ //TODO: Hide this. class LOTPlayerPrivate; -#define _LOTPLAYER_DECLARE_PRIVATE(A) \ +#define _LOT_PLAYER_DECLARE_PRIVATE(A) \ class A##Private *d; namespace lottieplayer { @@ -33,9 +33,9 @@ public: bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); private: - _LOTPLAYER_DECLARE_PRIVATE(LOTPlayer); + _LOT_PLAYER_DECLARE_PRIVATE(LOTPlayer); }; } // namespace lotplayer -#endif // _LOTPLAYER_H_ +#endif // _LOT_PLAYER_H_ diff --git a/src/binding/c/lottieplayer.cpp b/src/binding/c/lottieplayer.cpp index 9db88d7925..b3ee6a8e71 100644 --- a/src/binding/c/lottieplayer.cpp +++ b/src/binding/c/lottieplayer.cpp @@ -1,4 +1,5 @@ #include +#include "vdebug.h" extern "C" { @@ -10,73 +11,83 @@ LOT_EXPORT lotplayer *lotplayer_create(void) { lotplayer* p = new LOTPlayer(); if (!p) { - //TODO: Print Error + vCritical << "Failed to initialize lotplayer"; } return p; } LOT_EXPORT int lotplayer_destroy(lotplayer *player) { - if (!player) return -1; + if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; delete(player); - return 0; + return LOT_PLAYER_ERROR_NONE; } LOT_EXPORT int lotplayer_set_file(lotplayer *player, const char *file) { - if (!player) return -1; + if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; bool ret = player->setFilePath(file); if (!ret) return -1; - return 0; + return LOT_PLAYER_ERROR_NONE; } LOT_EXPORT int lotplayer_set_size(lotplayer *player, int w, int h) { - if (!player) return -1; + if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; player->setSize(w, h); - return 0; + return LOT_PLAYER_ERROR_NONE; } LOT_EXPORT int lotplayer_get_size(const lotplayer *player, int* w, int* h) { - if (!player) return -1; + if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; player->size(*w, *h); - return 0; + return LOT_PLAYER_ERROR_NONE; } LOT_EXPORT float lotplayer_get_pos(const lotplayer *player) { - if (!player) return -1.0f; + if (!player) { + vWarning << "Invalid parameter player = nullptr"; + return -1.0f; + } return player->pos(); } LOT_EXPORT size_t lotplayer_get_node_count(const lotplayer *player, float pos) { - if (!player) return 0; + if (!player) return LOT_PLAYER_ERROR_NONE; return player->renderList(pos).size(); } LOT_EXPORT float lotplayer_get_playtime(const lotplayer *player) { - if (!player) return 0.0f; + if (!player) { + vWarning << "Invalid parameter player = nullptr"; + return 0.0f; + } return player->playTime(); } LOT_EXPORT const lotnode* lotplayer_get_node(lotplayer *player, float pos, size_t idx) { - if (!player) return nullptr; + if (!player) { + vWarning << "Invalid parameter player = nullptr"; + return nullptr; + } if (idx >= player->renderList(pos).size()) { + vWarning << "Invalid parameter idx? (0 ~ " << player->renderList(pos).size() << "), given idx = " << idx; return nullptr; } From ded7532e57f3c98dd961b9db932163f0a4647e2e Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Tue, 21 Aug 2018 00:31:57 +0900 Subject: [PATCH 172/672] lottie/vector: added Xor operation to Rle object Change-Id: I48cb3680a22ce3fb7f07048385dd5cc518ff9c7e --- src/vector/vrle.cpp | 46 ++++++++++++++++++++++++++++++++++++++++----- src/vector/vrle.h | 20 ++++++++++++++++++-- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 67a5e6042f..1ab7393eb1 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -10,6 +10,11 @@ V_BEGIN_NAMESPACE +enum class Operation { + Add, + Xor +}; + struct VRleHelper { ushort alloc; ushort size; @@ -18,7 +23,7 @@ struct VRleHelper { static void rleIntersectWithRle(VRleHelper *, int, int, VRleHelper *, VRleHelper *); static void rleIntersectWithRect(const VRect &, VRleHelper *, VRleHelper *); -static void rleAddWithRle(VRleHelper *, VRleHelper *, VRleHelper *); +static void rleOpGeneric(VRleHelper *, VRleHelper *, VRleHelper *, Operation op); static void rleSubstractWithRle(VRleHelper *, VRleHelper *, VRleHelper *); static inline uchar divBy255(int x) @@ -207,7 +212,7 @@ void VRle::VRleData::opSubstract(const VRle::VRleData &a, mBboxDirty = true; } -void VRle::VRleData::opAdd(const VRle::VRleData &a, const VRle::VRleData &b) +void VRle::VRleData::opGeneric(const VRle::VRleData &a, const VRle::VRleData &b, OpCode code) { // This routine assumes, obj1(span_y) < obj2(span_y). @@ -256,9 +261,20 @@ void VRle::VRleData::opAdd(const VRle::VRleData &a, const VRle::VRleData &b) bObj.size = b.mSpans.size() - sizeB; bObj.spans = bPtr; + Operation op = Operation::Add; + switch (code) { + case OpCode::Add: + op = Operation::Add; + break; + case OpCode::Xor: + op = Operation::Xor; + break; + default: + break; + } // run till all the spans are processed while (aObj.size && bObj.size) { - rleAddWithRle(&aObj, &bObj, &tresult); + rleOpGeneric(&aObj, &bObj, &tresult, op); if (tresult.size) { copyArrayToVector(tresult.spans, tresult.size, mSpans); } @@ -443,6 +459,23 @@ static void rleIntersectWithRect(const VRect &clip, VRleHelper *tmp_obj, result->size = result->alloc - available; } +void blitXor(VRle::Span *spans, int count, uchar *buffer, + int offsetX) +{ + uchar *ptr; + while (count--) { + int x = spans->x + offsetX; + int l = spans->len; + ptr = buffer + x; + while (l--) { + int da = *ptr; + *ptr = divBy255((255 - spans->coverage) * (da) + spans->coverage * (255 - da)); + ptr++; + } + spans++; + } +} + void blitDestinationOut(VRle::Span *spans, int count, uchar *buffer, int offsetX) { @@ -522,7 +555,7 @@ int bufferToRle(uchar *buffer, int size, int offsetX, int y, VRle::Span *out) return count; } -static void rleAddWithRle(VRleHelper *a, VRleHelper *b, VRleHelper *result) +static void rleOpGeneric(VRleHelper *a, VRleHelper *b, VRleHelper *result, Operation op) { std::array temp; VRle::Span * out = result->spans; @@ -554,7 +587,10 @@ static void rleAddWithRle(VRleHelper *a, VRleHelper *b, VRleHelper *result) std::array array = {{0}}; blit(aStart, (aPtr - aStart), array.data(), -offset); - blitSrcOver(bStart, (bPtr - bStart), array.data(), -offset); + if (op == Operation::Add) + blitSrcOver(bStart, (bPtr - bStart), array.data(), -offset); + else if (op == Operation::Xor) + blitXor(bStart, (bPtr - bStart), array.data(), -offset); VRle::Span *tResult = temp.data(); int size = bufferToRle(array.data(), std::max(aLength, bLength), offset, y, tResult); diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 9a45824482..e5ecc367b3 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -34,11 +34,16 @@ public: VRle operator&(const VRle &o) const; VRle operator-(const VRle &o) const; VRle operator+(const VRle &o) const; + VRle operator^(const VRle &o) const; static VRle toRle(const VRect &rect); private: struct VRleData { + enum class OpCode { + Add, + Xor + }; bool isEmpty() const { return mSpans.empty(); } void addSpan(const VRle::Span *span, int count); void updateBbox() const; @@ -48,7 +53,7 @@ private: void operator*=(int alpha); void invert(); void opIntersect(const VRect &, VRle::VRleSpanCb, void *) const; - void opAdd(const VRle::VRleData &, const VRle::VRleData &); + void opGeneric(const VRle::VRleData &, const VRle::VRleData &, OpCode code); void opSubstract(const VRle::VRleData &, const VRle::VRleData &); void opIntersect(const VRle::VRleData &, const VRle::VRleData &); void addRect(const VRect &rect); @@ -102,7 +107,18 @@ inline VRle VRle::operator+(const VRle &o) const if (o.isEmpty()) return *this; VRle result; - result.d.write().opAdd(d.read(), o.d.read()); + result.d.write().opGeneric(d.read(), o.d.read(), VRleData::OpCode::Add); + + return result; +} + +inline VRle VRle::operator^(const VRle &o) const +{ + if (isEmpty()) return o; + if (o.isEmpty()) return *this; + + VRle result; + result.d.write().opGeneric(d.read(), o.d.read(), VRleData::OpCode::Xor); return result; } From c12a9916a5c98a3c7fa544088b3db9a5b8297fcb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 21 Aug 2018 10:06:27 +0900 Subject: [PATCH 173/672] lottie:convert remaining raw pointer to unique_ptr. Change-Id: If85e7b8ffbbacd2cd305e6a3ef6d98ccd8ed7172 --- src/lottie/lottieitem.cpp | 58 ++++++++++++++------------------------- src/lottie/lottieitem.h | 25 ++++++++--------- 2 files changed, 31 insertions(+), 52 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index cab0264971..253e59b9e6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -231,13 +231,7 @@ VRle LOTLayerItem::maskRle(const VRect &clipRect) return rle; } -LOTLayerItem::LOTLayerItem(LOTLayerData *layerData) - : mLayerData(layerData), - mParentLayer(nullptr), - mPrecompLayer(nullptr), - mCombinedAlpha(0.0f), - mFrameNo(-1), - mDirtyFlag(DirtyFlagBit::All) +LOTLayerItem::LOTLayerItem(LOTLayerData *layerData): mLayerData(layerData) { if (mLayerData->mHasMask) { for (auto &i : mLayerData->mMasks) { @@ -457,63 +451,59 @@ void LOTNullLayerItem::updateContent() {} LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData) : LOTLayerItem(layerData) { - mRoot = new LOTContentGroupItem(nullptr); + mRoot = std::make_unique(nullptr); mRoot->addChildren(layerData); mRoot->processPaintOperation(); if (layerData->hasPathOperator()) mRoot->processTrimOperation(); } -LOTShapeLayerItem::~LOTShapeLayerItem() -{ - delete mRoot; -} - -LOTContentItem *LOTShapeLayerItem::createContentItem(LOTData *contentData) +std::unique_ptr +LOTShapeLayerItem::createContentItem(LOTData *contentData) { switch (contentData->type()) { case LOTData::Type::ShapeGroup: { - return new LOTContentGroupItem( + return std::make_unique( static_cast(contentData)); break; } case LOTData::Type::Rect: { - return new LOTRectItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Ellipse: { - return new LOTEllipseItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Shape: { - return new LOTShapeItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Polystar: { - return new LOTPolystarItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Fill: { - return new LOTFillItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::GFill: { - return new LOTGFillItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Stroke: { - return new LOTStrokeItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::GStroke: { - return new LOTGStrokeItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Repeater: { - return new LOTRepeaterItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } case LOTData::Type::Trim: { - return new LOTTrimItem(static_cast(contentData)); + return std::make_unique(static_cast(contentData)); break; } default: @@ -542,17 +532,9 @@ void LOTContentGroupItem::addChildren(LOTGroupData *data) { if (!data) return; - for (auto i : data->mChildren) { - LOTData * data = i.get(); - LOTContentItem *content = LOTShapeLayerItem::createContentItem(data); - if (content) mContents.push_back(content); - } -} - -LOTContentGroupItem::~LOTContentGroupItem() -{ - for (auto i : mContents) { - delete i; + for (auto &i : data->mChildren) { + auto content = LOTShapeLayerItem::createContentItem(i.get()); + if (content) mContents.push_back(std::move(content)); } } @@ -601,7 +583,7 @@ void LOTContentGroupItem::paintOperationHelper( { int curOpCount = list.size(); for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - auto child = *i; + auto child = (*i).get(); if (auto pathNode = dynamic_cast(child)) { // the node is a path data node add the paint operation list to it. pathNode->addPaintOperation(list, curOpCount); @@ -638,7 +620,7 @@ void LOTContentGroupItem::trimOperationHelper(std::vector &list) { int curOpCount = list.size(); for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - auto child = *i; + auto child = (*i).get(); if (auto pathNode = dynamic_cast(child)) { // the node is a path data node add the trim operation list to it. pathNode->addTrimOperation(list); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 2cf17b480f..6dc0385ae3 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -81,14 +81,13 @@ protected: protected: std::vector mDrawableList; std::vector> mMasks; - LOTLayerData *mLayerData; - LOTLayerItem *mParentLayer; - LOTLayerItem *mPrecompLayer; - VMatrix mCombinedMatrix; - float mCombinedAlpha; - int mFrameNo; - DirtyFlag mDirtyFlag; - bool mVisible; + LOTLayerData *mLayerData{nullptr}; + LOTLayerItem *mParentLayer{nullptr}; + LOTLayerItem *mPrecompLayer{nullptr}; + VMatrix mCombinedMatrix; + float mCombinedAlpha{0.0}; + int mFrameNo{-1}; + DirtyFlag mDirtyFlag{DirtyFlagBit::All}; bool mStatic; }; @@ -122,13 +121,12 @@ class LOTContentGroupItem; class LOTShapeLayerItem: public LOTLayerItem { public: - ~LOTShapeLayerItem(); LOTShapeLayerItem(LOTLayerData *layerData); - static LOTContentItem * createContentItem(LOTData *contentData); + static std::unique_ptr createContentItem(LOTData *contentData); void renderList(std::vector &list)final; protected: void updateContent() final; - LOTContentGroupItem *mRoot; + std::unique_ptr mRoot; }; class LOTNullLayerItem: public LOTLayerItem @@ -189,7 +187,6 @@ public: class LOTContentGroupItem: public LOTContentItem { public: - ~LOTContentGroupItem(); LOTContentGroupItem(LOTShapeGroupData *data); void addChildren(LOTGroupData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; @@ -199,8 +196,8 @@ public: private: void paintOperationHelper(std::vector &list); void trimOperationHelper(std::vector &list); - LOTShapeGroupData *mData; - std::vector mContents; + LOTShapeGroupData *mData; + std::vector> mContents; }; class LOTPathDataItem : public LOTContentItem From 6fb25316eeef92b07b73bd1bc639e8ed1e39251d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 21 Aug 2018 10:44:40 +0900 Subject: [PATCH 174/672] lottie: refactor VRaster class. Change-Id: Iadd382d34fcaa67a4cb60b44f22af38051f6f09a --- src/lottie/lottieitem.cpp | 2 +- src/vector/vdrawable.cpp | 4 ++-- src/vector/vraster.cpp | 5 +---- src/vector/vraster.h | 32 ++++++++++---------------------- 4 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 253e59b9e6..295c5f6715 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -142,7 +142,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, VPath path = mLocalPath; path.transform(parentMatrix); - mRleTask = VRaster::instance().generateFillInfo(std::move(path), std::move(mRle)); + mRleTask = VRaster::generateFillInfo(std::move(path), std::move(mRle)); mRle = VRle(); } diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 625660ef89..450952b291 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -10,11 +10,11 @@ void VDrawable::preprocess() VDasher dasher(mStroke.mDash.data(), mStroke.mDash.size()); mPath = dasher.dashed(mPath); } - mRleTask = VRaster::instance().generateStrokeInfo( + mRleTask = VRaster::generateStrokeInfo( std::move(mPath), std::move(mRle), mStroke.cap, mStroke.join, mStroke.width, mStroke.meterLimit); } else { - mRleTask = VRaster::instance().generateFillInfo( + mRleTask = VRaster::generateFillInfo( std::move(mPath), std::move(mRle), mFillRule); } mRle = VRle(); diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index ec711208d1..7d20723f78 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -7,6 +7,7 @@ #include "vmatrix.h" #include "vpath.h" #include "vtaskqueue.h" +#include "vrle.h" V_BEGIN_NAMESPACE @@ -383,10 +384,6 @@ public: static RleTaskScheduler raster_scheduler; -VRaster::VRaster() {} - -VRaster::~VRaster() {} - std::future VRaster::generateFillInfo(VPath &&path, VRle &&rle, FillRule fillRule) { diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 5b5b1aa0a9..1eaf4ddf8f 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -1,35 +1,23 @@ #ifndef VRASTER_H #define VRASTER_H #include -#include "vrle.h" +#include "vglobal.h" V_BEGIN_NAMESPACE -struct FTOutline; class VPath; +class VRle; -struct VRasterPrivate; -class VRaster { -public: - ~VRaster(); - static VRaster &instance() - { - static VRaster Singleton; - return Singleton; - } - VRaster(const VRaster &other) = delete; - VRaster(VRaster &&) = delete; - VRaster &operator=(VRaster const &) = delete; - VRaster &operator=(VRaster &&) = delete; +struct VRaster { - std::future generateFillInfo(VPath &&path, VRle &&rle, - FillRule fillRule = FillRule::Winding); - std::future generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle cap, - JoinStyle join, float width, - float meterLimit); + static std::future + generateFillInfo(VPath &&path, VRle &&rle, + FillRule fillRule = FillRule::Winding); -private: - VRaster(); + static std::future + generateStrokeInfo(VPath &&path, VRle &&rle, + CapStyle cap, JoinStyle join, + float width, float meterLimit); }; V_END_NAMESPACE From bb877fd7d2fda7425403fe8f533dfddb80abc888 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Tue, 21 Aug 2018 00:33:51 +0900 Subject: [PATCH 175/672] lottie/parser: updated parser to parse difference mask mode Change-Id: I607d4f56a849d1cb928926c2d4ecc30cf1313e7e --- src/lottie/lottiemodel.h | 3 ++- src/lottie/lottieparser.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 3f162138ab..e191cbe69e 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -587,7 +587,8 @@ public: None, Add, Substarct, - Intersect + Intersect, + Difference }; float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} bool isStatic() const {return mIsStatic;} diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 05b8bb899f..beadb66aec 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -849,6 +849,9 @@ std::shared_ptr LottieParserImpl::parseMaskObject() case 'i': obj->mMode = LOTMaskData::Mode::Intersect; break; + case 'f': + obj->mMode = LOTMaskData::Mode::Difference; + break; default: obj->mMode = LOTMaskData::Mode::None; break; From ed0b8f5b4c0093f99e805c5d966ab04738bc06ef Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Tue, 21 Aug 2018 00:35:49 +0900 Subject: [PATCH 176/672] lottie/render: added support to render difference mask mode. Change-Id: Ia6ccba78181c87c6b49124026494b324ba93a846 --- src/lottie/lottieitem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 295c5f6715..3c262e5972 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -224,6 +224,10 @@ VRle LOTLayerItem::maskRle(const VRect &clipRect) rle = rle & i->rle(); break; } + case LOTMaskData::Mode::Difference: { + rle = rle ^ i->rle(); + break; + } default: break; } From 617b257ec4c45f38a1e214e431ce5246a2788434 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Fri, 17 Aug 2018 21:15:22 +0900 Subject: [PATCH 177/672] lottie: add "lottieviewer" example lottieviewer shows each frame image according to slider value. since edc compilation is not supported yet, do the following steps to run this example: $ cd example $ edje_cc layout.edc $ mv layout.edj ../build/example Change-Id: I00f7d8b743e9028d1e8006104e63bef5d96084b6 --- example/layout.edc | 31 +++++++++++++++++ example/lottieviewer.cpp | 72 ++++++++++++++++++++++++++++++++++++++++ example/meson.build | 9 +++++ 3 files changed, 112 insertions(+) create mode 100644 example/layout.edc create mode 100644 example/lottieviewer.cpp diff --git a/example/layout.edc b/example/layout.edc new file mode 100644 index 0000000000..cbc0694808 --- /dev/null +++ b/example/layout.edc @@ -0,0 +1,31 @@ +collections { + group { name: "layout"; + parts { + rect { "bg"; + desc { state: "default" 0.0; + color: 255 255 255 255; + } + } + spacer { "lottie_base"; + desc { state: "default" 0.0; + rel2.relative: 1.0 0.7; + } + } + swallow { "lottie"; + desc { state: "default" 0.0; + rel1.to: "lottie_base"; + rel1.relative: 0.5 0.5; + rel2.to: "lottie_base"; + rel2.relative: 0.5 0.5; + } + } + swallow { "slider"; + desc { state: "default" 0.0; + rel1.relative: 0.0 0.7; + rel1.offset: 20 20; + rel2.offset: -20 -20; + } + } + } + } +} diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp new file mode 100644 index 0000000000..2f46b47669 --- /dev/null +++ b/example/lottieviewer.cpp @@ -0,0 +1,72 @@ +#include +#include "lottieview.h" +#include +#include + +using namespace std; + +static void +_win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + LottieView *view = (LottieView *)data; + delete view; +} + +static void +_slider_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + LottieView *view = (LottieView *)data; + + view->seek(val); + view->render(); +} + +EAPI_MAIN int +elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) +{ + Evas_Object *win, *layout, *slider, *image; + bool renderMode = true; + + if (argc > 1) { + if (!strcmp(argv[1], "--disable-render")) + renderMode = false; + } + + win = elm_win_util_standard_add("lottie", "LottieViewer"); + evas_object_resize(win, 500, 700); + evas_object_show(win); + + layout = elm_layout_add(win); + evas_object_show(layout); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_layout_file_set(layout, "layout.edj", "layout"); + elm_win_resize_object_add(win, layout); + + std::string filePath = DEMO_DIR; + filePath +="data.json"; + + LottieView *view = new LottieView(evas_object_evas_get(win), renderMode); + view->setFilePath(filePath.c_str()); + view->setSize(500, 500); + + evas_object_smart_callback_add(win, "delete,request", _win_del_cb, (void *)view); + + image = view->getImage(); + evas_object_show(image); + evas_object_size_hint_min_set(image, 500, 500); + elm_object_part_content_set(layout, "lottie", image); + + slider = elm_slider_add(layout); + evas_object_show(slider); + elm_object_part_content_set(layout, "slider", slider); + evas_object_smart_callback_add(slider, "changed", _slider_cb, (void *)view); + + view->seek(0.0); + view->render(); + + elm_run(); + + return 0; +} +ELM_MAIN() diff --git a/example/meson.build b/example/meson.build index 79db2c115f..72fb94258c 100644 --- a/example/meson.build +++ b/example/meson.build @@ -32,3 +32,12 @@ executable('uxsampleTest', include_directories : inc, link_with : lottie_player_lib, dependencies : demo_dep) + +lottieviewer_sources = files('lottieviewer.cpp') +lottieviewer_sources += common_source + +executable('lottieviewer', + lottieviewer_sources, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) From 8a0d4d746bdea9165a953c7a73b0f367a2c5b250 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 21 Aug 2018 12:59:33 +0900 Subject: [PATCH 178/672] lottie: build fix. Change-Id: Ie008c71e2fcb3bcf7197245e26880e71e2bedc32 --- src/binding/c/{lottieplayer.cpp => lottieplayer_c.cpp} | 0 src/binding/c/meson.build | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/binding/c/{lottieplayer.cpp => lottieplayer_c.cpp} (100%) diff --git a/src/binding/c/lottieplayer.cpp b/src/binding/c/lottieplayer_c.cpp similarity index 100% rename from src/binding/c/lottieplayer.cpp rename to src/binding/c/lottieplayer_c.cpp diff --git a/src/binding/c/meson.build b/src/binding/c/meson.build index 223e5f72cd..646983b9ce 100644 --- a/src/binding/c/meson.build +++ b/src/binding/c/meson.build @@ -1,6 +1,6 @@ install_headers(['lotplayer_capi.h']) -source_file = files('lottieplayer.cpp') +source_file = files('lottieplayer_c.cpp') binding_c_dep = declare_dependency( include_directories : include_directories('.'), From d23e61c69d6952ace3f8197e3f83f0fb87e2b2d4 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 21 Aug 2018 13:20:22 +0900 Subject: [PATCH 179/672] lottie/example: add a missing example lottie file It is good to test matte feature and managing multiple layers. Change-Id: Ie87cc18d0b37b35858c765339d129dc35f2c2986 --- example/resource/personal_character.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 example/resource/personal_character.json diff --git a/example/resource/personal_character.json b/example/resource/personal_character.json new file mode 100644 index 0000000000..a56074e1f6 --- /dev/null +++ b/example/resource/personal_character.json @@ -0,0 +1 @@ +{"v":"5.1.14","fr":30,"ip":0,"op":162,"w":900,"h":900,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Front Hair","parent":8,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":0.16},"o":{"x":0.167,"y":0.167},"n":"0p16_0p16_0p167_0p167","t":0,"s":[101.385,187.205,0],"e":[101.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[101.385,187.205,0],"e":[98.385,187.205,0],"to":[-0.5,0,0],"ti":[0.5,0,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":20,"s":[98.385,187.205,0],"e":[98.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0},"n":"0p833_0p833_0p85_0","t":47,"s":[98.385,187.205,0],"e":[101.385,187.205,0],"to":[0.5,0,0],"ti":[-0.91666668653488,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[101.385,187.205,0],"e":[103.885,187.205,0],"to":[0.91666668653488,0,0],"ti":[-0.41666665673256,0,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":67,"s":[103.885,187.205,0],"e":[103.885,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0},"n":"0p833_0p833_0p85_0","t":94,"s":[103.885,187.205,0],"e":[101.385,187.205,0],"to":[-0.41666665673256,0,0],"ti":[0.41666665673256,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[101.385,187.205,0],"e":[101.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"t":114}],"ix":2},"a":{"a":0,"k":[128,239,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":265,"h":166,"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Mouth","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":124,"s":[0],"e":[5.203]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":136,"s":[5.203],"e":[0]},{"t":148}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":124,"s":[19.267,100.511,0],"e":[19.267,98.636,0],"to":[0,-0.3125,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":136,"s":[19.267,98.636,0],"e":[19.267,100.511,0],"to":[0,0,0],"ti":[0,-0.3125,0]},{"t":148}],"ix":2},"a":{"a":0,"k":[42.667,13.167,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-34.167,0],[0,0]],"o":[[0,0],[34.166,0],[0,0]],"v":[[-35.166,-5.667],[1.001,5.667],[35.166,-5.667]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925,0.455000005984,0.395999983245,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[42.666,13.167],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Nose","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p16_1_0p167_0"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p15_1_0p84_0"],"t":6,"s":[0],"e":[-4]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":20,"s":[-4],"e":[-4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.85],"y":[0]},"n":["0p833_0p833_0p85_0"],"t":47,"s":[-4],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p15_1_0p167_0p167"],"t":53,"s":[0],"e":[4]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":67,"s":[4],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":94,"s":[4],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":100,"s":[0],"e":[0]},{"t":114}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":0.16},"o":{"x":0.167,"y":0.167},"n":"0p16_0p16_0p167_0p167","t":0,"s":[102.885,146.327,0],"e":[102.885,146.327,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[102.885,146.327,0],"e":[110.885,139.327,0],"to":[1.33333337306976,-1.16666662693024,0],"ti":[-1.33333337306976,1.16666662693024,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":20,"s":[110.885,139.327,0],"e":[110.885,139.327,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0},"n":"0p833_0p833_0p85_0","t":47,"s":[110.885,139.327,0],"e":[102.885,146.327,0],"to":[-1.33333337306976,1.16666662693024,0],"ti":[2.58333325386047,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[102.885,146.327,0],"e":[95.385,139.327,0],"to":[-2.58333325386047,0,0],"ti":[1.25,1.16666662693024,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.167,"y":0.167},"n":"0p15_0p15_0p167_0p167","t":67,"s":[95.385,139.327,0],"e":[95.385,139.327,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":94,"s":[95.385,139.327,0],"e":[102.885,146.327,0],"to":[1.25,1.16666662693024,0],"ti":[-1.25,-1.16666662693024,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.167,"y":0.167},"n":"0p15_0p15_0p167_0p167","t":100,"s":[102.885,146.327,0],"e":[102.885,146.327,0],"to":[0,0,0],"ti":[0,0,0]},{"t":114}],"ix":2},"a":{"a":0,"k":[20.266,37.538,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.843,-4.933],[0,0],[0,0],[4.52,8.394],[4.842,4.946],[-2.583,11.623],[-7.426,0],[-2.583,-11.623]],"o":[[-4.843,4.946],[-4.52,8.394],[0,0],[0,0],[-4.843,-4.933],[2.583,-11.623],[7.425,0],[2.583,11.623]],"v":[[14.529,32.213],[7.425,28.895],[0.001,35.351],[-7.425,28.895],[-14.527,32.213],[-17.433,8.232],[0.001,-37.288],[17.434,8.232]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925,0.455000005984,0.395999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.266,37.539],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Eye","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-36.067,12.5,0],"ix":2},"a":{"a":0,"k":[6.333,6.333,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p16_1_0p167_0p167","0p16_1_0p167_0p167","0p16_1_0p167_0"],"t":0,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.84,0.84,0.84],"y":[0,0,0]},"n":["0p15_1_0p84_0","0p15_1_0p84_0","0p15_1_0p84_0"],"t":6,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p15_1_0p85_0","0p15_1_0p85_0","0p15_1_0p85_0"],"t":20,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":30,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":36,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0","0p833_1_0p167_0"],"t":42,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":47,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":53,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p15_1_0p85_0","0p15_1_0p85_0","0p15_1_0p85_0"],"t":67,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":77,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":83,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p15_1_0p167_0","0p15_1_0p167_0","0p15_1_0p167_0"],"t":89,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":94,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":100,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p15_1_0p85_0","0p15_1_0p85_0","0p15_1_0p85_0"],"t":114,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":130,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":136,"s":[205,18,100],"e":[100,100,100]},{"t":148}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.36],[3.359,0],[0,3.359],[-3.36,0]],"o":[[0,3.359],[-3.36,0],[0,-3.36],[3.359,0]],"v":[[6.084,0],[0.001,6.083],[-6.084,0],[0.001,-6.083]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.333,6.333],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Eye","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.767,12.5,0],"ix":2},"a":{"a":0,"k":[6.333,6.333,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p16_1_0p167_0p167","0p16_1_0p167_0p167","0p16_1_0p167_0"],"t":0,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.84,0.84,0.84],"y":[0,0,0]},"n":["0p15_1_0p84_0","0p15_1_0p84_0","0p15_1_0p84_0"],"t":6,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p15_1_0p85_0","0p15_1_0p85_0","0p15_1_0p85_0"],"t":20,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":30,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":36,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0","0p833_1_0p167_0"],"t":42,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":47,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":53,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p15_1_0p85_0","0p15_1_0p85_0","0p15_1_0p85_0"],"t":67,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":77,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":83,"s":[205,18,100],"e":[100,100,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"n":["0p15_1_0p167_0","0p15_1_0p167_0","0p15_1_0p167_0"],"t":89,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.85,0.85,0.85],"y":[0,0,0]},"n":["0p833_0p833_0p85_0","0p833_0p833_0p85_0","0p833_1_0p85_0"],"t":94,"s":[100,100,100],"e":[205,18,100]},{"i":{"x":[0.15,0.15,0.15],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"n":["0p15_1_0p167_0p167","0p15_1_0p167_0p167","0p15_1_0p167_0"],"t":100,"s":[205,18,100],"e":[100,100,100]},{"t":114}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.36],[3.359,0],[0,3.359],[-3.359,0]],"o":[[0,3.359],[-3.359,0],[0,-3.36],[3.359,0]],"v":[[6.083,0],[0,6.083],[-6.083,0],[0,-6.083]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.333,6.333],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Left Eye Brow","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p16_1_0p167_0p167"],"t":0,"s":[0],"e":[9.695]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p15_1_0p84_0"],"t":6,"s":[9.695],"e":[-8.041]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":20,"s":[-8.041],"e":[-8.041]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p833_1_0p85_0"],"t":30,"s":[-8.041],"e":[-1.024]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":36,"s":[-1.024],"e":[-8.041]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":42,"s":[-8.041],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[0],"e":[9.695]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p15_1_0p167_0p167"],"t":53,"s":[9.695],"e":[-8.041]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":67,"s":[-8.041],"e":[-8.041]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p833_1_0p85_0"],"t":77,"s":[-8.041],"e":[-1.024]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":83,"s":[-1.024],"e":[-8.041]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":89,"s":[-8.041],"e":[-8.041]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.85],"y":[0]},"n":["0p833_0p833_0p85_0"],"t":94,"s":[-8.041],"e":[9.695]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p15_1_0p167_0p167"],"t":100,"s":[9.695],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":114,"s":[0],"e":[-8.258]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p833_1_0p85_0"],"t":124,"s":[-8.258],"e":[6.314]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":136,"s":[6.314],"e":[0]},{"t":148}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p16_1_0p167_0p167","t":0,"s":[-34.733,-13.416,0],"e":[-34.733,-4.916,0],"to":[0,1.41666662693024,0],"ti":[0,-0.25,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[-34.733,-4.916,0],"e":[-34.733,-11.916,0],"to":[0,0.25,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0.85},"n":"0p833_0p833_0p85_0p85","t":20,"s":[-34.733,-11.916,0],"e":[-34.733,-11.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[-34.733,-11.916,0],"e":[-34.746,-8.158,0],"to":[-0.00203262735158,0.62638407945633,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[-34.746,-8.158,0],"e":[-34.733,-11.916,0],"to":[0,0,0],"ti":[-0.00203262735158,0.87638407945633,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[-34.733,-11.916,0],"e":[-34.733,-13.416,0],"to":[0.00203262735158,-0.87638407945633,0],"ti":[0,-1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47,"s":[-34.733,-13.416,0],"e":[-34.733,-4.916,0],"to":[0,1.16666662693024,0],"ti":[0,-0.25,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[-34.733,-4.916,0],"e":[-34.733,-11.916,0],"to":[0,0.25,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0.85},"n":"0p833_0p833_0p85_0p85","t":67,"s":[-34.733,-11.916,0],"e":[-34.733,-11.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":77,"s":[-34.733,-11.916,0],"e":[-34.746,-8.158,0],"to":[-0.00203262735158,0.62638407945633,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[-34.746,-8.158,0],"e":[-34.733,-11.916,0],"to":[0,0,0],"ti":[-0.00203262735158,0.62638407945633,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":89,"s":[-34.733,-11.916,0],"e":[-34.733,-11.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94,"s":[-34.733,-11.916,0],"e":[-34.733,-4.916,0],"to":[0,1.16666662693024,0],"ti":[0,0.25,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":100,"s":[-34.733,-4.916,0],"e":[-34.733,-13.416,0],"to":[0,-0.25,0],"ti":[0,3.25,0]},{"i":{"x":0.32,"y":1},"o":{"x":0.85,"y":0},"n":"0p32_1_0p85_0","t":114,"s":[-34.733,-13.416,0],"e":[-34.733,-24.416,0],"to":[0,-3.25,0],"ti":[0.00203262735158,-1.70971739292145,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":124,"s":[-34.733,-24.416,0],"e":[-34.746,-3.158,0],"to":[-0.00203262735158,1.70971739292145,0],"ti":[0,-1.83333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[-34.746,-3.158,0],"e":[-34.733,-13.416,0],"to":[0,1.83333337306976,0],"ti":[-0.00203262735158,1.70971739292145,0]},{"t":148}],"ix":2},"a":{"a":0,"k":[21.083,8.416,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.492,0],[0,0],[0,4.492],[-4.492,0],[0,0],[0,-4.492]],"o":[[0,0],[-4.492,0],[0,-4.492],[0,0],[4.492,0],[0,4.492]],"v":[[12.667,8.166],[-12.667,8.166],[-20.833,-0.001],[-12.667,-8.166],[12.667,-8.166],[20.833,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.083,8.417],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Right Eye Brow","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p16_1_0p167_0p167"],"t":0,"s":[0],"e":[-7.24]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p15_1_0p84_0"],"t":6,"s":[-7.24],"e":[5.892]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":20,"s":[5.892],"e":[5.892]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p833_1_0p85_0"],"t":30,"s":[5.892],"e":[-0.716]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":36,"s":[-0.716],"e":[5.892]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":42,"s":[5.892],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[0],"e":[-7.24]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p15_1_0p167_0p167"],"t":53,"s":[-7.24],"e":[5.892]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p15_1_0p85_0"],"t":67,"s":[5.892],"e":[5.892]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p833_1_0p85_0"],"t":77,"s":[5.892],"e":[-0.716]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":83,"s":[-0.716],"e":[5.892]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":89,"s":[5.892],"e":[5.892]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.85],"y":[0]},"n":["0p833_0p833_0p85_0"],"t":94,"s":[5.892],"e":[-7.24]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p15_1_0p167_0p167"],"t":100,"s":[-7.24],"e":[0]},{"t":114}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p16_1_0p167_0p167","t":0,"s":[75.267,-13.416,0],"e":[75.267,-4.916,0],"to":[0,1.41666662693024,0],"ti":[0,-0.08333333581686,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[75.267,-4.916,0],"e":[75.267,-12.916,0],"to":[0,0.08333333581686,0],"ti":[0,1.33333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0.85},"n":"0p833_0p833_0p85_0p85","t":20,"s":[75.267,-12.916,0],"e":[75.267,-12.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[75.267,-12.916,0],"e":[75.22,-8.659,0],"to":[-0.00784566719085,0.70951437950134,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[75.22,-8.659,0],"e":[75.267,-12.916,0],"to":[0,0,0],"ti":[-0.00784566719085,0.79284769296646,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[75.267,-12.916,0],"e":[75.267,-13.416,0],"to":[0.00784566719085,-0.79284769296646,0],"ti":[0,-1.33333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47,"s":[75.267,-13.416,0],"e":[75.267,-4.916,0],"to":[0,1.33333337306976,0],"ti":[0,-0.08333333581686,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[75.267,-4.916,0],"e":[75.267,-12.916,0],"to":[0,0.08333333581686,0],"ti":[0,1.33333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0.85},"n":"0p833_0p833_0p85_0p85","t":67,"s":[75.267,-12.916,0],"e":[75.267,-12.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":77,"s":[75.267,-12.916,0],"e":[75.22,-8.659,0],"to":[-0.00784566719085,0.70951437950134,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[75.22,-8.659,0],"e":[75.267,-12.916,0],"to":[0,0,0],"ti":[-0.00784566719085,0.70951437950134,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":89,"s":[75.267,-12.916,0],"e":[75.267,-12.916,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94,"s":[75.267,-12.916,0],"e":[75.267,-4.916,0],"to":[0,1.33333337306976,0],"ti":[0,0.08333333581686,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":100,"s":[75.267,-4.916,0],"e":[75.267,-13.416,0],"to":[0,-0.08333333581686,0],"ti":[0,1.41666662693024,0]},{"t":114}],"ix":2},"a":{"a":0,"k":[21.083,8.416,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.491,0],[0,0],[0,4.492],[-4.491,0],[0,0],[0,-4.492]],"o":[[0,0],[-4.491,0],[0,-4.492],[0,0],[4.491,0],[0,4.492]],"v":[[12.667,8.166],[-12.667,8.166],[-20.833,-0.001],[-12.667,-8.166],[12.667,-8.166],[20.833,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.083,8.417],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Face","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p16_1_0p167_0p167","t":0,"s":[452.198,490.045,0],"e":[452.198,496.045,0],"to":[0,1,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[452.198,496.045,0],"e":[452.198,490.045,0],"to":[0,0,0],"ti":[0,1,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0.85},"n":"0p833_0p833_0p85_0p85","t":20,"s":[452.198,490.045,0],"e":[452.198,490.045,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47,"s":[452.198,490.045,0],"e":[452.198,496.045,0],"to":[0,1,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[452.198,496.045,0],"e":[452.198,490.045,0],"to":[0,0,0],"ti":[0,1,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.167,"y":0.167},"n":"0p15_0p15_0p167_0p167","t":67,"s":[452.198,490.045,0],"e":[452.198,490.045,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":94,"s":[452.198,490.045,0],"e":[452.198,496.045,0],"to":[0,1,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":100,"s":[452.198,496.045,0],"e":[452.198,490.045,0],"to":[0,0,0],"ti":[0,2.5,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":114,"s":[452.198,490.045,0],"e":[452.198,481.045,0],"to":[0,-2.5,0],"ti":[0,-1.16666662693024,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":124,"s":[452.198,481.045,0],"e":[452.198,497.045,0],"to":[0,1.16666662693024,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":136,"s":[452.198,497.045,0],"e":[452.198,481.045,0],"to":[0,0,0],"ti":[0,2.66666674613953,0]},{"t":148}],"ix":2},"a":{"a":0,"k":[103.583,227.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.192,0],[0,0],[0,-11.193],[0,0],[-55.733,0],[0,55.733],[0,0]],"o":[[0,0],[-11.192,0],[0,0],[0,55.733],[55.733,0],[0,0],[0,-11.193]],"v":[[80.983,-136],[-80.984,-136],[-101.333,-115.65],[-101.333,34.667],[0,136],[101.333,34.667],[101.333,-115.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.855000035903,0.74900004069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.583,136.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Ear","parent":8,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p16_1_0p167_0"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.84],"y":[0]},"n":["0p15_1_0p84_0"],"t":6,"s":[0],"e":[-1.475]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.85],"y":[0]},"n":["0p833_1_0p85_0"],"t":20,"s":[-1.475],"e":[-1.475]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":47,"s":[-1.475],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p15_1_0p167_0p167"],"t":53,"s":[0],"e":[1.095]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":67,"s":[1.095],"e":[1.095]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":94,"s":[1.095],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p15_1_0p167_0"],"t":100,"s":[0],"e":[0]},{"t":114}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":0.16},"o":{"x":0.167,"y":0.167},"n":"0p16_0p16_0p167_0p167","t":0,"s":[101.385,187.205,0],"e":[101.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[101.385,187.205,0],"e":[97.385,190.205,0],"to":[-0.66666668653488,0.5,0],"ti":[0.66666668653488,-0.5,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":20,"s":[97.385,190.205,0],"e":[97.385,190.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0},"n":"0p833_0p833_0p85_0","t":47,"s":[97.385,190.205,0],"e":[101.385,187.205,0],"to":[0.66666668653488,-0.5,0],"ti":[-1.41666662693024,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[101.385,187.205,0],"e":[105.885,190.205,0],"to":[1.41666662693024,0,0],"ti":[-0.75,-0.5,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.167,"y":0.167},"n":"0p15_0p15_0p167_0p167","t":67,"s":[105.885,190.205,0],"e":[105.885,190.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":94,"s":[105.885,190.205,0],"e":[101.385,187.205,0],"to":[-0.75,-0.5,0],"ti":[0.75,0.5,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.167,"y":0.167},"n":"0p15_0p15_0p167_0p167","t":100,"s":[101.385,187.205,0],"e":[101.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"t":114}],"ix":2},"a":{"a":0,"k":[139,89,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":281,"h":539,"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Jakun","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450.948,579.25,0],"ix":2},"a":{"a":0,"k":[23.375,18.375,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-21.5,-16.5],[-0.464,16.5],[21.5,-16.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925,0.455000005984,0.395999983245,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.75,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[23.375,18.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Neck 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450.948,524.25,0],"ix":2},"a":{"a":0,"k":[74.083,116.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.823,0],[0,0],[0,-8.823],[0,0],[-40.608,0],[0,40.608],[0,0]],"o":[[0,0],[-8.823,0],[0,0],[0,40.608],[40.608,0],[0,0],[0,-8.823]],"v":[[57.79,-116],[-57.792,-116],[-73.833,-99.958],[-73.833,42.167],[-0.001,116],[73.833,42.167],[73.833,-99.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.731532931328,0.602845072746,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.084,116.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 1","parent":8,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-9.776,"ix":10},"p":{"a":0,"k":[95.385,220.205,0],"ix":2},"a":{"a":0,"k":[-2,100,0],"ix":1},"s":{"a":0,"k":[116.328,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[148,148],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.686274509804,0.585274849686,0.495194169587,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,100],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Neck","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450.948,524.25,0],"ix":2},"a":{"a":0,"k":[74.083,116.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.823,0],[0,0],[0,-8.823],[0,0],[-40.608,0],[0,40.608],[0,0]],"o":[[0,0],[-8.823,0],[0,0],[0,40.608],[40.608,0],[0,0],[0,-8.823]],"v":[[57.79,-116],[-57.792,-116],[-73.833,-99.958],[-73.833,42.167],[-0.001,116],[73.833,42.167],[73.833,-99.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.731532931328,0.602845072746,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.084,116.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"Back Hair","parent":8,"refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":0.16},"o":{"x":0.167,"y":0.167},"n":"0p16_0p16_0p167_0p167","t":0,"s":[101.385,187.205,0],"e":[101.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.84,"y":0},"n":"0p15_1_0p84_0","t":6,"s":[101.385,187.205,0],"e":[92.385,190.205,0],"to":[-1.5,0.5,0],"ti":[1.5,-0.5,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":20,"s":[92.385,190.205,0],"e":[92.385,190.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0},"n":"0p833_0p833_0p85_0","t":47,"s":[92.385,190.205,0],"e":[101.385,187.205,0],"to":[1.5,-0.5,0],"ti":[-3.16666674613953,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p15_1_0p167_0p167","t":53,"s":[101.385,187.205,0],"e":[111.385,190.205,0],"to":[3.16666674613953,0,0],"ti":[-1.66666662693024,-0.5,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":67,"s":[111.385,190.205,0],"e":[111.385,190.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.85,"y":0},"n":"0p833_0p833_0p85_0","t":94,"s":[111.385,190.205,0],"e":[101.385,187.205,0],"to":[-1.66666662693024,-0.5,0],"ti":[1.66666662693024,0.5,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.167,"y":0.167},"n":"0p15_0p15_0p167_0p167","t":100,"s":[101.385,187.205,0],"e":[101.385,187.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":114,"s":[101.385,187.205,0],"e":[101.385,194.205,0],"to":[0,1.16666662693024,0],"ti":[0,-1.16666662693024,0]},{"i":{"x":0.15,"y":0.15},"o":{"x":0.85,"y":0.85},"n":"0p15_0p15_0p85_0p85","t":124,"s":[101.385,194.205,0],"e":[101.385,194.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"n":"0p15_1_0p85_0","t":136,"s":[101.385,194.205,0],"e":[101.385,187.205,0],"to":[0,-1.16666662693024,0],"ti":[0,1.16666662693024,0]},{"t":148}],"ix":2},"a":{"a":0,"k":[165,271,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":342,"h":349,"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Rope","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[421.395,712.446,0],"ix":2},"a":{"a":0,"k":[9.25,9.458,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.233,0],[0,0],[0,4.233],[0,0],[-4.234,0],[0,0],[0,-4.233],[0,0]],"o":[[0,0],[-4.234,0],[0,0],[0,-4.233],[0,0],[4.233,0],[0,0],[0,4.233]],"v":[[1.303,52.208],[-1.302,52.208],[-9,44.512],[-9,-44.512],[-1.302,-52.208],[1.303,-52.208],[9,-44.512],[9,44.512]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.25,52.458],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Rope","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[479.395,711.946,0],"ix":2},"a":{"a":0,"k":[9.25,8.958,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.233,0],[0,0],[0,4.233],[0,0],[-4.234,0],[0,0],[0,-4.233],[0,0]],"o":[[0,0],[-4.234,0],[0,0],[0,-4.233],[0,0],[4.233,0],[0,0],[0,4.233]],"v":[[1.303,52.208],[-1.302,52.208],[-9,44.512],[-9,-44.512],[-1.302,-52.208],[1.303,-52.208],[9,-44.512],[9,44.512]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.25,52.458],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Inshirt Shirt","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450.395,650.725,0],"ix":2},"a":{"a":0,"k":[69.863,60.025,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[69.613,-59.775],[-0.499,59.775],[-69.613,-59.775]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.863,60.025],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Jacket","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450.197,693.825,0],"ix":2},"a":{"a":0,"k":[226.25,151.425,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[226,54.165],[226,151.175],[-226,151.175],[-226,54.165],[-164,-21.175],[-176,-41.175],[-134.67,-151.175],[134.67,-151.175],[176,-41.175],[164,-21.175]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[226.25,151.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[233.642,107.465,0],"ix":2},"a":{"a":0,"k":[31.489,31.489,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.253],[17.253,0],[0,17.252],[-17.253,0]],"o":[[0,17.252],[-17.253,0],[0,-17.253],[17.253,0]],"v":[[31.239,0],[0,31.239],[-31.239,0],[0,-31.239]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.489,31.489],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[93.334,36.893,0],"ix":2},"a":{"a":0,"k":[37.143,37.143,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-20.375],[20.375,0],[0,20.375],[-20.376,0]],"o":[[0,20.375],[-20.376,0],[0,-20.375],[20.375,0]],"v":[[36.893,0],[0,36.893],[-36.893,0],[0,-36.893]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.143,37.143],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.962,64.692,0],"ix":2},"a":{"a":0,"k":[37.143,37.143,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-20.375],[20.375,0],[0,20.375],[-20.376,0]],"o":[[0,20.375],[-20.376,0],[0,-20.375],[20.375,0]],"v":[[36.893,0],[0,36.893],[-36.893,0],[0,-36.893]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.143,37.143],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[133.774,35.547,0],"ix":2},"a":{"a":0,"k":[27.036,27.036,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-14.793],[14.794,0],[0,14.793],[-14.794,0]],"o":[[0,14.793],[-14.794,0],[0,-14.793],[14.794,0]],"v":[[26.786,0],[0,26.786],[-26.786,0],[0,-26.786]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.036,27.036],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[222.916,62.334,0],"ix":2},"a":{"a":0,"k":[27.035,27.036,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-14.793],[14.794,0],[0,14.793],[-14.793,0]],"o":[[0,14.793],[-14.793,0],[0,-14.793],[14.794,0]],"v":[[26.786,0],[0,26.786],[-26.786,0],[0,-26.786]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.035,27.036],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 8 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.636,47,0],"ix":2},"a":{"a":0,"k":[32.018,32.017,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-17.544],[17.545,0],[0,17.544],[-17.545,0]],"o":[[0,17.544],[-17.545,0],[0,-17.544],[17.545,0]],"v":[[31.768,0],[-0.001,31.767],[-31.768,0],[-0.001,-31.767]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.018,32.017],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 9 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[232.333,148.072,0],"ix":2},"a":{"a":0,"k":[17.618,17.618,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-9.592],[9.593,0],[0,9.592],[-9.592,0]],"o":[[0,9.592],[-9.592,0],[0,-9.592],[9.593,0]],"v":[[17.368,0],[0,17.368],[-17.368,0],[0,-17.368]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.618,17.618],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 10 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.499,112.956,0],"ix":2},"a":{"a":0,"k":[24.522,24.522,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-13.405],[13.405,0],[0,13.405],[-13.406,0]],"o":[[0,13.405],[-13.406,0],[0,-13.405],[13.405,0]],"v":[[24.273,0],[0.001,24.272],[-24.273,0],[0.001,-24.272]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.523,24.522],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 11 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.094,141.428,0],"ix":2},"a":{"a":0,"k":[19.118,19.118,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-10.42],[10.421,0],[0,10.42],[-10.421,0]],"o":[[0,10.42],[-10.421,0],[0,-10.42],[10.421,0]],"v":[[18.868,0],[0,18.868],[-18.868,0],[0,-18.868]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.118,19.118],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"EarPhone","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[139.395,284.625,0],"ix":2},"a":{"a":0,"k":[119.538,256.875,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[4.049,-6.086],[0,0],[0,0]],"o":[[0,0],[0,7.31],[0,0],[0,0],[0,0]],"v":[[57.966,-236.685],[57.966,-223.667],[51.756,-203.125],[-57.966,-38.23],[-57.966,236.686]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[177.583,274.564],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-4.049,-6.086],[0,0],[0,0]],"o":[[0,0],[0,7.31],[0,0],[0,0],[0,0]],"v":[[-57.965,-236.685],[-57.965,-223.667],[-51.757,-203.125],[57.965,-38.23],[57.965,236.686]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[61.653,274.564],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.548],[-6.547,0],[0,6.547],[6.548,0]],"o":[[0,6.547],[6.548,0],[0,-6.548],[-6.547,0]],"v":[[-11.855,0],[-0.001,11.855],[11.855,0],[-0.001,-11.855]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.708,12.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.89,0],[0,0],[0,-1.891],[0,0],[-1.89,0],[0,1.89],[0,0]],"o":[[0,0],[-1.89,0],[0,0],[0,1.89],[1.89,0],[0,0],[0,-1.891]],"v":[[0,-14.777],[0,-14.777],[-3.437,-11.34],[-3.437,11.34],[0,14.777],[3.437,11.34],[3.437,-11.34]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.687,25.852],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.548],[6.547,0],[0,6.547],[-6.548,0]],"o":[[0,6.547],[-6.548,0],[0,-6.548],[6.547,0]],"v":[[11.856,0],[0,11.855],[-11.856,0],[0,-11.855]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[226.369,12.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.89,0],[0,0],[0,-1.891],[0,0],[1.891,0],[0,1.89],[0,0]],"o":[[0,0],[1.891,0],[0,0],[0,1.89],[-1.89,0],[0,0],[0,-1.891]],"v":[[0,-14.777],[0,-14.777],[3.437,-11.34],[3.437,11.34],[0,14.777],[-3.437,11.34],[-3.437,-11.34]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[235.389,25.852],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Left Ear","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22.943,37.833,0],"ix":2},"a":{"a":0,"k":[30.75,43.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[21,14.5],[12.666,-14.666],[-14.667,-9.333],[-0.666,7]],"o":[[0,0],[-12.667,14.667],[14.666,9.334],[0.667,-7]],"v":[[9.5,-34.667],[-17.833,-28.834],[2.167,34.166],[29.833,34.166]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.635000011968,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.75,43.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Right Ear","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[258.058,37.833,0],"ix":2},"a":{"a":0,"k":[30.75,43.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-21,14.5],[-12.667,-14.666],[14.667,-9.333],[0.667,7]],"o":[[0,0],[12.667,14.667],[-14.667,9.334],[-0.666,-7]],"v":[[-9.5,-34.667],[17.833,-28.834],[-2.167,34.166],[-29.834,34.166]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.635000011968,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.75,43.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 19 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[266.333,98.881,0],"ix":2},"a":{"a":0,"k":[49.69,49.69,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-27.305],[27.305,0],[0,27.305],[-27.305,0]],"o":[[0,27.305],[-27.305,0],[0,-27.305],[27.305,0]],"v":[[49.441,0],[0.001,49.44],[-49.441,0],[0.001,-49.44]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.69,49.69],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 21 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[126.214,49.44,0],"ix":2},"a":{"a":0,"k":[49.69,49.69,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-27.305],[27.305,0],[0,27.305],[-27.306,0]],"o":[[0,27.305],[-27.306,0],[0,-27.305],[27.305,0]],"v":[[49.441,0],[0.001,49.44],[-49.441,0],[0.001,-49.44]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.69,49.69],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 24 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[56.522,90.44,0],"ix":2},"a":{"a":0,"k":[49.69,49.69,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-27.305],[27.305,0],[0,27.305],[-27.305,0]],"o":[[0,27.305],[-27.305,0],[0,-27.305],[27.305,0]],"v":[[49.44,0],[0,49.44],[-49.44,0],[0,-49.44]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.69,49.69],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 25 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[291.773,208.44,0],"ix":2},"a":{"a":0,"k":[49.69,49.69,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-27.305],[27.305,0],[0,27.305],[-27.305,0]],"o":[[0,27.305],[-27.305,0],[0,-27.305],[27.305,0]],"v":[[49.441,0],[0.001,49.44],[-49.441,0],[0.001,-49.44]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.691,49.69],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 26 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.774,208.44,0],"ix":2},"a":{"a":0,"k":[49.69,49.69,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-27.305],[27.305,0],[0,27.305],[-27.305,0]],"o":[[0,27.305],[-27.305,0],[0,-27.305],[27.305,0]],"v":[[49.44,0],[0,49.44],[-49.44,0],[0,-49.44]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.69,49.69],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 27 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206.785,54.893,0],"ix":2},"a":{"a":0,"k":[35.798,35.797,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-19.632],[19.632,0],[0,19.632],[-19.633,0]],"o":[[0,19.632],[-19.633,0],[0,-19.632],[19.632,0]],"v":[[35.548,0],[0,35.547],[-35.548,0],[0,-35.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.798,35.797],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 28 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.666,67.547,0],"ix":2},"a":{"a":0,"k":[35.798,35.797,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-19.632],[19.632,0],[0,19.632],[-19.633,0]],"o":[[0,19.632],[-19.633,0],[0,-19.632],[19.632,0]],"v":[[35.548,0],[0,35.547],[-35.548,0],[0,-35.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.798,35.797],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 29 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[266.333,280.547,0],"ix":2},"a":{"a":0,"k":[35.798,35.798,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-19.632],[19.633,0],[0,19.633],[-19.632,0]],"o":[[0,19.633],[-19.632,0],[0,-19.632],[19.633,0]],"v":[[35.548,-0.001],[-0.001,35.548],[-35.548,-0.001],[-0.001,-35.548]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.798,35.798],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 30 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.891,276.547,0],"ix":2},"a":{"a":0,"k":[35.798,35.798,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-19.632],[19.632,0],[0,19.633],[-19.633,0]],"o":[[0,19.633],[-19.633,0],[0,-19.632],[19.632,0]],"v":[[35.548,-0.001],[0,35.548],[-35.548,-0.001],[0,-35.548]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.797,35.798],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 31 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[72.214,49.44,0],"ix":2},"a":{"a":0,"k":[27.25,27.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-14.912],[14.912,0],[0,14.912],[-14.912,0]],"o":[[0,14.912],[-14.912,0],[0,-14.912],[14.912,0]],"v":[[27,0],[0,27],[-27,0],[0,-27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.25,27.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 32 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[289.518,155.529,0],"ix":2},"a":{"a":0,"k":[35.731,35.731,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-19.596],[19.595,0],[0,19.596],[-19.596,0]],"o":[[0,19.596],[-19.596,0],[0,-19.596],[19.595,0]],"v":[[35.482,0],[0,35.481],[-35.482,0],[0,-35.481]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.731,35.731],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Layer 33 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.928,155.529,0],"ix":2},"a":{"a":0,"k":[35.096,35.096,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-19.245],[19.245,0],[0,19.245],[-19.244,0]],"o":[[0,19.245],[-19.244,0],[0,-19.245],[19.245,0]],"v":[[34.846,0],[-0.001,34.846],[-34.846,0],[-0.001,-34.846]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.096,35.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 34 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[175.654,32,0],"ix":2},"a":{"a":0,"k":[27.25,27.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-14.912],[14.912,0],[0,14.912],[-14.912,0]],"o":[[0,14.912],[-14.912,0],[0,-14.912],[14.912,0]],"v":[[27,0],[0,27],[-27,0],[0,-27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.25,27.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Layer 36 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.576,53.315,0],"ix":2},"a":{"a":0,"k":[37.376,37.376,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-20.504],[20.504,0],[0,20.504],[-20.504,0]],"o":[[0,20.504],[-20.504,0],[0,-20.504],[20.504,0]],"v":[[37.126,-0.001],[0.001,37.126],[-37.126,-0.001],[0.001,-37.126]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.375,37.376],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 42 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[78.962,320.095,0],"ix":2},"a":{"a":0,"k":[27.25,27.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-14.912],[14.912,0],[0,14.911],[-14.912,0]],"o":[[0,14.911],[-14.912,0],[0,-14.912],[14.912,0]],"v":[[27,0],[0,27],[-27,0],[0,-27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.25,27.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Layer 43 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[242.333,321.364,0],"ix":2},"a":{"a":0,"k":[27.25,27.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-14.911],[14.912,0],[0,14.912],[-14.911,0]],"o":[[0,14.912],[-14.911,0],[0,-14.911],[14.912,0]],"v":[[27,0],[0,27],[-27,0],[0,-27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176000004189,0.204000001795,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.25,27.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":320,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450,450,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[900,900],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.686274509804,0.585274849686,0.495194169587,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"ME","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450,450,0],"ix":2},"a":{"a":0,"k":[450,450,0],"ix":1},"s":{"a":0,"k":[123.111,123.111,100],"ix":6}},"ao":0,"w":900,"h":900,"ip":0,"op":162,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450,450,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[900,900],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":162,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From bfbe3c986a94b7dfc4d66e2aad5d2037b9833d4c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 21 Aug 2018 13:21:16 +0900 Subject: [PATCH 180/672] lottie: fixed warnings generated by '-Wextra' flag. Change-Id: I73c122f61e628bdbdb6ab98bb68b7d32ab9f4ec0 --- inc/lotplayer.h | 2 +- src/lottie/lottieitem.cpp | 20 ++++++++++---------- src/lottie/lottieitem.h | 6 +++--- src/lottie/lottiemodel.cpp | 6 +++--- src/vector/vdrawhelper.cpp | 6 +++--- src/vector/vpoint.h | 4 ++-- src/vector/vrect.h | 8 ++++---- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/inc/lotplayer.h b/inc/lotplayer.h index 4fa589f824..66fabf89a1 100644 --- a/inc/lotplayer.h +++ b/inc/lotplayer.h @@ -33,7 +33,7 @@ public: bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); private: - _LOT_PLAYER_DECLARE_PRIVATE(LOTPlayer); + _LOT_PLAYER_DECLARE_PRIVATE(LOTPlayer) }; } // namespace lotplayer diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 3c262e5972..dc0f2b468f 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -126,7 +126,7 @@ bool LOTCompItem::render(const LOTBuffer &buffer) } void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, - float parentAlpha, const DirtyFlag &flag) + float parentAlpha, const DirtyFlag &/*flag*/) { if (mData->mShape.isStatic()) { if (mLocalPath.isEmpty()) { @@ -846,8 +846,8 @@ void LOTGFillItem::updateContent(int frameNo) mFillRule = mData->fillRule(); } -void LOTGFillItem::updateRenderNode(LOTPathDataItem *pathNode, - VDrawable *drawable, bool sameParent) +void LOTGFillItem::updateRenderNode(LOTPathDataItem */*pathNode*/, + VDrawable *drawable, bool /*sameParent*/) { drawable->setBrush(VBrush(mGradient.get())); drawable->setFillRule(mFillRule); @@ -925,8 +925,8 @@ void LOTGStrokeItem::updateContent(int frameNo) } } -void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, - VDrawable *drawable, bool sameParent) +void LOTGStrokeItem::updateRenderNode(LOTPathDataItem */*pathNode*/, + VDrawable *drawable, bool /*sameParent*/) { float scale = getScale(mParentMatrix); drawable->setBrush(VBrush(mGradient.get())); @@ -941,19 +941,19 @@ void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, LOTTrimItem::LOTTrimItem(LOTTrimData *data) : mData(data) {} -void LOTTrimItem::update(int frameNo, const VMatrix &parentMatrix, - float parentAlpha, const DirtyFlag &flag) +void LOTTrimItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/, + float /*parentAlpha*/, const DirtyFlag &/*flag*/) { } LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) {} -void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, - float parentAlpha, const DirtyFlag &flag) +void LOTRepeaterItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/, + float /*parentAlpha*/, const DirtyFlag &/*flag*/) { } -void LOTRepeaterItem::renderList(std::vector &list) {} +void LOTRepeaterItem::renderList(std::vector &/*list*/) {} void LOTDrawable::sync() { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 6dc0385ae3..5271cdd9ae 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -62,7 +62,7 @@ public: void setPrecompLayer(LOTLayerItem *precomp){mPrecompLayer = precomp;} virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha); VMatrix matrix(int frameNo) const; - virtual void renderList(std::vector &list){} + virtual void renderList(std::vector &){} virtual void updateStaticProperty(); virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } @@ -181,7 +181,7 @@ public: LOTContentItem(){} virtual ~LOTContentItem(){} virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0; - virtual void renderList(std::vector &list){} + virtual void renderList(std::vector &){} }; class LOTContentGroupItem: public LOTContentItem @@ -304,7 +304,7 @@ public: private: void updatePath(VPath& path, int frameNo) final; LOTShapeData *mData; - bool hasChanged(int frameNo) final { return true; } + bool hasChanged(int) final { return true; } }; class LOTPolystarItem: public LOTPathDataItem diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index c119950c0a..2e48fac97e 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -5,10 +5,10 @@ class LottieRepeaterProcesser : public LOTDataVisitor { public: LottieRepeaterProcesser() : mRepeaterFound(false) {} - void visit(LOTCompositionData *obj) {} - void visit(LOTLayerData *obj) {} + void visit(LOTCompositionData *) {} + void visit(LOTLayerData *) {} void visit(LOTTransformData *) {} - void visit(LOTShapeGroupData *obj) {} + void visit(LOTShapeGroupData *) {} void visit(LOTShapeData *) {} void visit(LOTRectData *) {} void visit(LOTEllipseData *) {} diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index ee421e02c1..315b59b42f 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -452,7 +452,7 @@ void fetch_radial_gradient(uint32_t *buffer, const Operator *op, } static inline Operator getOperator(const VSpanData * data, - const VRle::Span *spans, int spanCount) + const VRle::Span *, int) { Operator op; bool solidSource = false; @@ -542,8 +542,8 @@ static void blendGradientARGB(int count, const VRle::Span *spans, } } -void VSpanData::setup(const VBrush &brush, VPainter::CompositionMode mode, - int alpha) +void VSpanData::setup(const VBrush &brush, VPainter::CompositionMode /*mode*/, + int /*alpha*/) { switch (brush.type()) { case VBrush::Type::NoBrush: diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index fea5603ab7..2ee01f0bd4 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -22,7 +22,7 @@ public: { return VPointF(p1.mx + p2.mx, p1.my + p2.my); } - inline friend const bool fuzzyCompare(const VPointF &p1, const VPointF &p2); + inline friend bool fuzzyCompare(const VPointF &p1, const VPointF &p2); inline friend VDebug & operator<<(VDebug &os, const VPointF &o); friend inline VPointF operator-(const VPointF &p1, const VPointF &p2); @@ -36,7 +36,7 @@ private: float my; }; -inline const bool fuzzyCompare(const VPointF &p1, const VPointF &p2) +inline bool fuzzyCompare(const VPointF &p1, const VPointF &p2) { return (vCompare(p1.mx, p2.mx) && vCompare(p1.my, p2.my)); } diff --git a/src/vector/vrect.h b/src/vector/vrect.h index 0a2efdd019..eea0b81e1c 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -175,10 +175,10 @@ public: inline void setHeight(float h) { y2 = y1 + h; } inline void translate(float dx, float dy) { - x1 -= dx; - x2 -= dx; - y1 -= dx; - y2 -= dx; + x1 += dx; + y1 += dy; + x2 += dx; + y2 += dy; } private: From 8ea21ce487c5c848133febe840ef6b01535714b3 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 21 Aug 2018 13:57:22 +0900 Subject: [PATCH 181/672] lottie/example: add complex gradient examples and remove simple one Change-Id: I6003e3ca3209125c119feaaae55da35327b52a2c --- example/resource/data.json | 1 - example/resource/dna.json | 1 + example/resource/gradient_sleepy_loader.json | 1 + example/resource/intelia_logo_animation.json | 1 + example/resource/issue/insta_camera.json | 1 + example/resource/matte_two_item_with_lowerlayer.json | 1 + example/resource/mughead.json | 1 + example/resource/ripple_loading_animation.json | 1 + example/resource/waves_.json | 1 + 9 files changed, 8 insertions(+), 1 deletion(-) delete mode 100755 example/resource/data.json create mode 100644 example/resource/dna.json create mode 100644 example/resource/gradient_sleepy_loader.json create mode 100644 example/resource/intelia_logo_animation.json create mode 100644 example/resource/issue/insta_camera.json create mode 100644 example/resource/matte_two_item_with_lowerlayer.json create mode 100644 example/resource/mughead.json create mode 100644 example/resource/ripple_loading_animation.json create mode 100644 example/resource/waves_.json diff --git a/example/resource/data.json b/example/resource/data.json deleted file mode 100755 index c3531cea2b..0000000000 --- a/example/resource/data.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.1.13","fr":60,"ip":0,"op":60,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[43]},{"t":50}],"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[146,146],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.923041880131,0.933333337307,0.058562088758,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[2],"e":[14]},{"t":50}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0.937254905701,0.033079583198,0.118178516626,1],"e":[0.043737020344,0.085415646434,0.929411768913,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[0.043737020344,0.085415646434,0.929411768913,1],"e":[0.129419133067,0.92549020052,0.068958088756,1]},{"t":55}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/dna.json b/example/resource/dna.json new file mode 100644 index 0000000000..545d474b34 --- /dev/null +++ b/example/resource/dna.json @@ -0,0 +1 @@ +{"v":"4.13.0","fr":60,"ip":0,"op":241,"w":800,"h":600,"nm":"DNA","ddd":0,"assets":[{"id":"comp_6","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-156,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[56.455,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-153,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90.909,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-150,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[125.364,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-147,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[159.818,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-144,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[194.273,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-141,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[228.727,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-138,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[263.182,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-135,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[297.636,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-132,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[332.091,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-129,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[366.545,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-126,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[401,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-123,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435.455,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-120,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[469.909,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-117,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[504.364,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-114,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[538.818,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-111,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[573.273,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-108,"bm":0},{"ddd":0,"ind":18,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[607.727,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-105,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[642.182,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-102,"bm":0},{"ddd":0,"ind":20,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[676.636,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-99,"bm":0},{"ddd":0,"ind":21,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[711.091,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-96,"bm":0},{"ddd":0,"ind":22,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[745.545,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-93,"bm":0},{"ddd":0,"ind":23,"ty":0,"nm":"meet bar","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[780,290,0],"ix":2},"a":{"a":0,"k":[32,205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":64,"h":410,"ip":0,"op":361,"st":-90,"bm":0}]},{"id":"comp_7","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"traceNull","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[958,53,0],"ix":2,"x":"var $bm_rt;\nvar pathLayer = thisComp.layer('bar');\nvar progress = div(thisLayer.effect('Pseudo/ADBE Trace Path')('Pseudo/ADBE Trace Path-0001'), 100);\nvar pathToTrace = pathLayer('ADBE Root Vectors Group')(1)('ADBE Vector Shape');\n$bm_rt = pathLayer.toComp(pathToTrace.pointOnPath(progress));"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Trace Path","np":4,"mn":"Pseudo/ADBE Trace Path","ix":1,"en":1,"ef":[{"ty":0,"nm":"Progress","mn":"Pseudo/ADBE Trace Path-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p6_1_0p4_0"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p6_1_0p4_0"],"t":60,"s":[100],"e":[0]},{"t":120}],"ix":1,"x":"var $bm_rt;\nif (thisProperty.numKeys > 1) {\n $bm_rt = thisProperty.loopOut('cycle');\n} else {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Loop","mn":"Pseudo/ADBE Trace Path-0002","ix":2,"v":{"a":0,"k":0,"ix":2}}]}],"ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"botDot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[660,124,0],"ix":2,"x":"var $bm_rt;\nvar barLayer, barPath;\nbarLayer = thisComp.layer('bar');\nbarPath = barLayer.content('Path 1').path.points();\n$bm_rt = sub(barLayer.toComp(barPath[1]), sub(thisComp.layer('traceNull').transform.position, barLayer.toComp(barPath[0])));"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[12,12],"e":[16,16]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":30,"s":[16,16],"e":[12,12]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":60,"s":[12,12],"e":[4,4]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":90,"s":[4,4],"e":[12,12]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666666667,0.850980392157,0.96862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"topDot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[388,200,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('traceNull').transform.position;"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[12,12],"e":[4,4]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":30,"s":[4,4],"e":[12,12]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":60,"s":[12,12],"e":[16,16]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":90,"s":[16,16],"e":[12,12]},{"t":120}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666666667,0.850980392157,0.96862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":720,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"bar","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,436,0],"ix":2},"a":{"a":0,"k":[102,468,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-171,76],[-171,396]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('traceNull').effect('Trace Path')('Progress');"},"e":{"a":0,"k":100,"ix":2,"x":"var $bm_rt;\n$bm_rt = sub(100, content('Trim Paths 1').start);"},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":2,"ix":10},"g":{"p":5,"k":{"a":0,"k":[0,0.639,0.816,0.929,0.254,0.357,0.496,0.594,0.507,0.075,0.176,0.259,0.754,0.357,0.496,0.594,1,0.639,0.816,0.929,0,1,0.253,0.5,0.505,0,0.752,0.5,1,1],"ix":8}},"s":{"a":0,"k":[258,509],"ix":4},"e":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":0,"s":[396,-25],"e":[-7,-25],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":60,"s":[-7,-25],"e":[396,-25],"to":[0,0],"ti":[0,0]},{"t":120}],"ix":5,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":720,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":20,"ix":10},"p":{"a":0,"k":[410.059,291.323,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":241,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"meet graph","parent":1,"refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[78.88,-78.88,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Starglow","np":68,"mn":"tc Starglow","ix":1,"en":0,"ef":[{"ty":7,"nm":"Preset","mn":"tc Starglow-0059","ix":1,"v":{"a":0,"k":39,"ix":1}},{"ty":7,"nm":"Input Channel","mn":"tc Starglow-0001","ix":2,"v":{"a":0,"k":4,"ix":2}},{"ty":6,"nm":"Pre-Process","mn":"tc Starglow-0002","ix":3,"v":0},{"ty":0,"nm":"Threshold","mn":"tc Starglow-0003","ix":4,"v":{"a":0,"k":160,"ix":4}},{"ty":0,"nm":"Threshold Soft","mn":"tc Starglow-0004","ix":5,"v":{"a":0,"k":10,"ix":5}},{"ty":7,"nm":"Use Mask","mn":"tc Starglow-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Mask Radius","mn":"tc Starglow-0006","ix":7,"v":{"a":0,"k":100,"ix":7}},{"ty":0,"nm":"Mask Feather","mn":"tc Starglow-0007","ix":8,"v":{"a":0,"k":50,"ix":8}},{"ty":3,"nm":"Mask Position","mn":"tc Starglow-0008","ix":9,"v":{"a":0,"k":[400,300],"ix":9}},{"ty":6,"nm":"","mn":"tc Starglow-0009","ix":10,"v":0},{"ty":0,"nm":"Streak Length","mn":"tc Starglow-0010","ix":11,"v":{"a":0,"k":20,"ix":11}},{"ty":0,"nm":"Boost Light","mn":"tc Starglow-0021","ix":12,"v":{"a":0,"k":0,"ix":12}},{"ty":6,"nm":"Individual Lengths","mn":"tc Starglow-0011","ix":13,"v":0},{"ty":0,"nm":"Up","mn":"tc Starglow-0012","ix":14,"v":{"a":0,"k":1,"ix":14}},{"ty":0,"nm":"Down","mn":"tc Starglow-0013","ix":15,"v":{"a":0,"k":1,"ix":15}},{"ty":0,"nm":"Left","mn":"tc Starglow-0014","ix":16,"v":{"a":0,"k":0,"ix":16}},{"ty":0,"nm":"Right","mn":"tc Starglow-0015","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":0,"nm":"Up Left","mn":"tc Starglow-0016","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":0,"nm":"Up Right","mn":"tc Starglow-0017","ix":19,"v":{"a":0,"k":0,"ix":19}},{"ty":0,"nm":"Down Left","mn":"tc Starglow-0018","ix":20,"v":{"a":0,"k":0,"ix":20}},{"ty":0,"nm":"Down Right","mn":"tc Starglow-0019","ix":21,"v":{"a":0,"k":0,"ix":21}},{"ty":6,"nm":"","mn":"tc Starglow-0020","ix":22,"v":0},{"ty":6,"nm":"Individual Colors","mn":"tc Starglow-0046","ix":23,"v":0},{"ty":7,"nm":"Up","mn":"tc Starglow-0047","ix":24,"v":{"a":0,"k":1,"ix":24}},{"ty":7,"nm":"Down","mn":"tc Starglow-0048","ix":25,"v":{"a":0,"k":2,"ix":25}},{"ty":7,"nm":"Left","mn":"tc Starglow-0049","ix":26,"v":{"a":0,"k":1,"ix":26}},{"ty":7,"nm":"Right","mn":"tc Starglow-0050","ix":27,"v":{"a":0,"k":1,"ix":27}},{"ty":7,"nm":"Up Left","mn":"tc Starglow-0051","ix":28,"v":{"a":0,"k":1,"ix":28}},{"ty":7,"nm":"Up Right","mn":"tc Starglow-0052","ix":29,"v":{"a":0,"k":1,"ix":29}},{"ty":7,"nm":"Down Left","mn":"tc Starglow-0053","ix":30,"v":{"a":0,"k":2,"ix":30}},{"ty":7,"nm":"Down Right","mn":"tc Starglow-0054","ix":31,"v":{"a":0,"k":3,"ix":31}},{"ty":6,"nm":"","mn":"tc Starglow-0055","ix":32,"v":0},{"ty":6,"nm":"Colormap A","mn":"tc Starglow-0022","ix":33,"v":0},{"ty":7,"nm":"Preset","mn":"tc Starglow-0023","ix":34,"v":{"a":0,"k":5,"ix":34}},{"ty":2,"nm":"Highlights","mn":"tc Starglow-0024","ix":35,"v":{"a":0,"k":[1,1,1,0],"ix":35}},{"ty":2,"nm":"Mid High","mn":"tc Starglow-0025","ix":36,"v":{"a":0,"k":[1,0.650980392157,1,0],"ix":36}},{"ty":2,"nm":"Midtones","mn":"tc Starglow-0026","ix":37,"v":{"a":0,"k":[1,0.650980392157,0,0.035294117647],"ix":37}},{"ty":2,"nm":"Mid Low","mn":"tc Starglow-0027","ix":38,"v":{"a":0,"k":[1,0.650980392157,1,0],"ix":38}},{"ty":2,"nm":"Shadows","mn":"tc Starglow-0028","ix":39,"v":{"a":0,"k":[1,0,0,0],"ix":39}},{"ty":6,"nm":"","mn":"tc Starglow-0029","ix":40,"v":0},{"ty":6,"nm":"Colormap B","mn":"tc Starglow-0030","ix":41,"v":0},{"ty":7,"nm":"Preset","mn":"tc Starglow-0031","ix":42,"v":{"a":0,"k":9,"ix":42}},{"ty":2,"nm":"Highlights","mn":"tc Starglow-0032","ix":43,"v":{"a":0,"k":[1,1,1,0],"ix":43}},{"ty":2,"nm":"Mid High","mn":"tc Starglow-0033","ix":44,"v":{"a":0,"k":[0.988235294118,0.788235294118,0.635294117647,0],"ix":44}},{"ty":2,"nm":"Midtones","mn":"tc Starglow-0034","ix":45,"v":{"a":0,"k":[0.501960784314,1,1,0.035294117647],"ix":45}},{"ty":2,"nm":"Mid Low","mn":"tc Starglow-0035","ix":46,"v":{"a":0,"k":[0.572549019608,0.478431372549,0.945098039216,0],"ix":46}},{"ty":2,"nm":"Shadows","mn":"tc Starglow-0036","ix":47,"v":{"a":0,"k":[0,0,1,0],"ix":47}},{"ty":6,"nm":"","mn":"tc Starglow-0037","ix":48,"v":0},{"ty":6,"nm":"Colormap C","mn":"tc Starglow-0038","ix":49,"v":0},{"ty":7,"nm":"Preset","mn":"tc Starglow-0039","ix":50,"v":{"a":0,"k":7,"ix":50}},{"ty":2,"nm":"Highlights","mn":"tc Starglow-0040","ix":51,"v":{"a":0,"k":[1,1,1,0],"ix":51}},{"ty":2,"nm":"Mid High","mn":"tc Starglow-0041","ix":52,"v":{"a":0,"k":[0.78431372549,1,0.501960784314,1],"ix":52}},{"ty":2,"nm":"Midtones","mn":"tc Starglow-0042","ix":53,"v":{"a":0,"k":[0.650980392157,1,0,0.035294117647],"ix":53}},{"ty":2,"nm":"Mid Low","mn":"tc Starglow-0043","ix":54,"v":{"a":0,"k":[0.313725490196,1,0,1],"ix":54}},{"ty":2,"nm":"Shadows","mn":"tc Starglow-0044","ix":55,"v":{"a":0,"k":[0,1,0,0],"ix":55}},{"ty":6,"nm":"","mn":"tc Starglow-0045","ix":56,"v":0},{"ty":6,"nm":"Shimmer","mn":"tc Starglow-0060","ix":57,"v":0},{"ty":0,"nm":"Amount","mn":"tc Starglow-0061","ix":58,"v":{"a":0,"k":0,"ix":58}},{"ty":0,"nm":"Detail","mn":"tc Starglow-0062","ix":59,"v":{"a":0,"k":10,"ix":59}},{"ty":0,"nm":"Phase","mn":"tc Starglow-0063","ix":60,"v":{"a":0,"k":0,"ix":60}},{"ty":7,"nm":"Use Loop","mn":"tc Starglow-0064","ix":61,"v":{"a":0,"k":0,"ix":61}},{"ty":0,"nm":"Revolutions in Loop","mn":"tc Starglow-0065","ix":62,"v":{"a":0,"k":1,"ix":62}},{"ty":6,"nm":"","mn":"tc Starglow-0066","ix":63,"v":0},{"ty":0,"nm":"Source Opacity","mn":"tc Starglow-0056","ix":64,"v":{"a":0,"k":100,"ix":64}},{"ty":0,"nm":"Starglow Opacity","mn":"tc Starglow-0057","ix":65,"v":{"a":0,"k":43,"ix":65}},{"ty":7,"nm":"Transfer Mode","mn":"tc Starglow-0058","ix":66,"v":{"a":0,"k":7,"ix":66}}]}],"w":800,"h":600,"ip":0,"op":241,"st":-16,"bm":0}]} \ No newline at end of file diff --git a/example/resource/gradient_sleepy_loader.json b/example/resource/gradient_sleepy_loader.json new file mode 100644 index 0000000000..2881125f7f --- /dev/null +++ b/example/resource/gradient_sleepy_loader.json @@ -0,0 +1 @@ +{"v":"5.1.8","fr":23.9759979248047,"ip":0,"op":240.999979140721,"w":300,"h":300,"nm":"SynthesisProto_Loader","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-180],"e":[180]},{"t":239.999979227274}],"ix":10},"p":{"a":0,"k":[150.125,150,0],"ix":2},"a":{"a":0,"k":[533,533,0],"ix":1},"s":{"a":0,"k":[16,16,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[65.74,-27.805],[48.897,-48.895],[26.837,-63.449],[0,-71.877],[-27.805,-65.739],[-48.894,-48.896],[-63.449,-26.837],[-71.878,0],[-65.739,27.805],[-48.895,48.895],[-26.837,63.449],[0,71.878],[27.805,65.739],[48.896,48.896],[63.449,26.837],[71.877,0]],"o":[[-63.449,26.837],[-48.894,48.896],[-27.805,65.739],[0,71.878],[26.837,63.449],[48.897,48.895],[65.74,27.805],[71.877,0],[63.449,-26.837],[48.896,-48.896],[27.805,-65.739],[0,-71.877],[-26.837,-63.449],[-48.895,-48.895],[-65.739,-27.805],[-71.878,0]],"v":[[-207.395,-490.833],[-376.703,-376.703],[-490.833,-207.394],[-532.735,0],[-490.833,207.393],[-376.703,376.702],[-207.395,490.833],[0,532.735],[207.394,490.833],[376.702,376.702],[490.833,207.393],[532.738,0],[490.833,-207.394],[376.702,-376.703],[207.394,-490.833],[0,-532.738]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[65.201,65.2],[0,92.206],[-65.199,65.2],[-92.207,0],[-65.2,-65.2],[0,-92.206],[65.2,-65.201],[92.206,0]],"o":[[-65.199,-65.201],[0,-92.206],[65.201,-65.2],[92.206,0],[65.2,65.2],[0,92.206],[-65.2,65.2],[-92.207,0]],"v":[[-244.095,244.094],[-345.202,0],[-244.095,-244.094],[0,-345.202],[244.095,-244.094],[345.202,0],[244.095,244.094],[0,345.202]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.133,0.063,0.282,0.5,0.386,0.257,0.459,1,0.639,0.451,0.635],"ix":9}},"s":{"a":0,"k":[661,0],"ix":5},"e":{"a":0,"k":[-690,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[533,533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":720.999937595269,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[180],"e":[-180]},{"t":239.999979227274}],"ix":10},"p":{"a":0,"k":[150.125,150,0],"ix":2},"a":{"a":0,"k":[726,726,0],"ix":1},"s":{"a":0,"k":[16,16,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-400.378],[-400.379,0],[0,400.378],[400.378,0]],"o":[[0,400.378],[400.378,0],[0,-400.378],[-400.379,0]],"v":[[-724.948,0],[0,724.949],[724.948,0],[0,-724.949]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.133,0.063,0.282,0.5,0.386,0.257,0.459,1,0.639,0.451,0.635],"ix":9}},"s":{"a":0,"k":[200,0],"ix":5},"e":{"a":0,"k":[-608,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[726,726],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":720.999937595269,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/intelia_logo_animation.json b/example/resource/intelia_logo_animation.json new file mode 100644 index 0000000000..a82c26a532 --- /dev/null +++ b/example/resource/intelia_logo_animation.json @@ -0,0 +1 @@ +{"v":"5.1.3","fr":24,"ip":0,"op":207,"w":850,"h":850,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_25","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12.372,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36.085,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":92.997,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":116.71,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":130.938,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":152.281,"s":[0],"e":[100]},{"t":175.994140625}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-45],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0],"e":[360]},{"t":175.994140625}],"ix":10},"p":{"a":0,"k":[580.426,1041.493,0],"ix":2},"a":{"a":0,"k":[-356.047,-391.199,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[156.703,156.703],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-194.047,-395.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 5","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":19.484,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":43.199,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55.056,"s":[0],"e":[67]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78.77,"s":[67],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":102.482,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":152.281,"s":[0],"e":[100]},{"t":175.994140625}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-468.047,-441.199,0],"ix":2},"a":{"a":0,"k":[-194.047,-395.199,0],"ix":1},"s":{"a":0,"k":[53,53,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[156.703,156.703],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-194.047,-395.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3}]},{"id":"comp_26","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35.253,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71.7,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":127.79,"s":[100],"e":[0]},{"t":165.1826171875}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[742.953,606.801,0],"e":[448.953,366.801,0],"to":[-49,-40,0],"ti":[49,40,0]},{"t":166.0048828125}],"ix":2},"a":{"a":0,"k":[-194.047,-395.199,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[156.703,156.703],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-194.047,-395.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 4","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93.365,"s":[100],"e":[0]},{"t":166.0048828125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-426.047,-547.199,0],"ix":2},"a":{"a":0,"k":[-194.047,-395.199,0],"ix":1},"s":{"a":0,"k":[39,39,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[156.703,156.703],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-194.047,-395.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23.598,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93.365,"s":[100],"e":[0]},{"t":166.0048828125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-267.047,-558.199,0],"ix":2},"a":{"a":0,"k":[-194.047,-395.199,0],"ix":1},"s":{"a":0,"k":[78,78,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[156.703,156.703],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-194.047,-395.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3}]},{"id":"comp_27","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Combined Shape 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"t":10}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25.525,25.765,0],"ix":2},"a":{"a":0,"k":[38.73,33.425,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[20,0],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[21.5,1.5],"ix":2},"a":{"a":0,"k":[21.5,1.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[14,5],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[15.5,6.5],"ix":2},"a":{"a":0,"k":[15.5,6.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 2","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[10,10],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[11.5,11.5],"ix":2},"a":{"a":0,"k":[11.5,11.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 4","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[5,15],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[6.5,16.5],"ix":2},"a":{"a":0,"k":[6.5,16.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 6","np":1,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[0,20],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[1.5,21.5],"ix":2},"a":{"a":0,"k":[1.5,21.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 8","np":1,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[26,6],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[27.5,7.5],"ix":2},"a":{"a":0,"k":[27.5,7.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy","np":1,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[20,11],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[21.5,12.5],"ix":2},"a":{"a":0,"k":[21.5,12.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 3","np":1,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[16,16],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[17.5,17.5],"ix":2},"a":{"a":0,"k":[17.5,17.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 5","np":1,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[11,21],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[12.5,22.5],"ix":2},"a":{"a":0,"k":[12.5,22.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 7","np":1,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[6,26],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[7.5,27.5],"ix":2},"a":{"a":0,"k":[7.5,27.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 9","np":1,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.479,8.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[174.15,174.15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined Shape","np":11,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3},{"ddd":0,"ind":2,"ty":4,"nm":"Combined Shape","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"t":10}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[25.525,25.765,0],"ix":2},"a":{"a":0,"k":[38.73,33.425,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[20,0],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[21.5,1.5],"ix":2},"a":{"a":0,"k":[21.5,1.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[14,5],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[15.5,6.5],"ix":2},"a":{"a":0,"k":[15.5,6.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 2","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[10,10],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[11.5,11.5],"ix":2},"a":{"a":0,"k":[11.5,11.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 4","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[5,15],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[6.5,16.5],"ix":2},"a":{"a":0,"k":[6.5,16.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 6","np":1,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[0,20],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[1.5,21.5],"ix":2},"a":{"a":0,"k":[1.5,21.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 8","np":1,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[26,6],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[27.5,7.5],"ix":2},"a":{"a":0,"k":[27.5,7.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy","np":1,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[20,11],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[21.5,12.5],"ix":2},"a":{"a":0,"k":[21.5,12.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 3","np":1,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[16,16],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[17.5,17.5],"ix":2},"a":{"a":0,"k":[17.5,17.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 5","np":1,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[11,21],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[12.5,22.5],"ix":2},"a":{"a":0,"k":[12.5,22.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 7","np":1,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3,3],"ix":2},"p":{"a":0,"k":[6,26],"ix":3,"x":"var $bm_rt;\n$bm_rt = sum(div(thisProperty.propertyGroup(1)(2), 2), value);"},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[7.5,27.5],"ix":2},"a":{"a":0,"k":[7.5,27.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval Copy 9","np":1,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.479,8.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[174.15,174.15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined Shape","np":11,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":3}]},{"id":"comp_28","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"top gradient 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[676.793,592.214,0],"ix":2},"a":{"a":0,"k":[161.771,185.625,0],"ix":1},"s":{"a":0,"k":[167.414,156.485,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-32.615,36.219],[38.821,39.666],[0,0],[30.168,-34.428],[-34.643,-35.416]],"o":[[0,0],[35.421,36.573],[33.486,-37.186],[0,0],[-34.643,-35.408],[-32.698,37.315],[0,0]],"v":[[145.847,276.337],[188.716,320.16],[308.833,322.591],[302.799,191.193],[166.892,47.089],[45.018,50.252],[50.711,177.105]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":2,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[20.389,22.001],"ix":4},"e":{"a":0,"k":[333.534,351.158],"ix":5},"t":1,"lc":2,"lj":2,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":0,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":6,"ix":2}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.016,0.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[100]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[360],"e":[432]},{"t":206}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":582,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"bottom gradient 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[704.229,761.465,0],"ix":2},"a":{"a":0,"k":[178.51,145.63,0],"ix":1},"s":{"a":0,"k":[166.241,155.588,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[309.169,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":2,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[20.389,22.001],"ix":4},"e":{"a":0,"k":[333.534,351.158],"ix":5},"t":1,"lc":2,"lj":2,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":0,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":6,"ix":2}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[100]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[360],"e":[432]},{"t":206}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":582,"st":0,"bm":0}]},{"id":"comp_29","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"top gradient 2","sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[630.311,697.664,0],"ix":2},"a":{"a":0,"k":[129.266,259.367,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-32.615,36.219],[38.821,39.666],[0,0],[30.168,-34.428],[-34.643,-35.416]],"o":[[0,0],[35.421,36.573],[33.486,-37.186],[0,0],[-34.643,-35.408],[-32.698,37.315],[0,0]],"v":[[145.847,276.337],[188.716,320.16],[308.833,322.591],[302.799,191.193],[166.892,47.089],[45.018,50.252],[50.711,177.105]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[20.389,22.001],"ix":4},"e":{"a":0,"k":[333.534,351.158],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.016,0.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"bottom gradient 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":10,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,151.01,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[309.169,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[23.323,352.344],"ix":4},"e":{"a":0,"k":[333.867,22.766],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":582,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"bottom left","refId":"comp_25","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425,425,0],"ix":2},"a":{"a":0,"k":[700,700,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[19.3,-20.909],[-77.841,-87.143],[-26.626,37],[0,0],[0,0],[3.979,-3.943],[21.354,-8.993],[33.25,31.25],[-10.06,22.855],[0,0],[0,0],[0,0],[0,0]],"o":[[-18,19.501],[79.5,89],[4.366,-6.067],[0,0],[0,0],[-27.626,27.375],[-21.341,8.987],[-35.098,-32.987],[10.863,-24.679],[0,0],[0,0],[0,0],[0,0]],"v":[[478,811.999],[484,1028.5],[710.626,1031.25],[906.174,825.585],[828.745,800.692],[708.251,928.75],[636.146,997.493],[543.5,985],[522.637,879.679],[549.5,841.499],[726.796,651.11],[671.014,605.492],[511.727,774.458]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":1400,"h":1400,"ip":30,"op":207,"st":30,"bm":3},{"ddd":0,"ind":2,"ty":0,"nm":"Shape Layer 2 Comp 1","refId":"comp_26","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425,425,0],"ix":2},"a":{"a":0,"k":[700,700,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[60.5,-58.625],[0,0],[-29.176,-33.894],[0,0],[0,0],[2.138,9.397],[-42.42,36.582],[-11.955,-11.937],[0,0],[0,0],[10.352,8.203]],"o":[[0,0],[-61.774,59.859],[0,0],[15.824,18.981],[0,0],[0,0],[-15.362,-24.603],[39.578,-34.132],[9.545,1.063],[0,0],[0,0],[-24.898,-22.047]],"v":[[627.3,325.45],[491.5,365.625],[442.454,504.046],[478.176,589.519],[603.472,718.436],[649.702,663.18],[528.362,535.103],[543.17,417.168],[643.955,408.437],[868.819,643.157],[915.114,587.104],[693.648,354.297]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":1400,"h":1400,"ip":40,"op":207,"st":40,"bm":3},{"ddd":0,"ind":3,"ty":0,"nm":"dot dot","refId":"comp_27","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":87.39,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":111.085,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":134.78,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":182.17,"s":[100],"e":[0]},{"t":205.865234375}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[356,425,0],"ix":2},"a":{"a":0,"k":[25.5,26,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":51,"h":52,"ip":40,"op":207,"st":40,"bm":3},{"ddd":0,"ind":4,"ty":0,"nm":"dot dot 3","refId":"comp_27","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":132.41,"s":[100],"e":[0]},{"t":156.10546875}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49.478,"s":[97],"e":[103]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.217,"s":[103],"e":[151]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66.064,"s":[151],"e":[205]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":82.651,"s":[205],"e":[254]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":103.977,"s":[254],"e":[267]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":118.193,"s":[267],"e":[273]},{"t":156.10546875}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.171,"y":0.523},"o":{"x":0.202,"y":0},"n":"0p171_0p523_0p202_0","t":40,"s":[478.5,197,0],"e":[605.211,514.635,0],"to":[190.990447998047,160.949462890625,0],"ti":[57.1761779785156,-54.6577949523926,0]},{"i":{"x":0.46,"y":1},"o":{"x":0.166,"y":0.528},"n":"0p46_1_0p166_0p528","t":75.542,"s":[605.211,514.635,0],"e":[391,454,0],"to":[-53.2955093383789,50.9480514526367,0],"ti":[55.3542785644531,99.6731643676758,0]},{"t":205.865234375}],"ix":2},"a":{"a":0,"k":[25.5,26,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":51,"h":52,"ip":40,"op":207,"st":40,"bm":3},{"ddd":0,"ind":5,"ty":4,"nm":"circle 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[408.811,344.164,0],"ix":2},"a":{"a":0,"k":[178.217,185.94,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[141.106,206.717],[110.43,239.196],[145.39,275.784],[176.591,242.256]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":85,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[185.289,276.851],"e":[108.695,204.332],"to":[-12.7656526565552,-12.0863838195801],"ti":[12.7656526565552,12.0863838195801]},{"t":158.474609375}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[34.114,34.114],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[0],"e":[100]},{"t":63.6953125}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":207,"st":40,"bm":3},{"ddd":0,"ind":6,"ty":4,"nm":"bottom intersect","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.46,267.714,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[124.626,32.564],[39.976,108.706],[124.626,184.848],[209.277,108.706]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[310.568,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[23.323,352.344],"ix":4},"e":{"a":0,"k":[333.867,22.766],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[100]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[360]},{"t":40}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425.311,317.664,0],"ix":2},"a":{"a":0,"k":[178.217,185.94,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[110.862,203.395],[71.706,235.962],[161.474,328.756],[199.493,295.053]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":85,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87.39,"s":[125.589,217.812],"e":[100.818,262.368],"to":[-4.1284236907959,7.42597246170044],"ti":[4.1284236907959,-7.42597246170044]},{"t":205.865234375}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[34.114,34.114],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":87.39,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":111.085,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":182.17,"s":[100],"e":[0]},{"t":205.865234375}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":207,"st":40,"bm":3},{"ddd":0,"ind":8,"ty":0,"nm":"dot dot 2","refId":"comp_27","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96.868,"s":[100],"e":[0]},{"t":108.7158203125}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.21,"y":1},"o":{"x":0.996,"y":0},"n":"0p21_1_0p996_0","t":63.695,"s":[438.5,506,0],"e":[354.5,426,0],"to":[-14,-13.3333330154419,0],"ti":[14,13.3333330154419,0]},{"t":134.7802734375}],"ix":2},"a":{"a":0,"k":[25.5,26,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":51,"h":52,"ip":50,"op":207,"st":50,"bm":3},{"ddd":0,"ind":9,"ty":4,"nm":"top intersect","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[0],"e":[50]},{"t":30}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425.311,317.664,0],"ix":2},"a":{"a":0,"k":[178.217,185.94,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.194,150.86],[25.552,210.787],[167.942,347.812],[223.269,294.703]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-32.615,36.219],[38.821,39.666],[0,0],[30.168,-34.428],[-34.643,-35.416]],"o":[[0,0],[35.421,36.573],[33.486,-37.186],[0,0],[-34.643,-35.408],[-32.698,37.315],[0,0]],"v":[[144.798,275.288],[192.388,323.656],[308.833,322.591],[302.799,191.193],[166.892,47.089],[45.018,50.252],[50.711,177.105]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":7,"k":{"a":0,"k":[0,0.639,0.294,0.588,0.177,0.32,0.147,0.369,0.354,0,0,0.149,0.528,0,0,0.149,0.701,0,0,0.149,0.85,0.139,0.286,0.437,0.999,0.278,0.573,0.725],"ix":8}},"s":{"a":0,"k":[62.14,189.033],"ix":4},"e":{"a":0,"k":[193.065,322.973],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.016,0.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[100]},{"t":45}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[360]},{"t":45}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[177.755,185.625],"ix":2},"a":{"a":0,"k":[177.755,185.625],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"path animation","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"top gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425.311,317.664,0],"ix":2},"a":{"a":0,"k":[178.217,185.94,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-32.615,36.219],[38.821,39.666],[0,0],[30.168,-34.428],[-34.643,-35.416]],"o":[[0,0],[35.421,36.573],[33.486,-37.186],[0,0],[-34.643,-35.408],[-32.698,37.315],[0,0]],"v":[[145.847,276.337],[188.716,320.16],[308.833,322.591],[302.799,191.193],[166.892,47.089],[45.018,50.252],[50.711,177.105]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[20.389,22.001],"ix":4},"e":{"a":0,"k":[333.534,351.158],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.016,0.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[100]},{"t":45}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[360]},{"t":45}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"dot dot 4","refId":"comp_27","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":40,"s":[484,655,0],"e":[455,682.5,0],"to":[-4.83333349227905,4.58333349227905,0],"ti":[-18.1666660308838,18.25,0]},{"i":{"x":0,"y":1},"o":{"x":0.013,"y":0},"n":"0_1_0p013_0","t":87.39,"s":[455,682.5,0],"e":[593,545.5,0],"to":[18.1666660308838,-18.25,0],"ti":[-23,22.8333339691162,0]},{"t":111.0849609375}],"ix":2},"a":{"a":0,"k":[25.5,26,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":51,"h":52,"ip":40,"op":207,"st":40,"bm":3},{"ddd":0,"ind":12,"ty":4,"nm":"botto center shadow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[0],"e":[50]},{"t":32}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.46,267.714,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[222.668,-8.017],[147.58,16.983],[253,122.403],[292.86,67.857]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[309.169,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0,0,0.149,0.5,0.149,0.278,0.433,1,0.298,0.557,0.718],"ix":8}},"s":{"a":0,"k":[252.962,23.148],"ix":4},"e":{"a":0,"k":[186.511,57.098],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[100]},{"t":45}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[360]},{"t":45}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"bottom right shadow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[0],"e":[50]},{"t":33}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.46,267.714,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[27.966,-20.988]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-43.954,32.986]],"v":[[229.381,220.652],[163.13,232.882],[245.771,315.523],[345.496,189.019],[355.903,137.559],[314.719,201.432]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[309.169,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.576,0.341,0.612,0.5,0.288,0.171,0.38,1,0,0,0.149],"ix":8}},"s":{"a":0,"k":[209.954,279.226],"ix":4},"e":{"a":0,"k":[289.12,209.59],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[100]},{"t":45}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[360]},{"t":45}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"bottom gradient","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.46,267.714,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[309.169,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":51,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.078,0.482,0.5,0.488,0.41,0.645,1,0.059,0.741,0.808],"ix":8}},"s":{"a":0,"k":[23.323,352.344],"ix":4},"e":{"a":0,"k":[333.867,22.766],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[100]},{"t":45}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":5,"s":[0],"e":[360]},{"t":45}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"Ub=nder Lines Tones","refId":"comp_28","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.31],"y":[0]},"n":["0_1_0p31_0"],"t":20,"s":[0],"e":[-27]},{"t":40}],"ix":10},"p":{"a":0,"k":[435,415,0],"ix":2},"a":{"a":0,"k":[700,700,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1400,"h":1400,"ip":0,"op":207,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"underTone","refId":"comp_29","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[0],"e":[50]},{"t":30}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[0]},"o":{"x":[0.32],"y":[0]},"n":["0_0_0p32_0"],"t":20,"s":[0],"e":[-30]},{"t":40}],"ix":10},"p":{"a":0,"k":[357,421,0],"ix":2},"a":{"a":0,"k":[632,696,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1400,"h":1400,"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"underTone","refId":"comp_29","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[0],"e":[100]},{"t":30}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[0]},"o":{"x":[0.32],"y":[0]},"n":["0_0_0p32_0"],"t":20,"s":[0],"e":[-12]},{"t":40}],"ix":10},"p":{"a":0,"k":[357,421,0],"ix":2},"a":{"a":0,"k":[632,696,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1400,"h":1400,"ip":5,"op":207,"st":5,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"pre-top 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425.311,317.664,0],"ix":2},"a":{"a":0,"k":[178.217,185.94,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[30.168,-34.428],[-34.643,-35.416],[0,0],[0,0],[-32.615,36.219],[38.821,39.666]],"o":[[-34.643,-35.408],[-32.698,37.315],[0,0],[0,0],[35.421,36.573],[33.486,-37.186],[0,0]],"v":[[166.892,47.089],[45.018,50.252],[50.711,177.105],[145.148,276.687],[188.716,320.16],[308.833,322.591],[302.799,191.193]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.226922487745,0.270561427696,0.314200367647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":51,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.016,0.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[30]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[360]},{"t":40}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":41,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"pre-top","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[425.311,317.664,0],"ix":2},"a":{"a":0,"k":[178.217,185.94,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-32.615,36.219],[38.821,39.666],[0,0],[30.168,-34.428],[-34.643,-35.416],[0,0],[0,0]],"o":[[33.486,-37.186],[0,0],[-34.643,-35.408],[-32.698,37.315],[0,0],[0,0],[35.421,36.573]],"v":[[308.833,322.591],[302.799,191.193],[166.892,47.089],[45.018,50.252],[50.711,177.105],[145.148,276.687],[188.716,320.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.226922487745,0.270561427696,0.314200367647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":51,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.016,0.071],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[30]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[360]},{"t":40}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":41,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"pre-bottom 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.46,267.714,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437],[0,0],[0,0],[-31.766,-33.004]],"o":[[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0],[0,0],[-34.481,35.437],[32.568,33.837]],"v":[[168.402,323.543],[307.278,175.855],[310.568,47.695],[188.989,47.857],[122.383,118.689],[50.12,195.537],[46.83,323.705]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.226922487745,0.270561427696,0.314200367647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":51,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[30]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[360]},{"t":40}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":41,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"pre-bottom","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[170.46,267.714,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[143,143,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-31.766,-33.004],[-34.481,35.437],[0,0],[32.662,35.352],[34.489,-35.437]],"o":[[0,0],[-34.481,35.437],[32.568,33.837],[0,0],[34.481,-35.429],[-32.658,-35.348],[0,0]],"v":[[122.383,118.689],[50.12,195.537],[46.83,323.705],[168.402,323.543],[307.278,175.855],[310.568,47.695],[188.989,47.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.226922487745,0.270561427696,0.314200367647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":51,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[30]},{"t":40}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.13],"y":[1]},"o":{"x":[0.437],"y":[0]},"n":["0p13_1_0p437_0"],"t":0,"s":[0],"e":[360]},{"t":40}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":41,"st":0,"bm":0}],"markers":[{"tm":0.06944444444444,"cm":"1","dr":0}]} \ No newline at end of file diff --git a/example/resource/issue/insta_camera.json b/example/resource/issue/insta_camera.json new file mode 100644 index 0000000000..945c3b2f1d --- /dev/null +++ b/example/resource/issue/insta_camera.json @@ -0,0 +1 @@ +{"v":"5.0.1","fr":30.0000305175781,"ip":0,"op":124.000126139323,"w":800,"h":600,"nm":"Camera_003_render","ddd":0,"assets":[{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"flash ring","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[133,-67,0],"ix":2},"a":{"a":0,"k":[74,-135,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.09,0.09],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p09_1_0p167_0p167","0p09_1_0p167_0p167"],"t":73,"s":[0,0],"e":[148,148]},{"t":79.0000803629557}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.09],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p09_1_0p167_0p167"],"t":73,"s":[23],"e":[0]},{"t":82.0000834147135}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[74,-135],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":73.0000742594401,"op":83.0000844319661,"st":73.0000742594401,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"button lines","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-35.5,-60.5,0],"ix":2},"a":{"a":0,"k":[72.5,-149.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[91,-152.25],[108,-160.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[60.25,-161.75],[49,-177.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.25,2.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[73.75,-162.5],[80.75,-179]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.25,2.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[53,-150.5],[34.25,-159.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.08],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p08_1_0p167_0p167"],"t":73.539,"s":[0],"e":[100]},{"t":80.0000813802083}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.08],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p08_1_0p167_0p167"],"t":71,"s":[0],"e":[100]},{"t":80.0000813802083}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":5,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":71.0000722249349,"op":81.0000823974609,"st":71.0000722249349,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"flash light","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71,"s":[35.264],"e":[102.264]},{"t":80.0000813802083}],"ix":10},"p":{"a":0,"k":[132,-68,0],"ix":2},"a":{"a":0,"k":[-340,-162,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":143.286,"ix":5},"ir":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71,"s":[0],"e":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76,"s":[25],"e":[0]},{"t":80.0000813802083}],"ix":6},"is":{"a":0,"k":193,"ix":8},"or":{"a":0,"k":73.6,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,1,0.988235294118,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-340,-162],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":71.0000722249349,"op":81.0000823974609,"st":71.0000722249349,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"face button mask","parent":19,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-27,"s":[-2,-6.5,0],"e":[-2,-6.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":56,"s":[-2,-6.5,0],"h":1},{"t":66.0000671386719,"s":[-2,-6.5,0],"h":1}],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p14_1_0p167_0p167","0p14_1_0p167_0p167"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[216,302],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":101,"s":[216,302],"e":[0,302]},{"t":110.000111897786}],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('body').content('Rectangle 1').content('Rectangle Path 1').size;"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.204152006261,0.019608000213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"face button","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":89.999,"ix":10},"p":{"a":0,"k":[34.724,96.498,0],"ix":2},"a":{"a":0,"k":[3,4,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.35,0.35],"y":[1,1]},"o":{"x":[0.54,0.54],"y":[0,0]},"n":["0p35_1_0p54_0","0p35_1_0p54_0"],"t":28,"s":[0,0],"e":[32,32]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0"],"t":48,"s":[32,32],"e":[32,32]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.53,0.53],"y":[0,0]},"n":["0p833_0p833_0p53_0","0p833_0p833_0p53_0"],"t":97,"s":[32,32],"e":[105,105]},{"t":135.000137329102}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[3,4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":28.0000284830729,"op":124.000126139323,"st":28.0000284830729,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line mask","parent":19,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":0,"k":[-2,-6.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.54,0.54],"y":[0,0]},"n":["0p14_1_0p54_0","0p14_1_0p54_0"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"t":17.0000172932943}],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('body').content('Rectangle 1').content('Rectangle Path 1').size;"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.929412004059,0.929412004059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"line","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90.084,"ix":10},"p":{"a":0,"k":[68.999,-5.896,0],"ix":2},"a":{"a":0,"k":[0.5,-56,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-171.5,-56],[165.5,-56]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.59],"y":[1]},"o":{"x":[0.29],"y":[0]},"n":["0p59_1_0p29_0"],"t":16,"s":[50],"e":[0]},{"t":33.0000335693359}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.59],"y":[1]},"o":{"x":[0.29],"y":[0]},"n":["0p59_1_0p29_0"],"t":16,"s":[50],"e":[100]},{"t":33.0000335693359}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.929412004059,0.929412004059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16.0000162760417,"op":124.000126139323,"st":16.0000162760417,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"flash mask","parent":19,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":0,"k":[-2,-6.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.54,0.54],"y":[0,0]},"n":["0p14_1_0p54_0","0p14_1_0p54_0"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"t":17.0000172932943}],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('body').content('Rectangle 1').content('Rectangle Path 1').size;"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.929412004059,0.929412004059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"button","parent":20,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90.004,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":29,"s":[70.511],"e":[102.512]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[102.512],"e":[102.512]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71,"s":[102.512],"e":[92.512]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":74,"s":[92.512],"e":[102.512]},{"i":{"x":[0.823],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p823_1_0p167_0"],"t":77,"s":[102.512],"e":[102.512]},{"i":{"x":[0.745],"y":[1]},"o":{"x":[1],"y":[-0.47]},"n":["0p745_1_1_-0p47"],"t":93,"s":[102.512],"e":[72.512]},{"t":105.000106811523}],"ix":3,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('X Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('X Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('X Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":29,"s":[-176.891],"e":[-176.421]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[-176.421],"e":[-176.421]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71,"s":[-176.421],"e":[-176.421]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":74,"s":[-176.421],"e":[-176.421]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":77,"s":[-176.421],"e":[-176.421]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93,"s":[-176.421],"e":[-176.421]},{"t":105.000106811523}],"ix":4}},"a":{"a":0,"k":[94,-107.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"X Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"X Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"X Position - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[26,86],"ix":2},"p":{"a":0,"k":[74,24],"ix":3},"r":{"a":0,"k":24,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[94,-107.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29.0000295003255,"op":106.000107828776,"st":29.0000295003255,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"body mask","parent":19,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":0,"k":[-2,-6.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.54,0.54],"y":[0,0]},"n":["0p14_1_0p54_0","0p14_1_0p54_0"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"t":17.0000172932943}],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('body').content('Rectangle 1').content('Rectangle Path 1').size;"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.929412004059,0.929412004059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"flash","parent":20,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90.004,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27,"s":[71.498],"e":[129.499]},{"i":{"x":[0.885],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p885_1_0p167_0"],"t":39,"s":[129.499],"e":[129.499]},{"i":{"x":[0.683],"y":[1]},"o":{"x":[0.688],"y":[-0.339]},"n":["0p683_1_0p688_-0p339"],"t":99,"s":[129.499],"e":[69.499]},{"t":110.000111897786}],"ix":3,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('X Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('X Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('X Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.59],"y":[0]},"n":["0p833_0p833_0p59_0"],"t":27,"s":[-6.965],"e":[-6.42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":39,"s":[-6.42],"e":[-6.42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":99,"s":[-6.42],"e":[-6.42]},{"t":110.000111897786}],"ix":4,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Y Position - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Y Position - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Y Position - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"}},"a":{"a":0,"k":[94,-107.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Y Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Y Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Y Position - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"X Position - Overshoot","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"X Position - Bounce","np":3,"mn":"ADBE Slider Control","ix":5,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"X Position - Friction","np":3,"mn":"ADBE Slider Control","ix":6,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[79,72.861],"ix":2},"p":{"a":0,"k":[72,22],"ix":3},"r":{"a":0,"k":9,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[94,-107.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":27.0000274658203,"op":107.000108846029,"st":27.0000274658203,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"lens mask 2","parent":19,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-27,"s":[-2,-6.5,0],"e":[-2,-6.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":56,"s":[-2,-6.5,0],"h":1},{"t":66.0000671386719,"s":[-2,-6.5,0],"h":1}],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p14_1_0p167_0p167","0p14_1_0p167_0p167"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[216,302],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":101,"s":[216,302],"e":[0,302]},{"t":110.000111897786}],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('body').content('Rectangle 1').content('Rectangle Path 1').size;"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.204152006261,0.019608000213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"lens","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-22,-28.5,0],"ix":2},"a":{"a":0,"k":[3,4,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Size - Ellipse Path 1 - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Size - Ellipse Path 1 - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Size - Ellipse Path 1 - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.54,0.54],"y":[0,0]},"n":["0p833_0p833_0p54_0","0p833_0p833_0p54_0"],"t":21,"s":[0,0],"e":[94,94]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0"],"t":41,"s":[94,94],"e":[94,94]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.87,0.87],"y":[0,0]},"n":["0p833_0p833_0p87_0","0p833_0p833_0p87_0"],"t":97,"s":[94,94],"e":[183,183]},{"t":123.00012512207}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Size - Ellipse Path 1 - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Size - Ellipse Path 1 - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Size - Ellipse Path 1 - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[3,4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":21.0000213623047,"op":124.000126139323,"st":21.0000213623047,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"lens mask","parent":19,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-27,"s":[-2,-6.5,0],"e":[-2,-6.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":56,"s":[-2,-6.5,0],"h":1},{"t":66.0000671386719,"s":[-2,-6.5,0],"h":1}],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p14_1_0p167_0p167","0p14_1_0p167_0p167"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":17,"s":[216,302],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":101,"s":[216,302],"e":[0,302]},{"t":110.000111897786}],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('body').content('Rectangle 1').content('Rectangle Path 1').size;"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.204152006261,0.019608000213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"lens","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-22,-28.5,0],"ix":2},"a":{"a":0,"k":[3,4,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Size - Ellipse Path 1 - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Size - Ellipse Path 1 - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Size - Ellipse Path 1 - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":100,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.54,0.54],"y":[0,0]},"n":["0p833_0p833_0p54_0","0p833_0p833_0p54_0"],"t":15,"s":[0,0],"e":[136,136]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0"],"t":35,"s":[136,136],"e":[136,136]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.87,0.87],"y":[0,0]},"n":["0p833_0p833_0p87_0","0p833_0p833_0p87_0"],"t":97,"s":[136,136],"e":[212,212]},{"t":123.00012512207}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Size - Ellipse Path 1 - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Size - Ellipse Path 1 - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Size - Ellipse Path 1 - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[3,4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15.0000152587891,"op":124.000126139323,"st":15.0000152587891,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":".gannon-gram","cl":"gannon-gram","parent":20,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":90.004,"ix":10},"p":{"a":0,"k":[85.672,-6.451,0],"ix":2},"a":{"a":0,"k":[-0.257,-6.362,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.887],[-4.517,0],[-1.575,1.76],[0,0],[0,0],[0,0],[0,0],[0,0],[1.413,0],[0,2.919],[-2.803,0],[-0.718,-1.089],[0,0],[3.196,0]],"o":[[0,4.864],[2.803,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.672,0.602],[-2.803,0],[0,-2.919],[1.621,0],[0,0],[-1.181,-1.83],[-4.517,0]],"v":[[-101.849,-7.713],[-93.626,0.301],[-87.048,-2.617],[-87.048,-8.524],[-94.414,-8.524],[-94.414,-5.698],[-90.291,-5.698],[-90.291,-3.822],[-93.626,-2.641],[-98.467,-7.713],[-93.626,-12.786],[-89.966,-10.84],[-87.233,-12.323],[-93.626,-15.704]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"G","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.614,0],[-66.024,0],[-71.976,-15.45],[-76.099,-15.45],[-82.075,0],[-78.462,0],[-77.489,-2.664],[-70.587,-2.664]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-74.038,-12.601],[-71.49,-5.513],[-76.609,-5.513]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":5,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-49.766,0],[-46.593,0],[-46.593,-15.45],[-49.882,-15.45],[-49.882,-5.443],[-57.039,-15.45],[-60.421,-15.45],[-60.421,0],[-57.132,0],[-57.132,-10.377]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"N","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-28.721,0],[-25.548,0],[-25.548,-15.45],[-28.837,-15.45],[-28.837,-5.443],[-35.995,-15.45],[-39.376,-15.45],[-39.376,0],[-36.087,0],[-36.087,-10.377]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"N","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.656],[-4.656,0],[0,4.656],[4.679,0]],"o":[[0,4.656],[4.679,0],[0,-4.656],[-4.656,0]],"v":[[-19.073,-7.713],[-11.012,0.278],[-2.928,-7.713],[-11.012,-15.704]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-2.895],[2.849,0],[0,2.872],[-2.849,0]],"o":[[0,2.872],[-2.849,0],[0,-2.895],[2.849,0]],"v":[[-6.31,-7.713],[-11.012,-2.641],[-15.691,-7.713],[-11.012,-12.786]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"O","np":5,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[14.196,0],[17.37,0],[17.37,-15.45],[14.081,-15.45],[14.081,-5.443],[6.923,-15.45],[3.541,-15.45],[3.541,0],[6.831,0],[6.831,-10.377]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"N","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.887],[-4.517,0],[-1.575,1.76],[0,0],[0,0],[0,0],[0,0],[0,0],[1.413,0],[0,2.919],[-2.803,0],[-0.718,-1.089],[0,0],[3.196,0]],"o":[[0,4.864],[2.803,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.672,0.602],[-2.803,0],[0,-2.919],[1.621,0],[0,0],[-1.181,-1.83],[-4.517,0]],"v":[[23.845,-7.713],[32.068,0.301],[38.646,-2.617],[38.646,-8.524],[31.28,-8.524],[31.28,-5.698],[35.403,-5.698],[35.403,-3.822],[32.068,-2.641],[27.227,-7.713],[32.068,-12.786],[35.727,-10.84],[38.461,-12.323],[32.068,-15.704]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"G","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,2.733],[3.22,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[1.668,-0.394],[0,-2.872],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[54.156,0],[57.932,0],[54.457,-5.883],[57.839,-10.47],[52.651,-15.45],[45.424,-15.45],[45.424,0],[48.713,0],[48.713,-5.536],[51.122,-5.536]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-1.297],[1.32,0],[0,0],[0,0],[0,0]],"o":[[0,1.297],[0,0],[0,0],[0,0],[1.32,0]],"v":[[54.48,-10.493],[52.164,-8.362],[48.713,-8.362],[48.713,-12.624],[52.164,-12.624]],"c":true},"ix":2},"nm":"R","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"R","np":5,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[75.308,0],[78.898,0],[72.945,-15.45],[68.822,-15.45],[62.846,0],[66.459,0],[67.432,-2.664],[74.335,-2.664]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[70.884,-12.601],[73.431,-5.513],[68.312,-5.513]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":5,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[97.935,0],[101.247,0],[101.247,-15.45],[96.615,-15.45],[92.862,-5.814],[89.11,-15.45],[84.5,-15.45],[84.5,0],[87.79,0],[87.79,-11.118],[92.144,0],[93.58,0],[97.935,-11.118]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.988235294118,0.976470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"M","np":3,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false}],"ip":16.0000162760417,"op":110.000111897786,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":3,"nm":".chris-gannon-lottie-animation","cl":"chris-gannon-lottie-animation","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.45],"y":[1]},"o":{"x":[0.55],"y":[0]},"n":["0p45_1_0p55_0"],"t":72,"s":[0],"e":[-2]},{"i":{"x":[0.45],"y":[1]},"o":{"x":[0.55],"y":[0]},"n":["0p45_1_0p55_0"],"t":74,"s":[-2],"e":[0]},{"t":84.0000854492187}],"ix":10},"p":{"a":0,"k":[518,386,0],"ix":2},"a":{"a":0,"k":[178,146,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"body","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.45],"y":[0]},"n":["0p833_0p833_0p45_0"],"t":0,"s":[0],"e":[-90]},{"t":17.0000172932943}],"ix":10,"x":"var $bm_rt;\nvar amp, freq, decay, n, t;\ntry {\n amp = div(effect('Rotation - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = div(effect('Rotation - Bounce')('ADBE Slider Control-0001'), 20), decay = div(effect('Rotation - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : time - key(n).time, $bm_rt = 0 < n ? (v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10))), sum(value, div(mul(mul(div(v, 100), amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"p":{"a":0,"k":[60,60,0],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":-27,"s":[-2,-6.5,0],"e":[-2,-6.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":56,"s":[-2,-6.5,0],"h":1},{"t":66.0000671386719,"s":[-2,-6.5,0],"h":1}],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Rotation - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":30,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"Rotation - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":126,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p14_1_0p167_0p167","0p14_1_0p167_0p167"],"t":-27,"s":[0,0],"e":[200,1]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.45,0.45],"y":[0,0]},"n":["0p833_0p833_0p45_0","0p833_0p833_0p45_0"],"t":0,"s":[200,1],"e":[216,302]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"n":["0p833_1_0p167_0","0p833_1_0p167_0"],"t":17,"s":[216,302],"e":[216,302]},{"i":{"x":[0.197,0.45],"y":[1,1]},"o":{"x":[0.872,0.59],"y":[-0.522,0]},"n":["0p197_1_0p872_-0p522","0p45_1_0p59_0"],"t":97,"s":[216,302],"e":[0,200]},{"t":123.00012512207}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156982422,1,0.988234994926,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-2,-6.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":-27.0000274658203,"bm":0}]}],"layers":[{"ddd":0,"ind":3,"ty":0,"nm":".chris-gannon-instagram-lottie","cl":"chris-gannon-instagram-lottie","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,323,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[129,129,100],"ix":6}},"ao":0,"w":800,"h":600,"ip":0,"op":124.000126139323,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"blueToPurple","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[800,600],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":5,"k":{"a":0,"k":[0.007,0.298,0.404,0.851,0.307,0.431,0.308,0.735,0.6,0.565,0.212,0.62,0.8,0.565,0.212,0.62,1,0.565,0.212,0.62,0,1,0.199,1,0.397,1,0.592,0.5,0.788,0],"ix":9}},"s":{"a":0,"k":[-258,-522],"ix":5},"e":{"a":0,"k":[-943,-866],"ix":6},"t":2,"h":{"a":0,"k":18.494,"ix":7},"a":{"a":0,"k":-100.276,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"yellowToOrange","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[800,600],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":7,"k":{"a":0,"k":[0.007,0.984,0.847,0.482,0.193,0.969,0.657,0.325,0.375,0.953,0.467,0.169,0.545,0.882,0.263,0.314,0.715,0.812,0.059,0.459,0.857,0.688,0.135,0.539,1,0.565,0.212,0.62,0,1,0.259,1,0.517,1,0.75,0.5,0.983,0],"ix":9}},"s":{"a":0,"k":[-140,330],"ix":5},"e":{"a":0,"k":[-637,989],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[800,600],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811764705882,0.058823529412,0.458823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124.000126139323,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/matte_two_item_with_lowerlayer.json b/example/resource/matte_two_item_with_lowerlayer.json new file mode 100644 index 0000000000..747380d96b --- /dev/null +++ b/example/resource/matte_two_item_with_lowerlayer.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[30,30],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[-42,3],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":41,"ix":6},"is":{"a":0,"k":31,"ix":8},"or":{"a":0,"k":70,"ix":7},"os":{"a":0,"k":37,"ix":9},"ix":2,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.847843170166,0.072482459247,0.605201482773,1],"ix":4},"o":{"a":0,"k":65,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1,0],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[163,44.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[0,0.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-182.5,76.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[48,48],"ix":2},"p":{"a":0,"k":[-32,25],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":150.000006109625,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/mughead.json b/example/resource/mughead.json new file mode 100644 index 0000000000..ffbb6e0ec6 --- /dev/null +++ b/example/resource/mughead.json @@ -0,0 +1 @@ +{"v":"4.10.2","fr":12,"ip":0,"op":6,"w":800,"h":600,"nm":"Mughead","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"head tip","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-17,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.51,"y":1},"o":{"x":0.49,"y":0},"n":"0p51_1_0p49_0","t":0,"s":[{"i":[[101.998,-0.478],[0,0],[-55.505,1.557],[0,0]],"o":[[-101.998,0.478],[0,0],[55.505,-1.557],[0,0]],"v":[[4.002,-70.022],[-121,-64],[2.495,-70.943],[123,-62]],"c":true}],"e":[{"i":[[101.998,-0.478],[5.5,-3],[-55.505,1.557],[-1.5,2.75]],"o":[[-101.998,0.478],[-5.5,3],[55.505,-1.557],[1.5,-2.75]],"v":[[7.002,-70.522],[-121,-64],[6.995,-60.693],[123,-63.25]],"c":true}]},{"i":{"x":0.51,"y":1},"o":{"x":0.49,"y":0},"n":"0p51_1_0p49_0","t":3,"s":[{"i":[[101.998,-0.478],[5.5,-3],[-55.505,1.557],[-1.5,2.75]],"o":[[-101.998,0.478],[-5.5,3],[55.505,-1.557],[1.5,-2.75]],"v":[[7.002,-70.522],[-121,-64],[6.995,-60.693],[123,-63.25]],"c":true}],"e":[{"i":[[101.998,-0.478],[0,0],[-55.505,1.557],[0,0]],"o":[[-101.998,0.478],[0,0],[55.505,-1.557],[0,0]],"v":[[4.002,-70.022],[-121,-64],[2.495,-70.943],[123,-62]],"c":true}]},{"t":6}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Hose 2::Wrist","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"},"p":{"a":1,"k":[{"i":{"x":0.49,"y":1},"o":{"x":0.37,"y":0},"n":"0p49_1_0p37_0","t":0,"s":[288,409,0],"e":[321,415,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.49,"y":1},"o":{"x":0.37,"y":0},"n":"0p49_1_0p37_0","t":3,"s":[321,415,0],"e":[288,409,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"}},"ao":0,"ef":[{"ty":5,"nm":"RubberHose 2","np":18,"mn":"Pseudo/3bf5uID/RubberHose_2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Hose Length","mn":"Pseudo/3bf5uID/RubberHose_2-0001","ix":1,"v":{"a":0,"k":220,"ix":1}},{"ty":0,"nm":"Bend Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Realism","mn":"Pseudo/3bf5uID/RubberHose_2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Bend Direction","mn":"Pseudo/3bf5uID/RubberHose_2-0004","ix":4,"v":{"a":0,"k":-100,"ix":4}},{"ty":7,"nm":"Auto Rotate Start","mn":"Pseudo/3bf5uID/RubberHose_2-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Auto Rotate End","mn":"Pseudo/3bf5uID/RubberHose_2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":6,"nm":"Math Stuff","mn":"Pseudo/3bf5uID/RubberHose_2-0007","ix":7,"v":0},{"ty":3,"nm":"A","mn":"Pseudo/3bf5uID/RubberHose_2-0008","ix":8,"v":{"a":0,"k":[44,38],"ix":8,"x":"var $bm_rt;\n$bm_rt = thisLayer.toComp([\n 0,\n 0,\n 0\n]);"}},{"ty":3,"nm":"B","mn":"Pseudo/3bf5uID/RubberHose_2-0009","ix":9,"v":{"a":0,"k":[0,0],"ix":9,"x":"var $bm_rt;\ntry {\n var b = thisLayer(2)('Admin')(2)('B')(2)(1)._name;\n $bm_rt = thisComp.layer(b).toComp([\n 0,\n 0,\n 0\n ]);\n} catch (err) {\n $bm_rt = value;\n}"}},{"ty":0,"nm":"Outer Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0010","ix":10,"v":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\nvar s = length(a, b);\n$bm_rt = mul(Math.sin(0.78539816339), s);"}},{"ty":0,"nm":"Inner Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0011","ix":11,"v":{"a":0,"k":0,"ix":11,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar bendRad = eff('Bend Radius');\nvar hoseLength = div(eff('Hose Length'), 2);\nvar realism = eff('Realism');\nvar bendDir = div(eff('Bend Direction'), 100);\nvar sFac = eff('Parent Scale');\nvar straight = eff('Straight');\nvar autoFlop = eff('AutoFlop');\nvar roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\nvar innerRad;\nif (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n} else {\n innerRad = straight;\n}\ninnerRad *= Math.abs(sFac);\ninnerRad = linear(Math.abs(autoFlop), mul(straight, Math.max(Math.abs(sFac), 0.001)), innerRad);\n$bm_rt = innerRad;"}},{"ty":0,"nm":"Straight","mn":"Pseudo/3bf5uID/RubberHose_2-0012","ix":12,"v":{"a":0,"k":0,"ix":12,"x":"var $bm_rt;\nvar sFac = thisLayer(4)('RubberHose 2')('Parent Scale');\nvar outerRad = div(thisLayer(4)('RubberHose 2')('Outer Radius'), Math.max(Math.abs(sFac), 0.001));\n;\n$bm_rt = div(mul(1.4142135623731, outerRad), 2);"}},{"ty":0,"nm":"Base Rotation","mn":"Pseudo/3bf5uID/RubberHose_2-0013","ix":13,"v":{"a":0,"k":0,"ix":13,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\n$bm_rt = radiansToDegrees(Math.atan2(sub(a[1], b[1]), sub(a[0], b[0])));"}},{"ty":0,"nm":"AutoFlop","mn":"Pseudo/3bf5uID/RubberHose_2-0014","ix":14,"v":{"a":0,"k":0,"ix":14,"x":"var $bm_rt;\nvar hasAF = false, isEnabled = false, output;\ntry {\n var lyrAF = thisComp.layer(sum(thisLayer._name.split('::')[0], '::AutoFlop'));\n isEnabled = lyrAF(4)('Enable')(1);\n var falloffAngle = lyrAF(4)('Falloff')(1);\n hasAF = true;\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer(4)('RubberHose 2')('B');\n} catch (e) {\n}\nif (hasAF && isEnabled == 1) {\n var threshRot = lyrAF('ADBE Transform Group')('ADBE Rotate Z');\n threshRot %= 360;\n var ctrlAngle = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var offsetAngle = sub(threshRot, ctrlAngle);\n offsetAngle %= 360;\n var sign = offsetAngle > 0 && offsetAngle < 180 || offsetAngle < -180 ? -1 : 1;\n var absAngle = Math.abs(offsetAngle);\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n output = linear(absAngle, 0, falloffAngle, 0, 1);\n output *= sign;\n} else {\n output = 1;\n}\n$bm_rt = output;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"}},{"ty":0,"nm":"Parent Scale","mn":"Pseudo/3bf5uID/RubberHose_2-0015","ix":15,"v":{"a":0,"k":0,"ix":15,"x":"var $bm_rt;\nvar sFactor = 1;\nvar scaleNorm = 0;\nvar layerChain = 'thisLayer';\nwhile (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n scaleNorm = div(eval(layerChain)('ADBE Transform Group')('ADBE Scale')[0], 100);\n sFactor = mul(sFactor, scaleNorm);\n}\n$bm_rt = sFactor;"}},{"ty":6,"nm":"","mn":"Pseudo/3bf5uID/RubberHose_2-0016","ix":16,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 2::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 2::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar autoRotate = eff('Auto Rotate End');\nif (autoRotate == 1) {\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sub(sum(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n} else {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[20,20],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\nif (thisLayer.active) {\n try {\n var eff = thisLayer(4)('RubberHose 2');\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var straight = eff('Straight');\n var hoseLength = div(eff('Hose Length'), 2);\n if (straight > hoseLength) {\n $bm_rt = [\n 0.51,\n 0.83,\n 0.98,\n 1\n ];\n } else {\n $bm_rt = value;\n }\n } catch (err) {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Hose 1::Wrist","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"},"p":{"a":1,"k":[{"i":{"x":0.49,"y":1},"o":{"x":0.37,"y":0},"n":"0p49_1_0p37_0","t":0,"s":[522,410,0],"e":[487,420,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.49,"y":1},"o":{"x":0.37,"y":0},"n":"0p49_1_0p37_0","t":3,"s":[487,420,0],"e":[522,410,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"}},"ao":0,"ef":[{"ty":5,"nm":"RubberHose 2","np":18,"mn":"Pseudo/3bf5uID/RubberHose_2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Hose Length","mn":"Pseudo/3bf5uID/RubberHose_2-0001","ix":1,"v":{"a":0,"k":220,"ix":1}},{"ty":0,"nm":"Bend Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Realism","mn":"Pseudo/3bf5uID/RubberHose_2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Bend Direction","mn":"Pseudo/3bf5uID/RubberHose_2-0004","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":7,"nm":"Auto Rotate Start","mn":"Pseudo/3bf5uID/RubberHose_2-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Auto Rotate End","mn":"Pseudo/3bf5uID/RubberHose_2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":6,"nm":"Math Stuff","mn":"Pseudo/3bf5uID/RubberHose_2-0007","ix":7,"v":0},{"ty":3,"nm":"A","mn":"Pseudo/3bf5uID/RubberHose_2-0008","ix":8,"v":{"a":0,"k":[44,38],"ix":8,"x":"var $bm_rt;\n$bm_rt = thisLayer.toComp([\n 0,\n 0,\n 0\n]);"}},{"ty":3,"nm":"B","mn":"Pseudo/3bf5uID/RubberHose_2-0009","ix":9,"v":{"a":0,"k":[0,0],"ix":9,"x":"var $bm_rt;\ntry {\n var b = thisLayer(2)('Admin')(2)('B')(2)(1)._name;\n $bm_rt = thisComp.layer(b).toComp([\n 0,\n 0,\n 0\n ]);\n} catch (err) {\n $bm_rt = value;\n}"}},{"ty":0,"nm":"Outer Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0010","ix":10,"v":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\nvar s = length(a, b);\n$bm_rt = mul(Math.sin(0.78539816339), s);"}},{"ty":0,"nm":"Inner Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0011","ix":11,"v":{"a":0,"k":0,"ix":11,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar bendRad = eff('Bend Radius');\nvar hoseLength = div(eff('Hose Length'), 2);\nvar realism = eff('Realism');\nvar bendDir = div(eff('Bend Direction'), 100);\nvar sFac = eff('Parent Scale');\nvar straight = eff('Straight');\nvar autoFlop = eff('AutoFlop');\nvar roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\nvar innerRad;\nif (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n} else {\n innerRad = straight;\n}\ninnerRad *= Math.abs(sFac);\ninnerRad = linear(Math.abs(autoFlop), mul(straight, Math.max(Math.abs(sFac), 0.001)), innerRad);\n$bm_rt = innerRad;"}},{"ty":0,"nm":"Straight","mn":"Pseudo/3bf5uID/RubberHose_2-0012","ix":12,"v":{"a":0,"k":0,"ix":12,"x":"var $bm_rt;\nvar sFac = thisLayer(4)('RubberHose 2')('Parent Scale');\nvar outerRad = div(thisLayer(4)('RubberHose 2')('Outer Radius'), Math.max(Math.abs(sFac), 0.001));\n;\n$bm_rt = div(mul(1.4142135623731, outerRad), 2);"}},{"ty":0,"nm":"Base Rotation","mn":"Pseudo/3bf5uID/RubberHose_2-0013","ix":13,"v":{"a":0,"k":0,"ix":13,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\n$bm_rt = radiansToDegrees(Math.atan2(sub(a[1], b[1]), sub(a[0], b[0])));"}},{"ty":0,"nm":"AutoFlop","mn":"Pseudo/3bf5uID/RubberHose_2-0014","ix":14,"v":{"a":0,"k":0,"ix":14,"x":"var $bm_rt;\nvar hasAF = false, isEnabled = false, output;\ntry {\n var lyrAF = thisComp.layer(sum(thisLayer._name.split('::')[0], '::AutoFlop'));\n isEnabled = lyrAF(4)('Enable')(1);\n var falloffAngle = lyrAF(4)('Falloff')(1);\n hasAF = true;\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer(4)('RubberHose 2')('B');\n} catch (e) {\n}\nif (hasAF && isEnabled == 1) {\n var threshRot = lyrAF('ADBE Transform Group')('ADBE Rotate Z');\n threshRot %= 360;\n var ctrlAngle = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var offsetAngle = sub(threshRot, ctrlAngle);\n offsetAngle %= 360;\n var sign = offsetAngle > 0 && offsetAngle < 180 || offsetAngle < -180 ? -1 : 1;\n var absAngle = Math.abs(offsetAngle);\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n output = linear(absAngle, 0, falloffAngle, 0, 1);\n output *= sign;\n} else {\n output = 1;\n}\n$bm_rt = output;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"}},{"ty":0,"nm":"Parent Scale","mn":"Pseudo/3bf5uID/RubberHose_2-0015","ix":15,"v":{"a":0,"k":0,"ix":15,"x":"var $bm_rt;\nvar sFactor = 1;\nvar scaleNorm = 0;\nvar layerChain = 'thisLayer';\nwhile (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n scaleNorm = div(eval(layerChain)('ADBE Transform Group')('ADBE Scale')[0], 100);\n sFactor = mul(sFactor, scaleNorm);\n}\n$bm_rt = sFactor;"}},{"ty":6,"nm":"","mn":"Pseudo/3bf5uID/RubberHose_2-0016","ix":16,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 1::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 1::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar autoRotate = eff('Auto Rotate End');\nif (autoRotate == 1) {\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sub(sum(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n} else {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[20,20],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\nif (thisLayer.active) {\n try {\n var eff = thisLayer(4)('RubberHose 2');\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var straight = eff('Straight');\n var hoseLength = div(eff('Hose Length'), 2);\n if (straight > hoseLength) {\n $bm_rt = [\n 0.51,\n 0.83,\n 0.98,\n 1\n ];\n } else {\n $bm_rt = value;\n }\n } catch (err) {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Glove 2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":215.722,"ix":10},"p":{"a":0,"k":[-9.024,16.45,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[75,-75,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[9.406,-0.333]],"o":[[0,0],[0,0]],"v":[[5.63,-5.5],[-5.631,5.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[434.721,400.782],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[16.333,-1.856],[0,0]],"v":[[-10.333,0.928],[10.333,-0.072]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[421.351,351.021],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[12.964,-1.063],[0,0]],"v":[[-8.982,-1.135],[8.982,2.198]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[433.703,371.083],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[1,15.957],[0,0]],"v":[[3.834,-12],[-4.833,12]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[425.184,406.282],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.175,-0.137],[0.131,-0.101],[0.245,-0.208],[0.778,-0.842],[0.87,-1.172],[0.398,-0.659],[0.375,-0.694],[0.346,-0.705],[0.294,-0.695],[0.227,-0.659],[0.14,-0.593],[0.07,-0.491],[0.055,-0.354],[0,0],[0.054,0.719],[0.037,0.504],[0.007,0.628],[-0.077,0.717],[-0.14,0.778],[-0.2,0.812],[-0.258,0.816],[-0.297,0.796],[-0.311,0.756],[-0.675,1.142],[-0.469,0.655],[-0.17,0.201],[0,0],[-1.292,-1.055],[1.054,-1.293]],"o":[[0,0],[-0.101,0.069],[-0.477,0.419],[-0.792,0.827],[-0.422,0.593],[-0.429,0.644],[-0.406,0.683],[-0.359,0.703],[-0.3,0.695],[-0.231,0.659],[-0.13,0.594],[-0.077,0.493],[-0.11,0.713],[0,0],[-0.027,-0.362],[-0.043,-0.507],[0.002,-0.627],[0.074,-0.715],[0.134,-0.778],[0.187,-0.816],[0.227,-0.829],[0.267,-0.811],[0.65,-1.496],[0.658,-1.153],[0.237,-0.322],[0.14,-0.171],[1.054,-1.292],[1.293,1.054],[-0.146,0.179]],"v":[[5.122,-7.913],[4.921,-7.758],[4.389,-7.327],[2.435,-5.438],[-0.095,-2.403],[-1.37,-0.541],[-2.564,1.478],[-3.625,3.591],[-4.512,5.721],[-5.206,7.781],[-5.715,9.674],[-6.077,11.304],[-6.275,12.58],[-6.448,13.7],[-6.534,12.571],[-6.629,11.265],[-6.646,9.562],[-6.577,7.534],[-6.355,5.265],[-5.948,2.844],[-5.349,0.363],[-4.576,-2.088],[-3.665,-4.424],[-1.646,-8.434],[0.121,-11.167],[0.724,-11.951],[0.938,-12.214],[5.186,-12.645],[5.618,-8.396]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.726,359.156],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.143,-0.129],[0.265,-0.26],[0.83,-1.04],[0.472,-0.609],[0.435,-0.722],[0.419,-0.789],[0.4,-0.822],[0.367,-0.83],[0.299,-0.817],[0.228,-0.768],[0.148,-0.687],[0.063,-0.567],[0.056,-0.408],[0,0],[0.053,0.825],[0.037,0.578],[0.007,0.717],[-0.083,0.819],[-0.128,0.894],[-0.189,0.936],[-0.271,0.936],[-0.313,0.915],[-0.333,0.866],[-0.33,0.792],[-0.367,0.659],[-0.494,0.765],[-0.18,0.235],[0,0],[-1.336,-0.995],[0.995,-1.336],[0.142,-0.129]],"o":[[0,0],[-0.115,0.094],[-0.517,0.532],[-0.434,0.504],[-0.427,0.636],[-0.454,0.714],[-0.454,0.773],[-0.427,0.814],[-0.353,0.837],[-0.292,0.82],[-0.238,0.769],[-0.131,0.687],[-0.077,0.567],[-0.111,0.82],[0,0],[-0.027,-0.415],[-0.05,-0.581],[0.01,-0.716],[0.074,-0.819],[0.136,-0.892],[0.204,-0.93],[0.245,-0.945],[0.278,-0.928],[0.315,-0.875],[0.378,-0.767],[0.689,-1.34],[0.255,-0.378],[0.149,-0.201],[0.995,-1.336],[1.336,0.995],[-0.119,0.159],[0,0]],"v":[[5.468,-10.041],[5.249,-9.844],[4.663,-9.289],[2.557,-6.932],[1.237,-5.225],[-0.122,-3.214],[-1.457,-0.965],[-2.699,1.451],[-3.793,3.958],[-4.701,6.465],[-5.403,8.871],[-5.916,11.071],[-6.28,12.956],[-6.48,14.426],[-6.654,15.715],[-6.737,14.418],[-6.833,12.921],[-6.848,10.972],[-6.778,8.654],[-6.555,6.061],[-6.141,3.292],[-5.528,0.452],[-4.731,-2.362],[-3.789,-5.051],[-2.757,-7.527],[-1.683,-9.698],[0.183,-12.881],[0.822,-13.794],[1.051,-14.102],[5.272,-14.72],[5.889,-10.499],[5.497,-10.066]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[375.606,369.696],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.154,-0.142],[0.285,-0.285],[0.89,-1.136],[0.506,-0.664],[0.466,-0.787],[0.447,-0.857],[0.426,-0.893],[0.391,-0.901],[0.317,-0.886],[0.24,-0.832],[0.155,-0.742],[0.064,-0.613],[0.057,-0.44],[0,0],[0.05,0.89],[0.036,0.624],[0.002,0.773],[-0.095,0.882],[-0.145,0.962],[-0.211,1.006],[-0.299,1.006],[-0.344,0.982],[-0.365,0.929],[-0.36,0.848],[-0.399,0.705],[-0.535,0.816],[-0.192,0.247],[0,0],[-1.33,-1.001],[1.002,-1.33],[0.13,-0.12]],"o":[[0,0],[-0.126,0.107],[-0.558,0.585],[-0.466,0.55],[-0.458,0.693],[-0.484,0.776],[-0.484,0.84],[-0.454,0.884],[-0.373,0.906],[-0.308,0.887],[-0.251,0.832],[-0.136,0.744],[-0.079,0.613],[-0.113,0.886],[0,0],[-0.026,-0.448],[-0.049,-0.626],[0.016,-0.772],[0.086,-0.882],[0.153,-0.96],[0.226,-1.001],[0.27,-1.015],[0.306,-0.997],[0.344,-0.938],[0.412,-0.822],[0.749,-1.434],[0.276,-0.404],[0.161,-0.215],[1.002,-1.33],[1.329,1.002],[-0.11,0.146],[0,0]],"v":[[5.866,-11.157],[5.629,-10.94],[4.995,-10.327],[2.73,-7.747],[1.315,-5.887],[-0.14,-3.697],[-1.565,-1.251],[-2.889,1.374],[-4.051,4.093],[-5.01,6.81],[-5.75,9.415],[-6.286,11.794],[-6.664,13.832],[-6.868,15.421],[-7.046,16.812],[-7.125,15.413],[-7.217,13.797],[-7.218,11.697],[-7.125,9.197],[-6.865,6.405],[-6.398,3.427],[-5.717,0.374],[-4.839,-2.648],[-3.806,-5.535],[-2.678,-8.189],[-1.51,-10.514],[0.515,-13.918],[1.202,-14.889],[1.449,-15.217],[5.671,-15.812],[6.264,-11.59],[5.903,-11.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[385.397,386.802],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16,9.333],[8.667,0.333],[23.897,-4.788],[-8.368,-26.683],[1.748,-1.464],[-4.237,-5.06],[0,0],[-5.06,4.237],[-0.51,2.603],[0,0],[-9.49,9.835]],"o":[[9.667,-10.333],[-1.333,-14.667],[-24.637,4.935],[-2.112,0.313],[-5.06,4.237],[0,0],[4.237,5.06],[2.18,-1.825],[18.318,4.86],[0,0],[10.369,-10.746]],"v":[[41.819,-10.251],[30.819,-32.584],[-17.848,-50.584],[-46.171,9.291],[-52.085,11.932],[-53.582,28.836],[-36.165,49.638],[-19.261,51.135],[-15.21,44.254],[19.486,34.749],[47.45,29.495]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.866,383.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":3,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Glove ","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":152.627,"ix":10},"p":{"a":0,"k":[6.654,26.986,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[-75,-75,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[9.406,-0.333]],"o":[[0,0],[0,0]],"v":[[5.63,-5.5],[-5.631,5.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[434.721,400.782],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[16.333,-1.856],[0,0]],"v":[[-10.333,0.928],[10.333,-0.072]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[421.351,351.021],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[12.964,-1.063],[0,0]],"v":[[-8.982,-1.135],[8.982,2.198]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[433.703,371.083],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[1,15.957],[0,0]],"v":[[3.834,-12],[-4.833,12]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[425.184,406.282],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.175,-0.137],[0.131,-0.101],[0.245,-0.208],[0.778,-0.842],[0.87,-1.172],[0.398,-0.659],[0.375,-0.694],[0.346,-0.705],[0.294,-0.695],[0.227,-0.659],[0.14,-0.593],[0.07,-0.491],[0.055,-0.354],[0,0],[0.054,0.719],[0.037,0.504],[0.007,0.628],[-0.077,0.717],[-0.14,0.778],[-0.2,0.812],[-0.258,0.816],[-0.297,0.796],[-0.311,0.756],[-0.675,1.142],[-0.469,0.655],[-0.17,0.201],[0,0],[-1.292,-1.055],[1.054,-1.293]],"o":[[0,0],[-0.101,0.069],[-0.477,0.419],[-0.792,0.827],[-0.422,0.593],[-0.429,0.644],[-0.406,0.683],[-0.359,0.703],[-0.3,0.695],[-0.231,0.659],[-0.13,0.594],[-0.077,0.493],[-0.11,0.713],[0,0],[-0.027,-0.362],[-0.043,-0.507],[0.002,-0.627],[0.074,-0.715],[0.134,-0.778],[0.187,-0.816],[0.227,-0.829],[0.267,-0.811],[0.65,-1.496],[0.658,-1.153],[0.237,-0.322],[0.14,-0.171],[1.054,-1.292],[1.293,1.054],[-0.146,0.179]],"v":[[5.122,-7.913],[4.921,-7.758],[4.389,-7.327],[2.435,-5.438],[-0.095,-2.403],[-1.37,-0.541],[-2.564,1.478],[-3.625,3.591],[-4.512,5.721],[-5.206,7.781],[-5.715,9.674],[-6.077,11.304],[-6.275,12.58],[-6.448,13.7],[-6.534,12.571],[-6.629,11.265],[-6.646,9.562],[-6.577,7.534],[-6.355,5.265],[-5.948,2.844],[-5.349,0.363],[-4.576,-2.088],[-3.665,-4.424],[-1.646,-8.434],[0.121,-11.167],[0.724,-11.951],[0.938,-12.214],[5.186,-12.645],[5.618,-8.396]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.726,359.156],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.143,-0.129],[0.265,-0.26],[0.83,-1.04],[0.472,-0.609],[0.435,-0.722],[0.419,-0.789],[0.4,-0.822],[0.367,-0.83],[0.299,-0.817],[0.228,-0.768],[0.148,-0.687],[0.063,-0.567],[0.056,-0.408],[0,0],[0.053,0.825],[0.037,0.578],[0.007,0.717],[-0.083,0.819],[-0.128,0.894],[-0.189,0.936],[-0.271,0.936],[-0.313,0.915],[-0.333,0.866],[-0.33,0.792],[-0.367,0.659],[-0.494,0.765],[-0.18,0.235],[0,0],[-1.336,-0.995],[0.995,-1.336],[0.142,-0.129]],"o":[[0,0],[-0.115,0.094],[-0.517,0.532],[-0.434,0.504],[-0.427,0.636],[-0.454,0.714],[-0.454,0.773],[-0.427,0.814],[-0.353,0.837],[-0.292,0.82],[-0.238,0.769],[-0.131,0.687],[-0.077,0.567],[-0.111,0.82],[0,0],[-0.027,-0.415],[-0.05,-0.581],[0.01,-0.716],[0.074,-0.819],[0.136,-0.892],[0.204,-0.93],[0.245,-0.945],[0.278,-0.928],[0.315,-0.875],[0.378,-0.767],[0.689,-1.34],[0.255,-0.378],[0.149,-0.201],[0.995,-1.336],[1.336,0.995],[-0.119,0.159],[0,0]],"v":[[5.468,-10.041],[5.249,-9.844],[4.663,-9.289],[2.557,-6.932],[1.237,-5.225],[-0.122,-3.214],[-1.457,-0.965],[-2.699,1.451],[-3.793,3.958],[-4.701,6.465],[-5.403,8.871],[-5.916,11.071],[-6.28,12.956],[-6.48,14.426],[-6.654,15.715],[-6.737,14.418],[-6.833,12.921],[-6.848,10.972],[-6.778,8.654],[-6.555,6.061],[-6.141,3.292],[-5.528,0.452],[-4.731,-2.362],[-3.789,-5.051],[-2.757,-7.527],[-1.683,-9.698],[0.183,-12.881],[0.822,-13.794],[1.051,-14.102],[5.272,-14.72],[5.889,-10.499],[5.497,-10.066]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[375.606,369.696],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.154,-0.142],[0.285,-0.285],[0.89,-1.136],[0.506,-0.664],[0.466,-0.787],[0.447,-0.857],[0.426,-0.893],[0.391,-0.901],[0.317,-0.886],[0.24,-0.832],[0.155,-0.742],[0.064,-0.613],[0.057,-0.44],[0,0],[0.05,0.89],[0.036,0.624],[0.002,0.773],[-0.095,0.882],[-0.145,0.962],[-0.211,1.006],[-0.299,1.006],[-0.344,0.982],[-0.365,0.929],[-0.36,0.848],[-0.399,0.705],[-0.535,0.816],[-0.192,0.247],[0,0],[-1.33,-1.001],[1.002,-1.33],[0.13,-0.12]],"o":[[0,0],[-0.126,0.107],[-0.558,0.585],[-0.466,0.55],[-0.458,0.693],[-0.484,0.776],[-0.484,0.84],[-0.454,0.884],[-0.373,0.906],[-0.308,0.887],[-0.251,0.832],[-0.136,0.744],[-0.079,0.613],[-0.113,0.886],[0,0],[-0.026,-0.448],[-0.049,-0.626],[0.016,-0.772],[0.086,-0.882],[0.153,-0.96],[0.226,-1.001],[0.27,-1.015],[0.306,-0.997],[0.344,-0.938],[0.412,-0.822],[0.749,-1.434],[0.276,-0.404],[0.161,-0.215],[1.002,-1.33],[1.329,1.002],[-0.11,0.146],[0,0]],"v":[[5.866,-11.157],[5.629,-10.94],[4.995,-10.327],[2.73,-7.747],[1.315,-5.887],[-0.14,-3.697],[-1.565,-1.251],[-2.889,1.374],[-4.051,4.093],[-5.01,6.81],[-5.75,9.415],[-6.286,11.794],[-6.664,13.832],[-6.868,15.421],[-7.046,16.812],[-7.125,15.413],[-7.217,13.797],[-7.218,11.697],[-7.125,9.197],[-6.865,6.405],[-6.398,3.427],[-5.717,0.374],[-4.839,-2.648],[-3.806,-5.535],[-2.678,-8.189],[-1.51,-10.514],[0.515,-13.918],[1.202,-14.889],[1.449,-15.217],[5.671,-15.812],[6.264,-11.59],[5.903,-11.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[385.397,386.802],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16,9.333],[8.667,0.333],[23.897,-4.788],[-8.368,-26.683],[1.748,-1.464],[-4.237,-5.06],[0,0],[-5.06,4.237],[-0.51,2.603],[0,0],[-9.49,9.835]],"o":[[9.667,-10.333],[-1.333,-14.667],[-24.637,4.935],[-2.112,0.313],[-5.06,4.237],[0,0],[4.237,5.06],[2.18,-1.825],[18.318,4.86],[0,0],[10.369,-10.746]],"v":[[41.819,-10.251],[30.819,-32.584],[-17.848,-50.584],[-46.171,9.291],[-52.085,11.932],[-53.582,28.836],[-36.165,49.638],[-19.261,51.135],[-15.21,44.254],[19.486,34.749],[47.45,29.495]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.078000005086,0.078000005086,0.078000005086,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[400.866,383.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":3,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"middle spline","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.49,"y":1},"o":{"x":0.51,"y":0},"n":"0p49_1_0p51_0","t":0,"s":[8,-73,0],"e":[8,-69,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.49,"y":1},"o":{"x":0.51,"y":0},"n":"0p49_1_0p51_0","t":3,"s":[8,-69,0],"e":[8,-73,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[71,71,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[37.665,5.519],[-46.498,-4.641]],"o":[[0,0],[38.998,-4.641],[-42.248,5.186]],"v":[[-0.5,23.319],[-42.248,-17.622],[42.248,-17.622]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"eye left","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.37,"y":0},"n":"0p833_1_0p37_0","t":0,"s":[-32,-34,0],"e":[-32,-25,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.37,"y":0},"n":"0p833_1_0p37_0","t":3,"s":[-32,-25,0],"e":[-32,-34,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[73,73,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[15.855,0],[0,-24.024],[-17,0],[-0.081,21.632]],"o":[[0,0],[-0.072,-21.772],[-17,0],[0,24.024],[15.785,0],[0,0]],"v":[[1.003,0.25],[16.997,-6.754],[0.003,-43.5],[-16.997,0],[0.003,43.5],[16.996,6.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"eye right","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.37,"y":0},"n":"0p833_1_0p37_0","t":0,"s":[52,-34,0],"e":[52,-25,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.37,"y":0},"n":"0p833_1_0p37_0","t":3,"s":[52,-25,0],"e":[52,-34,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[73,73,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[15.855,0],[0,-24.024],[-17,0],[-0.081,21.632]],"o":[[0,0],[-0.072,-21.772],[-17,0],[0,24.024],[15.785,0],[0,0]],"v":[[1.003,0.25],[16.997,-6.754],[0.003,-43.5],[-16.997,0],[0.003,43.5],[16.996,6.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"nose","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":40,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":0,"s":[11.131,-2.66,0],"e":[11.131,7.34,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":3,"s":[11.131,7.34,0],"e":[11.131,-2.66,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[-10.369,-211.66,0],"ix":1},"s":{"a":0,"k":[67,67,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.619,8.587],[-10.879,-15.092]],"o":[[-5.619,-8.587],[10.879,15.092]],"v":[[-29,-198],[6,-223]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"mouth 2","parent":13,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-11,"ix":10},"p":{"a":0,"k":[19,40,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.995,0.124],[0,-11.322]],"v":[[57.5,-28.162],[0.001,-15.69],[-57.5,-27.162],[-78,-6.66],[1.005,28.038],[78,-7.663]],"c":true}],"e":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.994,0.124],[0,-11.322]],"v":[[56.611,-23.591],[-1.11,-9.975],[-57.944,-24.877],[-77.334,-10.089],[1.005,28.038],[78.222,-8.805]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.994,0.124],[0,-11.322]],"v":[[56.611,-23.591],[-1.11,-9.975],[-57.944,-24.877],[-77.334,-10.089],[1.005,28.038],[78.222,-8.805]],"c":true}],"e":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.995,0.124],[0,-11.322]],"v":[[57.5,-28.162],[0.001,-15.69],[-57.5,-27.162],[-78,-6.66],[1.005,28.038],[78,-7.663]],"c":true}]},{"t":6}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[85.892,85.892],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"tounge","parent":12,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":0,"s":[30,3,0],"e":[28.474,10.853,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":3,"s":[28.474,10.853,0],"e":[30,3,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[123,123,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.116,2.862],[-0.681,6.787]],"o":[[-5.097,2.581],[1.108,-11.042]],"v":[[8.158,-13.809],[1.067,0.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.5,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[81.427,81.427],"ix":3},"r":{"a":0,"k":-3.831,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.501,1.719],[-17.333,-1.333],[-2.065,-9.013]],"o":[[-7,-0.333],[3.677,-4.62],[2.367,10.333]],"v":[[-9.833,12.833],[0.167,-4.167],[17.167,-4.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509803922,0.266666666667,0.094117647059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[182.095,182.095],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"mouth","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-11,"ix":10},"p":{"a":0,"k":[19,40,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":0,"s":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.995,0.124],[0,-11.322]],"v":[[57.5,-28.162],[0.001,-15.69],[-57.5,-27.162],[-78,-6.66],[1.005,28.038],[78,-7.663]],"c":true}],"e":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.994,0.124],[0,-11.322]],"v":[[56.611,-23.591],[-1.11,-9.975],[-57.944,-24.877],[-77.334,-10.089],[1.005,28.038],[78.222,-8.805]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":3,"s":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.994,0.124],[0,-11.322]],"v":[[56.611,-23.591],[-1.11,-9.975],[-57.944,-24.877],[-77.334,-10.089],[1.005,28.038],[78.222,-8.805]],"c":true}],"e":[{"i":[[11.322,0],[19.224,0],[19.051,2.982],[0.002,-11.326],[-19.761,-0.077],[0,27.486]],"o":[[-19.05,2.982],[-19.225,0],[-11.321,0],[0.002,30.415],[31.995,0.124],[0,-11.322]],"v":[[57.5,-28.162],[0.001,-15.69],[-57.5,-27.162],[-78,-6.66],[1.005,28.038],[78,-7.663]],"c":true}]},{"t":6}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[85.892,85.892],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"--BODY--","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"n":"0p34_1_0p4_0","t":0,"s":[400,300,0],"e":[400,317,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"n":"0p34_1_0p4_0","t":3,"s":[400,317,0],"e":[400,300,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.344,15.543],[-2.276,0.299],[-30.441,0],[-6.695,-0.878],[0.198,-2.287],[47.291,0]],"o":[[-0.198,-2.287],[6.695,-0.878],[30.441,0],[2.276,0.299],[-1.344,15.543],[-47.291,0]],"v":[[-56.742,-31.993],[-53.043,-36.618],[0,-39],[53.043,-36.618],[56.742,-31.993],[0,39]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[223.275,223.275],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Hose 2::Shoulder","parent":13,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"},"p":{"a":0,"k":[-86,24,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 2::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 2::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var autoRotate = eff('Auto Rotate Start');\n if (autoRotate == 1) {\n var a = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name).toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (straight <= hoseLength) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sum(sub(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n } else {\n $bm_rt = 0;\n }\n ;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[20,20],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name);\n $bm_rt = ctrl(2)('Control Point')(2)('Stroke 1')('Color');\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Hose 1::Shoulder","parent":13,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"},"p":{"a":0,"k":[78,24,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 1::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 1::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var autoRotate = eff('Auto Rotate Start');\n if (autoRotate == 1) {\n var a = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name).toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (straight <= hoseLength) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sum(sub(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n } else {\n $bm_rt = 0;\n }\n ;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[20,20],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name);\n $bm_rt = ctrl(2)('Control Point')(2)('Stroke 1')('Color');\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = [\n 100,\n 100\n];"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Hose 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11,"x":"var $bm_rt;\n$bm_rt = 100;"},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar r = 0;\nif (thisLayer.hasParent) {\n r = $bm_neg(parentTotal());\n}\n$bm_rt = r;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"},"p":{"a":0,"k":[236,286,0],"ix":2,"x":"var $bm_rt;\nvar p = [\n 0,\n 0\n ];\ntry {\n if (thisLayer.hasParent) {\n p = parent.fromComp([\n 0,\n 0,\n 0\n ]);\n }\n $bm_rt = p;\n} catch (err) {\n $bm_rt = p;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\nvar s = [\n 100,\n 100\n ];\nif (hasParent) {\n var sFactor = parentTotal();\n s = [\n s[0] * sFactor[0],\n s[1] * sFactor[1]\n ];\n}\n$bm_rt = s;\nfunction parentTotal() {\n var sFactor = [\n 1,\n 1\n ];\n var scaleNorm = [\n 0,\n 0\n ];\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n scaleNorm = eval([layerChain][0]).scale;\n if (scaleNorm[0] != 0 && scaleNorm[1] != 0) {\n scaleNorm = [\n 100 / scaleNorm[0],\n 100 / scaleNorm[1]\n ];\n }\n sFactor = [\n sFactor[0] * scaleNorm[0],\n sFactor[1] * scaleNorm[1]\n ];\n }\n return sFactor;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3,"x":"var $bm_rt;\n$bm_rt = 4;"},"p":{"a":0,"k":[0,0],"ix":4,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"r":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\n$bm_rt = 0;"},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"BaseHose","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Style","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 2::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[200,200],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 2::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3,"x":"var $bm_rt;\n$bm_rt = 4;"},"p":{"a":0,"k":[0,0],"ix":4,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"r":{"a":0,"k":90,"ix":5,"x":"var $bm_rt;\n$bm_rt = 0;"},"ir":{"a":0,"k":200,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Inner Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"is":{"a":0,"k":100,"ix":8,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Bend Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"or":{"a":0,"k":200,"ix":7,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Outer Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = 0;"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0.01,"ix":1,"x":"var $bm_rt;\n$bm_rt = 0.01;"},"e":{"a":0,"k":24.99,"ix":2,"x":"var $bm_rt;\n$bm_rt = 24.99;"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\n$bm_rt = -90;"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar s = thisProperty.propertyGroup(2)(2)(1)(7);\n$bm_rt = [\n -s,\n 0\n];"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar flop;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var bendDir = eff('Bend Direction');\n var autoFlop = eff('AutoFlop');\n flop = bendDir > 0 ? 1 : -1;\n autoFlop > 0 ? 0 : flop *= -1;\n var s = flop == 1 ? [\n -100,\n 100\n ] : [\n 100,\n 100\n ];\n if (eff('Parent Scale') < 0) {\n s = [\n -s[0],\n s[1]\n ];\n }\n $bm_rt = s;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var baseRot = ctrl('Base Rotation');\n var flop = content('Admin').content('ArcMath').transform.scale[0];\n var rotOffset = flop < 0 ? -45 : 225;\n $bm_rt = sum(baseRot, rotOffset);\n} catch (err) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ArcMath","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Hose 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11,"x":"var $bm_rt;\n$bm_rt = 100;"},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar r = 0;\nif (thisLayer.hasParent) {\n r = $bm_neg(parentTotal());\n}\n$bm_rt = r;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n parentVal += eval([layerChain][0]).rotation;\n }\n return parentVal;\n}"},"p":{"a":0,"k":[400,286,0],"ix":2,"x":"var $bm_rt;\nvar p = [\n 0,\n 0\n ];\ntry {\n if (thisLayer.hasParent) {\n p = parent.fromComp([\n 0,\n 0,\n 0\n ]);\n }\n $bm_rt = p;\n} catch (err) {\n $bm_rt = p;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\nvar s = [\n 100,\n 100\n ];\nif (hasParent) {\n var sFactor = parentTotal();\n s = [\n s[0] * sFactor[0],\n s[1] * sFactor[1]\n ];\n}\n$bm_rt = s;\nfunction parentTotal() {\n var sFactor = [\n 1,\n 1\n ];\n var scaleNorm = [\n 0,\n 0\n ];\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain += '.parent';\n scaleNorm = eval([layerChain][0]).scale;\n if (scaleNorm[0] != 0 && scaleNorm[1] != 0) {\n scaleNorm = [\n 100 / scaleNorm[0],\n 100 / scaleNorm[1]\n ];\n }\n sFactor = [\n sFactor[0] * scaleNorm[0],\n sFactor[1] * scaleNorm[1]\n ];\n }\n return sFactor;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3,"x":"var $bm_rt;\n$bm_rt = 4;"},"p":{"a":0,"k":[0,0],"ix":4,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"r":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\n$bm_rt = 0;"},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"BaseHose","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Style","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 1::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[200,200],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Hose 1::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3,"x":"var $bm_rt;\n$bm_rt = 4;"},"p":{"a":0,"k":[0,0],"ix":4,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"r":{"a":0,"k":90,"ix":5,"x":"var $bm_rt;\n$bm_rt = 0;"},"ir":{"a":0,"k":200,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Inner Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"is":{"a":0,"k":100,"ix":8,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Bend Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"or":{"a":0,"k":200,"ix":7,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Outer Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\n$bm_rt = 0;"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0.01,"ix":1,"x":"var $bm_rt;\n$bm_rt = 0.01;"},"e":{"a":0,"k":24.99,"ix":2,"x":"var $bm_rt;\n$bm_rt = 24.99;"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\n$bm_rt = -90;"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = [\n 0,\n 0\n];"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar s = thisProperty.propertyGroup(2)(2)(1)(7);\n$bm_rt = [\n -s,\n 0\n];"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar flop;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var bendDir = eff('Bend Direction');\n var autoFlop = eff('AutoFlop');\n flop = bendDir > 0 ? 1 : -1;\n autoFlop > 0 ? 0 : flop *= -1;\n var s = flop == 1 ? [\n -100,\n 100\n ] : [\n 100,\n 100\n ];\n if (eff('Parent Scale') < 0) {\n s = [\n -s[0],\n s[1]\n ];\n }\n $bm_rt = s;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var baseRot = ctrl('Base Rotation');\n var flop = content('Admin').content('ArcMath').transform.scale[0];\n var rotOffset = flop < 0 ? -45 : 225;\n $bm_rt = sum(baseRot, rotOffset);\n} catch (err) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ArcMath","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"handle","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":0,"s":[132,-18,0],"e":[127,-13,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"n":"0p6_1_0p4_0","t":3,"s":[127,-13,0],"e":[132,-18,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-111,111,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.188],[-4.812,-0.367],[0,0],[0,-40],[0,0],[0,0]],"o":[[0,-21.188],[0,0],[0,0],[0,40],[0,0],[-4.812,-0.067]],"v":[[-4.23,0.741],[21.333,-18.726],[21.333,-34],[-21.333,0],[32.877,39.417],[29.029,23.459]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[128.967,128.967],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,420.824,0],"ix":2},"a":{"a":0,"k":[18,90.824,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,-0.667]},"o":{"x":[0.37,0.37,0.37],"y":[0,0,0]},"n":["0p833_0p833_0p37_0","0p833_0p833_0p37_0","0p833_-0p667_0p37_0"],"t":0,"s":[90,90,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,2.667]},"o":{"x":[0.37,0.37,0.37],"y":[0,0,0]},"n":["0p833_0p833_0p37_0","0p833_0p833_0p37_0","0p833_2p667_0p37_0"],"t":3,"s":[100,100,100],"e":[90,90,100]},{"t":6}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[112,14.352],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18,90.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"yellow","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[800,600],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627451,0.121568627451,0.121568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.811764705882,0.062745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2520,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/ripple_loading_animation.json b/example/resource/ripple_loading_animation.json new file mode 100644 index 0000000000..1935a03455 --- /dev/null +++ b/example/resource/ripple_loading_animation.json @@ -0,0 +1 @@ +{"v":"4.10.1","fr":60,"ip":0,"op":120,"w":800,"h":800,"nm":"loading_animation","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":23,"s":[20],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":34,"s":[100],"e":[20]},{"t":69}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0_1_0p333_0","0_1_0p333_0"],"t":23,"s":[400,400],"e":[440,440]},{"i":{"x":[0.009,0.009],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p009_1_0p333_0","0p009_1_0p333_0"],"t":34,"s":[440,440],"e":[400,400]},{"t":59}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[5],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[10],"e":[5]},{"t":59}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0,0.627,1,0.5,0.496,0.314,1,1,0.992,0,1],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":16,"s":[20],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":27,"s":[100],"e":[20]},{"t":62}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":16,"s":[320,320],"e":[360,360]},{"i":{"x":[0.025,0.025],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p025_1_0p333_0","0p025_1_0p333_0"],"t":27,"s":[360,360],"e":[320,320]},{"t":52}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[5],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27,"s":[10],"e":[5]},{"t":52}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0,0.627,1,0.5,0.496,0.314,1,1,0.992,0,1],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":9,"s":[20],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[100],"e":[20]},{"t":55}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":9,"s":[240,240],"e":[280,280]},{"i":{"x":[0.051,0.051],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p051_1_0p333_0","0p051_1_0p333_0"],"t":20,"s":[280,280],"e":[240,240]},{"t":45}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9,"s":[5],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[10],"e":[5]},{"t":45}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0,0.627,1,0.5,0.496,0.314,1,1,0.992,0,1],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":2,"s":[20],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":13,"s":[100],"e":[20]},{"t":48}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":2,"s":[160,160],"e":[200,200]},{"i":{"x":[0.034,0.034],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p034_1_0p333_0","0p034_1_0p333_0"],"t":13,"s":[200,200],"e":[160,160]},{"t":38}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2,"s":[5],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[10],"e":[5]},{"t":38}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0,0.627,1,0.5,0.496,0.314,1,1,0.992,0,1],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[20],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":11,"s":[100],"e":[20]},{"t":46}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[80,80],"e":[120,120]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0_1_0p333_0","0_1_0p333_0"],"t":11,"s":[120,120],"e":[80,80]},{"t":36}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[5],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11,"s":[10],"e":[5]},{"t":35}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0,0.627,1,0.5,0.496,0.314,1,1,0.992,0,1],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]} \ No newline at end of file diff --git a/example/resource/waves_.json b/example/resource/waves_.json new file mode 100644 index 0000000000..f7396e1a94 --- /dev/null +++ b/example/resource/waves_.json @@ -0,0 +1 @@ +{"v":"5.1.8","fr":23.9759979248047,"ip":0,"op":239.999979227274,"w":300,"h":300,"nm":"SleepJounrey_Anim_Card","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 6","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[55,1909,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[130,130,100],"e":[122,122,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":120,"s":[122,122,100],"e":[130,130,100]},{"t":239.999979227274}],"ix":6}},"ao":0,"ip":0,"op":360.999968754358,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 7","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,1069,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":360.999968754358,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","parent":2,"sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-25],"e":[-115]},{"t":239.999979227274}],"ix":10},"p":{"a":0,"k":[-485,949,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[113.773,-33.791],[0,0],[27.159,-50.107],[0,0],[104.344,56.556],[0,0],[54.636,-16.227],[0,0],[33.791,113.773],[0,0],[50.107,27.159],[0,0],[-56.556,104.344],[0,0],[16.227,54.636],[0,0],[-113.773,33.791],[0,0],[-27.159,50.108],[0,0],[-104.344,-56.556],[0,0],[-54.636,16.227],[0,0],[-33.791,-113.773],[0,0],[-50.107,-27.159],[0,0],[56.556,-104.344],[0,0],[-16.227,-54.636],[0,0]],"o":[[0,0],[-54.636,16.227],[0,0],[-56.556,104.344],[0,0],[-50.108,-27.159],[0,0],[-113.773,33.791],[0,0],[-16.227,-54.636],[0,0],[-104.344,-56.556],[0,0],[27.159,-50.107],[0,0],[-33.791,-113.773],[0,0],[54.636,-16.227],[0,0],[56.556,-104.344],[0,0],[50.108,27.159],[0,0],[113.773,-33.791],[0,0],[16.227,54.636],[0,0],[104.344,56.556],[0,0],[-27.159,50.107],[0,0],[33.791,113.773]],"v":[[745.996,577.184],[607.363,618.358],[479.616,721.959],[410.702,849.102],[119.368,935.629],[-7.775,866.716],[-171.363,849.642],[-309.996,890.816],[-577.184,745.996],[-618.358,607.362],[-721.959,479.616],[-849.102,410.702],[-935.629,119.368],[-866.715,-7.775],[-849.642,-171.363],[-890.816,-309.996],[-745.996,-577.184],[-607.363,-618.358],[-479.616,-721.959],[-410.702,-849.102],[-119.368,-935.629],[7.775,-866.715],[171.363,-849.642],[309.996,-890.816],[577.184,-745.996],[618.358,-607.363],[721.959,-479.616],[849.102,-410.702],[935.629,-119.368],[866.715,7.775],[849.642,171.362],[890.816,309.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0.47,0.475,0.725,0.816,0.735,0.457,0.59,0.837,1,0.439,0.455,0.859],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[264,742],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.999968754358,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.839],"y":[1]},"o":{"x":[0.198],"y":[0]},"n":["0p839_1_0p198_0"],"t":0,"s":[0],"e":[-90]},{"t":239.999979227274}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[113.773,-33.791],[0,0],[27.159,-50.107],[0,0],[104.344,56.556],[0,0],[54.636,-16.227],[0,0],[33.791,113.773],[0,0],[50.107,27.159],[0,0],[-56.556,104.344],[0,0],[16.227,54.636],[0,0],[-113.773,33.791],[0,0],[-27.159,50.108],[0,0],[-104.344,-56.556],[0,0],[-54.636,16.227],[0,0],[-33.791,-113.773],[0,0],[-50.107,-27.159],[0,0],[56.556,-104.344],[0,0],[-16.227,-54.636],[0,0]],"o":[[0,0],[-54.636,16.227],[0,0],[-56.556,104.344],[0,0],[-50.108,-27.159],[0,0],[-113.773,33.791],[0,0],[-16.227,-54.636],[0,0],[-104.344,-56.556],[0,0],[27.159,-50.107],[0,0],[-33.791,-113.773],[0,0],[54.636,-16.227],[0,0],[56.556,-104.344],[0,0],[50.108,27.159],[0,0],[113.773,-33.791],[0,0],[16.227,54.636],[0,0],[104.344,56.556],[0,0],[-27.159,50.107],[0,0],[33.791,113.773]],"v":[[745.996,577.184],[607.363,618.358],[479.616,721.959],[410.702,849.102],[119.368,935.629],[-7.775,866.716],[-171.363,849.642],[-309.996,890.816],[-577.184,745.996],[-618.358,607.362],[-721.959,479.616],[-849.102,410.702],[-935.629,119.368],[-866.715,-7.775],[-849.642,-171.363],[-890.816,-309.996],[-745.996,-577.184],[-607.363,-618.358],[-479.616,-721.959],[-410.702,-849.102],[-119.368,-935.629],[7.775,-866.715],[171.363,-849.642],[309.996,-890.816],[577.184,-745.996],[618.358,-607.363],[721.959,-479.616],[849.102,-410.702],[935.629,-119.368],[866.715,7.775],[849.642,171.362],[890.816,309.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0.47,0.475,0.725,0.816,0.735,0.457,0.59,0.837,1,0.439,0.455,0.859],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[264,742],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.999968754358,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,960,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[140,140,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1362.031,2140.766],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.799,0.545,0.301,0.406,0.456,0.302,0.318,1,0.113,0.06,0.334],"ix":9}},"s":{"a":0,"k":[1228.306,-624.67],"ix":5},"e":{"a":0,"k":[85.869,7.393],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.375,6.68],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":4533.99960756859,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":0,"nm":"OceanSlumber","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,182,0],"ix":2},"a":{"a":0,"k":[540,960,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"w":1080,"h":1920,"ip":0,"op":360.999968754358,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 3b4f97911f3dd5319fd756b9c9345a35a07812a8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 21 Aug 2018 14:05:50 +0900 Subject: [PATCH 182/672] lottie/parser: changed the datatype of gradient member object . Change-Id: I2b1ca35904f1d5af39c0c76be47af582f9b93041 --- example/resource/{issue => }/insta_camera.json | 0 src/lottie/lottiemodel.h | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename example/resource/{issue => }/insta_camera.json (100%) diff --git a/example/resource/issue/insta_camera.json b/example/resource/insta_camera.json similarity index 100% rename from example/resource/issue/insta_camera.json rename to example/resource/insta_camera.json diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index e191cbe69e..2c484b1539 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -520,8 +520,8 @@ public: int mGradientType; /* "t" Linear=1 , Radial = 2*/ LOTAnimatable mStartPoint; /* "s" */ LOTAnimatable mEndPoint; /* "e" */ - LOTAnimatable mHighlightLength{0}; /* "h" */ - LOTAnimatable mHighlightAngle{0}; /* "a" */ + LOTAnimatable mHighlightLength{0}; /* "h" */ + LOTAnimatable mHighlightAngle{0}; /* "a" */ LOTAnimatable mOpacity{0}; /* "o" */ LOTAnimatable mGradient; /* "g" */ int mColorPoints{-1}; From 17bc03eb44c1b98681fad411c093bb55c300e5eb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 21 Aug 2018 14:25:50 +0900 Subject: [PATCH 183/672] lottie/example: updated lottieviewer example. Change-Id: I97e30598090f16e4370f1d08dc94315789d82a3d --- example/lottieviewer.cpp | 7 +++++-- example/{ => resource}/layout.edc | 0 example/resource/layout.edj | Bin 0 -> 7712 bytes 3 files changed, 5 insertions(+), 2 deletions(-) rename example/{ => resource}/layout.edc (100%) create mode 100644 example/resource/layout.edj diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 2f46b47669..6a01b27c4f 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -10,6 +10,7 @@ _win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { LottieView *view = (LottieView *)data; delete view; + elm_exit(); } static void @@ -40,11 +41,13 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) layout = elm_layout_add(win); evas_object_show(layout); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_layout_file_set(layout, "layout.edj", "layout"); + std::string edjPath = DEMO_DIR; + edjPath +="layout.edj"; + elm_layout_file_set(layout, edjPath.c_str(), "layout"); elm_win_resize_object_add(win, layout); std::string filePath = DEMO_DIR; - filePath +="data.json"; + filePath +="insta_camera.json"; LottieView *view = new LottieView(evas_object_evas_get(win), renderMode); view->setFilePath(filePath.c_str()); diff --git a/example/layout.edc b/example/resource/layout.edc similarity index 100% rename from example/layout.edc rename to example/resource/layout.edc diff --git a/example/resource/layout.edj b/example/resource/layout.edj new file mode 100644 index 0000000000000000000000000000000000000000..a8f567df9df7230d7c501cb5c43b660b4d9057b2 GIT binary patch literal 7712 zcmZ{n33wDm7RQS#oRVX5aVj7nBn(NA2topr5JDg%*$^(Tu`|G8k|B1X^VD{kZ!L*cJZ~~Hz32&@O0ZqNUKOf+B{20@Oy-i2hcJI>HZPqTFhMp z--~`HAMY`Pkk(%k(z_M-0Wgz~lPeh4p&xWlf6zYxb{et`8lf0s5ZL#S?HIj!unSjlQHmkHJ%jJ4(O zU_-%z(2Vsuf(^&8BeUKruw*cHz1P9U2e4AGEU?yS#(G|`oB&n^mK(tS43-DRo}&ru zSuoh-U+)z#0mBXqy8~7nz;=OQZ!Io8<}wIA$V zFgC7`AE7%bqqb0ew7Xz`3ecmr9ANa!=zj@z6q1drOJLsyuxnsvC_^*s!~KLpx5c~f zfL#Zpb<^HveMw-bfj$P=9*x>J3zGVmKF}dUz)B$5J&0-U)}{f2S$Bp ztcQCG`v->6`g=6qE%jd8{{~qwWX)1=S zE%c*1ba*yz_fGdXMs;lG{)KW{so4ZZo!6u z(b(cpPJ>*mPzyS7dF!->A9`Y^xNrOQ?iq-_?f$W7w9~0VPuoaMO zjm3N6m0)cc`%wSG;X_}n>E}iKg>MDZY7S%?+Fr1IkXj5uW}qRj!jD2~ajL(&4Xh4~ ztyl0}IL%+pe~^>Vz6PUyi9j=A2=^1w0mDefzUg4S!AuM*1%nTLzbzn9zlZ>q2+8Kw z9Wc~#f3DKK;G+l{bF3cfZUpx6=UWW=Z-C`Pc11JnLw${KW2of}B=tpmuoob;yoAg_ z!<|Jegw(!+klASPRRqmT#G&>S;I9m}5wZt!wuiw!1!L_y0Y+oZ*rOHtW5Mbn**yOd z?0f)2jz?SvW8)q^j<^lRenZ=UHG^rsha7}fgdw$;t=aHZWDhWHJ;-7-tQFZGlHQ%+ zE5u~v5Dbm;a_HmEBWX_4nm`|{Pd)*o@xa;=1(plO)&sf+^%?xFJul%e{2u9oG`>f8 zk4ytAfn?XixgzNuvH80UOuG-p_tfT%&@=oz4}Gi^2_LqIacavxMy~>W#71Pbp$Dm; zA+I87?KHj>dFa=H(R*Wm7pH)o24ia&`jOYbSeq|^!NwL0aT?VLtRotIWHiKllnGMH z8Ay6JbHD~bMxz;b1e>FhDWg7sr2fEpqoy%zG5YX(6!kM}UpW}oB;oqIcJz0Ft)O~3 zi$tH=_YNe@75ZRIUIE(!N$2SkjXok(OH|jEm>~C+n9*uF$ zr;u-T_m3=Kvf`$f~5qQyNVd_wZUsP7EDIP@2S zJp{?t*u7xX&sttWI?!NGbOK};-IqS-BNw8_84Pkh+S6dv_v|-54~*sx%T|JkVC=q# zp=f&dhVS7|@;%tRfOm0c(M!M#`>+;y2W&ON9!K8`wgpoAHbT@Io77NL)_Xn_%0Sx1Af2`$*Mx~3y6zz z@ZvWEIw|2q4^K)2MaajiF3BqME;}z1 zQE&<>fvR}~RpvyYz-2DgrI(cA;>$=HwSU++>onfxo3ReF6NgaB+s(6eSxB6M%jpr# zghbr;jN_sW3O*4IUEYF8ngOHpA+l`M^9r30qZeieV$z}!OX6gU^dp% zdR}4^1-Dg|tb(23iY3`B>#{(X`MTtM5}O$vT_eG)t0b5?xXMj;aPzX_HU_xALRA~c zl1gW7yi0{^s4gX?{+`$0E7N+COB0Gyl2m#PZZjvk3w^t2TUd3Ce9kt@<`G3rr%aNZ z`l4FbOEg_`nOo#sygqP9HclkEYXrrrV948vyU?o$HpT4Z6vaP~c|{de4-I}lbI5|0 z4SrzfoNmEYfIxBaocv!H`QZ`45r#CZAN4CJB9EBT-=ecNZg@POKf?FN9Wy*Y(^%-f zrSPSIvlzh6yA(miq4lE_aX3Qf4#(ppaQ^?Bxo=kBJNK<(XK>p8vl^ZG->cCXy+Gv9vy4MAk_9)tK5MGv zbmAlkCj=m3-Y#vjeACJ}y(MF( z`^1{#+nb1zstUX{pHq0ExH%hcj(!~ShcOQ=?LIxC%;rQZJeTF{{k0sl;$_jX8&wS7VTykemCyh>_Y`ISAr~Ng1;rdANno%{WS9N zz;TO|xAHC;{C4<6I|U*GcS$X$Az||=}lZCB?r5c1X+3vSjL0Q*tb+X}QKA%aSu?LbhSTmsg}uUxfcDsX*fo#6V0Ak;R)3)XQ+E}JSLThnOH`Yvuf zy(s#mPMBnG3%N-f5mI_~%ZkZGhvGuY(>@(mzJB9FpDlBD*?Pg%=}gIw)#I-}eimJ0(t{2p8u$(_v zUzX}@JeBy!*!S<=Y18My4|n`Ae&ep)F~?_zUj0nnx2D`|eZeQ8; z#p;};W>c@BwPOan5w!E#=bH|@mR6)B2HDmxYz*Jr*L3R2=&yHQPCjzBaKb;I80>zl zl`S-;^vQ|A{nm|$+qQAl;iAbm^B#UV>6t6`eoLy>&VRGmytTD+j(O^`UdIOXyDNK zB$fK*>2GQtI0(O7jDKnF;U%4KZ+xn6+O~N;uT=~oy}zsAK!8#@-gm-_RdqV1y^hMm0oxTk2{ zp2%;4Z+*~oui@&a&J(wltb0#?`+SD^%b2``XX>9%ZCEk8F{x?n&!g&^$0ff$v@xcs z;;SEu+WqTX@cA8a!z;9#D?R&T%qlS-D4ejf7#OXXwtd;`}f>hmAHCh!P%fe zw`UG|Gjq%JiFv;->i)sv1+kYi%NI*)i&rm}R#y$Yy!PTpkIt|@{I~L_toiwAU5@5| ze0p_aw;S_4NAjy)d$mp1*xtLNnj88rj0p+e`2M`rx$SDdI{f?v*UBD6S3X^pVeNN5 zse0$SQ=Wl8aWkjCmP7W3{bktU6U(+vJJDQpX>b0l zx!=9IV}8t;xiyc~U7D=+Uwh=wsn`Eh+5V9pVoajgBT*c6u&et0qFtTOmGrw|IX&yt zwL`@Rl6oE(_dr4C(PMX9O=_;~R%tmt|HIwi>@G=u`Sk@gO&yApoM(bAZOS_pf1{@O zvtLae2A=pa{Gf1bPQ~_-ldfJK`SPs}Q6c8OPo;dc*xl~p;Df_ozTV-nlMlXfrB_(( z_<<|4VsAy%4xsX0n<`OEkKKPTeA4+v{Lv%7niuhVOtlB2CT%!ecYI3hFV#DDuQTa` z_&K+wuHCiQBC14JdhDy6ro?W_iXCNMIRt<2jj0_FR@-(Fe`)A}3TOW+(Q_~Mtr;b9 z)#4FVvEfyX)32798a7S#ZfN*2X=Ckk6Pg$PUd0btlYM0U*!bh$HjTXfL%UA(F;%NB sG_Oh6-!aR3{MRSfyg2Yq#J=k1_H^7+ll<)8mUY Date: Fri, 17 Aug 2018 21:15:22 +0900 Subject: [PATCH 184/672] lottie: fixed lottieviewer example Change-Id: I5ede2096f3e00dd4b343a05b337dd67070f6ac66 --- example/lottieviewer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 6a01b27c4f..e6db228532 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -10,7 +10,6 @@ _win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { LottieView *view = (LottieView *)data; delete view; - elm_exit(); } static void @@ -34,15 +33,19 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) renderMode = false; } + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); win = elm_win_util_standard_add("lottie", "LottieViewer"); + elm_win_autodel_set(win, EINA_TRUE); evas_object_resize(win, 500, 700); evas_object_show(win); layout = elm_layout_add(win); evas_object_show(layout); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + std::string edjPath = DEMO_DIR; edjPath +="layout.edj"; + elm_layout_file_set(layout, edjPath.c_str(), "layout"); elm_win_resize_object_add(win, layout); From 830ef0282786d06a6870f130742147a37bd25191 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 21 Aug 2018 19:20:53 +0900 Subject: [PATCH 185/672] binding/c: more compatible with C compiler. Change-Id: I9fea4817cc913913f65c4b228cb0a42aae2cb2f8 --- example/lottieview.cpp | 4 +- inc/lotcommon.h | 74 +++++++++++++++++++++----------- src/binding/c/lotplayer_capi.h | 23 +++++----- src/binding/c/lottieplayer_c.cpp | 24 +++++------ src/lottie/lottieitem.cpp | 30 ++++++------- 5 files changed, 89 insertions(+), 66 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 9025db4357..f52b7f83f6 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -56,7 +56,7 @@ void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) //evas_vg_shape_stroke_meter_limit_set(shape, node->mStroke.meterLimit); } // update paint info - if (node->mType == LOTNode::BrushSolid) { + if (node->mType == LOTBrushType::BrushSolid) { int r = (node->mColor.r * node->mColor.a)/255; int g = (node->mColor.g * node->mColor.a)/255; int b = (node->mColor.b * node->mColor.a)/255; @@ -67,7 +67,7 @@ void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) evas_vg_node_color_set(shape, r, g, b, a); } - } else if (node->mType == LOTNode::BrushGradient) { + } else if (node->mType == LOTBrushType::BrushGradient) { //TODO fill the gradient info } } diff --git a/inc/lotcommon.h b/inc/lotcommon.h index 8223df1f32..aa24423019 100644 --- a/inc/lotcommon.h +++ b/inc/lotcommon.h @@ -29,6 +29,7 @@ */ typedef enum { + //TODO: Coding convention?? LOT_PLAYER_ERROR_NONE = 0, LOT_PLAYER_ERROR_NOT_PERMITTED, LOT_PLAYER_ERROR_OUT_OF_MEMORY, @@ -36,8 +37,39 @@ typedef enum LOT_PLAYER_ERROR_RESULT_OUT_OF_RANGE, LOT_PLAYER_ERROR_ALREADY_IN_PROGRESS, LOT_PLAYER_ERROR_UNKNOWN -} lotplayer_error_e; +} LOTErrorType; +typedef enum +{ + BrushSolid = 0, + BrushGradient +} LOTBrushType; + +typedef enum +{ + FillEvenOdd = 0, + FillWinding +} LOTFillRule; + +typedef enum +{ + JoinMiter = 0, + JoinBevel, + JoinRound +} LOTJoinStyle; + +typedef enum +{ + CapFlat = 0, + CapSquare, + CapRound +} LOTCapStyle; + +typedef enum +{ + GradientLinear = 0, + GradientRadial +} LOTGradientType; typedef struct LOTNode { @@ -46,50 +78,40 @@ typedef struct LOTNode { #define ChangeFlagPaint 0x0010 #define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) - enum BrushType { BrushSolid, BrushGradient }; - enum FillRule { EvenOdd, Winding }; - enum JoinStyle { MiterJoin, BevelJoin, RoundJoin }; - enum CapStyle { FlatCap, SquareCap, RoundCap }; - - struct PathData { + struct { const float *ptPtr; int ptCount; const char* elmPtr; int elmCount; - }; + } mPath; - struct Color { + struct { unsigned char r, g, b, a; - }; + } mColor; - struct Stroke { + struct { bool enable; int width; - CapStyle cap; - JoinStyle join; + LOTCapStyle cap; + LOTJoinStyle join; int meterLimit; float* dashArray; int dashArraySize; - }; + } mStroke; - struct Gradient { - enum Type { Linear = 1, Radial = 2 }; - Gradient::Type type; + struct { + LOTGradientType type; struct { float x, y; } start, end, center, focal; float cradius; float fradius; - }; + } mGradient; int mFlag; - BrushType mType; - FillRule mFillRule; - PathData mPath; - Color mColor; - Stroke mStroke; - Gradient mGradient; -} lotnode; + LOTBrushType mType; + LOTFillRule mFillRule; +} LOTNode; typedef struct LOTBuffer { uint32_t *buffer; @@ -97,6 +119,6 @@ typedef struct LOTBuffer { int height; int bytesPerLine; bool clear; -} lotbuf; +} LOTBuffer; #endif // _LOT_COMMON_H_ diff --git a/src/binding/c/lotplayer_capi.h b/src/binding/c/lotplayer_capi.h index ccf679e52d..ab8230b853 100644 --- a/src/binding/c/lotplayer_capi.h +++ b/src/binding/c/lotplayer_capi.h @@ -1,23 +1,26 @@ #ifndef _LOTPLAYER_CAPI_H_ #define _LOTPLAYER_CAPI_H_ +#include +#include +#include #include #ifdef __cplusplus extern "C" { #endif -typedef struct lotplayer_s lotplayer; +typedef struct lotplayer_s LOTPlayer; -LOT_EXPORT lotplayer *lotplayer_create(void); -LOT_EXPORT int lotplayer_destroy(lotplayer *player); -LOT_EXPORT int lotplayer_set_file(lotplayer *player, const char *file); -LOT_EXPORT int lotplayer_set_size(lotplayer *player, int w, int h); -LOT_EXPORT int lotplayer_get_size(const lotplayer *player, int* w, int* h); -LOT_EXPORT float lotplayer_get_playtime(const lotplayer *player); -LOT_EXPORT float lotplayer_get_pos(const lotplayer *player); -LOT_EXPORT size_t lotplayer_get_node_count(const lotplayer *player, float pos); -LOT_EXPORT const lotnode* lotplayer_get_node(lotplayer *player, float pos, size_t idx); +LOT_EXPORT LOTPlayer *lotplayer_create(void); +LOT_EXPORT int lotplayer_destroy(LOTPlayer *player); +LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file); +LOT_EXPORT int lotplayer_set_size(LOTPlayer *player, int w, int h); +LOT_EXPORT int lotplayer_get_size(const LOTPlayer *player, int* w, int* h); +LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player); +LOT_EXPORT float lotplayer_get_pos(const LOTPlayer *player); +LOT_EXPORT size_t lotplayer_get_node_count(const LOTPlayer *player, float pos); +LOT_EXPORT const LOTNode* lotplayer_get_node(LOTPlayer *player, float pos, size_t idx); #ifdef __cplusplus } diff --git a/src/binding/c/lottieplayer_c.cpp b/src/binding/c/lottieplayer_c.cpp index b3ee6a8e71..93ee843202 100644 --- a/src/binding/c/lottieplayer_c.cpp +++ b/src/binding/c/lottieplayer_c.cpp @@ -1,22 +1,20 @@ #include #include "vdebug.h" -extern "C" { - using namespace lottieplayer; -using lotplayer = LOTPlayer; +extern "C" { -LOT_EXPORT lotplayer *lotplayer_create(void) +LOT_EXPORT LOTPlayer *lotplayer_create(void) { - lotplayer* p = new LOTPlayer(); + LOTPlayer* p = new LOTPlayer(); if (!p) { vCritical << "Failed to initialize lotplayer"; } return p; } -LOT_EXPORT int lotplayer_destroy(lotplayer *player) +LOT_EXPORT int lotplayer_destroy(LOTPlayer *player) { if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; delete(player); @@ -24,7 +22,7 @@ LOT_EXPORT int lotplayer_destroy(lotplayer *player) return LOT_PLAYER_ERROR_NONE; } -LOT_EXPORT int lotplayer_set_file(lotplayer *player, const char *file) +LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file) { if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; bool ret = player->setFilePath(file); @@ -34,7 +32,7 @@ LOT_EXPORT int lotplayer_set_file(lotplayer *player, const char *file) return LOT_PLAYER_ERROR_NONE; } -LOT_EXPORT int lotplayer_set_size(lotplayer *player, int w, int h) +LOT_EXPORT int lotplayer_set_size(LOTPlayer *player, int w, int h) { if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; @@ -43,7 +41,7 @@ LOT_EXPORT int lotplayer_set_size(lotplayer *player, int w, int h) return LOT_PLAYER_ERROR_NONE; } -LOT_EXPORT int lotplayer_get_size(const lotplayer *player, int* w, int* h) +LOT_EXPORT int lotplayer_get_size(const LOTPlayer *player, int* w, int* h) { if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; @@ -52,7 +50,7 @@ LOT_EXPORT int lotplayer_get_size(const lotplayer *player, int* w, int* h) return LOT_PLAYER_ERROR_NONE; } -LOT_EXPORT float lotplayer_get_pos(const lotplayer *player) +LOT_EXPORT float lotplayer_get_pos(const LOTPlayer *player) { if (!player) { vWarning << "Invalid parameter player = nullptr"; @@ -62,14 +60,14 @@ LOT_EXPORT float lotplayer_get_pos(const lotplayer *player) return player->pos(); } -LOT_EXPORT size_t lotplayer_get_node_count(const lotplayer *player, float pos) +LOT_EXPORT size_t lotplayer_get_node_count(const LOTPlayer *player, float pos) { if (!player) return LOT_PLAYER_ERROR_NONE; return player->renderList(pos).size(); } -LOT_EXPORT float lotplayer_get_playtime(const lotplayer *player) +LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player) { if (!player) { vWarning << "Invalid parameter player = nullptr"; @@ -79,7 +77,7 @@ LOT_EXPORT float lotplayer_get_playtime(const lotplayer *player) return player->playTime(); } -LOT_EXPORT const lotnode* lotplayer_get_node(lotplayer *player, float pos, size_t idx) +LOT_EXPORT const LOTNode* lotplayer_get_node(LOTPlayer *player, float pos, size_t idx) { if (!player) { vWarning << "Invalid parameter player = nullptr"; diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index dc0f2b468f..77f8544c7a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -979,40 +979,40 @@ void LOTDrawable::sync() switch (mFillRule) { case FillRule::EvenOdd: - mCNode.mFillRule = LOTNode::EvenOdd; + mCNode.mFillRule = LOTFillRule::FillEvenOdd; break; default: - mCNode.mFillRule = LOTNode::Winding; + mCNode.mFillRule = LOTFillRule::FillWinding; break; } switch (mStroke.cap) { case CapStyle::Flat: - mCNode.mStroke.cap = LOTNode::FlatCap; + mCNode.mStroke.cap = LOTCapStyle::CapFlat; break; case CapStyle::Square: - mCNode.mStroke.cap = LOTNode::SquareCap; + mCNode.mStroke.cap = LOTCapStyle::CapSquare; break; case CapStyle::Round: - mCNode.mStroke.cap = LOTNode::RoundCap; + mCNode.mStroke.cap = LOTCapStyle::CapRound; break; default: - mCNode.mStroke.cap = LOTNode::FlatCap; + mCNode.mStroke.cap = LOTCapStyle::CapFlat; break; } switch (mStroke.join) { case JoinStyle::Miter: - mCNode.mStroke.join = LOTNode::MiterJoin; + mCNode.mStroke.join = LOTJoinStyle::JoinMiter; break; case JoinStyle::Bevel: - mCNode.mStroke.join = LOTNode::BevelJoin; + mCNode.mStroke.join = LOTJoinStyle::JoinBevel; break; case JoinStyle::Round: - mCNode.mStroke.join = LOTNode::RoundJoin; + mCNode.mStroke.join = LOTJoinStyle::JoinRound; break; default: - mCNode.mStroke.join = LOTNode::MiterJoin; + mCNode.mStroke.join = LOTJoinStyle::JoinMiter; break; } @@ -1025,23 +1025,23 @@ void LOTDrawable::sync() switch (mBrush.type()) { case VBrush::Type::Solid: - mCNode.mType = LOTNode::BrushSolid; + mCNode.mType = LOTBrushType::BrushSolid; mCNode.mColor.r = mBrush.mColor.r; mCNode.mColor.g = mBrush.mColor.g; mCNode.mColor.b = mBrush.mColor.b; mCNode.mColor.a = mBrush.mColor.a; break; case VBrush::Type::LinearGradient: - mCNode.mType = LOTNode::BrushGradient; - mCNode.mGradient.type = LOTNode::Gradient::Linear; + mCNode.mType = LOTBrushType::BrushGradient; + mCNode.mGradient.type = LOTGradientType::GradientLinear; mCNode.mGradient.start.x = mBrush.mGradient->linear.x1; mCNode.mGradient.start.y = mBrush.mGradient->linear.y1; mCNode.mGradient.end.x = mBrush.mGradient->linear.x2; mCNode.mGradient.end.y = mBrush.mGradient->linear.y2; break; case VBrush::Type::RadialGradient: - mCNode.mType = LOTNode::BrushGradient; - mCNode.mGradient.type = LOTNode::Gradient::Radial; + mCNode.mType = LOTBrushType::BrushGradient; + mCNode.mGradient.type = LOTGradientType::GradientRadial; mCNode.mGradient.center.x = mBrush.mGradient->radial.cx; mCNode.mGradient.center.y = mBrush.mGradient->radial.cy; mCNode.mGradient.focal.x = mBrush.mGradient->radial.fx; From 25784d646ac8be4d1a6931a94d349e03b0c244d4 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Tue, 21 Aug 2018 21:43:22 +0900 Subject: [PATCH 186/672] lottie: add APIs in lottieplayer to get frame rate and total frame number Change-Id: Ib81eed03adf520927b3b434b67425168b07f13b1 --- inc/lotplayer.h | 4 ++++ src/lottie/lottieplayer.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/inc/lotplayer.h b/inc/lotplayer.h index 66fabf89a1..144d74c02b 100644 --- a/inc/lotplayer.h +++ b/inc/lotplayer.h @@ -24,6 +24,10 @@ public: float pos() const; + float getFrameRate() const; + + long getTotalFrame() const; + const std::vector &renderList(float pos) const; // TODO: Consider correct position... diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index da90742297..c1215abf22 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -19,6 +19,8 @@ public: VSize size() const; float playTime() const; float pos(); + float getFrameRate() const { return mFrameRate; } + long getTotalFrame() const { return mTotalFrame; } const std::vector &renderList(float pos); bool render(float pos, const LOTBuffer &buffer, bool forceRender); @@ -29,6 +31,8 @@ private: VSize mSize; std::atomic mRenderInProgress; float mPos = 0.0; + float mFrameRate; + long mTotalFrame; }; void LOTPlayerPrivate::setSize(const VSize &sz) @@ -124,6 +128,8 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); + mTotalFrame = mModel->frameDuration(); + mFrameRate = mModel->frameRate(); return true; } return false; @@ -256,6 +262,17 @@ float LOTPlayer::pos() const return d->pos(); } +float LOTPlayer::getFrameRate() const +{ + return d->getFrameRate(); +} + +long LOTPlayer::getTotalFrame() const +{ + return d->getTotalFrame(); +} + + const std::vector &LOTPlayer::renderList(float pos) const { return d->renderList(pos); From 318151a35d10b3d022736ffdb02e116a055a7b08 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 21 Aug 2018 18:56:06 +0900 Subject: [PATCH 187/672] lottie: remove the combined alpha value and method from path item Alpha(opacity) values are not applied to path items. Fill, Stroke and etc will handle opacity. Change-Id: I8e05989e7f85797a00508c7ca151b1805d44f454 --- src/lottie/lottieitem.cpp | 14 ++++---------- src/lottie/lottieitem.h | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 77f8544c7a..1960242cff 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -648,12 +648,11 @@ void LOTPathDataItem::addTrimOperation(std::vector &list) } void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, - float parentAlpha, const DirtyFlag &flag) + float, const DirtyFlag &flag) { VPath tempPath; mPathChanged = false; - mCombinedAlpha = parentAlpha; // 1. update the local path if needed if (!(mInit && mStaticPath) && hasChanged(frameNo)) { @@ -825,10 +824,8 @@ void LOTFillItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) { VColor color = mColor; - if (sameParent) - color.setAlpha(color.a * pathNode->combinedAlpha()); - else - color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); + + color.setAlpha(color.a * parentAlpha()); VBrush brush(color); drawable->setBrush(brush); drawable->setFillRule(mFillRule); @@ -889,11 +886,8 @@ void LOTStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *drawable, bool sameParent) { VColor color = mColor; - if (sameParent) - color.setAlpha(color.a * pathNode->combinedAlpha()); - else - color.setAlpha(color.a * parentAlpha() * pathNode->combinedAlpha()); + color.setAlpha(color.a * parentAlpha()); VBrush brush(color); drawable->setBrush(brush); float scale = getScale(mParentMatrix); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 5271cdd9ae..90630a8152 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -208,7 +208,6 @@ public: void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; VPath path() const; void addTrimOperation(std::vector &list); - inline float combinedAlpha() const{ return mCombinedAlpha;} void renderList(std::vector &list) final; private: std::vector mTrimNodeRefs; @@ -219,7 +218,6 @@ private: VPath mLocalPath; VPath mFinalPath; bool mPathChanged; - float mCombinedAlpha; protected: virtual void updatePath(VPath& path, int frameNo) = 0; virtual bool hasChanged(int frameNo) = 0; From 02e660cff76e65dc8ea853e2eb61148ee784c497 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Wed, 22 Aug 2018 16:24:26 +0900 Subject: [PATCH 188/672] lottie/example: add APIs in lottieview to get frame rate and total frame number Change-Id: I25d14d37776cd6bf07bcba1f0fc6a1c88e66dd71 --- example/lottieview.cpp | 2 ++ example/lottieview.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index f52b7f83f6..79ce8fb025 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -194,6 +194,8 @@ void LottieView::render() void LottieView::setFilePath(const char *filePath) { mPlayer->setFilePath(filePath); + mFrameRate = mPlayer->getFrameRate(); + mTotalFrame = mPlayer->getTotalFrame(); } void LottieView::setSize(int w, int h) diff --git a/example/lottieview.h b/example/lottieview.h index 032cbd07ff..e3e02d5d14 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -35,6 +35,8 @@ public: void setSpeed(float speed) { mSpeed = speed;} void setRepeatCount(int count); void setRepeatMode(LottieView::RepeatMode mode); + float getFrameRate() const { return mFrameRate; } + long getTotalFrame() const { return mTotalFrame; } public: void seek(float pos); void finished(); @@ -66,6 +68,8 @@ public: bool mAsyncRender; bool mDirty; float mPendingPos; + float mFrameRate; + long mTotalFrame; std::future mRenderTask; LOTBuffer mBuffer; }; From d2c954d53595a28d1a8493d44ea78778d3dbfae6 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Wed, 22 Aug 2018 16:26:44 +0900 Subject: [PATCH 189/672] lottie/example: add frame information in lottieviewer example Change-Id: If9245244bfd3e8d8050e18b5ea09fcaf240a867d --- example/lottieviewer.cpp | 29 +++++++++++++++++++---- example/resource/layout.edc | 45 ++++++++++++++++++++++++++++++++---- example/resource/layout.edj | Bin 7712 -> 8870 bytes 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index e6db228532..9e80c5596c 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -5,6 +5,12 @@ using namespace std; +typedef struct _AppInfo AppInfo; +struct _AppInfo { + LottieView *view; + Evas_Object *layout; +}; + static void _win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { @@ -16,10 +22,17 @@ static void _slider_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { double val = elm_slider_value_get(obj); - LottieView *view = (LottieView *)data; + AppInfo *info = (AppInfo *)data; - view->seek(val); - view->render(); + int frameNo = val * info->view->getTotalFrame(); + char buf[64]; + + sprintf(buf, "%d / %ld", frameNo, info->view->getTotalFrame()); + + elm_object_part_text_set(info->layout, "text", buf); + + info->view->seek(val); + info->view->render(); } EAPI_MAIN int @@ -27,6 +40,8 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) { Evas_Object *win, *layout, *slider, *image; bool renderMode = true; + char buf[64]; + AppInfo appInfo; if (argc > 1) { if (!strcmp(argv[1], "--disable-render")) @@ -63,10 +78,16 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) evas_object_size_hint_min_set(image, 500, 500); elm_object_part_content_set(layout, "lottie", image); + appInfo.view = view; + appInfo.layout = layout; + slider = elm_slider_add(layout); evas_object_show(slider); elm_object_part_content_set(layout, "slider", slider); - evas_object_smart_callback_add(slider, "changed", _slider_cb, (void *)view); + evas_object_smart_callback_add(slider, "changed", _slider_cb, (void *)&appInfo); + + sprintf(buf, "%d / %ld", 0, view->getTotalFrame()); + elm_object_part_text_set(layout, "text", buf); view->seek(0.0); view->render(); diff --git a/example/resource/layout.edc b/example/resource/layout.edc index cbc0694808..f13e870896 100644 --- a/example/resource/layout.edc +++ b/example/resource/layout.edc @@ -3,12 +3,15 @@ collections { parts { rect { "bg"; desc { state: "default" 0.0; - color: 255 255 255 255; + color: 225 225 225 225; } } spacer { "lottie_base"; desc { state: "default" 0.0; - rel2.relative: 1.0 0.7; + rel1.to_y: "text"; + rel1.relative: 0.0 1.0; + rel2.to_y: "slider"; + rel2.relative: 1.0 0.0; } } swallow { "lottie"; @@ -19,11 +22,43 @@ collections { rel2.relative: 0.5 0.5; } } + text { "text"; + desc { state: "default" 0.0; + rel1.relative: 1.0 0.0; + rel2.relative: 1.0 0.0; + rel1.offset: -20 20; + rel2.offset: -20 20; + align: 1.0 0.0; + color: 0 0 0 255; + min: 200 30; + text { + font: "arial"; + size: 25; + align: 1.0 0.5; + } + } + } swallow { "slider"; desc { state: "default" 0.0; - rel1.relative: 0.0 0.7; - rel1.offset: 20 20; - rel2.offset: -20 -20; + min: 0 100; + max: -1 100; + align: 0.5 1.0; + rel1.to_x: "left_pad"; + rel1.relative: 1.0 1.0; + rel2.to_x: "right_pad"; + rel2.relative: 0.0 1.0; + } + } + spacer { "left_pad"; + desc { state: "default" 0.0; + min: 20 0; + rel2.relative: 0.0 0.0; + } + } + spacer { "right_pad"; + desc { state: "default" 0.0; + min: 20 0; + rel1.relative: 1.0 0.0; } } } diff --git a/example/resource/layout.edj b/example/resource/layout.edj index a8f567df9df7230d7c501cb5c43b660b4d9057b2..38add6be83136ffc2092b212719c747638201afc 100644 GIT binary patch literal 8870 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 bnm)6-ru(ql@68?dbzI^4qrz&v_Wl0@ZYZFE literal 7712 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 sG_Oh6-!aR3{MRSfyg2Yq#J=k1_H^7+ll<)8mUY Date: Wed, 22 Aug 2018 14:25:56 +0900 Subject: [PATCH 190/672] lottieplayer: polishing getFrameDuration(), getFrameRate() Change-Id: I4344a6689c7ee8890e33978bfc5ca6a2c401da36 --- src/lottie/lottiemodel.h | 6 +++--- src/lottie/lottieplayer.cpp | 28 ++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 2c484b1539..bc1d373ab5 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -355,11 +355,11 @@ class LOTCompositionData : public LOTData { public: LOTCompositionData():LOTData(LOTData::Type::Composition){} - long frameDuration()const{return mEndFrame - mStartFrame -1;} - long frameRate()const{return mFrameRate;} + long frameDuration() const {return mEndFrame - mStartFrame -1;} + float frameRate() const {return mFrameRate;} long startFrame() const {return mStartFrame;} long endFrame() const {return mEndFrame;} - VSize size() const { return mSize;} + VSize size() const {return mSize;} void processRepeaterObjects(); void accept(LOTDataVisitor *visitor) override {visitor->visit(this); mRootLayer->accept(visitor);} diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index c1215abf22..733d464781 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -19,8 +19,8 @@ public: VSize size() const; float playTime() const; float pos(); - float getFrameRate() const { return mFrameRate; } - long getTotalFrame() const { return mTotalFrame; } + float getFrameRate() const; + long getTotalFrame() const; const std::vector &renderList(float pos); bool render(float pos, const LOTBuffer &buffer, bool forceRender); @@ -31,10 +31,28 @@ private: VSize mSize; std::atomic mRenderInProgress; float mPos = 0.0; - float mFrameRate; - long mTotalFrame; }; +float LOTPlayerPrivate::getFrameRate() const +{ + if (!mModel) { + vWarning << "Model Data is not existed yet, please setFilePath() first."; + return 0.0f; + } + + return mModel->frameRate(); +} + +long LOTPlayerPrivate::getTotalFrame() const +{ + if (!mModel) { + vWarning << "Model Data is not existed yet, please setFilePath() first."; + return 0.0f; + } + + return mModel->frameDuration(); +} + void LOTPlayerPrivate::setSize(const VSize &sz) { mSize = sz; @@ -128,8 +146,6 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); - mTotalFrame = mModel->frameDuration(); - mFrameRate = mModel->frameRate(); return true; } return false; From f0515f36b89eb31710b553ac69ff89a08f231707 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 Aug 2018 13:13:08 +0900 Subject: [PATCH 191/672] lottie/vector: return correct number from segments() api. Change-Id: Ifb90d0f7567ba0737f70c7b7abfc467e94004780 --- src/vector/vpath.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index f12f651197..085094c530 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -118,7 +118,7 @@ void VPath::VPathData::reset() int VPath::VPathData::segments() const { - return m_segments + 1; + return m_segments; } void VPath::VPathData::reserve(int pts, int elms) From 43d77af0d175f0fff8854ce1fd0a608c3504c372 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 Aug 2018 13:10:06 +0900 Subject: [PATCH 192/672] lottie/vector : added addPath() api to vpath. Change-Id: I3fd7ee9ba8add8f7109c23c0b6e62388b3fda5bf --- src/vector/vpath.cpp | 17 +++++++++++++++++ src/vector/vpath.h | 13 +++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 085094c530..7089d2bf6b 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -667,4 +667,21 @@ void VPath::VPathData::addPolygon(float points, float radius, float roundness, close(); } +void VPath::VPathData::addPath(const VPathData &path) +{ + int segment = path.segments(); + + // make sure enough memory available + if (m_points.capacity() < m_points.size() + path.m_points.size()) + m_points.reserve(m_points.size() + path.m_points.size()); + + if (m_elements.capacity() < m_elements.size() + path.m_elements.size()) + m_elements.reserve(m_elements.size() + path.m_elements.size()); + + std::copy(path.m_points.begin(), path.m_points.end(), back_inserter(m_points)); + std::copy(path.m_elements.begin(), path.m_elements.end(), back_inserter(m_elements)); + + m_segments += segment; +} + V_END_NAMESPACE diff --git a/src/vector/vpath.h b/src/vector/vpath.h index ff5583a8c2..8845b415cf 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -41,6 +41,7 @@ public: void addPolygon(float points, float radius, float roundness, float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); + void addPath(const VPath &path); void transform(const VMatrix &m); float length() const; const std::vector &elements() const; @@ -74,6 +75,7 @@ private: void addPolygon(float points, float radius, float roundness, float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); + void addPath(const VPathData &path); const std::vector &elements() const { return m_elements; @@ -201,6 +203,17 @@ inline void VPath::addPolygon(float points, float radius, float roundness, d.write().addPolygon(points, radius, roundness, startAngle, cx, cy, dir); } +inline void VPath::addPath(const VPath &path) +{ + if (path.isEmpty()) return; + + if (isEmpty()) { + *this = path; + } else { + d.write().addPath(path.d.read()); + } +} + inline const std::vector &VPath::elements() const { return d->elements(); From 5775d0226113ad2ba58548169ba8fef19a180d9b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 Aug 2018 11:12:13 +0900 Subject: [PATCH 193/672] lottie: refactor the lottie scene graph processing. Change-Id: I739aa19abaf7f141b556b67083df4461945461d9 --- src/lottie/lottieitem.cpp | 151 ++++++++++++++++++-------------------- src/lottie/lottieitem.h | 44 +++++------ src/vector/vdrawable.cpp | 6 ++ 3 files changed, 102 insertions(+), 99 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 1960242cff..23810d92a7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -457,7 +457,10 @@ LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData) { mRoot = std::make_unique(nullptr); mRoot->addChildren(layerData); - mRoot->processPaintOperation(); + + std::vector list; + mRoot->processPathItems(list); + if (layerData->hasPathOperator()) mRoot->processTrimOperation(); } @@ -576,44 +579,26 @@ void LOTContentGroupItem::renderList(std::vector &list) } } -void LOTContentGroupItem::processPaintOperation() -{ - std::vector list; - paintOperationHelper(list); -} - -void LOTContentGroupItem::paintOperationHelper( - std::vector &list) +void LOTContentGroupItem::processPathItems( + std::vector &list) { int curOpCount = list.size(); - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - auto child = (*i).get(); - if (auto pathNode = dynamic_cast(child)) { - // the node is a path data node add the paint operation list to it. - pathNode->addPaintOperation(list, curOpCount); - } else if (auto paintNode = dynamic_cast(child)) { - // add it to the paint operation list - list.push_back(paintNode); + for (auto &i : mContents) { + if (auto pathNode = dynamic_cast(i.get())) { + // add it to the list + list.push_back(pathNode); + } else if (auto paintNode = dynamic_cast(i.get())) { + // the node is a paint data node update the path list of the paint item. + paintNode->addPathItems(list); } else if (auto groupNode = - dynamic_cast(child)) { + dynamic_cast(i.get())) { // update the groups node with current list - groupNode->paintOperationHelper(list); + groupNode->processPathItems(list); } } list.erase(list.begin() + curOpCount, list.end()); } -void LOTPathDataItem::addPaintOperation(std::vector &list, - int externalCount) -{ - for (auto paintItem : list) { - bool sameGroup = (externalCount-- > 0) ? false : true; - mNodeList.push_back(std::make_unique()); - mRenderList.push_back( - LOTRenderNode(this, paintItem, mNodeList.back().get(), sameGroup)); - } -} - void LOTContentGroupItem::processTrimOperation() { std::vector list; @@ -682,30 +667,6 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, mFinalPath.transform(parentMatrix); mPathChanged = true; } - - // 2. update the rendernode list - for (const auto &i : mRenderList) { - i.drawable->mFlag = VDrawable::DirtyState::None; - i.paintNodeRef->updateRenderNode(i.pathNodeRef, i.drawable, - i.sameGroup); - if (mPathChanged) - i.drawable->mFlag |= VDrawable::DirtyState::Path; - - if (i.drawable->mFlag & VDrawable::DirtyState::Path) - i.drawable->mPath = mFinalPath; - } -} - -void LOTPathDataItem::renderList(std::vector &list) -{ - for (const auto &i : mRenderList) { - list.push_back(i.drawable); - } -} - -VPath LOTPathDataItem::path() const -{ - return mFinalPath; } LOTRectItem::LOTRectItem(LOTRectData *data) @@ -790,23 +751,61 @@ void LOTPolystarItem::updatePath(VPath& path, int frameNo) * PaintData Node handling * */ +LOTPaintDataItem::LOTPaintDataItem(bool staticContent):mDrawable(std::make_unique()), + mStaticContent(staticContent){} void LOTPaintDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) { - mContentChanged = false; + mRenderNodeUpdate = true; mParentAlpha = parentAlpha; mParentMatrix = parentMatrix; mFlag = flag; mFrameNo = frameNo; - // 1. update the local content if needed - // if (!(mInit && mStaticContent)) { - mInit = true; + updateContent(frameNo); - mContentChanged = true; - // } } +void LOTPaintDataItem::updateRenderNode() +{ + bool dirty = false; + for (auto &i : mPathItems) { + if (i->dirty()) { + dirty = true; + break; + } + } + + if (dirty) { + mPath.reset(); + + for (auto &i : mPathItems) { + mPath.addPath(i->path()); + } + mDrawable->setPath(mPath); + } else { + if (mDrawable->mFlag & VDrawable::DirtyState::Path) + mDrawable->mPath = mPath; + } +} + +void LOTPaintDataItem::renderList(std::vector &list) +{ + if (mRenderNodeUpdate) { + updateRenderNode(); + LOTPaintDataItem::updateRenderNode(); + mRenderNodeUpdate = false; + } + list.push_back(mDrawable.get()); +} + + +void LOTPaintDataItem::addPathItems(std::vector &list) +{ + mPathItems = list; +} + + LOTFillItem::LOTFillItem(LOTFillData *data) : LOTPaintDataItem(data->isStatic()), mData(data) { @@ -820,15 +819,14 @@ void LOTFillItem::updateContent(int frameNo) mFillRule = mData->fillRule(); } -void LOTFillItem::updateRenderNode(LOTPathDataItem *pathNode, - VDrawable *drawable, bool sameParent) +void LOTFillItem::updateRenderNode() { VColor color = mColor; color.setAlpha(color.a * parentAlpha()); VBrush brush(color); - drawable->setBrush(brush); - drawable->setFillRule(mFillRule); + mDrawable->setBrush(brush); + mDrawable->setFillRule(mFillRule); } LOTGFillItem::LOTGFillItem(LOTGFillData *data) @@ -843,11 +841,10 @@ void LOTGFillItem::updateContent(int frameNo) mFillRule = mData->fillRule(); } -void LOTGFillItem::updateRenderNode(LOTPathDataItem */*pathNode*/, - VDrawable *drawable, bool /*sameParent*/) +void LOTGFillItem::updateRenderNode() { - drawable->setBrush(VBrush(mGradient.get())); - drawable->setFillRule(mFillRule); + mDrawable->setBrush(VBrush(mGradient.get())); + mDrawable->setFillRule(mFillRule); } LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data) @@ -882,21 +879,20 @@ static float getScale(const VMatrix &matrix) return std::sqrt(final.x() * final.x() + final.y() * final.y()); } -void LOTStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, - VDrawable *drawable, bool sameParent) +void LOTStrokeItem::updateRenderNode() { VColor color = mColor; color.setAlpha(color.a * parentAlpha()); VBrush brush(color); - drawable->setBrush(brush); + mDrawable->setBrush(brush); float scale = getScale(mParentMatrix); - drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, + mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); if (mDashArraySize) { for (int i = 0 ; i < mDashArraySize ; i++) mDashArray[i] *= scale; - drawable->setDashInfo(mDashArray, mDashArraySize); + mDrawable->setDashInfo(mDashArray, mDashArraySize); } } @@ -919,17 +915,16 @@ void LOTGStrokeItem::updateContent(int frameNo) } } -void LOTGStrokeItem::updateRenderNode(LOTPathDataItem */*pathNode*/, - VDrawable *drawable, bool /*sameParent*/) +void LOTGStrokeItem::updateRenderNode() { float scale = getScale(mParentMatrix); - drawable->setBrush(VBrush(mGradient.get())); - drawable->setStrokeInfo(mCap, mJoin, mMiterLimit, + mDrawable->setBrush(VBrush(mGradient.get())); + mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); if (mDashArraySize) { for (int i = 0 ; i < mDashArraySize ; i++) mDashArray[i] *= scale; - drawable->setDashInfo(mDashArray, mDashArraySize); + mDrawable->setDashInfo(mDashArray, mDashArraySize); } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 90630a8152..0af1183a1b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -192,6 +192,7 @@ public: void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; void processPaintOperation(); void processTrimOperation(); + void processPathItems(std::vector &list); void renderList(std::vector &list) final; private: void paintOperationHelper(std::vector &list); @@ -206,18 +207,16 @@ public: LOTPathDataItem(bool staticPath):mInit(false), mStaticPath(staticPath){} void addPaintOperation(std::vector &list, int externalCount); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - VPath path() const; void addTrimOperation(std::vector &list); - void renderList(std::vector &list) final; + bool dirty() const {return mPathChanged;} + const VPath &path()const {return mFinalPath;} private: std::vector mTrimNodeRefs; - std::vector mRenderList; - std::vector> mNodeList; bool mInit; bool mStaticPath; - VPath mLocalPath; - VPath mFinalPath; - bool mPathChanged; + VPath mLocalPath; + VPath mFinalPath; + bool mPathChanged{true}; protected: virtual void updatePath(VPath& path, int frameNo) = 0; virtual bool hasChanged(int frameNo) = 0; @@ -362,21 +361,24 @@ private: class LOTPaintDataItem : public LOTContentItem { public: - LOTPaintDataItem(bool staticContent):mInit(false), mStaticContent(staticContent){} + LOTPaintDataItem(bool staticContent); + void addPathItems(std::vector &list); virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); - virtual void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) = 0; + void renderList(std::vector &list) final; protected: virtual void updateContent(int frameNo) = 0; + virtual void updateRenderNode(); inline float parentAlpha() const {return mParentAlpha;} - inline bool contentChanged() const{return mContentChanged;} public: - float mParentAlpha; - VMatrix mParentMatrix; - DirtyFlag mFlag; - int mFrameNo; - bool mInit; - bool mStaticContent; - bool mContentChanged; + float mParentAlpha; + VMatrix mParentMatrix; + VPath mPath; + DirtyFlag mFlag; + int mFrameNo; + std::vector mPathItems; + std::unique_ptr mDrawable; + bool mStaticContent; + bool mRenderNodeUpdate{true}; }; class LOTFillItem : public LOTPaintDataItem @@ -385,7 +387,7 @@ public: LOTFillItem(LOTFillData *data); protected: void updateContent(int frameNo) final; - void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; + void updateRenderNode() final; private: LOTFillData *mData; VColor mColor; @@ -398,7 +400,7 @@ public: LOTGFillItem(LOTGFillData *data); protected: void updateContent(int frameNo) final; - void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; + void updateRenderNode() final; private: LOTGFillData *mData; std::unique_ptr mGradient; @@ -411,7 +413,7 @@ public: LOTStrokeItem(LOTStrokeData *data); protected: void updateContent(int frameNo) final; - void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; + void updateRenderNode() final; private: LOTStrokeData *mData; CapStyle mCap; @@ -429,7 +431,7 @@ public: LOTGStrokeItem(LOTGStrokeData *data); protected: void updateContent(int frameNo) final; - void updateRenderNode(LOTPathDataItem *pathNode, VDrawable *renderer, bool sameParent) final; + void updateRenderNode() final; private: LOTGStrokeData *mData; std::unique_ptr mGradient; diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 450952b291..eda7352bfb 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -70,3 +70,9 @@ void VDrawable::setDashInfo(float *array, uint size) } mFlag |= DirtyState::Path; } + +void VDrawable::setPath(const VPath &path) +{ + mPath = path; + mFlag |= DirtyState::Path; +} From eea5add913e0b9fd0c2d236541ec5d5f1975a5a5 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 23 Aug 2018 17:07:48 +0900 Subject: [PATCH 194/672] lottie: fixed regression caused by last commit There was issue caused by item inside of groups. Change-Id: If9057db4f183fc2956d3bd43dca92fc5bb628202 --- src/lottie/lottieitem.cpp | 7 +++---- src/lottie/lottieitem.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 23810d92a7..84945b6278 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -589,14 +589,13 @@ void LOTContentGroupItem::processPathItems( list.push_back(pathNode); } else if (auto paintNode = dynamic_cast(i.get())) { // the node is a paint data node update the path list of the paint item. - paintNode->addPathItems(list); + paintNode->addPathItems(list, curOpCount); } else if (auto groupNode = dynamic_cast(i.get())) { // update the groups node with current list groupNode->processPathItems(list); } } - list.erase(list.begin() + curOpCount, list.end()); } void LOTContentGroupItem::processTrimOperation() @@ -800,9 +799,9 @@ void LOTPaintDataItem::renderList(std::vector &list) } -void LOTPaintDataItem::addPathItems(std::vector &list) +void LOTPaintDataItem::addPathItems(std::vector &list, int startOffset) { - mPathItems = list; + std::copy(list.begin() + startOffset, list.end(), back_inserter(mPathItems)); } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 0af1183a1b..e260d2d0c8 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -362,7 +362,7 @@ class LOTPaintDataItem : public LOTContentItem { public: LOTPaintDataItem(bool staticContent); - void addPathItems(std::vector &list); + void addPathItems(std::vector &list, int startOffset); virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); void renderList(std::vector &list) final; protected: From 2e59b9fb93408898f3f1150eadb8e84b1e740cfa Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 Aug 2018 17:19:43 +0900 Subject: [PATCH 195/672] lottie: remove dead code. Change-Id: I81d8c6e3e0c4b6b6d9cff03f70e8818af57dfade --- src/lottie/lottieitem.h | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index e260d2d0c8..c20dbdc70c 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -165,15 +165,6 @@ class LOTNode; class LOTPathDataItem; class LOTPaintDataItem; class LOTTrimItem; -struct LOTRenderNode -{ - LOTRenderNode(LOTPathDataItem *path, LOTPaintDataItem *paint, VDrawable *render, bool sameG) - :pathNodeRef(path), paintNodeRef(paint), drawable(render), sameGroup(sameG){} - LOTPathDataItem *pathNodeRef; - LOTPaintDataItem *paintNodeRef; - VDrawable *drawable; - bool sameGroup; -}; class LOTContentItem { @@ -190,12 +181,10 @@ public: LOTContentGroupItem(LOTShapeGroupData *data); void addChildren(LOTGroupData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - void processPaintOperation(); void processTrimOperation(); void processPathItems(std::vector &list); void renderList(std::vector &list) final; private: - void paintOperationHelper(std::vector &list); void trimOperationHelper(std::vector &list); LOTShapeGroupData *mData; std::vector> mContents; @@ -205,7 +194,6 @@ class LOTPathDataItem : public LOTContentItem { public: LOTPathDataItem(bool staticPath):mInit(false), mStaticPath(staticPath){} - void addPaintOperation(std::vector &list, int externalCount); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; void addTrimOperation(std::vector &list); bool dirty() const {return mPathChanged;} From 386e6ebbffee437bbdf264da5f2d81d6ff12423e Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Thu, 23 Aug 2018 19:31:28 +0900 Subject: [PATCH 196/672] lottie: fix doubled scale issue The scale was calculated based on length 2. So, its result was also doubled. It should be half before return scale result. Change-Id: I66a5fa9ba235bd5ebcde89b9b3c01c0f128d217e --- src/lottie/lottieitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 84945b6278..1104cd59af 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -875,7 +875,7 @@ static float getScale(const VMatrix &matrix) p2 = matrix.map(p2); VPointF final = p2 - p1; - return std::sqrt(final.x() * final.x() + final.y() * final.y()); + return std::sqrt(final.x() * final.x() + final.y() * final.y()) / 2.0; } void LOTStrokeItem::updateRenderNode() From a73e49a6f9fd3247ce63dd40f59974156e573efb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 24 Aug 2018 11:01:48 +0900 Subject: [PATCH 197/672] lottie: refactor processing of trim objects. 1. now each trim item keeps a list of path item it operates on. 2. trim update phase happens after the update phase. so that all path items are correctly updated. 3. Trim objects operate on a intermediate path so that multiple trim objects operating on same path can be possible. Change-Id: I9a6d66aef4449b9399ebc65e29d8633cf41cd25a --- src/lottie/lottieitem.cpp | 130 ++++++++++++++++++++++++-------------- src/lottie/lottieitem.h | 36 ++++++++--- src/lottie/lottiemodel.h | 4 ++ 3 files changed, 113 insertions(+), 57 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 1104cd59af..8d57009166 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -459,9 +459,12 @@ LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData) mRoot->addChildren(layerData); std::vector list; - mRoot->processPathItems(list); + mRoot->processPaintItems(list); - if (layerData->hasPathOperator()) mRoot->processTrimOperation(); + if (layerData->hasPathOperator()) { + list.clear(); + mRoot->processTrimItems(list); + } } std::unique_ptr @@ -522,6 +525,10 @@ LOTShapeLayerItem::createContentItem(LOTData *contentData) void LOTShapeLayerItem::updateContent() { mRoot->update(frameNo(), combinedMatrix(), combinedAlpha(), flag()); + + if (mLayerData->hasPathOperator()) { + mRoot->applyTrim(); + } } void LOTShapeLayerItem::renderList(std::vector &list) @@ -572,6 +579,17 @@ void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, } } +void LOTContentGroupItem::applyTrim() +{ + for (auto &i : mContents) { + if (auto trim = dynamic_cast(i.get())) { + trim->update(); + } else if (auto group = dynamic_cast(i.get())) { + group->applyTrim(); + } + } +} + void LOTContentGroupItem::renderList(std::vector &list) { for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { @@ -579,7 +597,7 @@ void LOTContentGroupItem::renderList(std::vector &list) } } -void LOTContentGroupItem::processPathItems( +void LOTContentGroupItem::processPaintItems( std::vector &list) { int curOpCount = list.size(); @@ -593,49 +611,33 @@ void LOTContentGroupItem::processPathItems( } else if (auto groupNode = dynamic_cast(i.get())) { // update the groups node with current list - groupNode->processPathItems(list); + groupNode->processPaintItems(list); } } } -void LOTContentGroupItem::processTrimOperation() -{ - std::vector list; - trimOperationHelper(list); -} - -void LOTContentGroupItem::trimOperationHelper(std::vector &list) +void LOTContentGroupItem::processTrimItems( + std::vector &list) { int curOpCount = list.size(); - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - auto child = (*i).get(); - if (auto pathNode = dynamic_cast(child)) { - // the node is a path data node add the trim operation list to it. - pathNode->addTrimOperation(list); - } else if (auto trimNode = dynamic_cast(child)) { - // add it to the trim operation list - list.push_back(trimNode); + for (auto &i : mContents) { + if (auto pathNode = dynamic_cast(i.get())) { + // add it to the list + list.push_back(pathNode); + } else if (auto trimNode = dynamic_cast(i.get())) { + // the node is a paint data node update the path list of the paint item. + trimNode->addPathItems(list, curOpCount); } else if (auto groupNode = - dynamic_cast(child)) { + dynamic_cast(i.get())) { // update the groups node with current list - groupNode->trimOperationHelper(list); + groupNode->processTrimItems(list); } } - list.erase(list.begin() + curOpCount, list.end()); -} - -void LOTPathDataItem::addTrimOperation(std::vector &list) -{ - for (auto trimItem : list) { - mTrimNodeRefs.push_back(trimItem); - } } void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float, const DirtyFlag &flag) { - VPath tempPath; - mPathChanged = false; // 1. update the local path if needed @@ -645,29 +647,25 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, mPathChanged = true; } - tempPath = mLocalPath; - - // 2. apply path operation if needed - if (mTrimNodeRefs.size() > 0) { - // TODO apply more than one trim path if necessary - VPathMesure pm; - float s = mTrimNodeRefs.front()->getStart(frameNo) / 100.0f; - float e = mTrimNodeRefs.front()->getEnd(frameNo) / 100.0f; - - pm.setOffset(s, e); - tempPath = pm.trim(tempPath); - mPathChanged = true; - } + mTemp = mLocalPath; // 3. compute the final path with parentMatrix if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { - mFinalPath.clone(tempPath); - mFinalPath.transform(parentMatrix); + mMatrix = parentMatrix; mPathChanged = true; } } +const VPath & LOTPathDataItem::finalPath() +{ + if (mPathChanged) { + mFinalPath.clone(mTemp); + mFinalPath.transform(mMatrix); + mPathChanged = false; + } + return mFinalPath; +} LOTRectItem::LOTRectItem(LOTRectData *data) : LOTPathDataItem(data->isStatic()), mData(data) { @@ -779,7 +777,7 @@ void LOTPaintDataItem::updateRenderNode() mPath.reset(); for (auto &i : mPathItems) { - mPath.addPath(i->path()); + mPath.addPath(i->finalPath()); } mDrawable->setPath(mPath); } else { @@ -929,11 +927,47 @@ void LOTGStrokeItem::updateRenderNode() LOTTrimItem::LOTTrimItem(LOTTrimData *data) : mData(data) {} -void LOTTrimItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/, +void LOTTrimItem::update(int frameNo, const VMatrix &/*parentMatrix*/, float /*parentAlpha*/, const DirtyFlag &/*flag*/) { + mDirty = false; + + if (mCache.mFrameNo == frameNo) return; + + float start = mData->start(frameNo); + float end = mData->end(frameNo); + float offset = mData->offset(frameNo); + + if (!(vCompare(mCache.mStart, start) && vCompare(mCache.mEnd, end) && + vCompare(mCache.mOffset, offset))) { + mDirty = true; + mCache.mStart = start; + mCache.mEnd = end; + mCache.mOffset = offset; + } + mCache.mFrameNo = frameNo; } +void LOTTrimItem::update() +{ + // when both path and trim are not dirty + if (!(mDirty || pathDirty())) return; + + //@TODO take the offset and trim type into account. + for (auto &i : mPathItems) { + VPathMesure pm; + pm.setOffset(mCache.mStart, mCache.mEnd); + i->updatePath(pm.trim(i->localPath())); + } +} + + +void LOTTrimItem::addPathItems(std::vector &list, int startOffset) +{ + std::copy(list.begin() + startOffset, list.end(), back_inserter(mPathItems)); +} + + LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) {} void LOTRepeaterItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/, diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index c20dbdc70c..1ef0ee34b5 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -181,11 +181,11 @@ public: LOTContentGroupItem(LOTShapeGroupData *data); void addChildren(LOTGroupData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - void processTrimOperation(); - void processPathItems(std::vector &list); + void applyTrim(); + void processTrimItems(std::vector &list); + void processPaintItems(std::vector &list); void renderList(std::vector &list) final; private: - void trimOperationHelper(std::vector &list); LOTShapeGroupData *mData; std::vector> mContents; }; @@ -195,15 +195,17 @@ class LOTPathDataItem : public LOTContentItem public: LOTPathDataItem(bool staticPath):mInit(false), mStaticPath(staticPath){} void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - void addTrimOperation(std::vector &list); bool dirty() const {return mPathChanged;} - const VPath &path()const {return mFinalPath;} + const VPath &localPath() const {return mTemp;} + const VPath &finalPath(); + void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true;} private: - std::vector mTrimNodeRefs; bool mInit; bool mStaticPath; VPath mLocalPath; + VPath mTemp; VPath mFinalPath; + VMatrix mMatrix; bool mPathChanged{true}; protected: virtual void updatePath(VPath& path, int frameNo) = 0; @@ -440,10 +442,26 @@ class LOTTrimItem : public LOTContentItem public: LOTTrimItem(LOTTrimData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - float getStart(int frameNo) {return mData->mStart.value(frameNo);} - float getEnd(int frameNo) {return mData->mEnd.value(frameNo);} + void update(); + void addPathItems(std::vector &list, int startOffset); private: - LOTTrimData *mData; + bool pathDirty() const { + for (auto &i : mPathItems) { + if (i->dirty()) + return true; + } + return false; + } + struct Cache { + int mFrameNo{-1}; + float mStart{0}; + float mEnd{0}; + float mOffset{0}; + }; + Cache mCache; + std::vector mPathItems; + LOTTrimData *mData; + bool mDirty{true}; }; class LOTRepeaterItem : public LOTContentItem diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index bc1d373ab5..165a50238b 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -654,6 +654,10 @@ public: LOTTrimData():LOTData(LOTData::Type::Trim){} void accept(LOTDataVisitor *visitor) final {visitor->visit(this);} + float start(int frameNo) const {return mStart.value(frameNo)/100.0f;} + float end(int frameNo) const {return mEnd.value(frameNo)/100.0f;} + float offset(int frameNo) const {return mOffset.value(frameNo)/100.0f;} + LOTTrimData::TrimType type() const {return mTrimType;} public: LOTAnimatable mStart{0}; LOTAnimatable mEnd{0}; From a752461b8fc31ef512ae55c83f56dcb25ca15c0a Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 24 Aug 2018 14:41:31 +0900 Subject: [PATCH 198/672] lottie: fix issue - path was not updated properly for each painter item It also adds debug message for polystar type. Change-Id: Ie1b788571d003402da0d518be484a0458df5dcec --- src/lottie/lottieitem.cpp | 9 ++++----- src/lottie/lottieitem.h | 10 +++++++--- src/lottie/lottieparser.cpp | 4 ++++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 8d57009166..35be998c61 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -641,16 +641,15 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, mPathChanged = false; // 1. update the local path if needed - if (!(mInit && mStaticPath) && hasChanged(frameNo)) { + if (hasChanged(frameNo)) { updatePath(mLocalPath, frameNo); - mInit = true; mPathChanged = true; + mNeedUpdate = true; } mTemp = mLocalPath; // 3. compute the final path with parentMatrix - if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { mMatrix = parentMatrix; mPathChanged = true; @@ -659,10 +658,10 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, const VPath & LOTPathDataItem::finalPath() { - if (mPathChanged) { + if (mPathChanged || mNeedUpdate) { mFinalPath.clone(mTemp); mFinalPath.transform(mMatrix); - mPathChanged = false; + mNeedUpdate = false; } return mFinalPath; } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 1ef0ee34b5..b2d8a8ff6d 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -193,20 +193,21 @@ private: class LOTPathDataItem : public LOTContentItem { public: - LOTPathDataItem(bool staticPath):mInit(false), mStaticPath(staticPath){} + LOTPathDataItem(bool staticPath): mStaticPath(staticPath){} void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; bool dirty() const {return mPathChanged;} const VPath &localPath() const {return mTemp;} const VPath &finalPath(); - void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true;} + void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true; mNeedUpdate = true;} + bool staticPath() const { return mStaticPath; } private: - bool mInit; bool mStaticPath; VPath mLocalPath; VPath mTemp; VPath mFinalPath; VMatrix mMatrix; bool mPathChanged{true}; + bool mNeedUpdate{true}; protected: virtual void updatePath(VPath& path, int frameNo) = 0; virtual bool hasChanged(int frameNo) = 0; @@ -235,6 +236,7 @@ protected: mCache.mRoundness = roundness; } bool hasChanged(int frameNo) final { + if (mCache.mFrameNo != -1 && staticPath()) return false; if (mCache.mFrameNo == frameNo) return false; VPointF pos = mData->mPos.value(frameNo); @@ -271,6 +273,7 @@ private: mCache.mSize = size; } bool hasChanged(int frameNo) final { + if (mCache.mFrameNo != -1 && staticPath()) return false; if (mCache.mFrameNo == frameNo) return false; VPointF pos = mData->mPos.value(frameNo); @@ -326,6 +329,7 @@ private: mCache.mRotation = rotation; } bool hasChanged(int frameNo) final { + if (mCache.mFrameNo != -1 && staticPath()) return false; if (mCache.mFrameNo == frameNo) return false; VPointF pos = mData->mPos.value(frameNo); diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index beadb66aec..be8dbc9caa 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1891,6 +1891,10 @@ public: { vDebug << "[ELLIPSE: static:" << e->isStatic() << "]"; } + void visit(LOTPolystarData *e) + { + vDebug << "[POLYSTAR: static:" << e->isStatic() << "]"; + } void visit(LOTTrimData *t) { vDebug << "[TRIM: static: " << t->isStatic() << " ]"; From d2fc8fc57637be9350ec53c7d381674fa5fa2a1c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 24 Aug 2018 15:44:51 +0900 Subject: [PATCH 199/672] lottie: refactor the viewitems to have a parent, to optimize the size of the structure. 1. we could move as much common data to parent structure and then keep the parent pointer in the child. 2. move expensive vmatrix data to parent. Change-Id: Icfd3aa885ebfce5c9555f8b107d3b885827ebedf --- src/lottie/lottieitem.cpp | 21 ++++++++++++--------- src/lottie/lottieitem.h | 24 ++++++++++++++---------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 35be998c61..992009b5e2 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -548,7 +548,10 @@ void LOTContentGroupItem::addChildren(LOTGroupData *data) for (auto &i : data->mChildren) { auto content = LOTShapeLayerItem::createContentItem(i.get()); - if (content) mContents.push_back(std::move(content)); + if (content) { + content->setParent(this); + mContents.push_back(std::move(content)); + } } } @@ -574,6 +577,8 @@ void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, } } + mMatrix = m; + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { (*i)->update(frameNo, m, alpha, newFlag); } @@ -635,7 +640,7 @@ void LOTContentGroupItem::processTrimItems( } } -void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, +void LOTPathDataItem::update(int frameNo, const VMatrix &, float, const DirtyFlag &flag) { mPathChanged = false; @@ -651,7 +656,6 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, // 3. compute the final path with parentMatrix if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { - mMatrix = parentMatrix; mPathChanged = true; } } @@ -660,7 +664,7 @@ const VPath & LOTPathDataItem::finalPath() { if (mPathChanged || mNeedUpdate) { mFinalPath.clone(mTemp); - mFinalPath.transform(mMatrix); + mFinalPath.transform(static_cast(parent())->matrix()); mNeedUpdate = false; } return mFinalPath; @@ -755,7 +759,6 @@ void LOTPaintDataItem::update(int frameNo, const VMatrix &parentMatrix, { mRenderNodeUpdate = true; mParentAlpha = parentAlpha; - mParentMatrix = parentMatrix; mFlag = flag; mFrameNo = frameNo; @@ -833,7 +836,7 @@ LOTGFillItem::LOTGFillItem(LOTGFillData *data) void LOTGFillItem::updateContent(int frameNo) { mData->update(mGradient, frameNo); - mGradient->mMatrix = mParentMatrix; + mGradient->mMatrix = static_cast(parent())->matrix(); mFillRule = mData->fillRule(); } @@ -882,7 +885,7 @@ void LOTStrokeItem::updateRenderNode() color.setAlpha(color.a * parentAlpha()); VBrush brush(color); mDrawable->setBrush(brush); - float scale = getScale(mParentMatrix); + float scale = getScale(static_cast(parent())->matrix()); mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); if (mDashArraySize) { @@ -901,7 +904,7 @@ LOTGStrokeItem::LOTGStrokeItem(LOTGStrokeData *data) void LOTGStrokeItem::updateContent(int frameNo) { mData->update(mGradient, frameNo); - mGradient->mMatrix = mParentMatrix; + mGradient->mMatrix = static_cast(parent())->matrix(); mCap = mData->capStyle(); mJoin = mData->joinStyle(); mMiterLimit = mData->meterLimit(); @@ -913,7 +916,7 @@ void LOTGStrokeItem::updateContent(int frameNo) void LOTGStrokeItem::updateRenderNode() { - float scale = getScale(mParentMatrix); + float scale = getScale(mGradient->mMatrix); mDrawable->setBrush(VBrush(mGradient.get())); mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index b2d8a8ff6d..1396311850 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -173,6 +173,10 @@ public: virtual ~LOTContentItem(){} virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0; virtual void renderList(std::vector &){} + void setParent(LOTContentItem *parent) {mParent = parent;} + LOTContentItem *parent() const {return mParent;} +private: + LOTContentItem *mParent{nullptr}; }; class LOTContentGroupItem: public LOTContentItem @@ -185,9 +189,11 @@ public: void processTrimItems(std::vector &list); void processPaintItems(std::vector &list); void renderList(std::vector &list) final; + const VMatrix & matrix() const { return mMatrix;} private: LOTShapeGroupData *mData; std::vector> mContents; + VMatrix mMatrix; }; class LOTPathDataItem : public LOTContentItem @@ -200,17 +206,16 @@ public: const VPath &finalPath(); void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true; mNeedUpdate = true;} bool staticPath() const { return mStaticPath; } -private: - bool mStaticPath; - VPath mLocalPath; - VPath mTemp; - VPath mFinalPath; - VMatrix mMatrix; - bool mPathChanged{true}; - bool mNeedUpdate{true}; protected: virtual void updatePath(VPath& path, int frameNo) = 0; virtual bool hasChanged(int frameNo) = 0; +private: + VPath mLocalPath; + VPath mTemp; + VPath mFinalPath; + bool mPathChanged{true}; + bool mNeedUpdate{true}; + bool mStaticPath; }; class LOTRectItem: public LOTPathDataItem @@ -223,9 +228,9 @@ protected: struct Cache { int mFrameNo{-1}; + float mRoundness; VPointF mPos; VPointF mSize; - float mRoundness; }; Cache mCache; @@ -365,7 +370,6 @@ protected: inline float parentAlpha() const {return mParentAlpha;} public: float mParentAlpha; - VMatrix mParentMatrix; VPath mPath; DirtyFlag mFlag; int mFrameNo; From f86f1bedd7a4df8a5ec82842783019b89a86d3ca Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Fri, 24 Aug 2018 19:27:20 +0900 Subject: [PATCH 200/672] lottie/vdasher: remove connected dash lines between pathes Since managing multiple pathes by a painter or a stroke, multiple pathes will be drawn in one "dashed" function call. And its vdasher's moveTo() function only do the job properly when there is only one moveTo call. Now, the moveTo() function initialize internal properties properly. Change-Id: I4dd45d480f27dce734ce2ef8d1ff38774c589e64 --- src/vector/vdasher.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index cd7df4382a..d5f7ba90a6 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -70,6 +70,7 @@ VDasher::VDasher(const float *dashArray, int size) void VDasher::moveTo(const VPointF &p) { mIsCurrentOperationGap = false; + mNewSegment = false; mStartPt = p; mCurPt = p; @@ -101,8 +102,7 @@ void VDasher::moveTo(const VPointF &p) normalizeLen -= mDashArray[i].gap; } } else { - mCurrentDashIndex = 0; - mCurrentDashLength = mDashArray[0].length; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; } } @@ -229,6 +229,7 @@ VPath VDasher::dashed(const VPath &path) if (path.isEmpty()) return VPath(); mDashedPath = VPath(); + mCurrentDashIndex = 0; const std::vector &elms = path.elements(); const std::vector & pts = path.points(); const VPointF * ptPtr = pts.data(); From 9de63f660f14abb25a02f68ad9f0535ce9e79502 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 27 Aug 2018 16:18:46 +0900 Subject: [PATCH 201/672] lottie/vdasher: improve readability for lineTo function It creates two internal functions for duplicated code. By replacing nested 'if' conditions with the functions, it improves readability and manageability. Change-Id: I303ba6849f776c5f02df6552f0a37acecb14a78b --- src/vector/vdasher.cpp | 67 +++++++++++++++++++++--------------------- src/vector/vdasher.h | 2 ++ 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index d5f7ba90a6..178f63a61a 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -106,6 +106,30 @@ void VDasher::moveTo(const VPointF &p) } } +void VDasher::addLine(const VPointF &p) +{ + if (mIsCurrentOperationGap) return; + + if (!mNewSegment) { + mDashedPath.moveTo(mCurPt); + mNewSegment = true; + } + mDashedPath.lineTo(p); +} + +void VDasher::updateActiveSegment() +{ + if (!mIsCurrentOperationGap) { + mIsCurrentOperationGap = true; + mNewSegment = false; + mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; + } else { + mIsCurrentOperationGap = false; + mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; + mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + } +} + void VDasher::lineTo(const VPointF &p) { VLine left, right; @@ -113,51 +137,26 @@ void VDasher::lineTo(const VPointF &p) float length = line.length(); if (length < mCurrentDashLength) { mCurrentDashLength -= length; - if (!mIsCurrentOperationGap) { - if (!mNewSegment) { - mDashedPath.moveTo(mCurPt); - mNewSegment = true; - } - mDashedPath.lineTo(p); - } + addLine(p); } else { while (length > mCurrentDashLength) { length -= mCurrentDashLength; line.splitAtLength(mCurrentDashLength, left, right); - if (!mIsCurrentOperationGap) { - if (!mNewSegment) { - mDashedPath.moveTo(left.p1()); - mNewSegment = true; - } - mDashedPath.lineTo(left.p2()); - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } else { - mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } - mIsCurrentOperationGap = !mIsCurrentOperationGap; - if (mIsCurrentOperationGap) - mNewSegment = false; + + addLine(left.p2()); + updateActiveSegment(); + line = right; mCurPt = line.p1(); } + // remainder mCurrentDashLength -= length; - if (!mIsCurrentOperationGap) { - mDashedPath.moveTo(line.p1()); - mDashedPath.lineTo(line.p2()); - } + addLine(line.p2()); + if (mCurrentDashLength < 1.0) { // move to next dash - if (!mIsCurrentOperationGap) { - mIsCurrentOperationGap = true; - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - mNewSegment = false; - } else { - mIsCurrentOperationGap = false; - mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } + updateActiveSegment(); } } mCurPt = p; diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index c50bfb535c..cc341991b7 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -14,6 +14,8 @@ private: void lineTo(const VPointF &p); void cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e); void close(); + void addLine(const VPointF &p); + void updateActiveSegment(); private: struct Dash { From e8195241c4957fcbadcb0e64fb01a9369de52598 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 27 Aug 2018 17:48:35 +0900 Subject: [PATCH 202/672] lottie/vdasher: improve readability for cubicTo function Change-Id: I86422527c33c323d0469a4a6b58089997b55b004 --- src/vector/vdasher.cpp | 57 +++++++++++++++--------------------------- src/vector/vdasher.h | 1 + 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 178f63a61a..d91bc6d682 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -162,6 +162,17 @@ void VDasher::lineTo(const VPointF &p) mCurPt = p; } +void VDasher::addCubic(const VPointF &cp1, const VPointF &cp2, const VPointF &e) +{ + if (mIsCurrentOperationGap) return; + + if (!mNewSegment) { + mDashedPath.moveTo(mCurPt); + mNewSegment = true; + } + mDashedPath.cubicTo(cp1, cp2, e); +} + void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) { VBezier left, right; @@ -170,54 +181,26 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) bezLen = b.length(); if (bezLen < mCurrentDashLength) { mCurrentDashLength -= bezLen; - if (!mIsCurrentOperationGap) { - if (!mNewSegment) { - mDashedPath.moveTo(mCurPt); - mNewSegment = true; - } - mDashedPath.cubicTo(cp1, cp2, e); - } + addCubic(cp1, cp2, e); } else { while (bezLen > mCurrentDashLength) { bezLen -= mCurrentDashLength; b.splitAtLength(mCurrentDashLength, &left, &right); - if (!mIsCurrentOperationGap) { - if (!mNewSegment) { - mDashedPath.moveTo(left.pt1()); - mNewSegment = true; - } - mDashedPath.cubicTo(left.pt2(), left.pt3(), left.pt4()); - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } else { - mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } - mIsCurrentOperationGap = !mIsCurrentOperationGap; - if (mIsCurrentOperationGap) - mNewSegment = false; + + addCubic(left.pt2(), left.pt3(), left.pt4()); + updateActiveSegment(); + b = right; mCurPt = b.pt1(); } + // remainder mCurrentDashLength -= bezLen; - if (!mIsCurrentOperationGap) { - if (!mNewSegment) { - mDashedPath.moveTo(b.pt1()); - mNewSegment = true; - } - mDashedPath.cubicTo(b.pt2(), b.pt3(), b.pt4()); - } + addCubic(b.pt2(), b.pt3(), b.pt4()); + if (mCurrentDashLength < 1.0) { // move to next dash - if (!mIsCurrentOperationGap) { - mIsCurrentOperationGap = true; - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - mNewSegment = false; - } else { - mIsCurrentOperationGap = false; - mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } + updateActiveSegment(); } } mCurPt = e; diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index cc341991b7..7d247def34 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -15,6 +15,7 @@ private: void cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e); void close(); void addLine(const VPointF &p); + void addCubic(const VPointF &cp1, const VPointF &cp2, const VPointF &e); void updateActiveSegment(); private: From d129603118932ca9253f0e81eb928065c17eadc2 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 28 Aug 2018 10:56:20 +0900 Subject: [PATCH 203/672] lottie/vector: refactor VDasher. Change-Id: I30ae3b69839754bfd7c3a19543d03cc205504681 --- src/vector/vdasher.cpp | 124 ++++++++++++++++++++--------------------- src/vector/vdasher.h | 11 ++-- 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index d91bc6d682..095738b037 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -62,16 +62,15 @@ VDasher::VDasher(const float *dashArray, int size) mDashArray = reinterpret_cast(dashArray); mArraySize = size / 2; mDashOffset = dashArray[size - 1]; - mCurrentDashIndex = 0; - mCurrentDashLength = 0; - mIsCurrentOperationGap = false; + mIndex = 0; + mCurrentLength = 0; + mDiscard = false; } void VDasher::moveTo(const VPointF &p) { - mIsCurrentOperationGap = false; - mNewSegment = false; - mStartPt = p; + mDiscard = false; + mStartNewSegment = true; mCurPt = p; if (!vCompare(mDashOffset, 0.0f)) { @@ -87,47 +86,48 @@ void VDasher::moveTo(const VPointF &p) // findout the current dash index , dashlength and gap. for (int i = 0; i < mArraySize; i++) { if (normalizeLen < mDashArray[i].length) { - mCurrentDashIndex = i; - mCurrentDashLength = mDashArray[i].length - normalizeLen; - mIsCurrentOperationGap = false; + mIndex = i; + mCurrentLength = mDashArray[i].length - normalizeLen; + mDiscard = false; break; } normalizeLen -= mDashArray[i].length; if (normalizeLen < mDashArray[i].gap) { - mCurrentDashIndex = i; - mCurrentDashLength = mDashArray[i].gap - normalizeLen; - mIsCurrentOperationGap = true; + mIndex = i; + mCurrentLength = mDashArray[i].gap - normalizeLen; + mDiscard = true; break; } normalizeLen -= mDashArray[i].gap; } } else { - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; + mCurrentLength = mDashArray[mIndex].length; } } void VDasher::addLine(const VPointF &p) { - if (mIsCurrentOperationGap) return; + if (mDiscard) return; - if (!mNewSegment) { - mDashedPath.moveTo(mCurPt); - mNewSegment = true; + if (mStartNewSegment) { + mResult.moveTo(mCurPt); + mStartNewSegment = false; } - mDashedPath.lineTo(p); + mResult.lineTo(p); } void VDasher::updateActiveSegment() { - if (!mIsCurrentOperationGap) { - mIsCurrentOperationGap = true; - mNewSegment = false; - mCurrentDashLength = mDashArray[mCurrentDashIndex].gap; - } else { - mIsCurrentOperationGap = false; - mCurrentDashIndex = (mCurrentDashIndex + 1) % mArraySize; - mCurrentDashLength = mDashArray[mCurrentDashIndex].length; - } + mStartNewSegment = true; + + if (mDiscard) { + mDiscard = false; + mIndex = (mIndex + 1) % mArraySize; + mCurrentLength = mDashArray[mIndex].length; + } else { + mDiscard = true; + mCurrentLength = mDashArray[mIndex].gap; + } } void VDasher::lineTo(const VPointF &p) @@ -135,13 +135,14 @@ void VDasher::lineTo(const VPointF &p) VLine left, right; VLine line(mCurPt, p); float length = line.length(); - if (length < mCurrentDashLength) { - mCurrentDashLength -= length; + + if (length <= mCurrentLength) { + mCurrentLength -= length; addLine(p); } else { - while (length > mCurrentDashLength) { - length -= mCurrentDashLength; - line.splitAtLength(mCurrentDashLength, left, right); + while (length > mCurrentLength) { + length -= mCurrentLength; + line.splitAtLength(mCurrentLength, left, right); addLine(left.p2()); updateActiveSegment(); @@ -149,28 +150,27 @@ void VDasher::lineTo(const VPointF &p) line = right; mCurPt = line.p1(); } - - // remainder - mCurrentDashLength -= length; - addLine(line.p2()); - - if (mCurrentDashLength < 1.0) { - // move to next dash - updateActiveSegment(); + // handle remainder + if (length > 1.0) { + mCurrentLength -= length; + addLine(line.p2()); } } + + if (mCurrentLength < 1.0) updateActiveSegment(); + mCurPt = p; } void VDasher::addCubic(const VPointF &cp1, const VPointF &cp2, const VPointF &e) { - if (mIsCurrentOperationGap) return; + if (mDiscard) return; - if (!mNewSegment) { - mDashedPath.moveTo(mCurPt); - mNewSegment = true; + if (mStartNewSegment) { + mResult.moveTo(mCurPt); + mStartNewSegment = false; } - mDashedPath.cubicTo(cp1, cp2, e); + mResult.cubicTo(cp1, cp2, e); } void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) @@ -179,13 +179,14 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) float bezLen = 0.0; VBezier b = VBezier::fromPoints(mCurPt, cp1, cp2, e); bezLen = b.length(); - if (bezLen < mCurrentDashLength) { - mCurrentDashLength -= bezLen; + + if (bezLen <= mCurrentLength) { + mCurrentLength -= bezLen; addCubic(cp1, cp2, e); } else { - while (bezLen > mCurrentDashLength) { - bezLen -= mCurrentDashLength; - b.splitAtLength(mCurrentDashLength, &left, &right); + while (bezLen > mCurrentLength) { + bezLen -= mCurrentLength; + b.splitAtLength(mCurrentLength, &left, &right); addCubic(left.pt2(), left.pt3(), left.pt4()); updateActiveSegment(); @@ -193,16 +194,15 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) b = right; mCurPt = b.pt1(); } - - // remainder - mCurrentDashLength -= bezLen; - addCubic(b.pt2(), b.pt3(), b.pt4()); - - if (mCurrentDashLength < 1.0) { - // move to next dash - updateActiveSegment(); + // handle remainder + if (bezLen > 1.0) { + mCurrentLength -= bezLen; + addCubic(b.pt2(), b.pt3(), b.pt4()); } } + + if (mCurrentLength < 1.0) updateActiveSegment(); + mCurPt = e; } @@ -210,13 +210,13 @@ VPath VDasher::dashed(const VPath &path) { if (path.isEmpty()) return VPath(); - mDashedPath = VPath(); - mCurrentDashIndex = 0; + mResult = VPath(); + mIndex = 0; const std::vector &elms = path.elements(); const std::vector & pts = path.points(); const VPointF * ptPtr = pts.data(); - for (auto i : elms) { + for (auto &i : elms) { switch (i) { case VPath::Element::MoveTo: { moveTo(*ptPtr++); @@ -240,7 +240,7 @@ VPath VDasher::dashed(const VPath &path) break; } } - return mDashedPath; + return std::move(mResult); } V_END_NAMESPACE diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 7d247def34..2e400603e4 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -25,14 +25,13 @@ private: }; const VDasher::Dash *mDashArray; int mArraySize; - VPointF mStartPt; VPointF mCurPt; - int mCurrentDashIndex; - float mCurrentDashLength; - bool mIsCurrentOperationGap; + int mIndex; /* index to the dash Array */ + float mCurrentLength; + bool mDiscard; float mDashOffset; - VPath mDashedPath; - bool mNewSegment=false; + VPath mResult; + bool mStartNewSegment=true; }; V_END_NAMESPACE From 171165be39044266e1bfc95e837fac6ae87ae6f2 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 28 Aug 2018 15:08:40 +0900 Subject: [PATCH 204/672] lottie/vdasher: fix multiple dashes issue on multiple pathes mIndex is for handling multiple dashes. If a previous path ends at mIndex > 0, it should be initialized as 0 when it starts job for next path. The previous work shouldn't affect the next path. Change-Id: Iab2b00fe456f7195acd7e086f55758ad7d2a7bf6 --- src/vector/vdasher.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 095738b037..508b767d67 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -72,6 +72,7 @@ void VDasher::moveTo(const VPointF &p) mDiscard = false; mStartNewSegment = true; mCurPt = p; + mIndex = 0; if (!vCompare(mDashOffset, 0.0f)) { float totalLength = 0.0; From 7c5b266b0352c05ffdc7e2bba847e25f37c01a45 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Tue, 28 Aug 2018 15:45:48 +0900 Subject: [PATCH 205/672] vector/vdasher: fix a wrong code indentation about the previous patch Sorry for my mistake. Change-Id: I22388fce81738b781c225545e8bff98219be9317 --- src/vector/vdasher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 508b767d67..b3782ff753 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -72,7 +72,7 @@ void VDasher::moveTo(const VPointF &p) mDiscard = false; mStartNewSegment = true; mCurPt = p; - mIndex = 0; + mIndex = 0; if (!vCompare(mDashOffset, 0.0f)) { float totalLength = 0.0; From c87e3933080210f72619bd1e143c1f31db0fa80a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 28 Aug 2018 15:14:24 +0900 Subject: [PATCH 206/672] lottie/vector: refactor VPathMesure to handle offset . Change-Id: Ic84c63376c52167ee2ae88d363bf22aadf4fbca9 --- src/lottie/lottieitem.cpp | 4 ++- src/lottie/lottiemodel.h | 2 +- src/vector/vpathmesure.cpp | 55 ++++++++++++++++++++++++++++++-------- src/vector/vpathmesure.h | 10 ++++--- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 992009b5e2..0681437a68 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -958,7 +958,9 @@ void LOTTrimItem::update() //@TODO take the offset and trim type into account. for (auto &i : mPathItems) { VPathMesure pm; - pm.setOffset(mCache.mStart, mCache.mEnd); + pm.setStart(mCache.mStart); + pm.setEnd(mCache.mEnd); + pm.setOffset(mCache.mOffset); i->updatePath(pm.trim(i->localPath())); } } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 165a50238b..85e50777b1 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -656,7 +656,7 @@ public: {visitor->visit(this);} float start(int frameNo) const {return mStart.value(frameNo)/100.0f;} float end(int frameNo) const {return mEnd.value(frameNo)/100.0f;} - float offset(int frameNo) const {return mOffset.value(frameNo)/100.0f;} + float offset(int frameNo) const {return mOffset.value(frameNo);} LOTTrimData::TrimType type() const {return mTrimType;} public: LOTAnimatable mStart{0}; diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 5e93f8ff15..05c61b623a 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -4,25 +4,58 @@ V_BEGIN_NAMESPACE -void VPathMesure::setOffset(float sp, float ep) +VPath oneSegment(float start, float end, const VPath & path) { - startOffset = sp; - endOffset = ep; + if (start > end) { + std::swap(start, end); + } + float array[5] = {0.0f, start, end - start, 1000, 0.0f}; + VDasher dasher(array, 5); + return dasher.dashed(path); } VPath VPathMesure::trim(const VPath &path) { - if (vCompare(startOffset, 0.0f) && (vCompare(endOffset, 1.0f))) return path; + if (vCompare(mStart, mEnd)) return VPath(); - float len = path.length(); - float sg = len * startOffset; - float eg = len * (1.0f - endOffset); - len = len - (sg + eg); + if ((vCompare(mStart, 0.0f) && (vCompare(mEnd, 1.0f))) || + (vCompare(mStart, 1.0f) && (vCompare(mEnd, 0.0f)))) return path; - float array[5] = {0.0f, sg, len, 1000, 0.0f}; - VDasher dasher(array, 5); + if (vIsZero(mOffset)) { + float length = path.length(); + return oneSegment(length * mStart, length * mEnd, path); + } else { + float length = path.length(); + float offset = fmod(mOffset, length); + float start = length * mStart; + float end = length * mEnd; + start += offset; + end +=offset; - return dasher.dashed(path); + if (start < 0 && end < 0) { + return oneSegment(length + start, length + end, path); + } else if (start > 0 && end > 0) { + if (start > length && end > length) + return oneSegment(start - length, end - length, path); + else if (start < length && end < length) + return oneSegment(start, end, path); + else { + float len1 = start > end ? start - length : end - length; + float start2 = start < end ? start : end; + float gap1 = start2 - len1; + float array[5] = {len1, gap1, length - start2, 1000, 0.0f}; + VDasher dasher(array, 5); + return dasher.dashed(path); + } + } else { + float len1 = start > end ? start : end; + float start2 = start < end ? length + start : length + end; + float gap1 = start2 - len1; + float array[5] = {len1, gap1, length - start2, 1000, 0.0f}; + VDasher dasher(array, 5); + return dasher.dashed(path); + } + } } V_END_NAMESPACE diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 61b1d34e22..8202913df4 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -7,12 +7,14 @@ V_BEGIN_NAMESPACE class VPathMesure { public: - void setOffset(float sp, float ep); + void setStart(float start){mStart = start;} + void setEnd(float end){mEnd = end;} + void setOffset(float offset){mOffset = offset;} VPath trim(const VPath &path); - private: - float startOffset{0.0f}; - float endOffset{1.0f}; + float mStart{0.0f}; + float mEnd{1.0f}; + float mOffset{0.0f}; }; V_END_NAMESPACE From adef38c0e79334beaea5c48b75dade6702c239e7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 29 Aug 2018 11:36:10 +0900 Subject: [PATCH 207/672] lottie/vector: move line related api to its own class . Change-Id: Ib9072653cf534e558eedd88242535bc9a8e028fe --- src/lottie/lottiemodel.cpp | 3 +- src/vector/vbezier.cpp | 24 +++----------- src/vector/vdasher.cpp | 55 ++------------------------------ src/vector/vglobal.h | 14 -------- src/vector/vline.h | 65 ++++++++++++++++++++++++++++++++++++++ src/vector/vpath.cpp | 16 ++++------ 6 files changed, 81 insertions(+), 96 deletions(-) create mode 100644 src/vector/vline.h diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 2e48fac97e..5d4145f73c 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -1,4 +1,5 @@ #include "lottiemodel.h" +#include "vline.h" #include #include @@ -242,7 +243,7 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) grad->radial.cx = start.x(); grad->radial.cy = start.y(); grad->radial.cradius = - vLineLength(start.x(), start.y(), end.x(), end.y()); + VLine::length(start.x(), start.y(), end.x(), end.y()); /* * Focal point is the point lives in highlight length distance from * center along the line (start, end) and rotated by highlight angle. diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index 3651bc7b97..bc31fa2e88 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -1,23 +1,9 @@ #include "vbezier.h" - +#include "vline.h" #include V_BEGIN_NAMESPACE -// Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. -// This uses alpha = 1, beta = 3/8, which results in a maximum error of less -// than 7% compared to the correct value. -static inline float lineLength(float x1, float y1, float x2, float y2) -{ - float x = x2 - x1; - float y = y2 - y1; - - x = x < 0 ? -x : x; - y = y < 0 ? -y : y; - - return (x > y ? x + 0.375 * y : y + 0.375 * x); -} - VBezier VBezier::fromPoints(const VPointF &p1, const VPointF &p2, const VPointF &p3, const VPointF &p4) { @@ -40,11 +26,11 @@ float VBezier::length() const float chord; /* chord length */ float length; - len = len + lineLength(x1, y1, x2, y2); - len = len + lineLength(x2, y2, x3, y3); - len = len + lineLength(x3, y3, x4, y4); + len = len + VLine::length(x1, y1, x2, y2); + len = len + VLine::length(x2, y2, x3, y3); + len = len + VLine::length(x3, y3, x4, y4); - chord = lineLength(x1, y1, x4, y4); + chord = VLine::length(x1, y1, x4, y4); if (!vCompare(len, chord)) { split(&left, &right); /* split in two */ diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index b3782ff753..eedae3aa2d 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -1,60 +1,9 @@ #include "vdasher.h" #include "vbezier.h" +#include "vline.h" V_BEGIN_NAMESPACE -class VLine { -public: - VLine() : mX1(0), mY1(0), mX2(0), mY2(0) {} - VLine(float x1, float y1, float x2, float y2) - : mX1(x1), mY1(y1), mX2(x2), mY2(y2) - { - } - VLine(const VPointF &p1, const VPointF &p2) - : mX1(p1.x()), mY1(p1.y()), mX2(p2.x()), mY2(p2.y()) - { - } - float length() const; - void splitAtLength(float length, VLine &left, VLine &right) const; - VPointF p1() const { return VPointF(mX1, mY1); } - VPointF p2() const { return VPointF(mX2, mY2); } - -private: - float mX1; - float mY1; - float mX2; - float mY2; -}; - -// approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. -// With alpha = 1, beta = 3/8, giving results with the largest error less -// than 7% compared to the exact value. -float VLine::length() const -{ - float x = mX2 - mX1; - float y = mY2 - mY1; - x = x < 0 ? -x : x; - y = y < 0 ? -y : y; - return (x > y ? x + 0.375 * y : y + 0.375 * x); -} - -void VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const -{ - float len = length(); - double dx = ((mX2 - mX1) / len) * lengthAt; - double dy = ((mY2 - mY1) / len) * lengthAt; - - left.mX1 = mX1; - left.mY1 = mY1; - left.mX2 = left.mX1 + dx; - left.mY2 = left.mY1 + dy; - - right.mX1 = left.mX2; - right.mY1 = left.mY2; - right.mX2 = mX2; - right.mY2 = mY2; -} - VDasher::VDasher(const float *dashArray, int size) { if (!(size % 2)) vCritical << "invalid dashArray format"; @@ -104,6 +53,7 @@ void VDasher::moveTo(const VPointF &p) } else { mCurrentLength = mDashArray[mIndex].length; } + if (vIsZero(mCurrentLength)) updateActiveSegment(); } void VDasher::addLine(const VPointF &p) @@ -129,6 +79,7 @@ void VDasher::updateActiveSegment() mDiscard = true; mCurrentLength = mDashArray[mIndex].gap; } + if (vIsZero(mCurrentLength)) updateActiveSegment(); } void VDasher::lineTo(const VPointF &p) diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index df6ae1d26f..a46742fd1c 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -110,20 +110,6 @@ static inline bool vIsZero(double f) return (std::abs(f) <= EPSILON_DOUBLE); } -// Approximate sqrt(x*x + y*y) using the alpha max plus beta min algorithm. -// This uses alpha = 1, beta = 3/8, which results in a maximum error of less -// than 7% compared to the correct value. -static inline float vLineLength(float x1, float y1, float x2, float y2) -{ - float x = x2 - x1; - float y = y2 - y1; - - x = x < 0 ? -x : x; - y = y < 0 ? -y : y; - - return (x > y ? x + 0.375 * y : y + 0.375 * x); -} - class vFlagHelper { int i; diff --git a/src/vector/vline.h b/src/vector/vline.h new file mode 100644 index 0000000000..47ddff40ba --- /dev/null +++ b/src/vector/vline.h @@ -0,0 +1,65 @@ +#ifndef VLINE_H +#define VLINE_H + +#include "vglobal.h" +#include "vpoint.h" + +V_BEGIN_NAMESPACE + +class VLine { +public: + VLine() = default; + VLine(float x1, float y1, float x2, float y2) + : mX1(x1), mY1(y1), mX2(x2), mY2(y2) + { + } + VLine(const VPointF &p1, const VPointF &p2) + : mX1(p1.x()), mY1(p1.y()), mX2(p2.x()), mY2(p2.y()) + { + } + float length() const { return length(mX1, mY1, mX2, mY2);} + void splitAtLength(float length, VLine &left, VLine &right) const; + VPointF p1() const { return VPointF(mX1, mY1); } + VPointF p2() const { return VPointF(mX2, mY2); } + + static float length(float x1, float y1, float x2, float y2); + +private: + float mX1{0}; + float mY1{0}; + float mX2{0}; + float mY2{0}; +}; + +// approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. +// With alpha = 1, beta = 3/8, giving results with the largest error less +// than 7% compared to the exact value. +inline float VLine::length(float x1, float y1, float x2, float y2) +{ + float x = x2 - x1; + float y = y2 - y1; + + x = x < 0 ? -x : x; + y = y < 0 ? -y : y; + + return (x > y ? x + 0.375 * y : y + 0.375 * x); +} + +inline void VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const +{ + float len = length(); + float dx = ((mX2 - mX1) / len) * lengthAt; + float dy = ((mY2 - mY1) / len) * lengthAt; + + left.mX1 = mX1; + left.mY1 = mY1; + left.mX2 = left.mX1 + dx; + left.mY2 = left.mY1 + dy; + + right.mX1 = left.mX2; + right.mY1 = left.mY2; + right.mX2 = mX2; + right.mY2 = mY2; +} + +#endif //VLINE_H \ No newline at end of file diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 7089d2bf6b..5114603540 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -4,6 +4,7 @@ #include "vbezier.h" #include "vdebug.h" #include "vrect.h" +#include "vline.h" V_BEGIN_NAMESPACE @@ -38,19 +39,14 @@ float VPath::VPathData::length() const i++; break; case VPath::Element::LineTo: { - VPointF p0 = m_points[i - 1]; - VPointF p = m_points[i++]; - VBezier b = VBezier::fromPoints(p0, p0, p, p); - len += b.length(); + len += VLine( m_points[i-1], m_points[i]).length(); + i++; break; } case VPath::Element::CubicTo: { - VPointF p0 = m_points[i - 1]; - VPointF p = m_points[i++]; - VPointF p1 = m_points[i++]; - VPointF p2 = m_points[i++]; - VBezier b = VBezier::fromPoints(p0, p, p1, p2); - len += b.length(); + len += VBezier::fromPoints(m_points[i-1], m_points[i], + m_points[i+1], m_points[i+2]).length(); + i += 3; break; } case VPath::Element::Close: From f18d33b9cb4a2bf64c74b55213f0a751b071f65f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 29 Aug 2018 14:42:35 +0900 Subject: [PATCH 208/672] lottie: added new lottie resource file. Change-Id: I487b65a371b2aeed80cda6211ab55ea525d37c9a --- example/resource/eid_mubarak.json | 1 + example/resource/loading.json | 1 + example/resource/windmill.json | 1 + example/resource/world_locations.json | 1 + 4 files changed, 4 insertions(+) create mode 100644 example/resource/eid_mubarak.json create mode 100644 example/resource/loading.json create mode 100644 example/resource/windmill.json create mode 100644 example/resource/world_locations.json diff --git a/example/resource/eid_mubarak.json b/example/resource/eid_mubarak.json new file mode 100644 index 0000000000..7c198b1d36 --- /dev/null +++ b/example/resource/eid_mubarak.json @@ -0,0 +1 @@ +{"v":"5.1.6","fr":29.9700012207031,"ip":0,"op":144.00000586524,"w":800,"h":800,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Dot1/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,452,0],"ix":2},"a":{"a":0,"k":[16,16,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":90,"s":[0,0,100],"e":[100,100,100]},{"t":100.000004073084}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.897,-0.05],[0.113,9.015],[-8.894,0.102],[-0.039,-8.805]],"o":[[-8.985,0.051],[-0.111,-8.845],[8.768,-0.1],[0.039,8.935]],"v":[[0.144,15.694],[-15.609,0.174],[-0.079,-15.645],[15.68,-0.066]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.969,15.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Dot2/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":100,"ix":10},"p":{"a":0,"k":[378,485,0],"ix":2},"a":{"a":0,"k":[13,13,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":85,"s":[0,0,100],"e":[100,100,100]},{"t":96.0000039101602}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.005,-7.006],[7.005,0.057],[-0.098,6.816],[-6.785,-0.025]],"o":[[-0.006,7.073],[-6.911,-0.055],[0.098,-6.888],[6.855,0.025]],"v":[[12.548,0.084],[0.055,12.587],[-12.455,-0.029],[0.172,-12.619]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.803,12.894],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Dot3/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[485,606,0],"ix":2},"a":{"a":0,"k":[16.5,16,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":40,"s":[0,0,100],"e":[100,100,100]},{"t":55.0000022401959}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.746,-0.066],[0.071,8.674],[-8.785,0.027],[-0.09,-8.869]],"o":[[-8.745,0.067],[-0.073,-8.788],[8.991,-0.027],[0.088,8.767]],"v":[[0.186,15.657],[-15.759,0.091],[-0.154,-15.698],[15.745,-0.218]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.083,15.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"E/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[477,380,0],"ix":2},"a":{"a":0,"k":[122.5,80,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[14.912,0],[0,-15.74],[-14.912,0],[0,15.74]],"o":[[-14.912,0],[0,15.74],[14.912,0],[0,-15.74]],"v":[[224.5,-49],[197.5,-20.5],[223,11],[251.5,-20.5]],"c":true}],"e":[{"i":[[14.912,0],[9.238,-12.744],[-14.884,0.906],[0,15.74]],"o":[[-14.912,0],[-83,114.5],[57.5,-3.5],[0,-15.74]],"v":[[201,22],[156.5,14],[170.5,103],[251.5,-20.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8,"s":[{"i":[[14.912,0],[9.238,-12.744],[-14.884,0.906],[0,15.74]],"o":[[-14.912,0],[-83,114.5],[57.5,-3.5],[0,-15.74]],"v":[[201,22],[156.5,14],[170.5,103],[251.5,-20.5]],"c":true}],"e":[{"i":[[14.912,0],[9.238,-12.744],[-14.884,0.906],[0,15.74]],"o":[[-14.912,0],[-83,114.5],[57.5,-3.5],[0,-15.74]],"v":[[201,22],[156.5,14],[160.5,130.5],[251.5,-20.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[{"i":[[14.912,0],[9.238,-12.744],[-14.884,0.906],[0,15.74]],"o":[[-14.912,0],[-83,114.5],[57.5,-3.5],[0,-15.74]],"v":[[201,22],[156.5,14],[160.5,130.5],[251.5,-20.5]],"c":true}],"e":[{"i":[[14.912,0],[9.238,-12.744],[-14.884,0.911],[29,236.5]],"o":[[-14.912,0],[-83,114.5],[49,-3],[-1.916,-15.623]],"v":[[201,22],[156.5,14],[160.5,130.5],[251.5,-20.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[14.912,0],[9.238,-12.744],[-14.884,0.911],[29,236.5]],"o":[[-14.912,0],[-83,114.5],[49,-3],[-1.916,-15.623]],"v":[[201,22],[156.5,14],[160.5,130.5],[251.5,-20.5]],"c":true}],"e":[{"i":[[14.912,0],[9.238,-12.744],[10.544,-10.544],[29,236.5]],"o":[[-14.912,0],[-83,114.5],[-100,100],[-1.916,-15.623]],"v":[[201,22],[156.5,14],[99,117],[251.5,-20.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27,"s":[{"i":[[14.912,0],[9.238,-12.744],[10.544,-10.544],[29,236.5]],"o":[[-14.912,0],[-83,114.5],[-100,100],[-1.916,-15.623]],"v":[[201,22],[156.5,14],[99,117],[251.5,-20.5]],"c":true}],"e":[{"i":[[14.912,0],[7.935,-13.594],[9.191,-3.786],[183.637,333.26]],"o":[[-14.912,0],[-79.939,136.951],[-157.852,65.032],[-7.596,-13.786]],"v":[[201,22],[156.5,14],[50.5,109.5],[221.5,-13]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[{"i":[[14.912,0],[7.935,-13.594],[9.191,-3.786],[183.637,333.26]],"o":[[-14.912,0],[-79.939,136.951],[-157.852,65.032],[-7.596,-13.786]],"v":[[201,22],[156.5,14],[50.5,109.5],[221.5,-13]],"c":true}],"e":[{"i":[[14.912,0],[7.935,-13.594],[9.191,-3.786],[183.637,333.26]],"o":[[-14.912,0],[-79.939,136.951],[-157.852,65.032],[-7.596,-13.786]],"v":[[201,22],[156.5,20.5],[41,88.5],[212,-34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":39,"s":[{"i":[[14.912,0],[7.935,-13.594],[9.191,-3.786],[183.637,333.26]],"o":[[-14.912,0],[-79.939,136.951],[-157.852,65.032],[-7.596,-13.786]],"v":[[201,22],[156.5,20.5],[41,88.5],[212,-34]],"c":true}],"e":[{"i":[[14.912,0],[7.935,-13.594],[9.191,-3.786],[183.637,333.26]],"o":[[-14.912,0],[-79.939,136.951],[-157.852,65.032],[-7.596,-13.786]],"v":[[201,22],[116.5,-39],[41,88.5],[212,-34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44,"s":[{"i":[[14.912,0],[7.935,-13.594],[9.191,-3.786],[183.637,333.26]],"o":[[-14.912,0],[-79.939,136.951],[-157.852,65.032],[-7.596,-13.786]],"v":[[201,22],[116.5,-39],[41,88.5],[212,-34]],"c":true}],"e":[{"i":[[14.912,0],[7.935,-13.594],[8.523,-5.115],[178.348,365.656]],"o":[[-14.912,0],[-79.939,136.951],[-163.23,97.968],[-6.9,-14.147]],"v":[[201,22],[116.5,-39],[-19.5,41],[212,-34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49,"s":[{"i":[[14.912,0],[7.935,-13.594],[8.523,-5.115],[178.348,365.656]],"o":[[-14.912,0],[-79.939,136.951],[-163.23,97.968],[-6.9,-14.147]],"v":[[201,22],[116.5,-39],[-19.5,41],[212,-34]],"c":true}],"e":[{"i":[[14.912,0],[7.935,-13.594],[8.523,-5.115],[178.348,365.656]],"o":[[-14.912,0],[-79.939,136.951],[-163.23,97.968],[-6.9,-14.147]],"v":[[201,22],[13,-89],[-19.5,41],[212,-34]],"c":true}]},{"t":57.0000023216576}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-15.21,7.235],[2.246,0.395],[-9.788,20.106],[-0.732,1.373],[-6.202,-0.151],[-9.412,15.289],[-2.308,4.75],[-0.675,-1.605],[9.191,-12.372],[8.825,-1.392],[9.092,5.583],[1.895,0.378],[-1.216,-2.194],[-10.857,-0.872],[-7.769,1.993],[-1.772,1.626],[-9.414,12.271],[-1.1,0.691],[0.055,-1.272],[1.095,-1.404],[25.893,-19.379],[17.172,1.05],[1.317,0]],"o":[[16.191,1.61],[-3.303,-0.366],[-21.938,-3.854],[0.681,-1.399],[2.609,-4.89],[17.204,0.421],[2.286,-3.713],[1.391,1.912],[5.596,13.314],[-5.472,7.363],[-10.169,1.604],[-0.985,-0.606],[0.665,2.499],[5.397,9.744],[8.169,0.655],[2.305,-0.591],[11.422,-10.484],[0.742,-0.967],[0.709,1.305],[-0.076,1.764],[-19.821,25.379],[-13.357,9.996],[-1.066,-0.065],[0,0]],"v":[[5.595,57.525],[51.68,47.482],[43.838,46.594],[21.039,1.595],[23.213,-2.535],[35.427,-9.515],[76.559,-30.424],[82.754,-43.023],[86.198,-38.197],[83.743,0.608],[61.716,12.801],[32.576,8.47],[28.808,6.72],[30.885,14.173],[55.884,29.188],[79.64,25.97],[86.045,22.353],[116.637,-12.372],[119.891,-14.481],[121.869,-10.572],[119.958,-5.393],[52.727,63.141],[7.298,78.269],[3.843,78.259]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[3.45,12.351],[0.178,0.306],[0.104,0.059],[13.744,6.907],[-5.73,23.029],[2.691,0.072],[3.141,8.396],[1.117,6.957],[-3.065,-2.548],[-7.604,-0.065],[-13.199,-0.032],[-6.655,-3.927],[10.925,2.071],[7.75,0.539],[9.341,1.332],[4.542,8.538],[-1.104,7.651],[-1.024,5.088],[-0.066,-2.312],[-4.346,-4.918],[-6.589,-0.067],[-8.027,0.351],[-10.117,-5.579],[2.419,-13.264],[1.46,-6.035],[0.262,-2.612],[15.96,0.712],[0.411,-2.425],[-13.665,5.614],[-5.539,3.419],[-2.945,-4.356],[-14.555,-1.639]],"o":[[-20.808,-1.891],[-0.094,-0.335],[-0.052,-0.089],[-11.724,14.264],[-13.077,-6.57],[-2.794,0],[-9.113,-0.242],[-2.489,-6.653],[2.654,3.042],[6.164,5.124],[13.198,0.112],[8.876,0.021],[2.271,-10.209],[-7.578,-1.436],[-9.437,-0.656],[-9.236,-1.317],[-3.756,-7.062],[0.676,-4.686],[3.014,1.48],[0.179,6.347],[4.472,5.061],[8.034,0.081],[11.326,-0.495],[11.722,6.464],[-1.11,6.089],[-0.57,2.353],[-15.945,-4.52],[-2.722,-0.122],[-2.953,17.398],[6.164,-2.532],[1.988,3.936],[2.88,4.259],[0,0]],"v":[[3.843,78.259],[-35.76,44.485],[-36.23,43.534],[-36.535,43.353],[-76.51,54.9],[-87.302,11.892],[-95.482,11.882],[-114.334,-1.163],[-119.259,-21.863],[-111.225,-12.822],[-89.766,-7.158],[-50.168,-7.116],[-30.405,-2.048],[-45.051,-24.108],[-68.273,-25.845],[-96.558,-28.004],[-118.168,-42.428],[-120.398,-64.926],[-117.549,-79.319],[-114.147,-73.424],[-108.44,-56.064],[-91.426,-48.772],[-67.32,-49.199],[-34.953,-42.89],[-19.47,-10.811],[-24.189,7.207],[-24.992,14.67],[-73.022,11.895],[-76.78,15.316],[-48.044,36.241],[-30.94,25.9],[-24.049,39.217],[5.595,57.525]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[122.174,79.568],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"K/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,444,0],"ix":2},"a":{"a":0,"k":[122,132.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[{"i":[[33.413,0],[0,-12.703],[-33.413,0],[0,12.703]],"o":[[-33.413,0],[0,12.703],[33.413,0],[0,-12.703]],"v":[[112.5,-61.5],[52,-38.5],[112.5,-15.5],[173,-38.5]],"c":true}],"e":[{"i":[[33.413,0],[0,-12.703],[-22.871,-24.359],[0,12.703]],"o":[[-33.413,0],[0,12.703],[84.5,90],[0,-12.703]],"v":[[112.5,-61.5],[67,112.5],[127.5,135.5],[173,-38.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[{"i":[[33.413,0],[0,-12.703],[-22.871,-24.359],[0,12.703]],"o":[[-33.413,0],[0,12.703],[84.5,90],[0,-12.703]],"v":[[112.5,-61.5],[67,112.5],[127.5,135.5],[173,-38.5]],"c":true}],"e":[{"i":[[33.413,0],[0,-12.702],[-32.773,-6.508],[0,12.703]],"o":[[-33.413,0],[0,12.703],[211.5,42],[0,-12.703]],"v":[[112.5,-61.5],[20,146.5],[80.5,169.5],[173,-38.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76,"s":[{"i":[[33.413,0],[0,-12.702],[-32.773,-6.508],[0,12.703]],"o":[[-33.413,0],[0,12.703],[211.5,42],[0,-12.703]],"v":[[112.5,-61.5],[20,146.5],[80.5,169.5],[173,-38.5]],"c":true}],"e":[{"i":[[33.413,0],[-5.1,-11.634],[-32.666,-7.025],[0,12.703]],"o":[[-33.413,0],[32,73],[232.5,50],[0,-12.703]],"v":[[112.5,-61.5],[19,185.5],[79.5,208.5],[173,-38.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":82,"s":[{"i":[[33.413,0],[-5.1,-11.634],[-32.666,-7.025],[0,12.703]],"o":[[-33.413,0],[32,73],[232.5,50],[0,-12.703]],"v":[[112.5,-61.5],[19,185.5],[79.5,208.5],[173,-38.5]],"c":true}],"e":[{"i":[[33.413,0],[-8.343,-9.579],[-32.979,-5.365],[0,12.703]],"o":[[-33.413,0],[54,62],[565.5,92],[0,-12.703]],"v":[[112.5,-61.5],[45,189.5],[105.5,212.5],[298.5,151]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88,"s":[{"i":[[33.413,0],[-8.343,-9.579],[-32.979,-5.365],[0,12.703]],"o":[[-33.413,0],[54,62],[565.5,92],[0,-12.703]],"v":[[112.5,-61.5],[45,189.5],[105.5,212.5],[298.5,151]],"c":true}],"e":[{"i":[[33.413,0],[-8.343,-9.579],[-30.818,-12.911],[0,12.703]],"o":[[-33.413,0],[54,62],[496.5,208],[0,-12.703]],"v":[[112.5,-61.5],[45,189.5],[105.5,212.5],[298.5,151]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94,"s":[{"i":[[33.413,0],[-8.343,-9.579],[-30.818,-12.911],[0,12.703]],"o":[[-33.413,0],[54,62],[496.5,208],[0,-12.703]],"v":[[112.5,-61.5],[45,189.5],[105.5,212.5],[298.5,151]],"c":true}],"e":[{"i":[[33.413,0],[-8.343,-9.579],[-5.675,-32.928],[19.5,99.5]],"o":[[-33.413,0],[54,62],[45.5,264],[-2.443,-12.465]],"v":[[112.5,-61.5],[45,189.5],[77.5,216.5],[298.5,151]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":99,"s":[{"i":[[33.413,0],[-8.343,-9.579],[-5.675,-32.928],[19.5,99.5]],"o":[[-33.413,0],[54,62],[45.5,264],[-2.443,-12.465]],"v":[[112.5,-61.5],[45,189.5],[77.5,216.5],[298.5,151]],"c":true}],"e":[{"i":[[33.413,0],[-8.343,-9.579],[-5.675,-32.928],[19.5,99.5]],"o":[[-33.413,0],[54,62],[45.5,264],[-2.443,-12.465]],"v":[[112.5,-61.5],[-23,118.5],[-26.5,210.5],[307.5,161]],"c":true}]},{"t":105.000004276738}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.509,10.645],[-2.145,-4.72],[-10.953,-2.651],[-6.522,-0.021],[-50.512,-0.052],[-5.189,-0.785],[-3.43,-8.152],[-0.708,-1.77],[-0.345,0.023],[0.814,3.237],[7.604,3.556],[14.25,0.816],[19.383,1.268],[10.003,4.401],[1.46,15.257],[-0.281,6.69],[-0.172,0.743],[-6.53,-1.78],[-10.108,24.027],[2.916,17.739],[16.924,19.848],[0.274,1.38],[-1.052,-0.768],[-6.537,-8.808],[1.776,-31.941],[12.48,-13.591],[17.96,0.885],[11.095,6.467],[-5.821,-3.975],[-10.296,-0.914],[-17.824,-1.194],[-13.423,-4.065],[-7.468,-10.232],[0.022,-7.864],[0.144,-7.911],[0.578,-1.143],[0.949,0.681],[2.374,0.372],[7.146,0.021],[52.661,0.008],[8.957,5.213],[3.351,11.818]],"o":[[1.571,5.283],[4.779,10.51],[6.347,1.536],[50.511,0.162],[5.247,0.005],[8.724,1.319],[0.739,1.756],[0.345,-0.024],[-0.326,-3.36],[-2.167,-8.615],[-13.165,-6.156],[-19.394,-1.112],[-10.773,-0.705],[-14.255,-6.274],[-0.632,-6.61],[0.048,-1.137],[6.676,2.397],[25.2,6.869],[7.064,-16.792],[-4.251,-25.863],[-0.796,-0.934],[1.51,0.142],[8.858,6.47],[18.928,25.5],[-1,17.995],[-12.177,13.261],[-12.868,-0.634],[0.43,4.427],[8.764,5.985],[17.789,1.579],[13.859,0.929],[11.807,3.577],[4.541,6.221],[-0.023,7.914],[-0.021,1.153],[-0.905,-0.743],[-2.169,-1.558],[-7.065,-1.108],[-52.661,-0.155],[-10.197,-0.001],[-10.676,-6.212],[-2.896,-10.212]],"v":[[-121.032,58.143],[-116.368,73.411],[-91.857,92.734],[-72.331,95.223],[79.204,95.275],[94.935,96.493],[113.163,110.969],[115.291,116.275],[116.327,116.206],[115.27,106.146],[99.143,88.948],[57.531,80.536],[-0.669,77.521],[-32.03,70.315],[-55.567,37.694],[-55.02,17.634],[-54.355,14.633],[-34.878,21.539],[24.458,-7.651],[29.595,-59.495],[-2.872,-127.703],[-3.759,-131.786],[0.708,-131.275],[23.711,-108.223],[50.801,-22.35],[31.987,25.883],[-13.426,44.078],[-49.089,32.782],[-39.414,45.692],[-10.354,55.206],[43.109,58.858],[84.298,64.503],[114.204,83.836],[121.469,104.875],[121.396,128.614],[119.738,132.044],[117.016,129.825],[110.417,125.423],[89.012,123.521],[-68.972,123.416],[-98.089,116.877],[-118.551,89.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.791,132.294],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"M/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[447,358,0],"ix":2},"a":{"a":0,"k":[177,234.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16,"s":[{"i":[[19.33,0],[0,-17.949],[-19.33,0],[0,17.949]],"o":[[-19.33,0],[0,17.949],[19.33,0],[0,-17.949]],"v":[[395,333.5],[360,366],[395,398.5],[430,366]],"c":true}],"e":[{"i":[[18.955,3.791],[0,-17.949],[-19.33,0],[0,17.949]],"o":[[-155,-31],[0,17.949],[19.33,0],[0,-17.949]],"v":[[395,333.5],[284,470],[319,502.5],[430,366]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":26,"s":[{"i":[[18.955,3.791],[0,-17.949],[-19.33,0],[0,17.949]],"o":[[-155,-31],[0,17.949],[19.33,0],[0,-17.949]],"v":[[395,333.5],[284,470],[319,502.5],[430,366]],"c":true}],"e":[{"i":[[18.955,3.791],[0,-17.949],[-16.515,-10.046],[0,17.949]],"o":[[-155,-31],[0,17.949],[217,132],[0,-17.949]],"v":[[395,333.5],[168,464],[203,496.5],[430,366]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":38,"s":[{"i":[[18.955,3.791],[0,-17.949],[-16.515,-10.046],[0,17.949]],"o":[[-155,-31],[0,17.949],[217,132],[0,-17.949]],"v":[[395,333.5],[168,464],[203,496.5],[430,366]],"c":true}],"e":[{"i":[[8.815,17.203],[-0.868,-17.928],[-10,7],[0,17.949]],"o":[[-207,-404],[13,268.5],[208.081,-145.654],[0,-17.949]],"v":[[395,333.5],[141,83],[236,551.5],[421,568]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44,"s":[{"i":[[8.815,17.203],[-0.868,-17.928],[-10,7],[0,17.949]],"o":[[-207,-404],[13,268.5],[208.081,-145.654],[0,-17.949]],"v":[[395,333.5],[141,83],[236,551.5],[421,568]],"c":true}],"e":[{"i":[[8.904,17.157],[-121,-97.5],[-270,43],[0,17.949]],"o":[[-301,-580],[209.317,168.664],[250.833,-39.947],[0,-17.949]],"v":[[395,333.5],[32,84],[236,551.5],[421,568]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50,"s":[{"i":[[8.904,17.157],[-121,-97.5],[-270,43],[0,17.949]],"o":[[-301,-580],[209.317,168.664],[250.833,-39.947],[0,-17.949]],"v":[[395,333.5],[32,84],[236,551.5],[421,568]],"c":true}],"e":[{"i":[[8.904,17.157],[-85,-143.5],[-270,43],[0,17.949]],"o":[[-301,-580],[136.998,231.285],[250.833,-39.947],[0,-17.949]],"v":[[395,333.5],[-2,146],[202,613.5],[421,568]],"c":true}]},{"t":63.0000025660426}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.386,-4.245],[1.598,4.619],[2.608,6.321],[-4.087,-6.576]],"o":[[4.093,-3.155],[-2.202,-6.363],[-5.213,5.574],[2.42,3.895]],"v":[[152.378,205.634],[154.674,193.072],[147.012,174.25],[145.464,193.406]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0.352,-6.311],[0.336,-13.427],[-4.214,-7.723],[-12.867,10.262],[-3.052,3.153],[-1.56,-3.275],[-11.438,9.821],[-4.476,10.63],[-2.437,6.673],[-3.574,-4.79],[-3.354,-3.906],[7.139,-11.656],[6.768,-9.317],[8.117,7.042],[3.823,-4.055],[10.174,3.021],[2.314,10.754],[5.104,-3.02],[9.34,12.862],[0.345,11.327],[0,19.187],[0.144,9.352]],"o":[[-0.658,6.387],[-0.748,13.411],[-0.215,8.566],[7.863,14.41],[3.317,-2.646],[1.247,3.129],[6.474,13.6],[8.997,-7.726],[2.82,-6.692],[3.149,4.939],[3.066,4.109],[8.895,10.356],[-5.583,9.113],[-3.762,-12.216],[-3.529,4.639],[-7.178,7.612],[-7.226,-2.146],[-1.584,6.311],[-12.703,7.512],[-6.864,-9.451],[-0.584,-19.17],[-0.001,-9.355],[0,0]],"v":[[37.694,76.381],[34.037,116.093],[32.308,156.352],[37.512,181.037],[74.36,188.637],[83.412,179.401],[87.383,189.266],[119.917,196.104],[138.491,167.421],[145.978,147.115],[155.653,162.098],[165.941,173.614],[169.35,207.13],[150.125,233.884],[129.519,207.823],[119.128,221.313],[92.875,228.352],[78.16,208.651],[68.231,222.354],[29.762,213.099],[19.553,181.378],[19.407,123.82],[19.314,69.156]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-0.017,1.005],[-0.401,40.061],[6.175,21.01],[24.443,14.22],[25.532,-19.954],[1.967,-25.641],[-8.44,-14.225],[2.485,-1.879],[1.397,1.826],[3.187,6.491],[-1.463,18.779],[-23.602,18.074],[-34.665,-11.265],[-13.398,-23.511],[-2.664,-25.241],[1.111,-31.166],[1.377,-25.872],[0,-2.799]],"o":[[0.06,-1.004],[0.687,-40.057],[0.218,-21.769],[-7.84,-26.675],[-27.965,-16.27],[-20.344,15.898],[-1.272,16.576],[1.289,2.171],[-1.041,0.786],[-4.417,-5.768],[-8.349,-17.005],[2.32,-29.771],[29.138,-22.313],[25.611,8.323],[12.733,22.34],[3.283,31.122],[-0.924,25.889],[-0.121,2.264],[0,0]],"v":[[19.314,69.156],[19.49,66.144],[21.456,-54.031],[13.18,-118.352],[-33.712,-180.742],[-124.757,-174.553],[-157.743,-112.094],[-146.794,-66.039],[-145.659,-59.128],[-152.535,-62.07],[-164.515,-80.31],[-175.026,-134.412],[-135.401,-206.527],[-38.859,-222.619],[19.035,-173.766],[40.378,-102.055],[41.805,-8.574],[37.712,69.044],[37.694,76.381]],"c":false},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.74,234.135],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Moon/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[378,242,0],"ix":2},"a":{"a":0,"k":[37.5,40,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[10.217,0],[0,-8.56],[-10.217,0],[0,8.56]],"o":[[-10.217,0],[0,8.56],[10.217,0],[0,-8.56]],"v":[[56,-26],[37.5,-10.5],[56,5],[74.5,-10.5]],"c":true}],"e":[{"i":[[10.217,0],[0,-8.56],[-10.217,0],[0,8.56]],"o":[[-10.217,0],[0,8.56],[10.217,0],[0,-8.56]],"v":[[56,-26],[-47.5,49.5],[36,11],[74.5,-10.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69,"s":[{"i":[[10.217,0],[0,-8.56],[-10.217,0],[0,8.56]],"o":[[-10.217,0],[0,8.56],[10.217,0],[0,-8.56]],"v":[[56,-26],[-47.5,49.5],[36,11],[74.5,-10.5]],"c":true}],"e":[{"i":[[10.217,0],[-3.655,-7.741],[-10.217,0],[0,8.56]],"o":[[-10.217,0],[89,188.5],[10.217,0],[0,-8.56]],"v":[[56,-26],[-47.5,49.5],[36,11],[74.5,-10.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[{"i":[[10.217,0],[-3.655,-7.741],[-10.217,0],[0,8.56]],"o":[[-10.217,0],[89,188.5],[10.217,0],[0,-8.56]],"v":[[56,-26],[-47.5,49.5],[36,11],[74.5,-10.5]],"c":true}],"e":[{"i":[[10.217,0],[-7.781,-3.568],[-10.217,0],[0,8.56]],"o":[[-10.217,0],[326,149.5],[10.217,0],[0,-8.56]],"v":[[56,-26],[-47.5,49.5],[36,11],[74.5,-10.5]],"c":true}]},{"t":89.0000036250443}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.658,0.156],[-10.218,-16.033],[-18.193,16.255],[16.324,3.105],[-1.53,18.101]],"o":[[-19.83,10.392],[9.625,15.104],[-4.724,13.95],[-21.217,-4.037],[1.779,-21.071]],"v":[[-0.114,-39.281],[-14.396,9.088],[36.881,14.827],[-3.499,36.176],[-35.351,-4.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.13,39.531],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"R/Eid-letters Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[340,558,0],"ix":2},"a":{"a":0,"k":[123.5,94.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[20.435,0],[0,-17.397],[-20.435,0],[0,17.397]],"o":[[-20.435,0],[0,17.397],[20.435,0],[0,-17.397]],"v":[[272.5,-66.5],[235.5,-35],[272.5,-3.5],[309.5,-35]],"c":true}],"e":[{"i":[[30.652,0],[0,-46.944],[-30.652,0],[0,46.944]],"o":[[-30.652,0],[0,46.944],[30.652,0],[0,-46.944]],"v":[[253,-62.5],[197.5,22.5],[253,107.5],[308.5,22.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[30.652,0],[0,-46.944],[-30.652,0],[0,46.944]],"o":[[-30.652,0],[0,46.944],[30.652,0],[0,-46.944]],"v":[[253,-62.5],[197.5,22.5],[253,107.5],[308.5,22.5]],"c":true}],"e":[{"i":[[70.416,0],[0,-82.29],[-70.416,0],[0,82.29]],"o":[[-70.416,0],[0,82.29],[70.416,0],[0,-82.29]],"v":[[181,-62.5],[53.5,86.5],[181,235.5],[308.5,86.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":62,"s":[{"i":[[70.416,0],[0,-82.29],[-70.416,0],[0,82.29]],"o":[[-70.416,0],[0,82.29],[70.416,0],[0,-82.29]],"v":[[181,-62.5],[53.5,86.5],[181,235.5],[308.5,86.5]],"c":true}],"e":[{"i":[[99.964,0],[0,-80.081],[-99.964,0],[0,80.081]],"o":[[-99.964,0],[0,80.081],[99.964,0],[0,-80.081]],"v":[[127.5,-62.5],[-53.5,82.5],[127.5,227.5],[308.5,82.5]],"c":true}]},{"t":69.0000028104276}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.146,0.124],[-8.243,-4.776],[-38.109,6.854],[-16.072,7.476],[-9.628,14.094],[3.637,11.238],[4.163,6.798],[2.957,5.406],[-9.868,11.409],[-5.761,2.072],[-1.619,0.391],[-3.699,-10.748],[-3.418,-10.051],[14.678,-20.125],[17.747,-11.114],[24.294,4.112],[29.162,20.773],[6.105,4.777]],"o":[[7.927,5.319],[33.258,19.272],[17.404,-3.131],[15.188,-7.065],[6.436,-9.42],[-2.415,-7.462],[-3.234,-5.281],[-6.578,-12.025],[3.994,-4.618],[0.959,-0.343],[-8.897,10.434],[3.455,10.041],[8.077,23.754],[-12.208,16.739],[-21.088,13.205],[-35.496,-6.006],[-6.308,-4.493],[0.146,-0.125]],"v":[[-122.403,33.635],[-98.574,49.513],[8.324,68.802],[58.81,54.018],[97.266,23.724],[104.221,-7.421],[92.927,-28.471],[82.197,-43.676],[88.143,-82.786],[102.714,-92.925],[106.32,-93.811],[103.241,-61.692],[114.766,-31.969],[104.208,34.024],[60.388,77.071],[-7.983,89.699],[-104.496,48.299],[-122.842,34.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.046535948211,0.414443550858,0.698039215686,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[123.092,94.061],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/loading.json b/example/resource/loading.json new file mode 100644 index 0000000000..b6605b8c7b --- /dev/null +++ b/example/resource/loading.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":29.9700012207031,"ip":0,"op":900.000036657751,"w":237,"h":237,"nm":"final","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"flight","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.9]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p9_0p167_0p167"],"t":0,"s":[-50],"e":[0]},{"t":180.00000733155}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.894},"o":{"x":0.167,"y":0.167},"n":"0p833_0p894_0p167_0p167","t":0,"s":[-50,141.805,0],"e":[118,38.61,0],"to":[28,-17.1991653442383,0],"ti":[-78,4.31500005722046,0]},{"i":{"x":0.538,"y":0.736},"o":{"x":0.05,"y":1},"n":"0p538_0p736_0p05_1","t":180,"s":[118,38.61,0],"e":[118,38.61,0],"to":[0.02864627912641,-2.52048540115356,0],"ti":[0.00681143719703,0.76931047439575,0]},{"i":{"x":0.833,"y":0.761},"o":{"x":0.422,"y":0.048},"n":"0p833_0p761_0p422_0p048","t":242,"s":[118,38.61,0],"e":[118,33,0],"to":[-0.00714083854109,-0.80651438236237,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.126},"n":"0p833_0p821_0p167_0p126","t":274,"s":[118,33,0],"e":[118,43,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.155},"n":"0p833_0p845_0p167_0p155","t":304,"s":[118,43,0],"e":[118,33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.179},"n":"0p833_0p833_0p167_0p179","t":330,"s":[118,33,0],"e":[118,43,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.828},"o":{"x":0.167,"y":0.178},"n":"0p833_0p828_0p167_0p178","t":360,"s":[118,43,0],"e":[118,33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.161},"n":"0p833_0p833_0p167_0p161","t":392,"s":[118,33,0],"e":[118,43,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.831},"o":{"x":0.167,"y":0.172},"n":"0p833_0p831_0p167_0p172","t":422,"s":[118,43,0],"e":[118,33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.164},"n":"0p833_0p833_0p167_0p164","t":453,"s":[118,33,0],"e":[118,43,0],"to":[0,0,0],"ti":[0,0,0]},{"t":483.000019672993}],"ix":2},"a":{"a":0,"k":[45.5,50.5,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":9,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":51,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":6,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":91,"h":101,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"may","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.233,118.5,0],"ix":2},"a":{"a":0,"k":[219.5,200.5,0],"ix":1},"s":{"a":0,"k":[54.504,54.504,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[14.114]},{"t":423.000017229143}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle', 0);"},"w":439,"h":401,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"loading 2","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[119,221,0],"ix":2},"a":{"a":0,"k":[219.5,200.5,0],"ix":1},"s":{"a":0,"k":[78,78,100],"ix":6}},"ao":0,"w":439,"h":401,"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.5,118.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[237,237],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.780392169952,0.898039221764,0.941176474094,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"flight Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.5,50.5,0],"ix":2},"a":{"a":0,"k":[45.5,50.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.198,-0.314],[6.473,-9.04],[-0.216,0.302],[-5.936,9.402]],"o":[[-5.936,9.401],[-0.215,0.301],[6.472,-9.04],[0.195,-0.31]],"v":[[9.09,-14.003],[-9.523,13.66],[-9.07,14.016],[9.544,-13.648]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.956,79.611],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.205,-0.309],[-5.842,-8.82],[0.205,0.308],[5.843,8.821]],"o":[[5.842,8.821],[0.204,0.309],[-5.841,-8.822],[-0.204,-0.309]],"v":[[-8.993,-13.058],[8.533,13.405],[8.993,13.059],[-8.534,-13.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.114,19.044],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.369,0.039],[0.49,-2.332],[-0.076,0.362],[-1.761,-0.183]],"o":[[-2.103,-0.219],[-0.077,0.364],[0.422,-2.007],[0.368,0.039]],"v":[[2.336,-1.493],[-2.628,1.262],[-2.059,1.35],[2.249,-0.924]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.746,46.668],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.37,0.025],[13.095,0.205],[-0.366,-0.005],[-13.016,-0.89]],"o":[[-13.065,-0.895],[-0.37,-0.005],[13.044,0.203],[0.368,0.025]],"v":[[19.622,0.529],[-19.622,-1.118],[-19.559,-0.544],[19.535,1.098]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.808000033509,0.808000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[42.202,55.706],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.165,0.168],[0,0],[4.254,-5.523]],"o":[[4.098,-5.319],[0,0],[1.888,1.922],[0,0]],"v":[[-3.046,4.854],[-2.941,-4.643],[-1.288,-6.268],[-1.208,6.269]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.149,50.261],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.005,3.843],[0,0],[-3.843,-0.005],[0,0],[0.005,-3.844],[0,0],[2.605,0.003]],"o":[[-3.843,-0.005],[0,0],[0.004,-3.843],[0,0],[2.605,0.003],[0,0],[-0.005,3.844],[0,0]],"v":[[-38.359,6.178],[-45.216,0.139],[-45.216,-0.324],[-38.345,-6.346],[35.679,-8.583],[45.217,-0.223],[45.217,0.241],[35.66,8.579]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.217,50.14],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.985,6.836],[-2.241,-6.833],[-4.654,-6.836],[-4.985,6.722]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.21,41.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.985,-6.447],[-2.27,6.639],[-4.684,6.635],[-4.985,-6.639]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.206,58.417],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[19.148,21.952],[-9.561,-21.942],[-19.148,-21.952],[-6.827,21.947]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.941000007181,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.136,21.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[19.197,-21.96],[-9.609,21.966],[-19.197,21.955],[-6.778,-21.965]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.941000007181,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.073,79.006],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.002,-1.534],[-1.66,-0.002],[0,0],[-0.001,1.534],[1.659,0.002]],"o":[[-1.659,-0.002],[-0.002,1.534],[0,0],[1.66,0.002],[0.002,-1.534],[0,0]],"v":[[-4.503,-2.876],[-7.511,-0.008],[-4.509,2.865],[4.503,2.876],[7.511,0.008],[4.51,-2.866]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.114,70.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.002,-1.534],[-1.66,-0.002],[0,0],[-0.001,1.533],[1.659,0.002]],"o":[[-1.659,-0.002],[-0.001,1.533],[0,0],[1.659,0.001],[0.002,-1.534],[0,0]],"v":[[-4.503,-2.876],[-7.512,-0.008],[-4.51,2.865],[4.504,2.876],[7.51,0.008],[4.51,-2.866]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[46.54,78.497],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.001,-1.534],[-1.66,-0.002],[0,0],[-0.001,1.534],[1.659,0.002]],"o":[[-1.659,-0.002],[-0.002,1.534],[0,0],[1.659,0.002],[0.002,-1.533],[0,0]],"v":[[-4.503,-2.876],[-7.51,-0.009],[-4.51,2.865],[4.504,2.876],[7.51,0.008],[4.51,-2.866]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.892,86.626],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.002,1.534],[-1.659,-0.002],[0,0],[0.001,-1.533],[1.659,0.002]],"o":[[-1.659,-0.002],[0.001,-1.533],[0,0],[1.659,0.002],[-0.002,1.534],[0,0]],"v":[[-4.51,3.105],[-7.51,-0.009],[-4.503,-3.115],[4.51,-3.105],[7.512,0.008],[4.503,3.115]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.16,29.937],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.002,1.534],[-1.659,-0.002],[0,0],[0.001,-1.534],[1.659,0.002]],"o":[[-1.659,-0.001],[0.001,-1.534],[0,0],[1.659,0.001],[-0.002,1.534],[0,0]],"v":[[-4.51,2.866],[-7.51,-0.008],[-4.504,-2.876],[4.51,-2.865],[7.512,0.009],[4.503,2.876]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[46.602,22.036],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.002,1.533],[-1.659,-0.002],[0,0],[0.001,-1.534],[1.659,0.002]],"o":[[-1.659,-0.002],[0.001,-1.534],[0,0],[1.659,0.002],[-0.002,1.534],[0,0]],"v":[[-4.51,2.626],[-7.51,-0.008],[-4.504,-2.636],[4.51,-2.626],[7.512,0.008],[4.503,2.637]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.067000003889,0.513999968884,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.973,14.136],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"may Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[659.5,200.5,0],"e":[219.5,200.5,0],"to":[-73.3333358764648,0,0],"ti":[147.91667175293,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":210,"s":[219.5,200.5,0],"e":[-228,200.5,0],"to":[-147.91667175293,0,0],"ti":[74.5833358764648,0,0]},{"t":422.000017188412}],"ix":2},"a":{"a":0,"k":[219.5,200.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.095,0],[1.385,-0.513],[7.344,0],[2.766,-3.613],[1.865,0],[0,-4.831],[-0.005,-0.121],[0,-5.671],[-6.637,0],[0,0],[0,7.132]],"o":[[-1.562,0],[-1.373,-6.977],[-4.885,0],[-1.417,-1.005],[-4.806,0],[0,0.123],[-5.243,1.3],[0,6.672],[0,0],[7.095,0],[0,-7.132]],"v":[[20.617,-7.197],[16.18,-6.39],[1.346,-18.63],[-10.637,-12.678],[-15.644,-14.279],[-24.347,-5.531],[-24.328,-5.167],[-33.464,6.549],[-21.446,18.63],[20.617,18.63],[33.464,5.716]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[327.953,358.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.395,0],[3.59,-1.33],[19.04,0],[7.17,-9.368],[4.838,0],[0,-12.526],[-0.013,-0.316],[0,-14.703],[-17.209,0],[0,0],[0,18.491]],"o":[[-4.049,0],[-3.559,-18.09],[-12.667,0],[-3.674,-2.606],[-12.462,0],[0,0.319],[-13.592,3.37],[0,17.298],[0,0],[18.395,0],[0,-18.49]],"v":[[53.453,-18.66],[41.951,-16.567],[3.492,-48.3],[-27.576,-32.87],[-40.559,-37.02],[-63.123,-14.34],[-63.075,-13.395],[-86.76,16.98],[-55.601,48.3],[53.453,48.3],[86.76,14.82]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":60,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.76,129.24],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.854,0.878],[0,2.671],[16.764,0],[5.258,-3.936],[2.695,0],[2.314,-7.548],[2.282,0],[0.843,-5.282],[0,-11.883],[-14.669,0],[0,0],[0,10.595]],"o":[[0.792,-2.44],[0,-15.106],[-7.37,0],[-2.342,-0.877],[-9.112,0],[-1.821,-0.989],[-6.095,0],[-12.599,1.871],[0,13.217],[0,0],[11.759,0],[0,-10.01]],"v":[[48.09,-1.622],[49.326,-9.308],[18.972,-36.66],[-0.409,-30.355],[-8.011,-31.722],[-27.093,-18.623],[-33.306,-20.215],[-45.236,-10.86],[-67.455,12.727],[-40.894,36.66],[46.164,36.66],[67.455,17.475]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":60,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[356.554,258.559],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.611,0.849],[0,0.379],[2.987,0],[0.684,-0.314],[5.387,0],[1.96,-3.103],[1.255,0],[0,-3.264],[-0.012,-0.153],[0,-4.09],[-4.849,0],[0,0],[0,3.612]],"o":[[0.073,-0.358],[0,-3.003],[-0.801,0],[-0.98,-5.128],[-3.926,0],[-0.955,-0.674],[-3.247,0],[0,0.156],[-3.756,1],[0,4.874],[0,0],[3.593,0],[0,-2.908]],"v":[[19.483,1.147],[19.595,0.04],[14.186,-5.397],[11.944,-4.903],[1.096,-13.906],[-8.23,-8.737],[-11.6,-9.809],[-17.479,-3.9],[-17.456,-3.439],[-23.984,5.082],[-15.206,13.906],[17.478,13.906],[23.984,7.367]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":28,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[414.784,81.916],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.3,0.748],[0,0.334],[2.63,0],[0.602,-0.277],[4.743,0],[1.725,-2.733],[1.105,0],[0,-2.874],[-0.011,-0.135],[0,-3.602],[-4.27,0],[0,0],[0,3.179]],"o":[[0.064,-0.314],[0,-2.643],[-0.705,0],[-0.862,-4.515],[-3.458,0],[-0.841,-0.593],[-2.859,0],[0,0.136],[-3.308,0.881],[0,4.291],[0,0],[3.164,0],[0,-2.562]],"v":[[17.155,1.009],[17.254,0.034],[12.492,-4.753],[10.517,-4.318],[0.966,-12.245],[-7.247,-7.694],[-10.215,-8.637],[-15.391,-3.434],[-15.37,-3.027],[-21.119,4.475],[-13.389,12.245],[15.39,12.245],[21.119,6.487]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":28,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.252,358.911],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.302,1.074],[0,0.48],[3.776,0],[0.864,-0.397],[6.809,0],[2.478,-3.923],[1.586,0],[0,-4.125],[-0.015,-0.193],[0,-5.17],[-6.129,0],[0,0],[0,4.566]],"o":[[0.093,-0.452],[0,-3.795],[-1.012,0],[-1.239,-6.482],[-4.965,0],[-1.207,-0.851],[-4.104,0],[0,0.196],[-4.748,1.264],[0,6.161],[0,0],[4.542,0],[0,-3.676]],"v":[[24.627,1.449],[24.77,0.049],[17.933,-6.822],[15.099,-6.198],[1.387,-17.579],[-10.404,-11.045],[-14.664,-12.4],[-22.095,-4.93],[-22.065,-4.347],[-30.318,6.423],[-19.221,17.578],[22.094,17.578],[30.318,9.311]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":28,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[178.451,17.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.038,1.313],[0,0.587],[4.619,0],[1.057,-0.485],[8.328,0],[3.032,-4.798],[1.941,0],[0,-5.045],[-0.019,-0.236],[0,-6.324],[-7.496,0],[0,0],[0,5.584]],"o":[[0.114,-0.553],[0,-4.642],[-1.238,0],[-1.515,-7.927],[-6.072,0],[-1.475,-1.041],[-5.019,0],[0,0.241],[-5.808,1.547],[0,7.535],[0,0],[5.556,0],[0,-4.497]],"v":[[30.121,1.772],[30.296,0.061],[21.933,-8.344],[18.467,-7.581],[1.696,-21.501],[-12.726,-13.51],[-17.936,-15.166],[-27.025,-6.031],[-26.988,-5.318],[-37.082,7.856],[-23.51,21.501],[27.023,21.501],[37.082,11.389]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[387.882,97.702],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.89,1.231],[0,2.922],[12.448,0],[3.63,-7.622],[3.085,0],[0,-8.534],[-0.029,-0.39],[0.106,0],[0,-7.229],[-7.192,0],[0,0],[0,6.247]],"o":[[1.002,-2.564],[0,-12.512],[-8.968,0],[-2.408,-1.573],[-8.491,0],[0,0.398],[-0.105,-0.002],[-7.192,0],[0,7.229],[0,0],[6.215,0],[0,-5.297]],"v":[[34.89,4.326],[36.461,-3.943],[13.922,-26.6],[-6.397,-13.699],[-14.758,-16.195],[-30.131,-0.743],[-30.072,0.436],[-30.385,0.421],[-43.407,13.51],[-30.385,26.6],[32.153,26.6],[43.407,15.288]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.97,46.37],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.864,0.973],[0,2.308],[9.837,0],[2.868,-6.024],[2.438,0],[0,-6.744],[-0.023,-0.309],[0.084,0],[0,-5.712],[-5.683,0],[0,0],[0,4.937]],"o":[[0.792,-2.026],[0,-9.888],[-7.087,0],[-1.903,-1.244],[-6.709,0],[0,0.315],[-0.083,-0.002],[-5.683,0],[0,5.713],[0,0],[4.911,0],[0,-4.185]],"v":[[27.571,3.418],[28.813,-3.116],[11.002,-21.019],[-5.054,-10.825],[-11.661,-12.799],[-23.809,-0.588],[-23.762,0.344],[-24.01,0.331],[-34.3,10.675],[-24.01,21.019],[25.408,21.019],[34.3,12.08]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.011,377.794],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":423.000017229143,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"loading 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-360]},{"t":899.000036617021}],"ix":10},"p":{"a":0,"k":[219.5,200.5,0],"ix":2},"a":{"a":0,"k":[219.5,200.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.817,-12.686],[-0.161,0.161],[-0.619,-0.249],[-0.372,0.747],[0.557,0.56],[-0.248,0.498],[0,0.499],[0.682,0.686],[1.61,0.872],[0.744,0.747],[0.62,0.872],[1.115,0.498],[0.868,0.872],[0.682,0.685],[0.992,0],[0.455,-0.595]],"o":[[0.366,-0.521],[0.42,-0.423],[0.62,0.249],[0.372,-0.748],[-0.558,-0.561],[0.247,-0.499],[0,-0.498],[-0.682,-0.685],[-1.612,-0.873],[-0.743,-0.748],[-0.62,-0.872],[-1.116,-0.499],[-0.867,-0.872],[-0.681,-0.685],[-0.475,0],[5.873,18.33]],"v":[[11.83,24.201],[12.704,23.046],[16.546,23.017],[18.034,21.024],[16.051,16.788],[16.299,13.798],[18.034,9.436],[15.307,5.077],[8.119,-0.155],[1.797,-4.516],[-2.045,-10.869],[-6.011,-13.112],[-8.738,-18.345],[-13.2,-21.709],[-16.918,-24.2],[-18.406,-23.034]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.939,259.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.079,-0.079],[-0.246,-0.247],[-0.281,0.282],[-0.351,0.494],[-0.069,0.282],[0.633,0.141],[0.099,0.171],[0.673,-1.216]],"o":[[0.175,0.176],[0.246,0.247],[0.281,-0.283],[0.352,-0.495],[0.071,-0.283],[-0.135,-0.03],[-0.717,1.186],[0.231,0.013]],"v":[[-1.315,1.19],[-0.894,2.249],[-0.051,2.249],[0.862,0.344],[1.775,-1.281],[0.581,-2.199],[0.235,-2.531],[-1.846,1.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.84,148.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.22,0],[-0.14,0.283],[-0.14,0.141],[-0.176,0.176],[0.07,0.283],[0.211,0.353],[0.405,0.177],[0.836,-1.85]],"o":[[0.421,0],[0.141,-0.282],[0.141,-0.141],[0.176,-0.176],[-0.071,-0.282],[-0.166,-0.281],[-0.935,1.793],[0.562,0.215]],"v":[[-1.029,2.926],[-0.327,1.938],[-0.257,0.243],[2.272,1.161],[1.992,-0.674],[1.429,-2.015],[0.214,-2.926],[-2.448,2.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[123.463,155.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.479,-0.481],[0,-0.412],[-0.205,0.206],[0,0.344],[0,0.481],[0.342,0],[0,0]],"o":[[0.479,0.481],[0,0.413],[0.205,-0.206],[0,-0.344],[0,-0.481],[0,0],[-0.068,0.206]],"v":[[-0.956,-0.995],[-0.752,1.34],[0.068,2.302],[1.025,1.203],[1.436,-1.82],[0.82,-2.507],[-0.752,-2.507]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.388,194.4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.137,0.343],[0.359,-0.328],[0.068,-0.344],[-0.329,0]],"o":[[-0.137,-0.344],[0,0],[-0.068,0.343],[0.329,0]],"v":[[0.786,0.748],[0.102,-1.038],[-0.855,0.061],[-0.227,1.367]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.765,189.496],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.41,-0.069],[-0.342,0],[0.136,0.137],[0.479,-0.138],[0.41,-0.619],[-0.41,-0.138]],"o":[[0.41,0.068],[0.341,0],[-0.137,-0.138],[0,0],[0,0],[0.41,0.136]],"v":[[-0.307,0.515],[1.606,0.927],[2.154,0.173],[0.512,-0.103],[-1.88,-0.309],[-1.88,0.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[235.393,203.88],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.479,-0.137],[0,0],[0,0.413],[0.41,0],[0.342,0],[0,0],[-0.342,-0.069]],"o":[[0.479,0.137],[0.957,-0.275],[0,-0.412],[-0.41,0],[-0.341,0],[0,0],[0.341,0.069]],"v":[[0.205,0.549],[1.435,1.443],[2.324,-0.275],[1.435,-1.305],[-0.957,-1.442],[-2.392,-1.03],[-1.572,-0.206]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[217.59,199.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.544,0.21],[0,0.799],[0.293,0.546],[0.669,-0.042],[0.209,0.294],[0.334,-0.337],[0.502,-0.169],[-0.137,-0.137],[1.004,0.042],[0.167,-0.378],[-0.167,-0.252],[-0.065,-0.252],[0,0],[0,0],[0.23,-0.231],[-0.209,-0.505],[-0.376,0],[-0.419,0.421],[-0.878,0],[-0.418,0.126],[-0.168,0.505],[-0.041,0.421],[0.125,0.463]],"o":[[0.543,-0.21],[0,-0.799],[-0.293,-0.547],[-0.669,0.042],[-0.209,-0.294],[-0.188,0.189],[-0.502,0.168],[0.136,0.137],[-1.004,-0.042],[-0.167,0.378],[0.168,0.252],[0.064,0.252],[0,0],[0,0],[-0.23,0.231],[0.209,0.504],[0.377,0],[0.418,-0.42],[0.879,0],[0.418,-0.126],[0.167,-0.504],[0.042,-0.42],[-0.126,-0.463]],"v":[[2.615,-1.43],[3.576,-2.061],[3.451,-3.532],[2.572,-4.289],[1.317,-3.995],[-0.021,-4.415],[-0.816,-3.49],[-1.276,-2.419],[-1.151,-1.682],[-2.991,-1.598],[-3.033,-0.505],[-3.139,0.168],[-2.531,0.924],[-2.74,1.808],[-3.326,2.691],[-3.535,3.784],[-3.075,4.709],[-1.569,4.33],[-0.482,3.405],[1.401,3.027],[2.238,2.312],[2.53,0.924],[2.405,-0.505]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.841,165.018],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.14,0.635],[-0.14,0.847],[0.386,0.388],[0,0.212],[-0.14,0.424],[-0.351,0.353],[-0.07,0.353],[0.14,0.706],[-0.176,0.177],[-0.07,-0.283],[-0.141,-0.353],[0,0],[-0.457,0.459],[-0.211,0.353],[0.351,-0.141],[0.562,0.071],[0.211,0.211],[-0.176,0.176],[0.421,0],[0.211,-0.353],[0.211,-0.212],[-0.07,0.423],[-0.141,0.424],[-0.597,0.6],[-0.632,0.283],[-0.421,0.211],[-0.351,0.494],[-0.246,0.247],[0,0.442],[0.211,0.565],[0.731,0.494],[-0.141,0.424],[0,0.283],[0.28,0.282],[0.312,-0.313],[0.352,0.07],[-0.141,0.424],[0.07,0.212],[0.159,-0.015],[0,-15.127],[-0.033,-1.1],[-0.36,0.726]],"o":[[0.139,-0.636],[0.14,-0.847],[-0.387,-0.388],[0,-0.211],[0.14,-0.423],[0.351,-0.354],[0.071,-0.353],[-0.141,-0.707],[0.176,-0.176],[0.071,0.282],[0.14,0.353],[0,0],[0.456,-0.459],[0.21,-0.353],[-0.351,0.141],[-0.562,-0.07],[-0.21,-0.212],[0.175,-0.177],[-0.421,0],[-0.211,0.353],[-0.21,0.212],[0.071,-0.424],[0.141,-0.424],[0.597,-0.6],[0.632,-0.282],[0.422,-0.212],[0.352,-0.494],[0.246,-0.247],[0,-0.443],[-0.21,-0.565],[-0.731,-0.494],[0.14,-0.424],[0,-0.282],[-0.281,-0.282],[-0.312,0.314],[-0.351,-0.071],[0.14,-0.423],[-0.025,-0.073],[-5.521,13.103],[0,1.107],[0.262,-0.377],[0.632,-1.27]],"v":[[-7.011,19.531],[-6.378,16.989],[-6.869,15.506],[-6.729,14.235],[-5.816,12.823],[-5.465,10.776],[-3.709,9.152],[-3.568,6.822],[-2.023,4.915],[-0.899,4.421],[-0.828,5.974],[0.085,5.339],[1.63,3.503],[2.965,2.514],[2.403,2.02],[0.787,1.949],[-0.197,0.114],[0.717,-2.075],[-0.056,-2.923],[-1.531,-1.299],[-2.655,0.961],[-2.936,-0.451],[-2.093,-3.064],[-0.688,-4.688],[1.068,-5.465],[3.807,-5.888],[5.282,-8.077],[7.671,-9.419],[8.233,-10.991],[7.6,-13.373],[4.762,-15.844],[4.44,-17.609],[4.931,-20.01],[3.878,-21.916],[2.543,-20.937],[1.208,-19.515],[0.647,-20.716],[0.647,-22.905],[0.343,-22.967],[-8.233,19.673],[-8.179,22.982],[-7.221,21.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.54,183.536],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.374,-0.15],[0,-0.376],[0.149,-0.528],[-0.599,0],[-0.525,0.15],[-0.3,0.602],[-0.299,0.452],[0,0.602],[0.899,-0.452],[1.198,-0.828],[0.674,-0.301],[0,-0.376],[-0.149,-0.301]],"o":[[-0.375,0.15],[0,0.377],[-0.151,0.526],[0.599,0],[0.523,-0.151],[0.299,-0.602],[0.3,-0.452],[0,-0.602],[0,0],[-1.198,0.827],[-0.674,0.301],[0,0.376],[0.149,0.302]],"v":[[-4.004,3.273],[-5.277,4.552],[-4.902,6.585],[-3.78,7.788],[-1.234,7.036],[2.358,1.844],[4.229,-3.122],[5.277,-5.003],[4.229,-7.335],[2.358,-4.401],[-1.16,-2.595],[-3.481,-0.714],[-3.256,1.317]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[262.589,286.337],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.219,-0.514],[0.145,-0.146],[-0.584,-0.22],[-0.072,-0.806],[0,-0.513],[0.658,-0.147],[0.657,0.294],[0,0.367],[-0.145,0.293],[0.219,0.586],[0.438,0.953],[0.146,0.733],[0.364,0.366],[-0.511,0.514],[-0.548,0.55],[-1.167,0],[-1.022,0.366],[-0.366,-0.66],[-0.147,-0.807],[-0.729,-0.147],[0.219,-0.514],[0,0],[0.292,0.66],[0.511,0.073],[0.218,-0.367],[-0.146,-0.44],[0,-0.514],[-0.73,-0.22],[-0.219,-0.366],[-0.219,-0.367],[-0.328,0.33],[-0.219,-0.44]],"o":[[-0.219,0.513],[-0.147,0.147],[0.584,0.22],[0.073,0.807],[0,0.513],[-0.656,0.146],[-0.657,-0.293],[0,-0.367],[0.146,-0.293],[-0.219,-0.587],[-0.438,-0.953],[-0.146,-0.733],[-0.365,-0.367],[0.51,-0.513],[0.547,-0.55],[1.167,0],[1.021,-0.367],[0.364,0.66],[0.145,0.806],[0.73,0.147],[-0.219,0.513],[-0.073,-1.027],[-0.292,-0.659],[-0.51,-0.073],[-0.219,0.367],[0.146,0.44],[0,0.513],[0.729,0.22],[0.219,0.367],[0.219,0.366],[0.328,-0.33],[0.219,0.44]],"v":[[31.062,-18.783],[28.655,-18.856],[29.311,-17.902],[30.478,-15.336],[30.406,-11.082],[28.508,-10.495],[24.204,-11.889],[23.329,-13.429],[23.839,-16.802],[24.569,-19.076],[21.286,-23.329],[21.067,-26.262],[19.681,-27.142],[21.578,-29.416],[23.183,-30.882],[25.298,-31.469],[27.706,-32.642],[28.874,-31.762],[29.166,-29.562],[30.478,-29.049],[30.77,-28.095],[29.457,-26.63],[28.363,-28.316],[26.684,-28.462],[26.247,-27.362],[25.736,-26.555],[26.174,-25.455],[27.195,-23.77],[28.363,-22.229],[28.363,-20.542],[29.603,-21.716],[30.916,-20.322]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[17.287,19.368],[0.068,0.023],[0.236,-0.238],[-0.052,-0.476],[-0.183,-0.185],[0.132,0.132],[0.236,0.237],[0.262,-0.106],[0.211,0],[0,0.529],[0.052,-0.158],[0,0],[-0.132,-0.132],[-0.316,-0.159],[-0.052,-0.369],[0.105,-0.211],[0.157,0.159],[-0.105,0.317],[0.053,0.158],[0,0],[-0.106,0.317],[0.159,0.158],[0.368,0],[0.211,-0.211],[0,-0.528],[0.21,-0.211],[-0.21,-0.211],[0.236,-0.237],[-0.342,-0.343],[0,0],[2.863,1.466],[0.918,0.434],[2.647,0.326],[0.055,0.327],[0.055,0.435],[0.918,0.271],[1.08,0.272],[0.378,0.76],[-0.216,0.869],[-0.432,0.435],[-1.135,0.434],[-1.135,0],[-0.324,0.109],[0.054,0.326],[0.432,0],[1.188,0.109],[0.703,-0.109],[1.026,0.109],[0.486,-0.217],[0.135,-0.136],[0.162,-0.543],[0.189,-0.19],[0.378,-0.598],[0.324,-0.815],[-0.756,-0.325],[0.595,-0.109],[-0.378,-0.706],[-0.27,-1.249],[0.35,-0.353],[0.378,0.815],[-0.055,-0.38],[0.216,-0.217],[0.27,0.271],[0.433,-0.217],[0.053,-0.217],[0.109,-0.108],[0.379,0.108],[0.162,-0.272],[-0.431,-0.163],[0.189,-0.189],[0.595,0.163],[0.757,0.435],[0,0.434],[-0.162,0.814],[0.216,0.434],[-0.432,0],[-0.648,-0.163],[-0.919,-0.326],[-0.486,0],[-0.325,0.435],[-0.107,0.489],[0.243,0.244],[0.649,0.38],[0.27,0.108],[0.27,0],[0.135,0.136],[0.81,-0.108],[0.324,0.054],[-0.324,0.162],[-0.298,0.298],[0.324,0.326],[0.702,0],[0.324,0.163],[0.405,-0.408],[0.216,-0.054],[0.27,0.055],[0.325,0],[0.379,-0.217],[0.864,-0.488],[1.08,-0.163],[1.188,-0.435],[0.622,-0.624],[0.676,-0.679],[0.433,-0.76],[0.405,-0.407],[0.54,-0.326],[0.27,-0.651],[-0.054,-0.76],[-0.595,-0.109],[-0.919,0.217],[-0.243,0.244],[-0.648,-0.163],[-0.054,-0.597],[-0.487,-0.489],[-0.27,-0.706],[-0.54,0],[-0.162,0.326],[-0.756,0.163],[-0.486,0.489],[-0.054,1.25],[-0.109,0.761],[-0.487,0.326],[-0.108,0.488],[0,0.272],[0.162,0.163],[0.378,0.108],[0.298,0.299],[0,0.489],[-0.54,0.923],[-0.595,0.381],[-0.486,0.109],[0.216,0.326],[-0.324,0.543],[-0.866,0.271],[-0.54,-0.325],[-0.108,-0.434],[0.323,-0.327],[0.459,-0.462],[0.648,-0.651],[0.188,-0.19],[-0.216,-0.434],[-0.324,-0.163],[-0.702,-0.435],[-0.81,0.054],[-0.81,0.163],[-0.378,0.163],[-0.324,-0.325],[0,-0.434],[0.323,0],[0.648,0],[0.648,0],[0.135,-0.136],[-0.217,-0.325],[-0.593,-0.109],[0.109,-0.489],[0.324,-0.163],[0.136,0.135],[0.19,-0.19],[0.108,-0.597],[-0.054,-0.217],[0.433,0],[0.162,-0.38],[0.378,0],[0.136,0.136],[0.163,-0.162],[0.27,-0.271],[0.54,-0.163],[-0.054,-0.435],[0.216,0.217],[0.109,0.109],[0.324,0],[0.27,-0.109],[0.107,0.489],[0.216,0.217],[0.054,0.434],[-0.243,0.245],[-0.107,0.272],[-0.055,0.325],[0.136,-0.136],[0.54,-0.109],[0.378,-0.489],[0.053,-0.652],[-0.297,-0.298],[-0.108,-0.326],[0.27,-0.543],[0.486,0.108],[0.325,0],[0.593,-0.163],[0.325,-0.435],[0.216,-0.543],[0.756,-0.271],[0.217,-0.326],[0.162,-0.272],[0.271,0],[0.108,-0.271],[0.163,0.163],[0.27,-0.054],[-0.162,-0.327],[0.122,-0.122],[0.324,0.109],[0.324,-0.108],[0.216,-0.326],[0,-0.434],[-0.594,-0.434],[-0.54,0],[-0.215,-0.652],[-0.297,-0.298],[0.054,-0.652],[0.487,-0.325],[1.08,0],[0.649,0.217],[0.378,-0.109],[0.216,-0.217],[0,0],[-0.27,-0.924],[0,-1.086],[0.162,-0.434],[-0.594,-0.706],[-0.108,-0.271],[-0.324,-0.326],[-0.487,-0.108],[-0.189,0.19],[-0.432,-0.055],[0,0.434],[-0.756,0.435],[-0.216,0.434],[0.108,0.489],[-0.27,0.815],[-0.648,0.272],[-0.324,0.543],[0,1.086],[-0.27,0.271],[-0.54,0],[-0.756,0.597],[-0.486,0],[-0.432,-0.651],[-0.297,-0.299],[-0.594,-0.434],[-0.324,-0.326],[-0.405,-0.407],[-0.053,-0.543],[0,-0.163],[-0.378,0],[-0.216,0.543],[-0.162,0.49],[0,0.271],[0.459,0.461],[-0.163,0.38],[-0.431,-0.054],[-0.162,-0.271],[0,0],[0.297,0.299],[0.594,0.327],[0.513,0.516],[0.594,0.598],[0.27,0.652],[0.702,0.543],[-0.054,1.032],[-0.811,0.163],[-0.108,-0.272],[-0.324,0.326],[-0.27,-0.597],[-0.216,-0.488],[-0.972,-0.217],[-0.433,-0.434],[-0.108,-0.977],[-0.432,-0.108],[-0.054,-0.598],[-0.486,-0.272],[0.054,-0.543],[-0.702,-0.163],[-0.216,-0.217],[-0.162,0.272],[-0.109,0.651],[-0.217,0.218],[0.379,0.101],[-0.216,0.326],[0.379,0.489],[-0.108,0.217],[-0.431,-0.055],[-0.054,0.38],[-1.027,0],[-0.379,-0.38],[-0.703,0.49],[-0.541,0],[0.431,0.434],[0.325,0.489],[-0.595,0.598],[-0.162,0.325],[-0.648,0.163],[0.162,0.706],[-0.595,0.38],[-0.702,-0.217],[-0.405,-0.407],[-0.217,-0.434],[-0.055,-0.381],[-0.432,-0.272],[-0.217,0.217],[-0.271,0.272],[0.594,0.38],[-0.162,0.38],[-1.297,0.218],[-0.595,-0.217],[0.271,-0.272],[0.378,0],[0,-0.488],[0.055,-0.217],[-0.486,-0.163],[-0.485,-0.326],[-0.161,-1.574],[0.648,-0.218],[1.189,0.271],[0.716,0.239],[0.299,-0.3],[0.477,0],[0.716,-0.119],[0.478,-0.479],[-0.477,0],[-0.238,-0.839],[-0.835,0],[-0.954,-0.599],[-1.669,0.719],[-0.477,0],[0,-1.079],[0.477,-1.438],[0.954,-0.6],[1.074,0.24],[0.596,-0.6],[1.192,0.24],[0.657,0.659],[1.075,-0.599],[0,-0.6],[1.193,0.359],[0.716,0.719],[1.551,0.36],[0.358,1.439],[-0.357,0.6],[0.716,0],[1.192,-0.36],[1.074,0],[0.835,-0.479],[1.073,0],[0.358,-0.36],[1.312,-1.318],[0.239,-0.48],[0.358,-1.799],[1.073,-1.078],[0.239,-1.079],[0,-1.078],[-0.358,-2.279],[0,-0.96],[-1.074,-1.439],[-0.835,-0.839],[-0.477,0],[-1.312,0],[-1.192,0],[-1.193,-0.359],[-1.67,0.24],[-0.656,-0.66],[-1.431,0],[-1.431,-1.678],[0,-0.959],[-1.55,-1.798],[-0.358,-0.959],[0.239,-1.319],[0,-0.6],[-0.835,-1.799],[-0.358,-1.559],[-1.313,-0.36],[-0.596,-1.079],[-0.476,-0.48],[-1.073,0],[-1.67,0.72],[-0.955,0.959],[0,0],[-0.656,0.659],[0,0.839],[-0.775,0.779],[-1.133,1.14],[0,0.839],[0,0.839],[0,0.481],[-0.835,1.319],[-1.073,1.079],[-1.312,1.559],[-0.238,0.839],[0,0],[0.597,0],[0.596,-0.6],[0.418,0.42],[0.417,0.42],[0.477,0],[0.358,0.72],[0.239,0.72],[0.716,0.72],[0,0.839],[0.536,0.539],[0.238,0.599],[0.477,0.72],[-0.358,0],[0,0],[0,0],[-0.476,-0.479],[-0.597,-0.839],[0,-0.36],[-0.537,-0.539],[-0.477,-1.318],[0,-1.199],[0,0],[-0.357,0.359],[-0.597,0],[-1.073,0.599],[-0.835,0.479],[0,0],[0.418,0.419],[0.716,0.359],[0,0],[0.835,-0.241],[0,0],[0.299,-0.299],[0.536,0.539],[0,0.838],[-1.193,0],[-0.298,-0.3],[-0.715,-0.719],[-1.194,0],[0,0],[-0.716,-0.24],[-1.075,0],[0,0],[-0.537,-0.539],[0.358,-0.36],[0,-0.839],[-0.716,0],[0,0],[0.238,-1.079],[-1.073,-1.798],[0,0],[-0.298,0.3],[0,-0.239],[-0.596,0.6],[0,0],[0,0.48],[0,0.359],[-1.074,0.72],[-0.656,0.66],[0,0],[-0.239,-0.6],[0.358,-0.6],[-0.478,0],[0,0],[0,0],[0,-0.599],[-0.358,-1.079],[-0.002,-0.007],[-0.176,0.457],[0,0.152],[0,0],[0,0],[-0.835,-0.36],[-0.088,-0.109],[0,11.336]],"o":[[-0.124,-0.059],[-0.314,-0.105],[-0.237,0.238],[0.052,0.475],[0.185,0.185],[-0.131,-0.133],[-0.238,-0.238],[-0.263,0.106],[-0.21,0],[0,-0.528],[-0.053,0.159],[0,0],[0.131,0.132],[0.315,0.158],[0.053,0.371],[-0.105,0.212],[-0.158,-0.158],[0.106,-0.317],[-0.052,-0.159],[0,0],[0.104,-0.317],[-0.157,-0.159],[-0.368,0],[-0.21,0.212],[0,0.528],[-0.211,0.212],[0.211,0.211],[-0.237,0.238],[0.341,0.343],[-0.108,0.271],[-2.864,-1.466],[-0.919,-0.435],[-2.648,-0.325],[-0.053,-0.325],[-0.053,-0.434],[-0.919,-0.272],[-1.081,-0.271],[-0.378,-0.761],[0.216,-0.869],[0.433,-0.434],[1.135,-0.435],[1.134,0],[0.324,-0.108],[-0.054,-0.326],[-0.432,0],[-1.189,-0.108],[-0.703,0.109],[-1.027,-0.109],[-0.485,0.217],[-0.135,0.136],[-0.162,0.543],[-0.188,0.19],[-0.378,0.597],[-0.324,0.814],[0.756,0.326],[-0.594,0.108],[0.378,0.706],[0.271,1.249],[-0.352,0.353],[-0.378,-0.815],[0.053,0.38],[-0.216,0.217],[-0.27,-0.272],[-0.432,0.218],[-0.054,0.217],[-0.108,0.109],[-0.378,-0.109],[-0.162,0.271],[0.433,0.163],[-0.189,0.19],[-0.595,-0.162],[-0.756,-0.434],[0,-0.435],[0.162,-0.815],[-0.216,-0.435],[0.433,0],[0.649,0.163],[0.918,0.326],[0.486,0],[0.324,-0.434],[0.108,-0.489],[-0.243,-0.245],[-0.648,-0.38],[-0.27,-0.109],[-0.27,0],[-0.135,-0.136],[-0.811,0.109],[-0.324,-0.055],[0.324,-0.163],[0.297,-0.299],[-0.324,-0.325],[-0.703,0],[-0.324,-0.164],[-0.405,0.407],[-0.215,0.055],[-0.271,-0.054],[-0.323,0],[-0.378,0.217],[-0.864,0.489],[-1.081,0.163],[-1.189,0.434],[-0.621,0.625],[-0.675,0.679],[-0.432,0.76],[-0.405,0.408],[-0.541,0.326],[-0.27,0.652],[0.054,0.76],[0.594,0.108],[0.918,-0.218],[0.243,-0.245],[0.648,0.163],[0.054,0.598],[0.485,0.489],[0.271,0.706],[0.54,0],[0.162,-0.326],[0.757,-0.162],[0.486,-0.489],[0.055,-1.249],[0.107,-0.76],[0.486,-0.325],[0.108,-0.489],[0,-0.271],[-0.162,-0.163],[-0.379,-0.109],[-0.297,-0.299],[0,-0.489],[0.54,-0.923],[0.595,-0.38],[0.486,-0.108],[-0.216,-0.326],[0.324,-0.543],[0.864,-0.272],[0.54,0.327],[0.108,0.435],[-0.324,0.325],[-0.459,0.461],[-0.649,0.652],[-0.19,0.19],[0.216,0.435],[0.324,0.163],[0.702,0.434],[0.811,-0.054],[0.811,-0.163],[0.378,-0.163],[0.324,0.326],[0,0.435],[-0.324,0],[-0.649,0],[-0.648,0],[-0.136,0.136],[0.216,0.326],[0.595,0.108],[-0.107,0.488],[-0.324,0.162],[-0.135,-0.136],[-0.189,0.19],[-0.108,0.597],[0.053,0.217],[-0.432,0],[-0.162,0.38],[-0.378,0],[-0.135,-0.136],[-0.162,0.163],[-0.27,0.272],[-0.54,0.163],[0.054,0.434],[-0.216,-0.218],[-0.107,-0.109],[-0.324,0],[-0.27,0.108],[-0.108,-0.489],[-0.216,-0.217],[-0.054,-0.434],[0.243,-0.244],[0.109,-0.271],[0.053,-0.326],[-0.135,0.136],[-0.541,0.109],[-0.378,0.488],[-0.054,0.651],[0.297,0.299],[0.108,0.326],[-0.27,0.543],[-0.486,-0.109],[-0.324,0],[-0.595,0.163],[-0.323,0.435],[-0.216,0.543],[-0.757,0.272],[-0.216,0.326],[-0.162,0.271],[-0.27,0],[-0.108,0.272],[-0.162,-0.163],[-0.27,0.055],[0.162,0.325],[-0.121,0.122],[-0.324,-0.108],[-0.324,0.109],[-0.216,0.325],[0,0.435],[0.595,0.435],[0.54,0],[0.217,0.651],[0.298,0.299],[-0.054,0.651],[-0.486,0.326],[-1.08,0],[-0.648,-0.217],[-0.378,0.109],[-0.216,0.217],[0,0],[0.27,0.923],[0,1.086],[-0.163,0.434],[0.594,0.706],[0.108,0.272],[0.324,0.326],[0.486,0.108],[0.189,-0.19],[0.433,0.054],[0,-0.435],[0.756,-0.435],[0.216,-0.435],[-0.108,-0.489],[0.27,-0.814],[0.649,-0.271],[0.325,-0.543],[0,-1.086],[0.27,-0.272],[0.541,0],[0.757,-0.598],[0.486,0],[0.432,0.652],[0.297,0.298],[0.594,0.435],[0.324,0.326],[0.405,0.407],[0.055,0.543],[0,0.164],[0.378,0],[0.217,-0.543],[0.162,-0.488],[0,-0.272],[-0.459,-0.462],[0.162,-0.38],[0.433,0.055],[0.163,0.272],[0,0],[-0.298,-0.299],[-0.595,-0.325],[-0.513,-0.515],[-0.595,-0.597],[-0.27,-0.651],[-0.702,-0.543],[0.054,-1.032],[0.81,-0.163],[0.108,0.271],[0.325,-0.326],[0.27,0.597],[0.217,0.489],[0.973,0.217],[0.431,0.435],[0.107,0.978],[0.432,0.109],[0.053,0.597],[0.486,0.272],[-0.054,0.543],[0.703,0.163],[0.217,0.217],[0.162,-0.272],[0.108,-0.652],[0.215,-0.217],[-0.378,-0.101],[0.215,-0.326],[-0.378,-0.488],[0.108,-0.217],[0.433,0.054],[0.054,-0.38],[1.026,0],[0.377,0.38],[0.703,-0.488],[0.54,0],[-0.433,-0.435],[-0.324,-0.489],[0.593,-0.597],[0.162,-0.326],[0.649,-0.163],[-0.162,-0.706],[0.593,-0.38],[0.702,0.217],[0.406,0.407],[0.216,0.435],[0.054,0.38],[0.432,0.271],[0.216,-0.218],[0.27,-0.271],[-0.595,-0.38],[0.162,-0.38],[1.297,-0.217],[0.593,0.218],[-0.269,0.271],[-0.379,0],[0,0.489],[-0.053,0.217],[0.487,0.163],[0.486,0.326],[0.162,1.576],[-0.648,0.217],[-1.188,-0.272],[-0.715,-0.24],[-0.298,0.299],[-0.477,0],[-0.716,0.12],[-0.477,0.48],[0.478,0],[0.24,0.839],[0.835,0],[0.954,0.6],[1.67,-0.72],[0.477,0],[0,1.079],[-0.477,1.44],[-0.954,0.598],[-1.073,-0.24],[-0.597,0.6],[-1.193,-0.24],[-0.655,-0.659],[-1.073,0.6],[0,0.6],[-1.192,-0.361],[-0.715,-0.719],[-1.551,-0.359],[-0.358,-1.439],[0.358,-0.599],[-0.716,0],[-1.193,0.36],[-1.073,0],[-0.834,0.48],[-1.074,0],[-0.357,0.359],[-1.312,1.32],[-0.238,0.48],[-0.358,1.798],[-1.073,1.08],[-0.238,1.078],[0,1.08],[0.357,2.278],[0,0.959],[1.073,1.439],[0.835,0.84],[0.477,0],[1.312,0],[1.193,0],[1.193,0.361],[1.67,-0.24],[0.656,0.659],[1.431,0],[1.431,1.679],[0,0.959],[1.551,1.799],[0.358,0.959],[-0.239,1.318],[0,0.6],[0.835,1.798],[0.358,1.558],[1.311,0.36],[0.596,1.079],[0.478,0.479],[1.073,0],[1.669,-0.719],[0.954,-0.96],[0,0],[0.656,-0.659],[0,-0.839],[0.776,-0.779],[1.133,-1.139],[0,-0.84],[0,-0.839],[0,-0.479],[0.835,-1.319],[1.074,-1.079],[1.312,-1.559],[0.239,-0.84],[0,0],[-0.596,0],[-0.596,0.599],[-0.417,-0.42],[-0.418,-0.42],[-0.477,0],[-0.358,-0.72],[-0.238,-0.72],[-0.716,-0.72],[0,-0.84],[-0.537,-0.54],[-0.239,-0.599],[-0.477,-0.719],[0.358,0],[0,0],[0,0],[0.478,0.48],[0.596,0.839],[0,0.359],[0.536,0.54],[0.478,1.319],[0,1.199],[0,0],[0.358,-0.36],[0.596,0],[1.074,-0.599],[0.835,-0.48],[0,0],[-0.417,-0.42],[-0.716,-0.36],[0,0],[-0.835,0.239],[0,0],[-0.298,0.3],[-0.537,-0.54],[0,-0.84],[1.193,0],[0.298,0.299],[0.716,0.719],[1.192,0],[0,0],[0.716,0.239],[1.073,0],[0,0],[0.537,0.54],[-0.358,0.36],[0,0.84],[0.714,0],[0,0],[-0.238,1.08],[1.073,1.799],[0,0],[0.298,-0.299],[0,0.24],[0.597,-0.6],[0,0],[0,-0.48],[0,-0.36],[1.073,-0.72],[0.656,-0.659],[0,0],[0.239,0.6],[-0.357,0.599],[0.476,0],[0,0],[0,1.079],[0,0.6],[0.002,0.007],[0.181,-0.455],[-0.098,-0.522],[0,0],[0,-0.838],[0,0],[0.13,0.056],[3.184,-10.283],[0,-28.068]],"v":[[51.736,-81.983],[51.435,-82.115],[50.49,-82.062],[50.542,-81.111],[51.382,-80.319],[50.647,-79.896],[49.702,-80.477],[48.283,-80.319],[48.387,-79.051],[46.968,-80.425],[46.496,-81.534],[45.498,-81.111],[45.445,-80.214],[46.443,-79.262],[46.758,-77.467],[46.338,-75.671],[45.235,-75.988],[45.129,-77.942],[44.551,-79.685],[43.658,-80.583],[43.816,-82.485],[43.132,-83.488],[41.556,-84.016],[40.294,-84.546],[40.084,-82.643],[38.824,-82.168],[39.191,-80.847],[39.402,-79.844],[40.663,-77.889],[41.251,-76.796],[37.74,-78.153],[35.525,-79.402],[32.121,-79.837],[31.634,-81.033],[31.256,-82.335],[29.204,-83.312],[27.205,-84.073],[26.07,-85.81],[26.232,-87.711],[26.772,-89.178],[28.555,-90.318],[35.579,-91.404],[38.226,-91.676],[37.902,-92.436],[36.119,-92.925],[33.04,-93.251],[30.338,-93.142],[27.313,-92.979],[25.313,-92.654],[24.233,-91.947],[23.531,-90.861],[22.936,-90.102],[22.18,-88.797],[20.559,-86.516],[22.504,-84.943],[20.559,-84.344],[18.668,-83.149],[19.046,-80.651],[16.832,-78.589],[13.86,-78.153],[12.996,-77.61],[14.4,-75.492],[12.455,-76.253],[9.267,-75.927],[7.539,-74.623],[7.376,-72.615],[3.756,-74.514],[2.676,-73.754],[3.918,-72.559],[4.567,-71.365],[2.352,-71.528],[-0.133,-72.777],[-0.673,-73.809],[-0.62,-75.709],[-1.376,-77.012],[-1.268,-77.882],[0.461,-77.61],[2.623,-76.741],[5.972,-76.198],[8.079,-76.633],[8.727,-78.099],[7.863,-79.999],[4.135,-81.466],[-1.268,-83.909],[-3.591,-84.073],[-3.321,-85.159],[-5.806,-85.159],[-8.183,-85.43],[-8.237,-86.353],[-6.724,-86.68],[-7.697,-87.44],[-10.074,-87.386],[-10.615,-88.471],[-12.181,-87.766],[-13.208,-87.82],[-14.342,-87.386],[-14.451,-88.526],[-15.801,-88.201],[-17.53,-87.06],[-19.907,-86.734],[-22.878,-85.81],[-27.039,-83.421],[-31.199,-79.783],[-33.414,-76.253],[-35.899,-73.483],[-42.76,-68.812],[-44.597,-67.346],[-44.597,-60.123],[-42.922,-58.439],[-40.491,-58.439],[-37.79,-61.643],[-36.277,-61.915],[-35.737,-59.906],[-35.358,-57.679],[-33.198,-54.095],[-32.441,-52.574],[-31.469,-52.954],[-29.686,-54.421],[-27.633,-55.344],[-27.309,-57.572],[-27.092,-59.526],[-25.417,-61.318],[-23.959,-62.512],[-24.175,-63.219],[-24.769,-63.653],[-25.742,-64.141],[-26.823,-65.229],[-27.254,-66.531],[-26.174,-68.975],[-23.689,-71.528],[-20.285,-72.94],[-20.393,-73.754],[-19.961,-75.655],[-17.421,-76.958],[-15.044,-76.633],[-13.964,-74.895],[-14.774,-74.352],[-16.017,-73.048],[-18.34,-71.039],[-20.393,-69.681],[-20.177,-68.921],[-19.637,-64.686],[-18.178,-63.598],[-15.369,-63.49],[-11.911,-64.25],[-8.994,-64.74],[-8.021,-63.816],[-6.67,-62.567],[-9.263,-62.35],[-11.046,-61.806],[-14.126,-61.97],[-16.395,-61.535],[-16.233,-60.069],[-14.991,-59.199],[-14.991,-57.408],[-15.855,-55.995],[-17.476,-57.354],[-19.205,-57.679],[-19.961,-55.725],[-20.177,-52.031],[-21.528,-51.434],[-22.987,-50.565],[-24.067,-50.186],[-25.148,-50.945],[-26.499,-50.729],[-28.119,-49.859],[-30.172,-49.37],[-30.496,-48.229],[-31.523,-48.501],[-32.604,-49.859],[-34.116,-50.076],[-35.845,-48.936],[-36.709,-50.24],[-38.06,-50.783],[-38.222,-52.194],[-37.304,-53.552],[-36.602,-54.638],[-37.195,-56.158],[-37.574,-57.299],[-38.924,-56.757],[-40.545,-55.615],[-41.031,-53.824],[-40.275,-52.466],[-39.681,-51.162],[-40.113,-48.827],[-41.788,-48.393],[-42.977,-47.632],[-45.299,-47.199],[-46.813,-45.677],[-47.569,-43.342],[-50.216,-42.311],[-51.513,-41.604],[-51.891,-39.594],[-53.404,-39.486],[-53.728,-38.4],[-55.187,-38.237],[-56.429,-39.052],[-56.699,-38.182],[-56.916,-36.689],[-58.266,-36.608],[-59.887,-36.608],[-61.021,-36.337],[-61.129,-35.359],[-59.887,-34.327],[-57.942,-34.11],[-57.078,-32.48],[-55.781,-31.177],[-55.781,-28.408],[-57.078,-25.149],[-59.725,-24.931],[-63.345,-25.529],[-65.56,-25.04],[-66.856,-25.203],[-68.423,-24.443],[-68.153,-23.085],[-68.207,-18.306],[-68.963,-16.188],[-68.369,-14.667],[-68.045,-11.844],[-64.371,-11.41],[-63.128,-10.16],[-61.994,-10.867],[-58.645,-10.811],[-57.564,-11.464],[-56.375,-12.821],[-54.484,-14.776],[-54.484,-16.405],[-53.782,-18.904],[-51.513,-20.75],[-49.082,-22.108],[-49.514,-24.117],[-47.947,-25.583],[-45.354,-24.714],[-43.841,-25.094],[-39.627,-27.375],[-37.844,-25.529],[-35.575,-22.596],[-31.793,-20.153],[-30.658,-18.306],[-29.146,-17.22],[-28.66,-15.591],[-28.984,-13.636],[-28.227,-13.311],[-27.471,-13.908],[-27.147,-15.211],[-26.552,-16.405],[-27.201,-17.274],[-27.254,-18.74],[-25.959,-18.632],[-25.04,-17.546],[-24.284,-18.089],[-24.769,-19.066],[-26.876,-20.153],[-28.713,-21.565],[-31.09,-23.303],[-32.063,-25.258],[-34.224,-26.669],[-34.386,-29.059],[-32.711,-30.688],[-32.063,-29.493],[-31.037,-29.602],[-29.848,-28.354],[-28.984,-25.692],[-26.661,-24.66],[-22.932,-21.945],[-22.608,-19.555],[-21.96,-16.949],[-20.879,-16.079],[-19.475,-14.233],[-19.961,-12.658],[-18.665,-11.3],[-17.476,-10.594],[-16.935,-11.083],[-16.503,-12.929],[-15.422,-13.636],[-16.288,-14.551],[-16.881,-15.862],[-17.314,-17.383],[-17.692,-18.849],[-16.666,-18.36],[-16.017,-19.339],[-13.045,-19.772],[-11.586,-18.632],[-10.128,-19.61],[-8.399,-20.098],[-7.588,-20.858],[-9.534,-22.759],[-9.209,-24.823],[-8.021,-26.832],[-6.617,-28.354],[-6.508,-29.711],[-5.049,-32.046],[-2.186,-32.372],[-1.7,-31.177],[-0.241,-30.634],[-0.889,-29.167],[0.137,-28.19],[1.272,-27.701],[3.271,-29.059],[1.974,-29.928],[1.866,-31.829],[5.053,-32.752],[8.62,-33.404],[7.214,-31.938],[6.783,-30.852],[6.404,-29.548],[5.593,-28.733],[6.512,-28.027],[11.104,-24.497],[12.779,-22.108],[10.564,-19.936],[5.972,-19.882],[2.043,-22.579],[-1.774,-21.62],[-4.994,-20.421],[-6.425,-19.104],[-10.481,-17.904],[-10.481,-16.945],[-10.243,-12.868],[-6.187,-9.751],[-2.966,-10.59],[0.85,-10.35],[3.713,-11.189],[4.071,-8.552],[3.117,-3.277],[0.135,-0.158],[-4.279,-0.279],[-7.26,0.201],[-11.554,-0.039],[-15.372,-1.598],[-20.501,-2.438],[-22.05,1.28],[-25.152,0.921],[-29.208,-1.358],[-33.024,-3.158],[-37.795,-5.554],[-36.603,-8.552],[-38.153,-11.91],[-43.043,-11.549],[-49.723,-10.83],[-54.375,-9.751],[-58.549,-8.192],[-63.917,-8.791],[-65.706,-5.436],[-69.165,-2.798],[-70.119,2.359],[-73.22,4.635],[-76.202,9.913],[-79.542,16.266],[-78.11,24.42],[-79.065,28.976],[-74.651,34.37],[-71.073,40.725],[-66.183,44.922],[-63.678,45.882],[-60.1,44.802],[-56.402,45.521],[-51.631,43.603],[-45.906,44.323],[-42.805,46.841],[-38.511,48.159],[-38.988,55.953],[-34.933,59.909],[-32.189,67.582],[-32.547,70.699],[-34.694,75.616],[-32.905,79.332],[-30.4,85.327],[-27.895,87.844],[-25.629,90.962],[-23.244,92.88],[-17.637,92.16],[-11.912,89.763],[-7.379,86.286],[-5.829,83.409],[-2.37,81.729],[-3.205,78.612],[-0.581,75.854],[4.667,72.617],[6.099,67.703],[5.263,63.385],[5.383,60.388],[7.649,56.792],[13.732,50.557],[19.458,44.323],[24.109,36.769],[24.467,34.01],[20.054,35.57],[16.595,36.41],[14.329,35.689],[13.255,33.532],[10.273,29.814],[8.484,28.736],[7.172,23.939],[5.025,22.861],[4.548,17.226],[2.64,14.948],[0.97,10.392],[-1.416,5.236],[-1.416,3.558],[0.97,5.956],[1.924,4.038],[4.309,9.193],[6.099,12.79],[8.842,17.586],[8.842,19.624],[12.42,24.898],[13.852,28.976],[14.209,32.691],[15.879,31.614],[19.816,30.415],[22.797,28.495],[27.21,26.458],[36.157,16.027],[36.633,13.989],[33.89,11.711],[32.458,10.392],[29.119,12.551],[26.853,12.43],[25.779,10.991],[24.229,10.392],[21.843,2.839],[24.109,1.519],[25.541,2.839],[27.449,5.836],[30.074,7.394],[33.89,6.915],[35.56,9.312],[39.616,10.152],[46.175,9.312],[47.249,12.189],[49.754,13.629],[48.442,14.708],[49.874,16.385],[52.378,14.468],[51.901,21.301],[52.974,27.176],[54.763,34.491],[56.791,32.092],[56.791,35.57],[58.103,35.57],[57.268,30.535],[57.865,28.495],[58.938,23.461],[62.159,19.743],[65.737,13.148],[69.434,11.111],[70.508,14.948],[70.269,18.545],[70.747,19.984],[72.178,18.185],[72.178,21.782],[70.747,27.057],[71.701,31.853],[71.706,31.872],[72.243,30.505],[72.058,29.336],[72.058,26.098],[73.251,22.141],[74.325,23.34],[74.643,23.601],[79.542,-8.951]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[249.445,212.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":6,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.076,-0.152],[-0.566,0.228],[-0.792,-0.455],[-0.792,0.796],[-1.132,0.683],[-1.019,0.683],[0,0.569],[0.679,0.341],[0,0],[0.202,-0.05],[0.378,-0.077],[0.152,-0.711],[0.48,0.025],[0.151,-0.356],[0.177,0],[0,0.127],[-0.101,0.305],[0.202,0.076],[0.227,-0.102],[0.303,0.076],[0.151,-0.077],[0.051,-0.432],[0,-0.254],[-0.303,-0.076],[-0.253,0.153],[-0.177,-0.076],[0,-0.102],[0.127,0],[0.05,-0.127],[-0.278,0.076],[-0.202,-0.255]],"o":[[0.076,0.152],[0.566,-0.227],[0.792,0.455],[0.793,-0.797],[1.132,-0.682],[1.019,-0.682],[0,-0.569],[-0.679,-0.341],[0,0],[-0.203,0.051],[-0.379,0.076],[-0.151,0.711],[-0.48,-0.026],[-0.152,0.355],[-0.176,0],[0,-0.127],[0.101,-0.304],[-0.202,-0.076],[-0.227,0.102],[-0.303,-0.076],[-0.152,0.076],[-0.05,0.432],[0,0.254],[0.303,0.076],[0.252,-0.152],[0.177,0.076],[0,0.102],[-0.126,0],[-0.051,0.127],[0.278,-0.076],[0.202,0.254]],"v":[[-4.595,2.448],[-3.507,2.389],[-2.149,3.413],[-0.112,2.617],[2.718,1.365],[5.321,-0.228],[6.793,-2.503],[5.208,-3.527],[3.51,-3.755],[2.049,-3.317],[0.887,-3.189],[0.179,-2.174],[-1.437,-1.818],[-2.574,-1.386],[-3.282,-0.777],[-3.559,-1.285],[-3.155,-2.377],[-3.787,-2.834],[-4.671,-2.834],[-5.328,-2.351],[-6.035,-2.554],[-6.187,-1.488],[-6.793,-1.006],[-6.035,-0.574],[-5.075,-0.879],[-4.368,-0.625],[-4.57,0.01],[-5.606,0.365],[-6.136,0.645],[-5.353,0.848],[-4.671,1.331]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.849,140.674],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.251,0.378],[0.335,0],[0.125,0.379],[0.126,0.337],[0.376,0.378],[-0.052,0.505],[0.292,0.042],[0.084,0.084],[-0.146,0.147],[-0.167,0.169],[-0.188,0.189],[0.083,0.168],[0.168,0.042],[0.251,0.126],[-0.272,0.273],[-0.085,0.178],[0,0],[0.167,0],[0.168,-0.042],[0.083,-0.63],[0.229,-0.231],[-0.125,-0.253],[-0.041,-0.253],[-0.083,-0.336],[-0.167,-0.252],[-0.376,-0.21],[0.042,-0.673],[0,-0.504],[-0.418,-0.042],[-0.251,0],[0.125,-0.379],[-0.293,-0.294],[0.167,-0.421],[0.126,0],[0.083,-0.252],[-0.377,-0.378],[0.293,-0.378],[0,-0.211],[-0.46,-0.085],[0.104,-0.105],[0.168,0.042],[0.126,-0.21],[0.084,-0.21],[-0.251,-0.252],[-0.67,0.168],[-0.083,0.21],[-0.377,-0.085],[-0.168,0.252],[-0.334,-0.043],[-0.377,0],[-0.419,-0.084],[0,0.168],[0.334,0.126],[-0.189,0.189]],"o":[[-0.251,-0.378],[-0.334,0],[-0.126,-0.378],[-0.125,-0.336],[-0.377,-0.378],[0.051,-0.504],[-0.293,-0.042],[-0.083,-0.084],[0.147,-0.147],[0.168,-0.168],[0.188,-0.19],[-0.084,-0.168],[-0.287,-0.072],[-0.251,-0.127],[0.209,-0.211],[0.025,-0.052],[0.413,-0.729],[-0.167,0],[-0.167,0.042],[-0.084,0.631],[-0.23,0.232],[0.126,0.252],[0.042,0.252],[0.084,0.337],[0.168,0.253],[0.377,0.21],[-0.042,0.673],[0,0.505],[0.419,0.042],[0.251,0],[-0.126,0.378],[0.293,0.294],[-0.167,0.42],[-0.125,0],[-0.084,0.253],[0.376,0.379],[-0.293,0.379],[0,0.21],[0.46,0.084],[-0.105,0.106],[-0.167,-0.042],[-0.125,0.211],[-0.083,0.21],[0.251,0.253],[0.669,-0.169],[0.084,-0.21],[0.376,0.084],[0.167,-0.252],[0.335,0.042],[0.376,0],[0.418,0.084],[0,-0.169],[-0.335,-0.126],[0.188,-0.189]],"v":[[5.459,3.581],[4.161,3.329],[3.326,2.782],[2.949,1.268],[1.568,-0.708],[0.784,-2.39],[-0.062,-3.189],[-1.527,-3.525],[-1.192,-4.24],[-0.23,-4.871],[0.188,-5.879],[0.773,-6.931],[-0.021,-7.141],[-2.908,-7.351],[-1.904,-8.57],[-1.399,-9.369],[-1.359,-9.454],[-2.699,-9.748],[-3.786,-9.664],[-4.329,-8.613],[-5.249,-7.604],[-5.585,-6.594],[-5.208,-5.879],[-5.041,-5.039],[-4.999,-4.114],[-3.995,-3.735],[-3.911,-2.642],[-4.078,-1.549],[-3.535,-0.918],[-2.154,-1.086],[-2.322,-0.077],[-1.652,1.058],[-1.694,2.446],[-3.242,2.488],[-3.827,2.908],[-3.326,3.959],[-3.702,5.431],[-4.664,6.23],[-2.656,6.861],[-2.113,7.491],[-3.535,7.66],[-3.953,8.584],[-5.041,9.173],[-4.873,9.93],[-3.326,9.636],[-2.531,8.963],[-1.317,8.753],[-0.355,8.206],[0.857,7.618],[2.029,8.122],[4.372,7.744],[5.417,6.987],[4.12,6.692],[5.124,5.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.416,162.531],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.042,0.476],[10.285,-12.495],[-0.05,-0.5],[0.227,-0.797],[-0.565,-0.113],[-0.453,-0.113],[0.792,-0.455],[0.453,-0.455],[-0.113,-1.365],[-0.114,-1.024],[-0.906,-0.342],[-0.566,0],[-0.34,1.252],[0,0],[-1.019,0.228],[-0.566,0.228],[-0.567,0.797],[-0.68,0.683],[-0.679,0.682],[-0.679,0.683],[0,0.91],[-0.114,1.252],[0,0],[-0.34,0.57],[0.679,0.341],[-0.34,0.342],[-0.397,0.398],[0.226,0.227],[-0.736,0.74],[-0.679,0.227],[-0.566,0],[0.905,0],[0.906,-0.626],[0.679,0],[0,0],[-0.509,0.512]],"o":[[-14.8,6.914],[0.118,0.526],[0.113,1.138],[-0.226,0.796],[0.566,0.114],[0.452,0.114],[-0.793,0.455],[-0.452,0.455],[0.113,1.365],[0.113,1.024],[0.905,0.341],[0.566,0],[0.339,-1.251],[0,0],[1.019,-0.227],[0.566,-0.227],[0.566,-0.796],[0.679,-0.683],[0.679,-0.683],[0.679,-0.682],[0,-0.91],[0.113,-1.251],[0,0],[0.34,-0.568],[-0.679,-0.341],[0.339,-0.341],[0.396,-0.398],[-0.226,-0.228],[0.736,-0.739],[0.679,-0.228],[0.566,0],[-0.906,0],[-0.905,0.626],[-0.679,0],[0,0],[0.28,-0.282]],"v":[[14.18,-26.157],[-23.904,3.405],[-23.6,4.995],[-24.165,7.271],[-24.279,9.432],[-21.674,8.977],[-23.939,11.48],[-25.523,13.87],[-25.863,17.852],[-25.184,22.403],[-22.807,25.816],[-20.09,26.157],[-18.506,22.971],[-14.658,13.983],[-12.281,12.504],[-7.188,9.546],[-4.471,6.474],[-0.057,4.654],[5.262,0.9],[8.658,-1.49],[8.884,-4.106],[9.904,-6.837],[12.281,-8.999],[13.751,-11.047],[13.298,-13.208],[13.072,-14.915],[15.337,-16.621],[13.751,-17.645],[15.109,-19.466],[19.751,-22.651],[25.41,-25.211],[24.164,-25.95],[19.41,-25.211],[16.354,-24.358],[13.979,-23.561],[13.751,-24.813]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.481999984442,0.779999976065,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.155,130.103],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-60.423],[60.112,0],[0,60.423],[-60.11,0]],"o":[[0,60.423],[-60.11,0],[0,-60.423],[60.112,0]],"v":[[108.84,0],[-0.001,109.406],[-108.84,0],[-0.001,-109.406]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.340999977261,0.670999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.147,203.209],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.496,10.504],[-2.392,-10.504],[-9.495,-6.484],[-2.823,-2.401],[-4.845,-1.258],[1.825,2.824],[0.518,3.563],[5.262,6.466],[4.033,7.161]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141000007181,0.670999983245,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.776,302.485],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-9.496,-4.475],[-2.824,-0.392],[-4.846,0.753],[1.824,4.834],[0.518,5.572],[5.261,8.475],[4.032,9.171],[9.495,12.513],[9.441,6.109],[8.214,6.805],[8.167,1.244],[6.861,1.983],[6.796,-5.836],[4.775,-4.693],[4.71,-12.514]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.788000009574,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.776,300.475],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-3.833,11.759],[4.551,-8.924],[-2.442,-11.759],[-1.566,-4.58],[-3.555,-5.387],[-2.679,1.79],[-3.965,1.269],[-3.342,6.372],[-4.551,5.882]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141000007181,0.670999983245,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.517,311.743],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.939,-11.759],[-5.064,-4.58],[-7.053,-5.387],[-6.176,1.79],[-7.462,1.268],[-6.839,6.372],[-8.048,5.882],[-7.331,11.759],[-2.723,8.04],[-3.932,7.55],[0.069,4.321],[-1.217,3.8],[4.41,-0.74],[2.419,-1.547],[8.048,-6.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.788000009574,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[180.014,311.743],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.057,14.554],[6.378,-10.349],[-2.042,-14.554],[-1.65,-5.543],[-4.045,-6.739],[-3.653,2.269],[-5.202,1.496],[-4.922,7.903],[-6.378,7.176]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141000007181,0.670999983245,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[166.017,309.236],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":4,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.252,-14.554],[-5.859,-5.542],[-8.255,-6.739],[-7.863,2.269],[-9.411,1.497],[-9.132,7.903],[-10.589,7.176],[-10.268,14.554],[-4.176,10.378],[-5.632,9.651],[-0.343,6.025],[-1.891,5.252],[5.545,0.153],[3.15,-1.043],[10.589,-6.145]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.788000009574,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.228,309.236],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.814,8.682],[-7.943,-8.681],[-13.814,-1.325],[-4.918,0.174],[-6.589,2.267],[2.302,3.765],[1.223,5.118],[7.546,6.183],[6.531,7.454]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141000007181,0.670999983245,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[311.184,278.988],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-13.814,2.353],[-4.918,3.852],[-6.589,5.945],[2.302,7.443],[1.223,8.795],[7.546,9.861],[6.531,11.132],[13.814,12.36],[11.001,5.531],[9.987,6.802],[7.545,0.873],[6.465,2.226],[3.033,-6.112],[1.363,-4.019],[-2.072,-12.36]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.788000009574,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[311.184,275.31],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":4,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-13.418,-9.441],[7.033,9.442],[13.418,2.527],[4.654,0.392],[6.47,-1.575],[-2.29,-3.709],[-1.116,-4.981],[-7.347,-6.498],[-6.243,-7.693]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141000007181,0.670999983245,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[129.631,128.631],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.418,-0.931],[4.654,-3.066],[6.47,-5.033],[-2.29,-7.166],[-1.116,-8.438],[-7.347,-9.955],[-6.243,-11.151],[-13.418,-12.899],[-11.104,-5.885],[-10,-7.081],[-7.992,-0.991],[-6.818,-2.263],[-3.994,6.3],[-2.177,4.333],[0.648,12.899]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.788000009574,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[129.631,132.088],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-18.781,-14.691],[8.846,14.691],[18.781,5.35],[6.333,1.368],[9.16,-1.289],[-3.285,-5.269],[-1.458,-6.986],[-10.307,-9.816],[-8.59,-11.432]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141000007181,0.670999983245,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.776,111.29],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":4,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.782,0.678],[6.333,-3.303],[9.16,-5.96],[-3.285,-9.939],[-1.458,-11.658],[-10.307,-14.488],[-8.589,-16.102],[-18.781,-19.363],[-16.156,-8.989],[-14.438,-10.605],[-12.156,-1.597],[-10.329,-3.314],[-7.124,9.35],[-4.296,6.692],[-1.089,19.363]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.788000009574,0.008000000785,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.776,115.962],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.473,2.159],[0.281,-0.053],[2.266,3.786],[-0.345,-1.85],[-4.577,0.852]],"o":[[-0.274,0.065],[-5.764,1.072],[-1.427,1.317],[0.574,3.086],[3.234,-0.602]],"v":[[7.973,-0.129],[7.141,0.051],[-6.302,-4.736],[-7.866,0.217],[-0.062,4.545]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[339.28,193.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.577,-0.853],[0.575,3.086],[-4.578,0.852],[-0.574,-3.086]],"o":[[-4.577,0.852],[-0.575,-3.086],[4.577,-0.852],[0.576,3.085]],"v":[[-0.484,5.587],[-8.288,1.259],[-2.564,-5.587],[8.288,-1.827]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[339.702,192.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":4,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.663,1.391],[-3.919,0.021],[3.664,-1.391],[3.919,-0.02]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[331.293,194.007],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":4,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.207,1.606],[-0.046,-0.295],[4.024,-2.245],[-1.942,0.301],[0.744,4.805]],"o":[[0.06,0.288],[0.937,6.051],[1.33,1.531],[3.239,-0.502],[-0.526,-3.395]],"v":[[0.249,-8.311],[0.41,-7.437],[-5.014,6.443],[0.106,8.233],[4.872,0.225]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[215.704,83.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":4,"cix":2,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.744,-4.805],[3.24,-0.502],[0.743,4.805],[-3.24,0.501]],"o":[[0.744,4.805],[-3.238,0.501],[-0.745,-4.805],[3.239,-0.502]],"v":[[5.865,0.693],[1.099,8.701],[-5.864,2.509],[-1.594,-8.7]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[214.711,83.507],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":4,"cix":2,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.336,3.868],[-0.103,4.092],[-1.336,-3.869],[0.104,-4.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[215.673,92.329],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":4,"cix":2,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.26,3.274],[0.08,-0.428],[6.617,-1.146],[-2.815,-0.524],[-1.296,6.967]],"o":[[-0.058,0.425],[-1.632,8.773],[1.089,2.748],[4.697,0.873],[0.915,-4.923]],"v":[[5.882,-11.423],[5.681,-10.143],[-8.476,6.328],[-2.299,11.261],[8.12,2.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[232.538,81.807],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":4,"cix":2,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.296,-6.967],[4.696,0.874],[-1.295,6.967],[-4.696,-0.873]],"o":[[-1.296,6.967],[-4.696,-0.873],[1.296,-6.967],[4.697,0.873]],"v":[[8.504,3.902],[-1.915,12.615],[-8.505,0.739],[2.777,-12.616]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[232.155,80.452],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":4,"cix":2,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.029,5.965],[-2.117,5.578],[0.03,-5.965],[2.117,-5.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[229.993,93.169],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":4,"cix":2,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.029,-3.263],[-0.256,0.25],[-4.982,-2.353],[1.642,1.679],[4.158,-4.063]],"o":[[0.239,-0.259],[5.235,-5.117],[0.565,-2.357],[-2.739,-2.803],[-2.938,2.872]],"v":[[-9.1,6.738],[-8.361,5.974],[8.912,1.602],[7.094,-4.622],[-4.009,-3.693]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.579,291.88],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":4,"cix":2,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.157,4.064],[-2.739,-2.802],[4.158,-4.063],[2.739,2.803]],"o":[[4.158,-4.063],[2.739,2.802],[-4.157,4.065],[-2.739,-2.803]],"v":[[-3.693,-6.263],[7.41,-7.193],[6.227,3.885],[-7.646,7.523]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.264,294.45],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":4,"cix":2,"ix":38,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.835,-3.989],[4.053,-2.743],[-2.834,3.989],[-4.052,2.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[144.887,287.306],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":4,"cix":2,"ix":39,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.32,-1.556],[-0.3,-0.06],[-0.744,-4.659],[-0.394,1.972],[4.881,0.974]],"o":[[0.298,0.044],[6.146,1.228],[1.939,-0.741],[0.657,-3.29],[-3.449,-0.689]],"v":[[-7.992,-4.259],[-7.095,-4.106],[4.341,5.99],[7.862,1.697],[1.84,-5.7]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.648,153.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":4,"cix":2,"ix":40,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.881,-0.975],[0.657,-3.29],[4.88,0.974],[-0.657,3.29]],"o":[[4.881,0.975],[-0.657,3.291],[-4.881,-0.975],[0.657,-3.29]],"v":[[2.816,-5.957],[8.838,1.44],[0.437,5.958],[-8.837,-2.089]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[108.672,154.174],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":4,"cix":2,"ix":41,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.189,0.076],[3.896,1.538],[-4.189,-0.076],[-3.897,-1.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.579,155.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":4,"cix":2,"ix":42,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.785,-1.197],[-0.231,-0.046],[-0.572,-3.583],[-0.303,1.517],[3.755,0.75]],"o":[[0.229,0.034],[4.728,0.945],[1.492,-0.57],[0.506,-2.531],[-2.652,-0.53]],"v":[[-6.148,-3.276],[-5.458,-3.159],[3.339,4.607],[6.047,1.305],[1.414,-4.385]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[111.808,163.788],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":4,"cix":2,"ix":43,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.754,-0.75],[0.505,-2.53],[3.754,0.75],[-0.506,2.531]],"o":[[3.755,0.75],[-0.506,2.531],[-3.754,-0.75],[0.505,-2.531]],"v":[[2.166,-4.583],[6.799,1.107],[0.336,4.583],[-6.798,-1.607]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[111.057,163.985],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":4,"cix":2,"ix":44,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.222,0.058],[2.997,1.183],[-3.222,-0.059],[-2.998,-1.184]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.908,165.227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":4,"cix":2,"ix":45,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.864,-2.582],[-0.134,0.267],[-4.569,-0.504],[1.752,0.88],[2.176,-4.335]],"o":[[0.118,-0.269],[2.74,-5.46],[-0.195,-2.014],[-2.922,-1.467],[-1.537,3.063]],"v":[[-6.198,7.009],[-5.823,6.206],[6.617,-1.934],[3.492,-6.352],[-5.015,-2.602]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.53,299.31],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":4,"cix":2,"ix":46,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.176,4.335],[-2.923,-1.467],[2.176,-4.335],[2.922,1.467]],"o":[[2.176,-4.335],[2.922,1.467],[-2.176,4.335],[-2.922,-1.468]],"v":[[-5.231,-4.1],[3.275,-7.85],[5.352,1.212],[-4.605,7.85]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.747,300.807],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":4,"cix":2,"ix":47,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.153,-3.917],[2.452,-3.265],[-1.153,3.917],[-2.452,3.266]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.204,292.938],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":4,"cix":2,"ix":48,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.045,-0.438],[0.278,0.348],[-3.536,5.89],[2.287,-1.83],[-4.529,-5.659]],"o":[[-0.291,-0.328],[-5.703,-7.127],[-2.856,-0.993],[-3.814,3.053],[3.201,4]],"v":[[7.674,11.722],[6.817,10.711],[3.526,-11.258],[-4.423,-9.771],[-4.639,4.118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.689999988032,0.081999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[301.735,296.291],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":4,"cix":2,"ix":49,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.528,5.659],[-3.815,3.053],[-4.529,-5.659],[3.816,-3.052]],"o":[[-4.529,-5.659],[3.815,-3.052],[4.529,5.659],[-3.814,3.053]],"v":[[-7.951,3.642],[-7.735,-10.248],[5.864,-7.413],[8.664,10.247]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.8,0.097999999102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[305.048,296.768],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":4,"cix":2,"ix":50,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.599,-4.01],[-2.904,-5.366],[4.599,4.009],[2.903,5.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.344999994016,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.4,286.261],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":4,"cix":2,"ix":51,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.372,-7.247],[4.985,3.736],[-5.373,7.247],[-4.986,-3.735]],"o":[[-5.372,7.246],[-4.985,-3.734],[5.372,-7.246],[4.986,3.735]],"v":[[9.027,6.762],[-9.728,13.12],[-9.028,-6.762],[9.727,-13.121]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.375999989229,0.702000038297,0.195999998205,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[321.291,233.272],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":4,"cix":2,"ix":52,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.181,-8.96],[6.164,0.821],[-1.18,8.96],[-6.165,-0.821]],"o":[[-1.18,8.959],[-6.164,-0.82],[1.18,-8.959],[6.164,0.82]],"v":[[11.16,1.486],[-2.138,16.222],[-11.162,-1.486],[2.137,-16.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.375999989229,0.702000038297,0.195999998205,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[323.532,212.715],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":4,"cix":2,"ix":53,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.648,-4.751],[3.269,5.316],[-7.648,4.751],[-3.269,-5.318]],"o":[[-7.648,4.751],[-3.268,-5.318],[7.649,-4.751],[3.268,5.316]],"v":[[5.918,9.627],[-13.849,8.603],[-5.919,-9.627],[13.848,-8.602]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.375999989229,0.702000038297,0.195999998205,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.889,252.882],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":4,"cix":2,"ix":54,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.176,0.066],[-0.063,1.147],[0,0]],"o":[[0,0],[-0.062,1.149],[-1.175,-0.064],[0,0],[0,0]],"v":[[2.284,-3.182],[2.035,1.389],[-0.206,3.35],[-2.221,1.156],[-1.971,-3.417]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.543,357.135],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":4,"cix":2,"ix":55,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.278,-1.892],[17.382,0.013],[17.28,1.892],[-17.382,-0.013]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.392,341.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":4,"cix":2,"ix":56,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.278,-1.892],[17.382,0.014],[17.28,1.893],[-17.382,-0.012]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.327,323.889],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 57","np":4,"cix":2,"ix":57,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.641,0.091],[-0.087,1.601],[0,0]],"o":[[0,0],[-0.088,1.601],[-1.64,-0.09],[0,0],[0,0]],"v":[[3.187,-4.442],[2.84,1.941],[-0.288,4.677],[-3.1,1.615],[-2.752,-4.768]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.310000011968,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[201.052,331.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 58","np":4,"cix":2,"ix":58,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.64,0.09],[-0.087,1.601],[0,0]],"o":[[0,0],[-0.087,1.601],[-1.64,-0.091],[0,0],[0,0]],"v":[[3.187,-4.442],[2.839,1.941],[-0.288,4.678],[-3.1,1.615],[-2.753,-4.768]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.310000011968,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.896,332.451],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 59","np":4,"cix":2,"ix":59,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.641,0.09],[-0.088,1.601],[0,0]],"o":[[0,0],[-0.087,1.601],[-1.64,-0.091],[0,0],[0,0]],"v":[[3.188,-4.441],[2.839,1.941],[-0.289,4.678],[-3.1,1.615],[-2.753,-4.768]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.310000011968,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.738,332.992],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 60","np":4,"cix":2,"ix":60,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.199,-21.743],[18.461,-19.838],[16.199,21.743],[-18.461,19.838]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.274,324.872],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 61","np":4,"cix":2,"ix":61,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.637,0.035],[-0.034,0.622],[0,0]],"o":[[0,0],[-0.034,0.622],[-0.637,-0.035],[0,0],[0,0]],"v":[[1.238,-1.725],[1.102,0.754],[-0.112,1.816],[-1.204,0.627],[-1.069,-1.851]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.908,320.988],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 62","np":4,"cix":2,"ix":62,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.637,0.035],[-0.034,0.622],[0,0]],"o":[[0,0],[-0.033,0.622],[-0.637,-0.035],[0,0],[0,0]],"v":[[1.238,-1.724],[1.102,0.754],[-0.112,1.816],[-1.204,0.627],[-1.069,-1.851]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[185.605,320.696],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 63","np":4,"cix":2,"ix":63,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.638,0.035],[-0.034,0.622],[0,0]],"o":[[0,0],[-0.034,0.622],[-0.636,-0.035],[0,0],[0,0]],"v":[[1.238,-1.725],[1.102,0.754],[-0.113,1.816],[-1.204,0.628],[-1.069,-1.852]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[180.302,320.405],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 64","np":4,"cix":2,"ix":64,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.637,0.035],[-0.034,0.622],[0,0]],"o":[[0,0],[-0.034,0.622],[-0.637,-0.034],[0,0],[0,0]],"v":[[1.238,-1.724],[1.102,0.754],[-0.112,1.816],[-1.204,0.627],[-1.069,-1.851]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[175,320.113],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 65","np":4,"cix":2,"ix":65,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.579,-2.785],[-1.269,-2.941],[-1.58,2.783],[1.267,2.94]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.604,326.537],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 66","np":4,"cix":2,"ix":66,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.58,-2.785],[-1.268,-2.941],[-1.579,2.784],[1.268,2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[187.763,326.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 67","np":4,"cix":2,"ix":67,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.579,-2.784],[-1.269,-2.941],[-1.58,2.784],[1.267,2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[182.922,326.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 68","np":4,"cix":2,"ix":68,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.579,-2.785],[-1.269,-2.941],[-1.58,2.783],[1.268,2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[178.08,325.738],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 69","np":4,"cix":2,"ix":69,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.58,-2.784],[-1.268,-2.941],[-1.58,2.784],[1.268,2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[173.239,325.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 70","np":4,"cix":2,"ix":70,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.477,-10.777],[-14.215,-12.41],[-15.477,10.778],[14.214,12.41]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[187.307,314.33],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 71","np":4,"cix":2,"ix":71,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.637,-0.035],[-0.033,0.623],[0,0]],"o":[[0,0],[-0.034,0.622],[0.637,0.035],[0,0],[0,0]],"v":[[-1.068,-1.851],[-1.204,0.627],[-0.112,1.816],[1.102,0.753],[1.238,-1.724]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.967,323.245],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 72","np":4,"cix":2,"ix":72,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.638,-0.035],[-0.034,0.623],[0,0]],"o":[[0,0],[-0.034,0.622],[0.637,0.035],[0,0],[0,0]],"v":[[-1.068,-1.852],[-1.204,0.628],[-0.112,1.816],[1.102,0.753],[1.238,-1.724]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[237.27,323.536],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 73","np":4,"cix":2,"ix":73,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.637,-0.034],[-0.034,0.623],[0,0]],"o":[[0,0],[-0.033,0.622],[0.637,0.035],[0,0],[0,0]],"v":[[-1.069,-1.851],[-1.204,0.627],[-0.113,1.816],[1.103,0.753],[1.238,-1.724]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[242.572,323.828],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 74","np":4,"cix":2,"ix":74,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.637,-0.035],[-0.034,0.623],[0,0]],"o":[[0,0],[-0.033,0.622],[0.637,0.035],[0,0],[0,0]],"v":[[-1.069,-1.851],[-1.204,0.627],[-0.113,1.816],[1.103,0.753],[1.238,-1.725]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[247.875,324.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 75","np":4,"cix":2,"ix":75,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.268,-2.941],[1.58,-2.784],[1.268,2.941],[-1.58,2.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[229.653,328.573],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 76","np":4,"cix":2,"ix":76,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.268,-2.941],[1.58,-2.785],[1.268,2.941],[-1.58,2.784]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[234.494,328.84],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 77","np":4,"cix":2,"ix":77,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.268,-2.941],[1.58,-2.784],[1.268,2.941],[-1.58,2.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[239.335,329.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 78","np":4,"cix":2,"ix":78,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.268,-2.941],[1.58,-2.785],[1.268,2.941],[-1.58,2.784]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[244.176,329.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 79","np":4,"cix":2,"ix":79,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.268,-2.941],[1.58,-2.784],[1.268,2.941],[-1.58,2.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[249.018,329.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 80","np":4,"cix":2,"ix":80,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-14.214,-12.41],[15.477,-10.777],[14.215,12.41],[-15.477,10.777]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236.242,317.02],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 81","np":4,"cix":2,"ix":81,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.223,-3.981],[2.643,-3.713],[2.225,3.981],[-2.643,3.713]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.246,344.844],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 82","np":4,"cix":2,"ix":82,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.224,-3.982],[2.643,-3.714],[2.224,3.982],[-2.643,3.714]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[202.695,345.253],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 83","np":4,"cix":2,"ix":83,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.223,-3.982],[2.643,-3.712],[2.225,3.982],[-2.643,3.714]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.143,345.663],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 84","np":4,"cix":2,"ix":84,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.224,-3.981],[2.643,-3.713],[2.224,3.981],[-2.643,3.713]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[217.592,346.072],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 85","np":4,"cix":2,"ix":85,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.223,-3.981],[2.643,-3.713],[2.223,3.982],[-2.643,3.714]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[225.04,346.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 86","np":4,"cix":2,"ix":86,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.518,4.388],[-14.252,-7.465],[-14.42,-4.386],[-0.685,7.465],[14.253,-2.81],[14.42,-5.888]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.559,361.528],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 87","np":4,"cix":2,"ix":87,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.979,14.031],[10.549,6.1],[11.579,-12.815],[0.515,-13.423],[-10.549,-14.031],[-11.579,4.885]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.642999985639,0.238999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.003,352.197],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 88","np":4,"cix":2,"ix":88,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.418,3.544],[-11.511,-6.029],[-11.647,-3.544],[-0.553,6.029],[11.513,-2.27],[11.647,-4.756]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.877999997606,0.532999973671,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.355,364.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 89","np":4,"cix":2,"ix":89,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.394,3.329],[-10.817,-5.665],[-10.944,-3.33],[-0.521,5.665],[10.816,-2.134],[10.944,-4.469]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.4,0.136999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.257,365.852],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 90","np":4,"cix":2,"ix":90,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.722,0.457],[0.441,0.705],[0,0]],"o":[[0,0],[0.442,0.704],[0.722,-0.457],[0,0],[0,0]],"v":[[-2.622,-1.371],[-0.433,2.122],[1.674,2.57],[2.181,0.466],[-0.01,-3.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[293.365,335.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 91","np":4,"cix":2,"ix":91,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.722,0.457],[0.441,0.705],[0,0]],"o":[[0,0],[0.442,0.704],[0.722,-0.457],[0,0],[0,0]],"v":[[-2.622,-1.371],[-0.433,2.122],[1.674,2.57],[2.181,0.466],[-0.01,-3.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.604,333.161],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 92","np":4,"cix":2,"ix":92,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.722,0.457],[0.441,0.705],[0,0]],"o":[[0,0],[0.442,0.704],[0.722,-0.458],[0,0],[0,0]],"v":[[-2.622,-1.371],[-0.433,2.122],[1.674,2.57],[2.181,0.466],[-0.009,-3.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[301.843,330.476],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 93","np":4,"cix":2,"ix":93,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.722,0.457],[0.442,0.705],[0,0]],"o":[[0,0],[0.442,0.704],[0.722,-0.458],[0,0],[0,0]],"v":[[-2.623,-1.371],[-0.433,2.122],[1.674,2.57],[2.181,0.466],[-0.01,-3.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[306.083,327.79],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 94","np":4,"cix":2,"ix":94,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.722,0.457],[0.442,0.705],[0,0]],"o":[[0,0],[0.442,0.704],[0.722,-0.458],[0,0],[0,0]],"v":[[-2.623,-1.371],[-0.433,2.122],[1.674,2.57],[2.181,0.466],[-0.009,-3.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[310.322,325.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 95","np":4,"cix":2,"ix":95,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-12.56,5.379],[9.664,-8.7],[12.56,-7.09],[-12.365,8.7]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[299.853,326.553],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 96","np":4,"cix":2,"ix":96,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.406,-2.865],[-1.101,-4.324],[3.406,2.865],[1.101,4.325]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[289.759,319.834],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 97","np":4,"cix":2,"ix":97,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.406,-2.865],[-1.101,-4.324],[3.406,2.865],[1.101,4.324]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.596,314.869],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 98","np":4,"cix":2,"ix":98,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.457,6.447],[4.294,5.917],[-3.457,-6.447],[-4.294,-5.915]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[285.166,322.52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 99","np":4,"cix":2,"ix":99,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.457,6.447],[4.294,5.917],[-3.457,-6.447],[-4.294,-5.915]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[287.096,321.297],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 100","np":4,"cix":2,"ix":100,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.137,1.884],[2.613,-1.126],[2.138,-1.884],[-2.613,1.126]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[290.75,329.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 101","np":4,"cix":2,"ix":101,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.343,0.919],[1.838,-1.728],[2.344,-0.921],[-1.836,1.728]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[290.259,328.495],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 102","np":4,"cix":2,"ix":102,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.823,-0.197],[1.041,-2.645],[2.823,0.197],[-1.042,2.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.365,314.307],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 103","np":4,"cix":2,"ix":103,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.457,6.446],[4.294,5.917],[-3.457,-6.447],[-4.294,-5.916]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[292.612,317.802],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 104","np":4,"cix":2,"ix":104,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.457,6.446],[4.294,5.916],[-3.457,-6.446],[-4.294,-5.916]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[294.542,316.58],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 105","np":4,"cix":2,"ix":105,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.138,1.884],[2.613,-1.126],[2.138,-1.884],[-2.613,1.126]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[298.197,324.559],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 106","np":4,"cix":2,"ix":106,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.344,0.92],[1.837,-1.728],[2.343,-0.921],[-1.837,1.728]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.706,323.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 107","np":4,"cix":2,"ix":107,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.823,-0.197],[1.042,-2.645],[2.823,0.196],[-1.042,2.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[288.811,309.59],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 108","np":4,"cix":2,"ix":108,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.457,6.446],[4.293,5.917],[-3.457,-6.447],[-4.293,-5.916]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[300.059,313.085],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 109","np":4,"cix":2,"ix":109,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.457,6.447],[4.293,5.917],[-3.457,-6.447],[-4.293,-5.915]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[301.989,311.862],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 110","np":4,"cix":2,"ix":110,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.137,1.884],[2.613,-1.126],[2.138,-1.884],[-2.613,1.126]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[305.643,319.842],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 111","np":4,"cix":2,"ix":111,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.344,0.919],[1.837,-1.728],[2.343,-0.921],[-1.837,1.729]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[305.152,319.059],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 112","np":4,"cix":2,"ix":112,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.823,-0.196],[1.042,-2.645],[2.823,0.197],[-1.042,2.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[296.258,304.872],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 113","np":4,"cix":2,"ix":113,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.272,0.435],[-0.433,0.274],[0,0],[-0.273,-0.435],[0.431,-0.274],[0,0]],"o":[[-0.272,-0.435],[0,0],[0.433,-0.275],[0.272,0.434],[0,0],[-0.432,0.274]],"v":[[-10.149,6.43],[-9.859,5.147],[8.872,-6.719],[10.149,-6.428],[9.86,-5.146],[-8.873,6.72]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[309.021,341.823],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 114","np":4,"cix":2,"ix":114,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.272,0.435],[-0.433,0.273],[0,0],[-0.273,-0.435],[0.431,-0.274],[0,0]],"o":[[-0.272,-0.435],[0,0],[0.432,-0.274],[0.272,0.434],[0,0],[-0.432,0.273]],"v":[[-11.794,7.472],[-11.505,6.19],[10.518,-7.762],[11.794,-7.471],[11.505,-6.189],[-10.519,7.763]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[287.427,307.382],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 115","np":4,"cix":2,"ix":115,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.347,0.854],[0.824,1.316],[0,0]],"o":[[0,0],[0.826,1.316],[1.348,-0.853],[0,0],[0,0]],"v":[[-4.219,-1.482],[-1.483,2.882],[2.449,3.719],[3.396,-0.208],[0.66,-4.573]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[273.306,300.204],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 116","np":4,"cix":2,"ix":116,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.348,0.854],[0.825,1.317],[0,0]],"o":[[0,0],[0.825,1.316],[1.347,-0.853],[0,0],[0,0]],"v":[[-4.22,-1.482],[-1.484,2.882],[2.449,3.719],[3.394,-0.209],[0.658,-4.573]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280.108,295.896],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 117","np":4,"cix":2,"ix":117,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.347,0.854],[0.824,1.317],[0,0]],"o":[[0,0],[0.826,1.316],[1.348,-0.853],[0,0],[0,0]],"v":[[-4.219,-1.482],[-1.483,2.882],[2.449,3.719],[3.396,-0.209],[0.66,-4.573]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[286.909,291.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 118","np":4,"cix":2,"ix":118,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.616,9.517],[11.396,-1.893],[6.616,-9.517],[-11.396,1.893]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.638999968884,0.430999995213,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[306.833,338.333],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 119","np":4,"cix":2,"ix":119,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-13.298,3.002],[8.431,-10.764],[13.298,-3.003],[-8.432,10.764]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[302.01,330.642],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 120","np":4,"cix":2,"ix":120,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.378,-1.911],[5.352,-15.677],[16.379,1.911],[-5.352,15.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[292.941,316.177],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 121","np":4,"cix":2,"ix":121,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-15.818,-0.149],[6.69,-14.409],[15.817,0.149],[-6.691,14.409]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.95,300.241],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 122","np":4,"cix":2,"ix":122,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.942,1.863],[1.801,2.873],[0,0]],"o":[[0,0],[1.8,2.872],[2.942,-1.865],[0,0],[0,0]],"v":[[-7.277,-0.146],[-5.177,3.205],[3.41,5.032],[5.477,-3.544],[3.375,-6.895]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[310.038,343.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 123","np":4,"cix":2,"ix":123,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-4.478,2.836],[2.741,4.372],[0,0]],"o":[[0,0],[2.741,4.372],[4.476,-2.836],[0,0],[0,0]],"v":[[-11.074,-0.221],[-7.879,4.876],[5.191,7.656],[8.333,-5.395],[5.137,-10.492]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.250999989229,0.122000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[310.924,345.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 124","np":4,"cix":2,"ix":124,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.196,0.047],[1.853,-3.785],[4.197,-0.047],[-1.853,3.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[315.836,352.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 125","np":4,"cix":2,"ix":125,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.28,0.81],[0.784,1.251],[0,0]],"o":[[0,0],[0.784,1.251],[1.282,-0.812],[0,0],[0,0]],"v":[[-3.168,-0.063],[-2.254,1.395],[1.484,2.191],[2.384,-1.543],[1.47,-3.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.356999984442,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[316.958,354.662],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 126","np":4,"cix":2,"ix":126,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.021,0.658],[0.533,-0.017],[-0.02,-0.659],[-0.533,0.017]],"o":[[-0.021,-0.657],[-0.534,0.016],[0.021,0.658],[0.533,-0.017]],"v":[[0.966,-0.031],[-0.038,-1.191],[-0.966,0.031],[0.036,1.191]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[319.313,360.217],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 127","np":4,"cix":2,"ix":127,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.732,0.381],[-0.308,0.599],[-0.732,-0.381],[0.308,-0.6]],"o":[[-0.732,-0.381],[0.31,-0.6],[0.733,0.381],[-0.309,0.6]],"v":[[-0.559,1.086],[-1.327,-0.69],[0.56,-1.087],[1.327,0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[321.627,358.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 128","np":4,"cix":2,"ix":128,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.339,0.216],[-0.214,-0.341],[0,0],[0.339,-0.214],[0.214,0.341]],"o":[[-0.215,-0.341],[0.339,-0.215],[0,0],[0.213,0.341],[-0.34,0.215],[0,0]],"v":[[-1.634,-1.238],[-1.408,-2.247],[-0.406,-2.018],[1.637,1.24],[1.409,2.246],[0.406,2.018]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.702000038297,0.510000011968,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[319.795,358.93],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 129","np":4,"cix":2,"ix":129,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.069,4.668],[3.245,-6.955],[6.069,-4.669],[-3.246,6.955]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.39199999641,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.065,306.346],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 130","np":4,"cix":2,"ix":130,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.401,-6.124],[-7.742,-6.947],[8.401,6.125],[7.742,6.947]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[365.958,314.296],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 131","np":4,"cix":2,"ix":131,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-28.177,-21.734],[-27.124,-23.047],[28.177,21.733],[27.124,23.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294000004787,0.564999988032,0.620000023935,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[338.879,290.608],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 132","np":4,"cix":2,"ix":132,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.558,1.943],[0,0],[2.022,1.638],[0,0]],"o":[[0,0],[1.557,-1.943],[0,0],[2.021,1.637]],"v":[[-7.211,14.216],[12.134,-9.924],[11.293,-16.407],[-13.691,14.77]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.39199999641,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[300.702,276.136],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 133","np":4,"cix":2,"ix":133,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.965,8.484],[6.551,-9.629],[7.966,-8.483],[-6.549,9.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[306.679,285.872],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 134","np":4,"cix":2,"ix":134,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.966,8.483],[6.55,-9.629],[7.965,-8.483],[-6.55,9.629]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[311.184,289.52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 135","np":4,"cix":2,"ix":135,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.965,8.484],[6.551,-9.629],[7.966,-8.483],[-6.551,9.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[315.689,293.168],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 136","np":4,"cix":2,"ix":136,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.966,8.484],[6.55,-9.629],[7.966,-8.483],[-6.55,9.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[320.193,296.816],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 137","np":4,"cix":2,"ix":137,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.966,8.483],[6.55,-9.629],[7.966,-8.483],[-6.55,9.629]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[324.698,300.464],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 138","np":4,"cix":2,"ix":138,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.759,8.224],[6.342,-9.371],[7.758,-8.224],[-6.343,9.37]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.411,303.852],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 139","np":4,"cix":2,"ix":139,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.344,7.707],[5.927,-8.854],[7.344,-7.707],[-5.928,8.853]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[334.33,306.982],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 140","np":4,"cix":2,"ix":140,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.462,6.608],[5.046,-7.753],[6.462,-6.607],[-5.047,7.754]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[339.716,309.531],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 141","np":4,"cix":2,"ix":141,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.639,5.581],[4.223,-6.727],[5.639,-5.58],[-4.224,6.727]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[345.044,312.152],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 142","np":4,"cix":2,"ix":142,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.388,4.02],[2.973,-5.166],[4.388,-4.019],[-2.974,5.166]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.8,314.238],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 143","np":4,"cix":2,"ix":143,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-16.192,5.918],[0,0],[0,0]],"o":[[0,0],[0,0],[19.978,24.842]],"v":[[31.623,17.799],[-19.648,-23.718],[-31.622,-8.777]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.294000004787,0.564999988032,0.620000023935,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[328.395,297.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 144","np":4,"cix":2,"ix":144,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.335,8.236],[0,0],[0,0]],"o":[[0,0],[0,0],[21.613,28.38]],"v":[[36.026,18.967],[-20.992,-27.203],[-36.026,-8.443]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.128999986836,0.486000001197,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[328.586,298.031],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 145","np":4,"cix":2,"ix":145,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.261,0.536],[-0.172,-3.318],[3.261,-0.537],[0.173,3.318]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.102000000898,0.39199999641,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[359.816,310.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 146","np":4,"cix":2,"ix":146,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.62,2.13],[4.62,-0.918],[4.133,-2.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.435000011968,0.187999994615,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.677,258.559],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 147","np":4,"cix":2,"ix":147,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.73,-1.817],[-1.755,0.713],[0,0]],"o":[[0,0],[-1.755,0.713],[0.73,1.816],[0,0],[0,0]],"v":[[3.631,-5.132],[-3.688,-2.158],[-5.544,2.421],[-1.045,4.419],[6.274,1.446]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[114.128,232.659],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 148","np":4,"cix":2,"ix":148,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.668,-6.721],[8.398,0.072],[-7.976,6.721],[-8.398,-1.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[107.627,223.141],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 149","np":4,"cix":2,"ix":149,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[9.552,0.54],[6.822,-6.253],[-9.551,0.396],[-4.514,6.253]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.071,244.064],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 150","np":4,"cix":2,"ix":150,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.253,-10.624],[11.12,3.975],[-5.253,10.624],[-11.12,-3.975]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.772,233.837],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 151","np":4,"cix":2,"ix":151,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.39,-0.97],[-0.389,-0.97],[0,0],[-0.39,-0.969],[-0.39,-0.97],[0,0],[0.634,1.577],[0,0],[0.634,1.577],[0,0]],"o":[[0.39,0.971],[0.391,0.97],[0,0],[0.39,0.971],[0.39,0.971],[0,0],[-0.633,-1.577],[0,0],[-0.634,-1.576],[0,0]],"v":[[-7.078,-15.726],[-6.952,-7.03],[-3.653,1.175],[-0.355,9.381],[5.563,15.725],[6.733,18.636],[7.614,14.892],[1.294,-0.833],[-5.027,-16.559],[-8.248,-18.636]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.392,236.736],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 152","np":4,"cix":2,"ix":152,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.529,-1.318],[-1.274,0.517],[0,0]],"o":[[0,0],[-1.274,0.518],[0.53,1.319],[0,0],[0,0]],"v":[[2.635,-3.725],[-2.678,-1.567],[-4.026,1.757],[-0.759,3.208],[4.555,1.049]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.08,238.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 153","np":4,"cix":2,"ix":153,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.236,-5.234],[5.657,0.79],[-5.282,5.234],[-5.657,-1.622]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.152,229.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 154","np":4,"cix":2,"ix":154,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.68,1.206],[4.259,-4.817],[-6.68,-0.375],[-2.213,4.818]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.755,248.118],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 155","np":4,"cix":2,"ix":155,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.868,-8.695],[8.072,4.252],[-2.867,8.695],[-8.072,-4.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.942,239.048],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 156","np":4,"cix":2,"ix":156,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.346,-0.86],[-0.345,-0.86],[0,0],[-0.345,-0.861],[-0.346,-0.861],[0,0],[0.562,1.399],[0,0],[0.562,1.398],[0,0]],"o":[[0.346,0.86],[0.346,0.861],[0,0],[0.346,0.86],[0.346,0.86],[0,0],[-0.562,-1.398],[0,0],[-0.562,-1.399],[0,0]],"v":[[-6.277,-13.946],[-6.165,-6.234],[-3.239,1.042],[-0.315,8.32],[4.934,13.947],[5.972,16.527],[6.753,13.207],[1.147,-0.739],[-4.458,-14.685],[-7.315,-16.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.074,240.891],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 157","np":4,"cix":2,"ix":157,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.475,-1.184],[-1.143,0.464],[0,0]],"o":[[0,0],[-1.143,0.464],[0.476,1.183],[0,0],[0,0]],"v":[[2.365,-3.342],[-2.403,-1.406],[-3.612,1.577],[-0.681,2.878],[4.087,0.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.263,242.744],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 158","np":4,"cix":2,"ix":158,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.903,-4.696],[5.076,0.709],[-4.74,4.696],[-5.076,-1.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[85.74,234.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 159","np":4,"cix":2,"ix":159,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.994,1.081],[3.822,-4.323],[-5.993,-0.338],[-1.986,4.322]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[91.663,251.126],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 160","np":4,"cix":2,"ix":160,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.573,-7.801],[7.242,3.816],[-2.573,7.802],[-7.242,-3.815]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.242,242.987],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 161","np":4,"cix":2,"ix":161,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.311,-0.772],[-0.31,-0.772],[0,0],[-0.31,-0.773],[-0.31,-0.772],[0,0],[0.504,1.255],[0,0],[0.504,1.255],[0,0]],"o":[[0.31,0.771],[0.31,0.772],[0,0],[0.31,0.772],[0.31,0.772],[0,0],[-0.504,-1.255],[0,0],[-0.504,-1.255],[0,0]],"v":[[-5.632,-12.514],[-5.531,-5.595],[-2.907,0.934],[-0.282,7.465],[4.427,12.512],[5.358,14.829],[6.059,11.849],[1.03,-0.663],[-4,-13.177],[-6.563,-14.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.772,244.642],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 162","np":4,"cix":2,"ix":162,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.414,-1.031],[-0.996,0.405],[0,0]],"o":[[0,0],[-0.996,0.405],[0.415,1.031],[0,0],[0,0]],"v":[[2.062,-2.914],[-2.094,-1.226],[-3.148,1.374],[-0.593,2.508],[3.562,0.82]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.445,246.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 163","np":4,"cix":2,"ix":163,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.531,-4.093],[4.425,0.618],[-4.131,4.093],[-4.425,-1.269]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[77.374,239.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 164","np":4,"cix":2,"ix":164,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.225,0.943],[3.331,-3.768],[-5.225,-0.293],[-1.73,3.768]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.537,253.609],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 165","np":4,"cix":2,"ix":165,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.243,-6.801],[6.313,3.326],[-2.243,6.801],[-6.313,-3.326]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.555,246.515],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 166","np":4,"cix":2,"ix":166,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.271,-0.673],[-0.27,-0.673],[0,0],[-0.27,-0.673],[-0.27,-0.672],[0,0],[0.439,1.094],[0,0],[0.44,1.094],[0,0]],"o":[[0.271,0.673],[0.271,0.673],[0,0],[0.271,0.673],[0,0],[0,0],[-0.44,-1.093],[0,0],[-0.439,-1.094],[0,0]],"v":[[-4.909,-10.907],[-4.822,-4.876],[-2.534,0.817],[-0.246,6.508],[3.859,10.908],[4.671,12.927],[5.282,10.33],[0.898,-0.577],[-3.487,-11.485],[-5.721,-12.927]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.531,247.956],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 167","np":4,"cix":2,"ix":167,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.364,-0.905],[-0.874,0.355],[0,0]],"o":[[0,0],[-0.874,0.355],[0.363,0.905],[0,0],[0,0]],"v":[[1.809,-2.556],[-1.837,-1.075],[-2.762,1.206],[-0.52,2.201],[3.126,0.72]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.684,249.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 168","np":4,"cix":2,"ix":168,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.22,-3.591],[3.882,0.543],[-3.625,3.591],[-3.882,-1.112]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.99,243.114],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 169","np":4,"cix":2,"ix":169,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.584,0.827],[2.922,-3.307],[-4.584,-0.258],[-1.519,3.306]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.52,255.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 170","np":4,"cix":2,"ix":170,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.968,-5.967],[5.539,2.917],[-1.969,5.967],[-5.538,-2.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.904,249.623],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 171","np":4,"cix":2,"ix":171,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.237,-0.59],[-0.237,-0.591],[0,0],[-0.237,-0.591],[-0.237,-0.591],[0,0],[0.386,0.96],[0,0],[0.386,0.96],[0,0]],"o":[[0.237,0.591],[0.237,0.591],[0,0],[0.238,0.591],[0.237,0.59],[0,0],[-0.386,-0.959],[0,0],[-0.386,-0.959],[0,0]],"v":[[-4.307,-9.57],[-4.23,-4.278],[-2.223,0.716],[-0.217,5.709],[3.385,9.57],[4.098,11.341],[4.633,9.063],[0.788,-0.507],[-3.06,-10.077],[-5.02,-11.341]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.25,250.888],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 172","np":4,"cix":2,"ix":172,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.331,-0.823],[-0.795,0.323],[0,0]],"o":[[0,0],[-0.796,0.323],[0.33,0.823],[0,0],[0,0]],"v":[[1.645,-2.325],[-1.671,-0.978],[-2.512,1.097],[-0.474,2.002],[2.843,0.655]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.806,252.218],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 173","np":4,"cix":2,"ix":173,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.02,-3.266],[3.531,0.495],[-3.297,3.267],[-3.531,-1.011]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.354,246.466],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 174","np":4,"cix":2,"ix":174,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.17,0.753],[2.658,-3.007],[-4.17,-0.234],[-1.381,3.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.476,258.049],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 175","np":4,"cix":2,"ix":175,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.79,-5.427],[5.038,2.654],[-1.79,5.427],[-5.038,-2.655]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.096,252.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 176","np":4,"cix":2,"ix":176,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.216,-0.537],[0,0],[-0.216,-0.537],[-0.216,-0.537],[0,0],[0.351,0.872],[0,0],[0.35,0.873],[0,0]],"o":[[0.216,0.537],[0.216,0.538],[0,0],[0.216,0.538],[0,0],[0,0],[-0.351,-0.873],[0,0],[-0.351,-0.872],[0,0]],"v":[[-3.919,-8.705],[-3.848,-3.892],[-2.023,0.65],[-0.197,5.193],[3.079,8.705],[3.728,10.316],[4.215,8.244],[0.715,-0.462],[-2.783,-9.167],[-4.566,-10.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.682,253.538],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 177","np":4,"cix":2,"ix":177,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.276,-0.686],[-0.663,0.27],[0,0]],"o":[[0,0],[-0.663,0.27],[0.276,0.687],[0,0],[0,0]],"v":[[1.373,-1.939],[-1.394,-0.816],[-2.096,0.915],[-0.395,1.669],[2.372,0.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.426,254.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 178","np":4,"cix":2,"ix":178,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.685,-2.725],[2.946,0.412],[-2.751,2.725],[-2.946,-0.844]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.381,249.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 179","np":4,"cix":2,"ix":179,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.479,0.628],[2.217,-2.509],[-3.479,-0.195],[-1.152,2.509]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.216000007181,0.216000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.819,259.654],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 180","np":4,"cix":2,"ix":180,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.493,-4.528],[4.203,2.214],[-1.493,4.528],[-4.203,-2.215]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.184000007779,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.834,254.931],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 181","np":4,"cix":2,"ix":181,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.18,-0.448],[-0.181,-0.449],[0,0],[-0.18,-0.449],[-0.179,-0.448],[0,0],[0.293,0.728],[0,0],[0.293,0.729],[0,0]],"o":[[0.18,0.448],[0.179,0.448],[0,0],[0.181,0.448],[0.181,0.449],[0,0],[-0.293,-0.729],[0,0],[-0.293,-0.727],[0,0]],"v":[[-3.269,-7.262],[-3.21,-3.246],[-1.687,0.544],[-0.165,4.333],[2.568,7.262],[3.109,8.606],[3.516,6.878],[0.598,-0.384],[-2.322,-7.647],[-3.81,-8.606]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.322000002394,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[56.82,255.89],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 182","np":4,"cix":2,"ix":182,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.475,-1.179],[-1.141,0.463],[0,0]],"o":[[0,0],[-1.14,0.463],[0.474,1.181],[0,0],[0,0]],"v":[[1.027,-2.793],[-1.063,-1.943],[-2.269,1.031],[0.655,2.329],[2.744,1.48]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.435000011968,0.187999994615,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.389,256.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 183","np":4,"cix":2,"ix":183,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.2,-1.533],[-1.482,1.172],[0,0]],"o":[[0,0],[-1.482,1.172],[1.201,1.533],[0,0],[0,0]],"v":[[0.871,-5.095],[-3.51,-1.628],[-4.018,3.27],[0.839,3.923],[5.219,0.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.612,267.586],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 184","np":4,"cix":2,"ix":184,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.2,-1.533],[-1.482,1.172],[0,0]],"o":[[0,0],[-1.481,1.172],[1.201,1.533],[0,0],[0,0]],"v":[[0.87,-5.095],[-3.51,-1.628],[-4.019,3.27],[0.838,3.923],[5.218,0.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.953,299.937],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 185","np":4,"cix":2,"ix":185,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.779,-0.994],[-0.961,0.761],[0,0]],"o":[[0,0],[-0.96,0.761],[0.779,0.994],[0,0],[0,0]],"v":[[1.059,-3.696],[-2.771,-0.666],[-3.1,2.511],[0.049,2.934],[3.879,-0.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.347,286.117],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 186","np":4,"cix":2,"ix":186,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.197,-1.528],[-1.477,1.169],[0,0]],"o":[[0,0],[-1.477,1.169],[1.197,1.529],[0,0],[0,0]],"v":[[1.628,-5.681],[-4.258,-1.023],[-4.765,3.861],[0.077,4.512],[5.963,-0.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.758,271.513],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 187","np":4,"cix":2,"ix":187,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.95,-2.49],[-2.406,1.905],[0,0]],"o":[[0,0],[-2.406,1.904],[1.95,2.489],[0,0],[0,0]],"v":[[2.968,-9.505],[-7.254,-1.415],[-8.08,6.542],[-0.192,7.601],[10.03,-0.488]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.055,273.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 188","np":4,"cix":2,"ix":188,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.95,-2.489],[-2.407,1.904],[0,0]],"o":[[0,0],[-2.406,1.904],[1.951,2.49],[0,0],[0,0]],"v":[[7.253,-12.897],[-11.539,1.976],[-12.365,9.932],[-4.476,10.993],[14.315,-3.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.870999983245,0.380000005984,0.270999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.956,284.755],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 189","np":4,"cix":2,"ix":189,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-3.993,-5.098],[-4.927,3.9],[0,0]],"o":[[0,0],[-4.927,3.9],[3.994,5.099],[0,0],[0,0]],"v":[[6.078,-19.465],[-14.855,-2.898],[-16.546,13.395],[-0.392,15.565],[20.54,-1.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.245,278.833],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 190","np":4,"cix":2,"ix":190,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.867,-24.393],[19.632,22.206],[16.868,24.393],[-19.632,-22.204]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.128999986836,0.105999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.349,280.632],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 191","np":4,"cix":2,"ix":191,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.712,-25.623],[20.858,22.341],[16.711,25.623],[-20.858,-22.342]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[139.481,270.241],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 192","np":4,"cix":2,"ix":192,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-3.994,-5.099],[-4.927,3.9],[0,0]],"o":[[0,0],[-4.928,3.9],[3.994,5.1],[0,0],[0,0]],"v":[[-2.232,-12.889],[-6.546,-9.475],[-8.237,6.818],[7.917,8.989],[12.23,5.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.771,291.08],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 193","np":4,"cix":2,"ix":193,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.153,-33.883],[31.792,12.008],[4.153,33.883],[-31.792,-12.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[124.555,282.053],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 194","np":4,"cix":2,"ix":194,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.499,-7.02],[-6.784,5.369],[0,0]],"o":[[0,0],[-6.784,5.369],[5.498,7.019],[0,0],[0,0]],"v":[[-2.41,-18.27],[-9.674,-12.52],[-12.002,9.913],[10.237,12.901],[17.501,7.152]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.506,291.176],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 195","np":4,"cix":2,"ix":195,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.003,-24.654],[19.942,21.237],[17.235,24.654],[-19.942,-22.81]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[108.766,294.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 196","np":4,"cix":2,"ix":196,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,0.229],[-0.228,-0.29],[0,0],[0.289,-0.228],[0.228,0.29],[0,0]],"o":[[0.289,-0.229],[0,0],[0.228,0.291],[-0.289,0.23],[0,0],[-0.227,-0.291]],"v":[[-4.372,-5.582],[-3.436,-5.471],[4.483,4.64],[4.372,5.581],[3.436,5.47],[-4.484,-4.641]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.584,291.558],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 197","np":4,"cix":2,"ix":197,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.853,-0.532],[-0.316,-0.958],[0.852,0.533],[0.314,0.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.542,298.713],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 198","np":4,"cix":2,"ix":198,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.036,-1.258],[1.458,-0.717],[-1.036,1.258],[-1.459,0.717]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.811,298.501],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 199","np":4,"cix":2,"ix":199,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.002,-1.714],[1.657,0.404],[0.002,1.714],[-1.657,-0.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.47,296.396],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 200","np":4,"cix":2,"ix":200,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.677,-1.469],[1.262,1.007],[0.677,1.469],[-1.262,-1.006]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.351,297.282],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 201","np":4,"cix":2,"ix":201,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.475,-1.816],[1.646,0.891],[0.475,1.816],[-1.646,-0.889]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.883,295.278],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 202","np":4,"cix":2,"ix":202,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.871,-1.111],[-2.291,1.813],[0,0]],"o":[[0,0],[-2.291,1.812],[0.871,1.112],[0,0],[0,0]],"v":[[-0.055,-3.003],[-0.236,-2.86],[-2.807,2.434],[2.918,1.164],[3.098,1.022]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.722000002394,0.451000019148,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.098,292.52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 203","np":4,"cix":2,"ix":203,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.22,-2.835],[-2.291,1.813],[0,0]],"o":[[0,0],[-2.291,1.812],[2.221,2.835],[0,0],[0,0]],"v":[[-2.758,-6.111],[-2.938,-5.968],[-3.065,2.448],[5.105,4.298],[5.285,4.156]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.356,292.507],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 204","np":4,"cix":2,"ix":204,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.004,-1.282],[-1.239,0.981],[0,0]],"o":[[0,0],[-1.239,0.981],[1.004,1.281],[0,0],[0,0]],"v":[[0.728,-4.26],[-2.934,-1.362],[-3.359,2.734],[0.701,3.279],[4.363,0.381]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.219,281.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 205","np":4,"cix":2,"ix":205,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.68,-5.34],[3.736,6.681],[5.68,4.3],[-2.921,-6.681]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.168,288.028],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 206","np":4,"cix":2,"ix":206,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.286,-7.29],[6.749,2.966],[1.285,7.29],[-6.749,-2.967]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.352,289.368],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 207","np":4,"cix":2,"ix":207,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.611,-9.378],[9.212,1.603],[-0.611,9.378],[-9.212,-1.604]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.459,282.95],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 208","np":4,"cix":2,"ix":208,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.289,0.229],[-0.229,-0.291],[0,0],[0.289,-0.229],[0.228,0.291],[0,0]],"o":[[0.29,-0.229],[0,0],[0.227,0.291],[-0.29,0.229],[0,0],[-0.228,-0.291]],"v":[[-4.372,-5.582],[-3.435,-5.47],[4.484,4.641],[4.373,5.582],[3.436,5.47],[-4.483,-4.641]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.812,323.766],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 209","np":4,"cix":2,"ix":209,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.852,-0.533],[-0.316,-0.958],[0.853,0.533],[0.316,0.958]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.77,330.922],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 210","np":4,"cix":2,"ix":210,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.036,-1.257],[1.459,-0.717],[-1.035,1.257],[-1.459,0.718]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[96.039,330.71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 211","np":4,"cix":2,"ix":211,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.002,-1.714],[1.657,0.405],[0.002,1.714],[-1.657,-0.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.699,328.604],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 212","np":4,"cix":2,"ix":212,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.677,-1.469],[1.262,1.006],[0.677,1.469],[-1.262,-1.006]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.579,329.491],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 213","np":4,"cix":2,"ix":213,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.475,-1.816],[1.645,0.889],[0.474,1.816],[-1.645,-0.89]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.112,327.487],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 214","np":4,"cix":2,"ix":214,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.871,-1.111],[-2.291,1.812],[0,0]],"o":[[0,0],[-2.291,1.812],[0.871,1.113],[0,0],[0,0]],"v":[[-0.056,-3.003],[-0.236,-2.86],[-2.807,2.434],[2.917,1.165],[3.098,1.022]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.722000002394,0.451000019148,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.327,324.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 215","np":4,"cix":2,"ix":215,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.22,-2.835],[-2.291,1.813],[0,0]],"o":[[0,0],[-2.29,1.813],[2.221,2.835],[0,0],[0,0]],"v":[[-2.758,-6.111],[-2.938,-5.969],[-3.065,2.447],[5.105,4.298],[5.285,4.156]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.584,324.716],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 216","np":4,"cix":2,"ix":216,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.004,-1.281],[-1.239,0.981],[0,0]],"o":[[0,0],[-1.238,0.981],[1.004,1.281],[0,0],[0,0]],"v":[[0.727,-4.26],[-2.935,-1.363],[-3.36,2.733],[0.702,3.279],[4.363,0.381]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588000009574,0.224000010771,0.184000007779,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.448,313.691],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 217","np":4,"cix":2,"ix":217,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.68,-5.34],[3.736,6.681],[5.68,4.3],[-2.921,-6.681]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.842999985639,0.560999971278,0.411999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.397,320.236],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 218","np":4,"cix":2,"ix":218,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.285,-7.29],[6.749,2.966],[1.286,7.29],[-6.749,-2.966]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[107.58,321.576],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 219","np":4,"cix":2,"ix":219,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.611,-9.377],[9.212,1.603],[-0.611,9.377],[-9.212,-1.604]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.769000004787,0.298000021542,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.688,315.159],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 220","np":4,"cix":2,"ix":220,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.038,-2.556],[-1.698,21.509],[8.038,-21.509]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.603,173.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 221","np":4,"cix":2,"ix":221,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-12.322,-3.919],[-2.603,32.971],[12.323,-32.971]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.901,174.458],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 222","np":4,"cix":2,"ix":222,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.863,-1.797],[1.809,2.861],[-2.863,1.796],[-1.808,-2.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.337,159.752],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 223","np":4,"cix":2,"ix":223,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.923,-2.01],[0.869,2.648],[-1.923,2.011],[-0.869,-2.647]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.989,152.831],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 224","np":4,"cix":2,"ix":224,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.31,1.459],[14.492,5.074],[-15.31,-2.014],[-14.617,-5.074]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.401,156.478],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 225","np":4,"cix":2,"ix":225,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.863,-1.797],[1.809,2.861],[-2.863,1.796],[-1.809,-2.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[108.294,168.779],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 226","np":4,"cix":2,"ix":226,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.924,-2.011],[0.868,2.647],[-1.924,2.01],[-0.869,-2.648]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[77.946,161.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 227","np":4,"cix":2,"ix":227,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.31,1.459],[14.492,5.074],[-15.31,-2.014],[-14.617,-5.074]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.358,165.504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 228","np":4,"cix":2,"ix":228,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.863,-1.797],[1.809,2.861],[-2.863,1.796],[-1.809,-2.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[106.251,177.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 229","np":4,"cix":2,"ix":229,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.923,-2.01],[0.869,2.648],[-1.923,2.011],[-0.869,-2.647]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.903,170.884],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 230","np":4,"cix":2,"ix":230,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.31,1.459],[14.492,5.074],[-15.31,-2.014],[-14.617,-5.074]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[91.316,174.531],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 231","np":4,"cix":2,"ix":231,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.863,-1.797],[1.809,2.861],[-2.863,1.796],[-1.809,-2.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.208,186.832],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 232","np":4,"cix":2,"ix":232,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.924,-2.01],[0.87,2.648],[-1.924,2.011],[-0.869,-2.647]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.86,179.911],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 233","np":4,"cix":2,"ix":233,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.31,1.459],[14.492,5.074],[-15.31,-2.014],[-14.617,-5.074]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.272,183.557],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 234","np":4,"cix":2,"ix":234,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.863,-1.797],[1.809,2.861],[-2.863,1.796],[-1.808,-2.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.165,195.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 235","np":4,"cix":2,"ix":235,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.924,-2.011],[0.87,2.647],[-1.924,2.01],[-0.869,-2.648]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.817,188.938],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 236","np":4,"cix":2,"ix":236,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.31,1.459],[14.492,5.074],[-15.31,-2.014],[-14.617,-5.074]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.23,192.584],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 237","np":4,"cix":2,"ix":237,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.863,-1.797],[1.808,2.861],[-2.863,1.796],[-1.808,-2.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.122,204.885],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 238","np":4,"cix":2,"ix":238,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.924,-2.01],[0.87,2.648],[-1.924,2.011],[-0.869,-2.647]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541000007181,0.569000004787,0.522000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.774,197.964],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 239","np":4,"cix":2,"ix":239,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.31,1.46],[14.492,5.074],[-15.31,-2.013],[-14.617,-5.074]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[85.187,201.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 240","np":4,"cix":2,"ix":240,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[9.137,-29.077],[-4.276,30.186],[-9.138,29.077],[4.275,-30.186]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.783999992819,0.722000002394,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[114.023,184.324],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 241","np":4,"cix":2,"ix":241,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.367,-26.217],[-4.642,26.84],[-7.367,26.219],[4.641,-26.839]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.62400004069,0.658999992819,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.123,174.768],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 242","np":4,"cix":2,"ix":242,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[9.033,-27.251],[-3.583,28.494],[-9.033,27.25],[3.583,-28.494]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.62400004069,0.658999992819,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.29,183.473],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 243","np":4,"cix":2,"ix":243,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.529,-0.369],[0.367,-0.531],[0.529,0.369],[-0.367,0.532]],"o":[[0.529,0.369],[-0.367,0.532],[-0.529,-0.369],[0.367,-0.531]],"v":[[0.665,-0.963],[0.958,0.668],[-0.665,0.963],[-0.958,-0.669]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.113999998803,0.023999999551,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.582,110.001],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 244","np":4,"cix":2,"ix":244,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.573,-5.379],[16.13,3.332],[-15.573,5.379],[-16.13,-3.332]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.889999988032,0.654999976065,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[111.641,103.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 245","np":4,"cix":2,"ix":245,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.573,-5.379],[16.13,3.332],[-15.573,5.379],[-16.13,-3.332]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.889999988032,0.654999976065,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.523,116.24],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 246","np":4,"cix":2,"ix":246,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.015,-0.243],[0.242,-0.015],[0,0],[0.015,0.242],[-0.241,0.015]],"o":[[0.242,-0.016],[0.016,0.242],[0,0],[-0.242,0.016],[-0.015,-0.243],[0,0]],"v":[[38.929,-2.955],[39.394,-2.542],[38.985,-2.075],[-38.929,2.955],[-39.395,2.544],[-38.986,2.076]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.298000021542,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.582,110.001],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 247","np":4,"cix":2,"ix":247,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.351,15.654],[-3.315,16.214],[-5.351,-15.654],[3.315,-16.214]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.889999988032,0.654999976065,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.788,132.175],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 248","np":4,"cix":2,"ix":248,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.351,15.654],[-3.314,16.214],[-5.351,-15.654],[3.314,-16.214]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.889999988032,0.654999976065,0.337000020345,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.376,87.827],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 249","np":4,"cix":2,"ix":249,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.242,-0.015],[0.016,0.242],[0,0],[-0.241,0.016],[-0.016,-0.243]],"o":[[0.016,0.243],[-0.242,0.016],[0,0],[-0.016,-0.243],[0.241,-0.016],[0,0]],"v":[[2.939,39.131],[2.53,39.599],[2.064,39.188],[-2.939,-39.132],[-2.53,-39.6],[-2.064,-39.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.298000021542,0.078000005086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.582,110.001],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 250","np":4,"cix":2,"ix":250,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.912,-0.636],[0.633,-0.916],[0.912,0.636],[-0.633,0.916]],"o":[[0.911,0.636],[-0.633,0.916],[-0.912,-0.636],[0.633,-0.916]],"v":[[1.146,-1.659],[1.65,1.152],[-1.146,1.659],[-1.651,-1.151]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.582,110.001],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 251","np":4,"cix":2,"ix":251,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.567,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.794,125.908],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 252","np":4,"cix":2,"ix":252,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.567,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.576,129.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 253","np":4,"cix":2,"ix":253,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.252],[0.567,2.244],[-2.29,0.251],[-0.566,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.221,123.416],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 254","np":4,"cix":2,"ix":254,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.566,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.003,126.628],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 255","np":4,"cix":2,"ix":255,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.314,-0.868],[1.4,6.25],[-6.314,0.868],[-1.4,-6.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.630999995213,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.899,126.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 256","np":4,"cix":2,"ix":256,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.566,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.289,117.882],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 257","np":4,"cix":2,"ix":257,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.567,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.071,121.094],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 258","np":4,"cix":2,"ix":258,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.567,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.716,115.389],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 259","np":4,"cix":2,"ix":259,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.29,-0.251],[0.566,2.244],[-2.29,0.251],[-0.566,-2.244]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.499,118.601],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 260","np":4,"cix":2,"ix":260,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.314,-0.868],[1.399,6.25],[-6.314,0.868],[-1.4,-6.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.630999995213,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.394,118.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 261","np":4,"cix":2,"ix":261,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.396,-0.276],[0.275,-0.398],[0,0],[0.396,0.277],[-0.275,0.398],[0,0]],"o":[[0.396,0.276],[0,0],[-0.275,0.398],[-0.396,-0.276],[0,0],[0.275,-0.398]],"v":[[8.087,-11.714],[8.307,-10.493],[-6.873,11.493],[-8.088,11.713],[-8.307,10.492],[6.873,-11.494]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.638999968884,0.344999994016,0.090000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.23,112.546],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 262","np":4,"cix":2,"ix":262,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.078,-3.009],[-4.613,-3.35]],"o":[[-4.736,-3.172],[-2.078,3.01],[0,0]],"v":[[7.165,-3.878],[-5.087,-4.207],[-0.495,7.216]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.352999997606,0.102000000898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.998,110.948],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 263","np":4,"cix":2,"ix":263,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.037,-5.847],[-5.656,-4.202]],"o":[[-5.895,-3.856],[-4.037,5.847],[0,0]],"v":[[10.942,-8.849],[-6.904,-5.331],[-3.941,12.705]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.870999983245,0.470999983245,0.125,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.832,110.689],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 264","np":4,"cix":2,"ix":264,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.542,13.634],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[19.542,13.633],[0,0],[0,0],[0,0]],"v":[[-14.505,-19.931],[-18.518,-14.118],[-22.531,-8.306],[8.119,19.931],[15.325,9.493],[22.531,-0.944]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.122000002394,0.027000000898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[111.244,126.312],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 265","np":4,"cix":2,"ix":265,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.542,13.634],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[19.542,13.634],[0,0],[0,0],[0,0]],"v":[[-12.749,-25.833],[-19.678,-15.798],[-26.607,-5.764],[1.725,25.833],[14.166,7.814],[26.607,-10.206]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.403,127.992],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 266","np":4,"cix":2,"ix":266,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.214,-0.15],[0.149,-0.216],[0,0],[0.214,0.149],[-0.149,0.216],[0,0]],"o":[[0.214,0.149],[0,0],[-0.149,0.215],[-0.215,-0.15],[0,0],[0.148,-0.215]],"v":[[3.087,-4.471],[3.206,-3.809],[-2.43,4.353],[-3.087,4.471],[-3.206,3.811],[2.43,-4.351]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.638999968884,0.344999994016,0.090000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.061,142.427],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 267","np":4,"cix":2,"ix":267,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.169,0.076],[2.228,5.783],[-6.17,-0.076],[-2.23,-5.783]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.579999976065,0.093999997307,0.019999999626,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.25,139.769],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 268","np":4,"cix":2,"ix":268,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-5.569,8.065],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[5.569,-8.065],[0,0]],"v":[[4.473,-18.39],[-4.437,-3.484],[-15.213,10.12],[-6.546,18.39],[6.147,3.9],[15.212,-13.121]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.870999983245,0.470999983245,0.125,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[129.891,138.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 269","np":4,"cix":2,"ix":269,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.164,-1.685],[-1.629,-1.211]],"o":[[-1.699,-1.111],[-1.163,1.686],[0,0]],"v":[[3.154,-2.551],[-1.991,-1.537],[-1.137,3.662]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.630999995213,0.141000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.974,105.539],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 270","np":4,"cix":2,"ix":270,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.058,-0.129],[0.128,0.058],[0,0],[-0.057,0.129],[-0.128,-0.058],[0,0]],"o":[[-0.058,0.129],[0,0],[-0.128,-0.057],[0.058,-0.13],[0,0],[0.128,0.058]],"v":[[7.781,3.51],[7.444,3.64],[-7.654,-3.173],[-7.781,-3.511],[-7.444,-3.64],[7.652,3.171]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[288.09,18.685],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 271","np":4,"cix":2,"ix":271,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.115,0.908],[-0.598,0.69],[0.115,-0.908],[0.599,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[294.732,22.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 272","np":4,"cix":2,"ix":272,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.116,0.908],[-0.598,0.69],[0.114,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[293.331,22.028],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 273","np":4,"cix":2,"ix":273,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.116,0.908],[-0.598,0.69],[0.115,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[291.93,21.396],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 274","np":4,"cix":2,"ix":274,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.115,0.908],[-0.598,0.69],[0.115,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[290.528,20.764],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 275","np":4,"cix":2,"ix":275,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.115,0.908],[-0.598,0.69],[0.115,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[289.127,20.132],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 276","np":4,"cix":2,"ix":276,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.115,0.908],[-0.598,0.69],[0.115,-0.908],[0.599,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[287.726,19.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 277","np":4,"cix":2,"ix":277,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.116,0.908],[-0.599,0.69],[0.114,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[286.325,18.867],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 278","np":4,"cix":2,"ix":278,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.116,0.908],[-0.599,0.69],[0.114,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[284.923,18.235],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 279","np":4,"cix":2,"ix":279,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.116,0.908],[-0.598,0.69],[0.114,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[283.522,17.603],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 280","np":4,"cix":2,"ix":280,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.116,0.908],[-0.598,0.69],[0.115,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.121,16.97],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 281","np":4,"cix":2,"ix":281,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.115,0.908],[-0.598,0.69],[0.115,-0.908],[0.598,-0.69]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280.719,16.338],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 282","np":4,"cix":2,"ix":282,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.275,4.328],[-8.716,-3.339],[-8.275,-4.328],[8.716,3.339]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[283.362,29.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 283","np":4,"cix":2,"ix":283,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.586,0.265],[0.262,-0.589],[0,0]],"o":[[0,0],[0.264,-0.59],[-0.587,-0.264],[0,0],[0,0]],"v":[[-0.116,3.245],[1.974,-1.435],[1.39,-2.981],[-0.148,-2.393],[-2.238,2.287]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[290.316,29.062],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 284","np":4,"cix":2,"ix":284,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.586,0.264],[0.262,-0.59],[0,0]],"o":[[0,0],[0.264,-0.589],[-0.586,-0.265],[0,0],[0,0]],"v":[[-0.115,3.245],[1.975,-1.436],[1.389,-2.98],[-0.147,-2.392],[-2.238,2.288]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[286.477,27.329],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 285","np":4,"cix":2,"ix":285,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.586,0.265],[0.263,-0.589],[0,0]],"o":[[0,0],[0.263,-0.59],[-0.586,-0.264],[0,0],[0,0]],"v":[[-0.115,3.245],[1.975,-1.435],[1.39,-2.981],[-0.148,-2.393],[-2.238,2.287]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.637,25.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 286","np":4,"cix":2,"ix":286,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.586,0.265],[0.263,-0.589],[0,0]],"o":[[0,0],[0.263,-0.59],[-0.586,-0.264],[0,0],[0,0]],"v":[[-0.116,3.245],[1.975,-1.435],[1.39,-2.981],[-0.148,-2.393],[-2.238,2.287]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[278.799,23.865],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 287","np":4,"cix":2,"ix":287,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.154,5.673],[-11.63,-4.608],[-11.155,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[279.016,39.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 288","np":4,"cix":2,"ix":288,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[288.655,39.749],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 289","np":4,"cix":2,"ix":289,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[284.521,37.883],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 290","np":4,"cix":2,"ix":290,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.284,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280.386,36.018],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 291","np":4,"cix":2,"ix":291,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.158,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.251,34.152],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 292","np":4,"cix":2,"ix":292,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.117,32.286],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 293","np":4,"cix":2,"ix":293,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.154,5.673],[-11.63,-4.608],[-11.155,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[275.12,47.726],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 294","np":4,"cix":2,"ix":294,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.284,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[284.76,48.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 295","np":4,"cix":2,"ix":295,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.284,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280.625,46.606],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 296","np":4,"cix":2,"ix":296,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.491,44.74],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 297","np":4,"cix":2,"ix":297,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.356,42.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 298","np":4,"cix":2,"ix":298,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.222,41.009],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 299","np":4,"cix":2,"ix":299,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.154,5.673],[-11.631,-4.608],[-11.156,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[271.225,56.449],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 300","np":4,"cix":2,"ix":300,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280.865,57.194],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 301","np":4,"cix":2,"ix":301,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.73,55.329],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 302","np":4,"cix":2,"ix":302,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.596,53.463],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 303","np":4,"cix":2,"ix":303,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.461,51.597],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 304","np":4,"cix":2,"ix":304,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[264.326,49.732],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 305","np":4,"cix":2,"ix":305,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.155,5.673],[-11.63,-4.608],[-11.156,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[267.33,65.172],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 306","np":4,"cix":2,"ix":306,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.97,65.917],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 307","np":4,"cix":2,"ix":307,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.835,64.051],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 308","np":4,"cix":2,"ix":308,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.7,62.186],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 309","np":4,"cix":2,"ix":309,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[264.565,60.32],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 310","np":4,"cix":2,"ix":310,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.431,58.455],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 311","np":4,"cix":2,"ix":311,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.154,5.673],[-11.63,-4.608],[-11.155,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[263.435,73.895],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 312","np":4,"cix":2,"ix":312,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[273.074,74.64],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 313","np":4,"cix":2,"ix":313,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.939,72.774],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 314","np":4,"cix":2,"ix":314,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[264.805,70.908],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 315","np":4,"cix":2,"ix":315,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.284,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.67,69.043],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 316","np":4,"cix":2,"ix":316,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.126,-1.546],[1.496,-3.211],[-0.159,-2.577],[-2.409,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[256.536,67.177],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 317","np":4,"cix":2,"ix":317,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.154,5.673],[-11.63,-4.608],[-11.155,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[259.539,82.617],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 318","np":4,"cix":2,"ix":318,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.179,83.362],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 319","np":4,"cix":2,"ix":319,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.284,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.044,81.497],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 320","np":4,"cix":2,"ix":320,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.211],[-0.158,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.909,79.631],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 321","np":4,"cix":2,"ix":321,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[256.775,77.766],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 322","np":4,"cix":2,"ix":322,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.127,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[252.641,75.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 323","np":4,"cix":2,"ix":323,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.154,5.673],[-11.63,-4.608],[-11.155,-5.673],[11.63,4.608]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.779999976065,0.556999954523,0.39199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.644,91.34],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 324","np":4,"cix":2,"ix":324,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.124,3.495],[2.126,-1.546],[1.496,-3.211],[-0.159,-2.577],[-2.409,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.284,92.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 325","np":4,"cix":2,"ix":325,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.286],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.284],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.211],[-0.159,-2.577],[-2.41,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[261.149,90.22],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 326","np":4,"cix":2,"ix":326,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.632,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.284,-0.634],[-0.631,-0.285],[0,0],[0,0]],"v":[[-0.125,3.495],[2.126,-1.546],[1.496,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[257.015,88.354],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 327","np":4,"cix":2,"ix":327,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[252.88,86.488],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 328","np":4,"cix":2,"ix":328,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.631,0.285],[0.283,-0.635],[0,0]],"o":[[0,0],[0.283,-0.634],[-0.632,-0.285],[0,0],[0,0]],"v":[[-0.124,3.495],[2.127,-1.546],[1.497,-3.21],[-0.159,-2.577],[-2.41,2.464]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741000007181,0.505999995213,0.33300000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[248.745,84.623],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 329","np":4,"cix":2,"ix":329,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.677,0.305],[0.305,-0.681],[0,0]],"o":[[0,0],[0.304,-0.681],[-0.677,-0.306],[0,0],[0,0]],"v":[[-0.133,3.75],[2.282,-1.658],[1.606,-3.444],[-0.171,-2.765],[-2.586,2.643]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[262.242,103.539],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 330","np":4,"cix":2,"ix":330,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.678,0.306],[0.304,-0.68],[0,0]],"o":[[0,0],[0.305,-0.681],[-0.677,-0.306],[0,0],[0,0]],"v":[[-0.134,3.75],[2.281,-1.658],[1.605,-3.444],[-0.171,-2.765],[-2.586,2.644]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[257.201,101.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 331","np":4,"cix":2,"ix":331,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.678,0.306],[0.304,-0.68],[0,0]],"o":[[0,0],[0.304,-0.68],[-0.677,-0.306],[0,0],[0,0]],"v":[[-0.133,3.75],[2.282,-1.658],[1.606,-3.444],[-0.17,-2.765],[-2.585,2.644]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[252.16,98.99],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 332","np":4,"cix":2,"ix":332,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.677,0.305],[0.305,-0.681],[0,0]],"o":[[0,0],[0.304,-0.681],[-0.677,-0.306],[0,0],[0,0]],"v":[[-0.133,3.75],[2.282,-1.658],[1.606,-3.444],[-0.171,-2.765],[-2.586,2.643]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[247.118,96.715],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 333","np":4,"cix":2,"ix":333,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.677,0.306],[0.305,-0.68],[0,0]],"o":[[0,0],[0.304,-0.681],[-0.677,-0.306],[0,0],[0,0]],"v":[[-0.133,3.75],[2.282,-1.658],[1.606,-3.444],[-0.171,-2.765],[-2.586,2.644]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[242.077,94.44],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 334","np":4,"cix":2,"ix":334,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.927,-0.418],[0.156,-0.961],[0,0],[0,0],[-0.926,-0.418],[0.156,-0.962],[0,0],[0,0],[-0.927,-0.418],[-0.031,-0.015],[-0.031,-0.015],[0.156,-0.962],[0,0],[0,0],[-0.927,-0.418],[0.157,-0.962],[0,0],[0,0],[-0.927,-0.418],[0.156,-0.963],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.612,-0.757],[0.927,0.419],[0,0],[0,0],[0.611,-0.757],[0.927,0.418],[0,0],[0,0],[0.611,-0.757],[0.031,0.014],[0.032,0.013],[0.927,0.418],[0,0],[0,0],[0.611,-0.758],[0.926,0.418],[0,0],[0,0],[0.612,-0.756],[0.927,0.418],[0,0],[0,0],[0,0]],"v":[[8.541,2.335],[3.223,-0.064],[0.564,-1.264],[-2.094,-2.463],[-7.411,-4.863],[-12.729,-7.262],[-13.857,-4.734],[-13.222,-4.447],[-10.623,-5.07],[-9.358,-2.705],[-8.54,-2.335],[-7.904,-2.048],[-5.306,-2.67],[-4.041,-0.305],[-3.223,0.064],[-2.587,0.351],[0.012,-0.271],[0.1,-0.222],[0.195,-0.188],[1.459,2.177],[2.094,2.464],[2.913,2.834],[5.512,2.211],[6.775,4.576],[7.411,4.863],[8.23,5.232],[10.829,4.61],[12.093,6.976],[12.729,7.262],[13.857,4.734]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[254.841,93.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 335","np":4,"cix":2,"ix":335,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.589,-0.266],[0.1,-0.611],[0,0],[0,0],[-0.589,-0.266],[0.1,-0.612],[0,0],[0,0],[-0.589,-0.265],[-0.02,-0.01],[-0.02,-0.009],[0.1,-0.611],[0,0],[0,0],[-0.59,-0.266],[0.1,-0.611],[0,0],[0,0],[-0.589,-0.266],[0.099,-0.612],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.389,-0.48],[0.589,0.266],[0,0],[0,0],[0.389,-0.482],[0.589,0.266],[0,0],[0,0],[0.388,-0.481],[0.021,0.009],[0.019,0.007],[0.589,0.266],[0,0],[0,0],[0.389,-0.481],[0.589,0.266],[0,0],[0,0],[0.388,-0.482],[0.589,0.266],[0,0],[0,0],[0,0]],"v":[[5.429,1.484],[2.049,-0.041],[0.36,-0.804],[-1.331,-1.566],[-4.711,-3.092],[-8.091,-4.617],[-8.809,-3.01],[-8.404,-2.827],[-6.753,-3.222],[-5.949,-1.719],[-5.428,-1.485],[-5.024,-1.301],[-3.373,-1.697],[-2.569,-0.193],[-2.049,0.041],[-1.645,0.223],[0.007,-0.173],[0.064,-0.141],[0.124,-0.119],[0.927,1.383],[1.331,1.566],[1.852,1.8],[3.504,1.406],[4.307,2.908],[4.711,3.092],[5.232,3.326],[6.884,2.93],[7.688,4.434],[8.092,4.617],[8.809,3.01]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[287.01,21.102],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 336","np":4,"cix":2,"ix":336,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.876,5.852],[-11.578,-4.28],[-10.876,-5.852],[11.578,4.28]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.689999988032,0.470999983245,0.310000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.79,30.551],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 337","np":4,"cix":2,"ix":337,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.789,35.576],[-24.593,25.739],[2.789,-35.576],[24.593,-25.738]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.651000019148,0.481999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.816,61.843],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 338","np":4,"cix":2,"ix":338,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.659,10.784],[-15.1,-0.839],[-10.658,-10.784],[15.099,0.838]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.651000019148,0.481999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[253.02,97.214],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 339","np":4,"cix":2,"ix":339,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.339,9.721],[-10.774,2.452],[-5.338,-9.721],[10.775,-2.451]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.651000019148,0.481999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[284.613,26.47],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 340","np":4,"cix":2,"ix":340,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.14,14.106],[0,0],[0.352,-1.079],[2.671,-17.61],[-0.014,-1.135],[0,0]],"o":[[2.14,-14.106],[0,0],[-0.351,1.078],[-2.671,17.611],[0.017,1.135],[0,0]],"v":[[-0.242,-0.126],[5.604,-33.1],[4.004,-31.835],[-1.159,-0.267],[-5.59,31.414],[-4.437,33.1]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.216000007181,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[361.935,234.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 341","np":4,"cix":2,"ix":341,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.213,2.202],[-3.368,-3.364],[4.213,-2.202],[3.369,3.364]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[366.562,234.665],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 342","np":4,"cix":2,"ix":342,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.008,6.288],[-0.053,-6.604],[2.007,-6.288],[0.052,6.604]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[370.166,235.216],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 343","np":4,"cix":2,"ix":343,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.738,31.241],[0,0],[0.747,-1.137],[3.297,-21.738],[-1.122,-3.907],[0,0]],"o":[[4.738,-31.241],[0,0],[-2.23,3.393],[-3.296,21.737],[0.376,1.31],[0,0]],"v":[[-2.773,-0.646],[8.13,-40.957],[5.202,-39.961],[-4.833,-0.961],[-6.816,39.271],[-4.315,41.098]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.564999988032,0.670999983245,0.62400004069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[376.684,236.437],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 344","np":4,"cix":2,"ix":344,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.124,12.31],[0.689,-0.76],[2.484,-16.374],[-0.434,-0.933],[0,0]],"o":[[0,0],[0,0],[-0.691,0.762],[-2.483,16.373],[0.434,0.932],[-1.241,-13.285]],"v":[[-1.989,-0.544],[7.506,-39.145],[4.405,-38.273],[-4.423,-0.917],[-7.071,37.385],[-4.369,39.146]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[374.776,236.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 345","np":4,"cix":2,"ix":345,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.76,12.173],[0.623,-0.675],[2.041,-13.457],[-0.393,-0.831],[0,0]],"o":[[0,0],[0,0],[-0.622,0.676],[-2.041,13.456],[0.395,0.831],[-0.935,-13.046]],"v":[[-1.123,-0.437],[6.991,-34.723],[3.536,-33.905],[-4.173,-0.904],[-6.598,32.907],[-3.542,34.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.216000007181,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[372.092,235.776],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 346","np":4,"cix":2,"ix":346,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.584,11.015],[0.613,-0.605],[1.854,-12.221],[-0.404,-0.761],[0,0]],"o":[[0,0],[0,0],[-0.611,0.606],[-1.853,12.221],[0.406,0.761],[-1.109,-11.889]],"v":[[-0.69,-0.419],[6.94,-31.518],[2.667,-30.949],[-3.741,-0.886],[-6.536,29.73],[-2.627,31.554]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.172999991623,0.176000004189,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[369.039,235.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 347","np":4,"cix":2,"ix":347,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.2,0.03],[0.012,-0.075],[0,0],[-0.201,-0.03],[-0.011,0.075],[0,0]],"o":[[-0.201,-0.031],[0,0],[-0.011,0.075],[0.201,0.031],[0,0],[0.011,-0.075]],"v":[[0.281,-1.853],[-0.104,-1.772],[-0.624,1.661],[-0.281,1.853],[0.103,1.772],[0.624,-1.661]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[349.386,251.729],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 348","np":4,"cix":2,"ix":348,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.243,0.038],[0.024,-0.159],[0,0],[-0.243,-0.038],[-0.024,0.159],[0,0]],"o":[[-0.243,-0.037],[0,0],[-0.025,0.159],[0.243,0.037],[0,0],[0.025,-0.159]],"v":[[0.589,-3.885],[0.106,-3.664],[-0.985,3.529],[-0.589,3.885],[-0.105,3.664],[0.985,-3.53]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[348.809,251.641],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 349","np":4,"cix":2,"ix":349,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.001,0.153],[0.764,0.117],[0,0],[0,0],[0,0],[-0.762,-0.118],[-1.002,-0.154],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.002,-0.153],[-0.763,-0.117],[0,0],[0,0],[0,0],[0.764,0.117],[1.002,0.154],[0,0]],"v":[[14.155,-0.799],[15.576,-0.581],[15.138,2.296],[14.702,5.174],[13.281,4.956],[12.681,4.079],[-8.835,0.781],[-11.091,1.173],[-15.576,0.484],[-15.147,-2.344],[-14.717,-5.174],[-10.233,-4.486],[-8.195,-3.439],[13.323,-0.141]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.216000007181,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[333.302,249.288],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 350","np":4,"cix":2,"ix":350,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.757,-2.967],[-1.602,2.605],[0.757,2.967],[1.601,-2.605]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.216000007181,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[362.83,250.742],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 351","np":4,"cix":2,"ix":351,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-21.609,-4.707],[-22.023,-1.98],[21.609,4.706],[22.023,1.98]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.172999991623,0.176000004189,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[340.424,247.309],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 352","np":4,"cix":2,"ix":352,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.2,0.031],[-0.011,0.075],[0,0],[-0.201,-0.031],[0.012,-0.075],[0,0]],"o":[[-0.201,-0.03],[0,0],[0.011,-0.075],[0.201,0.03],[0,0],[-0.012,0.075]],"v":[[-0.281,1.853],[-0.624,1.661],[-0.103,-1.772],[0.281,-1.853],[0.623,-1.661],[0.103,1.772]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[355.225,213.229],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 353","np":4,"cix":2,"ix":353,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.243,0.037],[-0.024,0.159],[0,0],[-0.243,-0.037],[0.025,-0.159],[0,0]],"o":[[-0.243,-0.037],[0,0],[0.024,-0.159],[0.243,0.038],[0,0],[-0.024,0.159]],"v":[[-0.59,3.885],[-0.986,3.53],[0.105,-3.664],[0.589,-3.885],[0.985,-3.529],[-0.106,3.664]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380000005984,0.216000007181,0.156999999402,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[354.65,213.141],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 354","np":4,"cix":2,"ix":354,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.002,0.155],[0.764,0.117],[0,0],[0,0],[0,0],[-0.764,-0.117],[-1.002,-0.153],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.002,-0.153],[-0.763,-0.118],[0,0],[0,0],[0,0],[0.764,0.116],[1.002,0.154],[0,0]],"v":[[13.281,4.956],[14.702,5.174],[15.138,2.297],[15.575,-0.58],[14.154,-0.798],[13.322,-0.141],[-8.195,-3.439],[-10.233,-4.486],[-14.717,-5.174],[-15.147,-2.345],[-15.575,0.484],[-11.091,1.173],[-8.835,0.782],[12.682,4.079]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.216000007181,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[339.142,210.788],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 355","np":4,"cix":2,"ix":355,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.602,2.605],[-0.757,-2.966],[1.602,-2.605],[0.756,2.966]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.216000007181,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[367.766,218.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 356","np":4,"cix":2,"ix":356,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-22.023,-1.98],[-21.61,-4.707],[22.023,1.981],[21.61,4.707]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.830999995213,0.172999991623,0.176000004189,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[345.36,214.765],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 357","np":4,"cix":2,"ix":357,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.944,31.167],[6.43,-30.633],[2.943,-31.167],[-6.43,30.633]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.2,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[359.584,233.595],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 358","np":4,"cix":2,"ix":358,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.163,0.311],[-1.017,-0.645],[1.164,-0.311],[1.018,0.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.788000009574,0.626999978458,0.313999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[362.181,235.895],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 359","np":4,"cix":2,"ix":359,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.163,0.311],[-1.018,-0.645],[1.163,-0.311],[1.019,0.645]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.788000009574,0.626999978458,0.313999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[362.745,232.178],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 360","np":4,"cix":2,"ix":360,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.146,-0.117],[-0.092,-0.117],[0,0],[-0.145,0.116],[0.093,0.117],[0,0]],"o":[[-0.146,0.117],[0,0],[0.093,0.117],[0.147,-0.117],[0,0],[-0.093,-0.117]],"v":[[-6.637,-8.401],[-6.734,-7.977],[6.204,8.401],[6.637,8.402],[6.733,7.978],[-6.204,-8.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[283.964,119.033],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 361","np":4,"cix":2,"ix":361,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.073,-0.058],[0.047,0.058],[0,0],[-0.073,0.059],[-0.046,-0.058],[0,0]],"o":[[-0.073,0.059],[0,0],[-0.046,-0.059],[0.073,-0.059],[0,0],[0.047,0.059]],"v":[[5.209,6.593],[4.992,6.593],[-5.258,-6.382],[-5.209,-6.594],[-4.993,-6.594],[5.257,6.382]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[291.843,124.362],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 362","np":4,"cix":2,"ix":362,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.073,0.059],[0.046,0.059],[0,0],[0.074,-0.058],[-0.047,-0.058],[0,0]],"o":[[0.073,-0.058],[0,0],[-0.047,-0.059],[-0.073,0.059],[0,0],[0.047,0.058]],"v":[[3.613,4.572],[3.661,4.361],[-3.396,-4.573],[-3.613,-4.574],[-3.66,-4.362],[3.396,4.572]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[288.573,114.486],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 363","np":4,"cix":2,"ix":363,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.11,0.087],[0.07,0.088],[0,0],[0.11,-0.088],[-0.07,-0.087],[0,0]],"o":[[0.109,-0.087],[0,0],[-0.069,-0.088],[-0.109,0.087],[0,0],[0.069,0.088]],"v":[[5.251,6.647],[5.323,6.329],[-4.927,-6.645],[-5.252,-6.646],[-5.324,-6.329],[4.926,6.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[293.466,113.44],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 364","np":4,"cix":2,"ix":364,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.109,0.087],[-0.069,-0.088],[0,0],[0.11,-0.087],[0.07,0.088],[0,0]],"o":[[0.109,-0.087],[0,0],[0.07,0.087],[-0.11,0.088],[0,0],[-0.07,-0.088]],"v":[[-2.1,-2.659],[-1.776,-2.658],[2.173,2.341],[2.101,2.658],[1.776,2.657],[-2.172,-2.341]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[302.492,119.675],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 365","np":4,"cix":2,"ix":365,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.109,-0.087],[0.07,0.088],[0,0],[-0.11,0.088],[-0.069,-0.088],[0,0]],"o":[[-0.11,0.088],[0,0],[-0.069,-0.089],[0.109,-0.087],[0,0],[0.07,0.089]],"v":[[5.419,6.859],[5.094,6.858],[-5.492,-6.541],[-5.419,-6.86],[-5.095,-6.859],[5.491,6.541]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[300.296,111.976],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 366","np":4,"cix":2,"ix":366,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.109,-0.087],[-0.07,-0.088],[0,0],[-0.11,0.087],[0.069,0.088],[0,0]],"o":[[-0.109,0.087],[0,0],[0.07,0.088],[0.109,-0.087],[0,0],[-0.069,-0.088]],"v":[[-3.654,-4.626],[-3.727,-4.308],[3.331,4.625],[3.656,4.626],[3.728,4.308],[-3.331,-4.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[306.496,113.269],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 367","np":4,"cix":2,"ix":367,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.073,-0.059],[0.047,0.059],[0,0],[-0.073,0.058],[-0.046,-0.059],[0,0]],"o":[[-0.073,0.058],[0,0],[-0.046,-0.059],[0.073,-0.058],[0,0],[0.047,0.059]],"v":[[2.899,3.669],[2.682,3.668],[-2.947,-3.457],[-2.898,-3.669],[-2.682,-3.668],[2.947,3.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[306.605,107.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 368","np":4,"cix":2,"ix":368,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.109,-0.087],[0.069,0.088],[0,0],[-0.109,0.087],[-0.069,-0.089],[0,0]],"o":[[-0.109,0.087],[0,0],[-0.07,-0.088],[0.11,-0.088],[0,0],[0.07,0.088]],"v":[[2.94,3.722],[2.616,3.722],[-3.013,-3.403],[-2.941,-3.721],[-2.617,-3.721],[3.013,3.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.688,107.718],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 369","np":4,"cix":2,"ix":369,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[16.782,-28.377],[-16.781,10.519],[-2.672,28.377]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[309.207,129.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 370","np":4,"cix":2,"ix":370,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[30.833,-28.377],[-30.833,-25.055],[11.379,28.377]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.713999968884,0.365000017952,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[295.155,129.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 371","np":4,"cix":2,"ix":371,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.12,-0.096],[-0.076,-0.097],[0,0],[-0.12,0.096],[0.076,0.097],[0,0]],"o":[[-0.12,0.095],[0,0],[0.076,0.096],[0.119,-0.095],[0,0],[-0.076,-0.096]],"v":[[-5.456,-6.907],[-5.534,-6.559],[5.103,6.905],[5.457,6.906],[5.535,6.559],[-5.103,-6.906]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[304.841,147.293],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 372","np":4,"cix":2,"ix":372,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.061,-0.048],[0.038,0.048],[0,0],[-0.06,0.048],[-0.038,-0.049],[0,0]],"o":[[-0.06,0.047],[0,0],[-0.038,-0.048],[0.06,-0.048],[0,0],[0.038,0.048]],"v":[[4.282,5.421],[4.105,5.42],[-4.322,-5.246],[-4.282,-5.42],[-4.105,-5.419],[4.322,5.247]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[311.311,151.68],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 373","np":4,"cix":2,"ix":373,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.06,0.048],[0.038,0.049],[0,0],[0.059,-0.048],[-0.038,-0.048],[0,0]],"o":[[0.061,-0.048],[0,0],[-0.038,-0.048],[-0.06,0.048],[0,0],[0.038,0.048]],"v":[[2.97,3.759],[3.01,3.585],[-2.792,-3.759],[-2.969,-3.76],[-3.009,-3.586],[2.793,3.758]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[308.613,143.568],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 374","np":4,"cix":2,"ix":374,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.09,0.072],[0.057,0.073],[0,0],[0.09,-0.072],[-0.058,-0.073],[0,0]],"o":[[0.09,-0.071],[0,0],[-0.058,-0.073],[-0.09,0.071],[0,0],[0.058,0.072]],"v":[[4.317,5.464],[4.376,5.203],[-4.05,-5.463],[-4.317,-5.464],[-4.375,-5.203],[4.05,5.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.624,142.718],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 375","np":4,"cix":2,"ix":375,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.09,0.072],[-0.057,-0.072],[0,0],[0.09,-0.072],[0.056,0.072],[0,0]],"o":[[0.09,-0.072],[0,0],[0.056,0.073],[-0.09,0.071],[0,0],[-0.056,-0.073]],"v":[[-1.726,-2.186],[-1.46,-2.184],[1.786,1.924],[1.727,2.187],[1.462,2.185],[-1.786,-1.924]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[320.036,147.849],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 376","np":4,"cix":2,"ix":376,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.09,-0.071],[0.058,0.072],[0,0],[-0.09,0.072],[-0.056,-0.073],[0,0]],"o":[[-0.09,0.072],[0,0],[-0.056,-0.072],[0.09,-0.072],[0,0],[0.056,0.073]],"v":[[4.454,5.639],[4.188,5.638],[-4.515,-5.378],[-4.455,-5.639],[-4.19,-5.637],[4.514,5.378]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[318.222,141.527],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 377","np":4,"cix":2,"ix":377,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.09,-0.071],[-0.057,-0.073],[0,0],[-0.09,0.072],[0.057,0.073],[0,0]],"o":[[-0.09,0.072],[0,0],[0.057,0.072],[0.09,-0.071],[0,0],[-0.058,-0.072]],"v":[[-3.004,-3.804],[-3.064,-3.542],[2.738,3.801],[3.004,3.802],[3.064,3.541],[-2.737,-3.803]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[323.309,142.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 378","np":4,"cix":2,"ix":378,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.06,-0.048],[0.038,0.047],[0,0],[-0.06,0.048],[-0.038,-0.049],[0,0]],"o":[[-0.061,0.048],[0,0],[-0.039,-0.049],[0.06,-0.048],[0,0],[0.038,0.049]],"v":[[2.384,3.016],[2.206,3.016],[-2.422,-2.842],[-2.383,-3.016],[-2.206,-3.015],[2.422,2.842]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[323.389,138.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 379","np":4,"cix":2,"ix":379,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.09,-0.072],[0.058,0.072],[0,0],[-0.09,0.072],[-0.057,-0.072],[0,0]],"o":[[-0.089,0.072],[0,0],[-0.056,-0.073],[0.09,-0.071],[0,0],[0.056,0.073]],"v":[[2.417,3.059],[2.151,3.059],[-2.477,-2.799],[-2.417,-3.061],[-2.151,-3.06],[2.477,2.798]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[328.377,138.054],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 380","np":4,"cix":2,"ix":380,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[13.729,-23.276],[-13.729,8.593],[-2.13,23.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.838999968884,0.616000007181,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[325.543,155.801],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 381","np":4,"cix":2,"ix":381,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[25.281,-23.276],[-25.281,-20.651],[9.422,23.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.713999968884,0.365000017952,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[313.991,155.801],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 382","np":4,"cix":2,"ix":382,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.216,0.812],[0.807,-0.216],[0,0]],"o":[[0,0],[0.807,-0.217],[-0.217,-0.812],[0,0],[0,0]],"v":[[-0.587,1.668],[0.085,1.488],[1.155,-0.375],[-0.699,-1.452],[-1.371,-1.271]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.435000011968,0.603999956916,0.620000023935,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[403.621,156.959],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 383","np":4,"cix":2,"ix":383,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.347,6.395],[-3.484,-5.365],[0.347,-6.394],[3.484,5.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.365000017952,0.552999997606,0.569000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[351.999,170.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 384","np":4,"cix":2,"ix":384,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.465,2.385],[-1.59,-1.833],[0.465,-2.385],[1.59,1.834]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[401.614,157.434],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 385","np":4,"cix":2,"ix":385,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.44,5.775],[-2.495,-5.223],[-0.439,-5.775],[2.495,5.223]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[354.942,169.971],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 386","np":4,"cix":2,"ix":386,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.713,10.552],[-3.768,-10],[-1.714,-10.552],[3.768,10]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[338.772,174.315],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 387","np":4,"cix":2,"ix":387,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.848,15.365],[0,0],[0,0],[0,0],[0,0],[0,0],[8.542,-5.382],[0,0]],"o":[[0,0],[0,0],[-54.296,13.685],[0,0],[10.078,0.379],[0,0],[0,0],[0,0]],"v":[[32.053,-10.041],[31.604,-11.721],[31.156,-13.4],[-32.052,-3.88],[-30.35,1.063],[2.001,-3.77],[-28.43,8.264],[-27.443,13.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.435000011968,0.603999956916,0.620000023935,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.983,169.431],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 388","np":4,"cix":2,"ix":388,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.087,0.328],[0,0],[0.326,-0.088],[0,0]],"o":[[0,0],[0.327,-0.087],[0,0],[-0.087,-0.328],[0,0],[0,0]],"v":[[0.283,3.88],[1.179,3.639],[1.612,2.886],[-0.054,-3.357],[-0.803,-3.792],[-1.699,-3.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[325.957,191.789],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 389","np":4,"cix":2,"ix":389,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.087,0.328],[0,0],[0.326,-0.088],[0,0]],"o":[[0,0],[0.327,-0.087],[0,0],[-0.087,-0.328],[0,0],[0,0]],"v":[[0.283,3.88],[1.179,3.639],[1.612,2.886],[-0.054,-3.357],[-0.803,-3.792],[-1.699,-3.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[318.986,165.65],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 390","np":4,"cix":2,"ix":390,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[8.104,2.135],[0,0],[-2.291,-8.591],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[2.291,8.59],[0,0],[5.957,-5.913]],"v":[[10.713,6.111],[8.044,-3.893],[5.376,-13.898],[-10.713,-15.985],[-9.118,-10.004],[2.42,-2.382],[-3.781,10.005],[-2.185,15.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.435000011968,0.603999956916,0.620000023935,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.7,178.485],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 391","np":4,"cix":2,"ix":391,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.037,0.137],[-0.137,0.037],[0,0],[-0.037,-0.137],[0.135,-0.036]],"o":[[-0.136,0.037],[-0.037,-0.136],[0,0],[0.135,-0.037],[0.036,0.137],[0,0]],"v":[[-4.193,1.391],[-4.505,1.21],[-4.325,0.896],[4.194,-1.391],[4.506,-1.21],[4.326,-0.897]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[405.537,156.38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 392","np":4,"cix":2,"ix":392,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.716,0.496],[-0.456,0.745],[-0.715,-0.496],[0.457,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.855,50.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 393","np":4,"cix":2,"ix":393,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.715,0.496],[-0.457,0.745],[-0.716,-0.496],[0.456,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.387,51.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 394","np":4,"cix":2,"ix":394,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.715,0.496],[-0.457,0.745],[-0.716,-0.496],[0.456,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[189.919,51.742],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 395","np":4,"cix":2,"ix":395,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.715,0.496],[-0.457,0.745],[-0.716,-0.497],[0.456,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[187.451,52.263],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 396","np":4,"cix":2,"ix":396,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.715,0.496],[-0.457,0.745],[-0.716,-0.496],[0.456,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[184.982,52.784],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 397","np":4,"cix":2,"ix":397,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.716,0.496],[-0.456,0.745],[-0.716,-0.497],[0.457,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[182.514,53.306],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 398","np":4,"cix":2,"ix":398,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.716,0.496],[-0.456,0.745],[-0.715,-0.496],[0.457,-0.745]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[180.046,53.827],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 399","np":4,"cix":2,"ix":399,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.268,-1.287],[-8.084,2.166],[-8.268,1.287],[8.084,-2.166]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[187.85,54.178],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 400","np":4,"cix":2,"ix":400,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.261,-0.393],[-7.721,2.982],[-8.261,0.393],[7.72,-2.982]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[187.851,54.178],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 401","np":4,"cix":2,"ix":401,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.869,3.23],[-2.248,4.523],[-3.868,-3.231],[2.248,-4.523]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.26699999641,0.231000010173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[188.814,58.788],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 402","np":4,"cix":2,"ix":402,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.581,-0.292],[-7.057,2.799],[-7.581,0.291],[7.057,-2.799]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.722000002394,0.62400004069,0.54900004069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[188.847,58.946],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 403","np":4,"cix":2,"ix":403,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.272,3.015],[-6.366,6.106],[-8.272,-3.015],[6.365,-6.106]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[188.671,58.103],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 404","np":4,"cix":2,"ix":404,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.038,0.608],[-6.04,1.838],[6.039,-0.712],[5.546,-1.838]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.11,73.996],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 405","np":4,"cix":2,"ix":405,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.317,0.878],[-7.318,2.108],[7.318,-0.982],[6.825,-2.108]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[193.382,80.083],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 406","np":4,"cix":2,"ix":406,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.678,0.743],[-6.679,1.973],[6.679,-0.847],[6.185,-1.973]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.746,77.04],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 407","np":4,"cix":2,"ix":407,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.12,0.203],[-4.121,1.433],[4.121,-0.307],[3.628,-1.433]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.202,64.866],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 408","np":4,"cix":2,"ix":408,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.399,0.473],[-5.4,1.703],[5.4,-0.577],[4.906,-1.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[191.474,70.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 409","np":4,"cix":2,"ix":409,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.759,0.338],[-4.76,1.568],[4.76,-0.442],[4.266,-1.568]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.838,67.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 410","np":4,"cix":2,"ix":410,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.957,1.013],[-7.958,2.243],[7.958,-1.117],[7.464,-2.243]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.018,83.127],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 411","np":4,"cix":2,"ix":411,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[12.434,-2.063],[11.94,-3.188],[-12.434,1.959],[-12.435,3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[198.47,104.43],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 412","np":4,"cix":2,"ix":412,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-11.794,1.823],[-11.795,3.053],[11.794,-1.927],[11.3,-3.053]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.835,101.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 413","np":4,"cix":2,"ix":413,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-11.154,1.688],[-11.155,2.919],[11.155,-1.792],[10.661,-2.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.198,98.343],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 414","np":4,"cix":2,"ix":414,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.596,1.148],[-8.597,2.378],[8.597,-1.252],[8.104,-2.378]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.654,86.17],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 415","np":4,"cix":2,"ix":415,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.515,1.553],[-10.516,2.783],[10.516,-1.658],[10.022,-2.783]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[196.562,95.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 416","np":4,"cix":2,"ix":416,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.236,1.283],[-9.237,2.513],[9.237,-1.388],[8.743,-2.513]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.291,89.214],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 417","np":4,"cix":2,"ix":417,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.875,1.418],[-9.876,2.648],[9.876,-1.522],[9.383,-2.648]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.926,92.257],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 418","np":4,"cix":2,"ix":418,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.638,-23.681],[-9.178,-22.932],[-12.719,-22.185],[-12.768,23.681],[0,20.984],[12.768,18.289]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[198.802,85.596],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 419","np":4,"cix":2,"ix":419,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-4.355,-24.304],[-9.178,-23.286],[-14.001,-22.267],[-17.392,24.304],[0,20.631],[17.393,16.959]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.722000002394,0.62400004069,0.54900004069,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[198.802,85.949],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 420","np":4,"cix":2,"ix":420,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.949,-1.88],[-14.438,4.326],[-14.949,1.88],[14.438,-4.326]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[189.88,63.886],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 421","np":4,"cix":2,"ix":421,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.349,0.034],[-14.038,6.24],[-15.349,-0.034],[14.038,-6.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.279,65.801],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 422","np":4,"cix":2,"ix":422,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[19.908,-2.927],[-19.396,5.373],[-19.908,2.927],[19.396,-5.373]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[191.191,70.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 423","np":4,"cix":2,"ix":423,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.266,-1.215],[-19.038,7.085],[-20.266,1.215],[19.038,-7.085]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[191.633,72.276],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 424","np":4,"cix":2,"ix":424,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[23.637,-3.715],[-23.127,6.16],[-23.637,3.715],[23.126,-6.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.502,76.434],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 425","np":4,"cix":2,"ix":425,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[23.995,-2.003],[-22.768,7.872],[-23.995,2.003],[22.768,-7.872]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.944,78.55],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 426","np":4,"cix":2,"ix":426,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27.52,-4.534],[-27.009,6.98],[-27.52,4.535],[27.008,-6.98]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[193.813,82.708],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 427","np":4,"cix":2,"ix":427,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27.878,-2.823],[-26.65,8.693],[-27.878,2.823],[26.65,-8.693]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.255,84.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 428","np":4,"cix":2,"ix":428,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.832,-5.445],[-31.321,7.891],[-31.832,5.445],[31.321,-7.891]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.124,88.982],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 429","np":4,"cix":2,"ix":429,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[32.189,-3.733],[-30.963,9.603],[-32.189,3.733],[30.962,-9.603]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.566,91.098],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 430","np":4,"cix":2,"ix":430,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35.752,-6.273],[-35.241,8.718],[-35.752,6.272],[35.24,-8.718]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[196.436,95.256],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 431","np":4,"cix":2,"ix":431,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[36.109,-4.561],[-34.883,10.431],[-36.11,4.561],[34.882,-10.431]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[196.878,97.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 432","np":4,"cix":2,"ix":432,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[40.16,-7.204],[-39.65,9.65],[-40.161,7.203],[39.648,-9.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.528999956916,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.747,101.53],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 433","np":4,"cix":2,"ix":433,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[40.518,-5.492],[-39.292,11.362],[-40.519,5.491],[39.291,-11.362]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.490000017952,0.411999990426,0.352999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[198.189,103.646],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 434","np":4,"cix":2,"ix":434,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.113,0.029],[-0.028,-0.114],[0,0],[0.114,-0.027],[0.027,0.114]],"o":[[-0.027,-0.114],[0.115,-0.027],[0,0],[0.028,0.114],[-0.114,0.028],[0,0]],"v":[[-0.977,-3.079],[-0.822,-3.339],[-0.564,-3.182],[0.975,3.079],[0.82,3.337],[0.563,3.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.868,377.794],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 435","np":4,"cix":2,"ix":435,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.114,0.029],[-0.028,-0.114],[0,0],[0.113,-0.028],[0.028,0.114]],"o":[[-0.028,-0.114],[0.115,-0.028],[0,0],[0.028,0.115],[-0.114,0.028],[0,0]],"v":[[-0.976,-3.079],[-0.821,-3.338],[-0.563,-3.182],[0.976,3.079],[0.821,3.338],[0.563,3.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[274.348,377.426],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 436","np":4,"cix":2,"ix":436,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.114,0.029],[-0.027,-0.114],[0,0],[0.113,-0.028],[0.028,0.114]],"o":[[-0.028,-0.114],[0.115,-0.028],[0,0],[0.027,0.114],[-0.114,0.028],[0,0]],"v":[[-0.975,-3.079],[-0.82,-3.338],[-0.564,-3.182],[0.977,3.08],[0.822,3.338],[0.563,3.183]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[275.828,377.058],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 437","np":4,"cix":2,"ix":437,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.114,0.029],[-0.028,-0.114],[0,0],[0.114,-0.028],[0.028,0.114]],"o":[[-0.028,-0.115],[0.114,-0.028],[0,0],[0.028,0.114],[-0.113,0.028],[0,0]],"v":[[-0.975,-3.079],[-0.82,-3.338],[-0.563,-3.182],[0.976,3.079],[0.821,3.338],[0.564,3.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[277.308,376.691],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 438","np":4,"cix":2,"ix":438,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.114,0.029],[-0.028,-0.114],[0,0],[0.114,-0.028],[0.028,0.114]],"o":[[-0.028,-0.114],[0.114,-0.028],[0,0],[0.028,0.114],[-0.114,0.028],[0,0]],"v":[[-0.975,-3.079],[-0.82,-3.338],[-0.564,-3.182],[0.975,3.08],[0.82,3.338],[0.563,3.183]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[278.789,376.323],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 439","np":4,"cix":2,"ix":439,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.113,0.029],[-0.028,-0.115],[0,0],[0.114,-0.028],[0.028,0.114]],"o":[[-0.028,-0.115],[0.115,-0.028],[0,0],[0.028,0.114],[-0.114,0.028],[0,0]],"v":[[-0.976,-3.079],[-0.821,-3.338],[-0.563,-3.182],[0.976,3.079],[0.821,3.338],[0.563,3.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[280.269,375.955],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 440","np":4,"cix":2,"ix":440,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.084,0.343],[-0.34,0.084],[0,0],[-0.084,-0.343],[0.339,-0.084],[0,0]],"o":[[-0.085,-0.342],[0,0],[0.341,-0.084],[0.084,0.341],[0,0],[-0.34,0.084]],"v":[[-0.97,0.241],[-0.507,-0.531],[0.203,-0.707],[0.971,-0.241],[0.508,0.53],[-0.202,0.707]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752999997606,0.62400004069,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.451,396.734],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 441","np":4,"cix":2,"ix":441,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.801,8.642],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[6.483,6.337]],"v":[[3.407,8.54],[3.849,8.43],[4.292,8.319],[5.288,-8.54],[0.001,-7.227],[-5.287,-5.913]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[277.615,388.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 442","np":4,"cix":2,"ix":442,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2.655,4.555],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.46,2.788]],"v":[[-3.119,5.734],[1.911,4.486],[2.02,4.458],[7.05,3.21],[8.905,-5.734],[0.055,-3.536],[-0.055,-3.508],[-8.905,-1.31]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[273.524,368.015],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 443","np":4,"cix":2,"ix":443,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.516,1.53],[8.245,-2.633],[8.515,-1.53],[-8.245,2.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.709999952129,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[273.388,363.942],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 444","np":4,"cix":2,"ix":444,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.037,-0.149],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.037,-0.15],[0.15,-0.037],[0,0],[0.037,0.151],[-0.151,0.037],[0,0]],"v":[[-0.859,-2.327],[-0.656,-2.666],[-0.318,-2.462],[0.859,2.328],[0.656,2.667],[0.318,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.898,361.511],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 445","np":4,"cix":2,"ix":445,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.037,-0.15],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.036,-0.15],[0.15,-0.037],[0,0],[0.036,0.151],[-0.15,0.037],[0,0]],"v":[[-0.86,-2.328],[-0.656,-2.667],[-0.318,-2.463],[0.86,2.327],[0.656,2.666],[0.318,2.461]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[267.522,361.108],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 446","np":4,"cix":2,"ix":446,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.037,-0.15],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.037,-0.15],[0.151,-0.037],[0,0],[0.037,0.15],[-0.15,0.037],[0,0]],"v":[[-0.859,-2.327],[-0.657,-2.667],[-0.319,-2.462],[0.859,2.328],[0.655,2.667],[0.317,2.462]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.147,360.704],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 447","np":4,"cix":2,"ix":447,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.036,-0.15],[0,0],[0.15,-0.037],[0.037,0.15]],"o":[[-0.037,-0.15],[0.15,-0.037],[0,0],[0.037,0.151],[-0.15,0.037],[0,0]],"v":[[-0.859,-2.327],[-0.655,-2.667],[-0.318,-2.462],[0.86,2.327],[0.656,2.667],[0.319,2.462]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[270.771,360.301],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 448","np":4,"cix":2,"ix":448,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.037,-0.15],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.037,-0.15],[0.15,-0.037],[0,0],[0.037,0.151],[-0.15,0.037],[0,0]],"v":[[-0.859,-2.327],[-0.655,-2.667],[-0.317,-2.462],[0.86,2.327],[0.657,2.667],[0.319,2.462]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.395,359.898],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 449","np":4,"cix":2,"ix":449,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.037,-0.15],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.037,-0.149],[0.15,-0.037],[0,0],[0.037,0.151],[-0.15,0.037],[0,0]],"v":[[-0.859,-2.328],[-0.656,-2.667],[-0.318,-2.462],[0.86,2.327],[0.656,2.667],[0.318,2.462]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[274.02,359.494],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 450","np":4,"cix":2,"ix":450,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.15,0.037],[-0.037,-0.15],[0,0],[0.149,-0.037],[0.036,0.15]],"o":[[-0.037,-0.15],[0.15,-0.037],[0,0],[0.037,0.151],[-0.15,0.037],[0,0]],"v":[[-0.859,-2.327],[-0.655,-2.666],[-0.318,-2.461],[0.86,2.328],[0.656,2.667],[0.319,2.463]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[275.644,359.091],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 451","np":4,"cix":2,"ix":451,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.036,-0.15],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.037,-0.15],[0.15,-0.037],[0,0],[0.037,0.151],[-0.151,0.037],[0,0]],"v":[[-0.859,-2.328],[-0.656,-2.667],[-0.319,-2.463],[0.859,2.327],[0.656,2.666],[0.318,2.461]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[277.268,358.687],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 452","np":4,"cix":2,"ix":452,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.149,0.037],[-0.037,-0.15],[0,0],[0.149,-0.037],[0.037,0.15]],"o":[[-0.036,-0.15],[0.15,-0.037],[0,0],[0.036,0.15],[-0.15,0.037],[0,0]],"v":[[-0.86,-2.327],[-0.656,-2.667],[-0.318,-2.462],[0.86,2.328],[0.656,2.667],[0.318,2.462]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.569000004787,0.470999983245,0.317999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[278.892,358.284],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 453","np":4,"cix":2,"ix":453,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.06,-0.103],[0.102,-0.06],[0,0],[0.059,0.103],[-0.103,0.06]],"o":[[0.103,-0.06],[0.059,0.104],[0,0],[-0.103,0.06],[-0.06,-0.103],[0,0]],"v":[[0.706,-0.659],[0.999,-0.58],[0.921,-0.285],[-0.706,0.659],[-0.999,0.581],[-0.921,0.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.049,349.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 454","np":4,"cix":2,"ix":454,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.097,0.069],[-0.068,-0.098],[0,0],[0.097,-0.069],[0.067,0.098]],"o":[[-0.067,-0.098],[0.097,-0.068],[0,0],[0.067,0.098],[-0.098,0.068],[0,0]],"v":[[-0.715,-0.649],[-0.663,-0.95],[-0.363,-0.897],[0.716,0.649],[0.663,0.95],[0.363,0.897]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[270.401,349.776],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 455","np":4,"cix":2,"ix":455,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.041,0.026],[-0.026,0.041],[0,0],[-0.041,-0.024],[0.025,-0.042]],"o":[[-0.025,0.041],[-0.041,-0.024],[0,0],[0.026,-0.042],[0.041,0.025],[0,0]],"v":[[-0.226,0.547],[-0.346,0.576],[-0.375,0.456],[0.227,-0.548],[0.347,-0.578],[0.377,-0.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.029,351.99],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 456","np":4,"cix":2,"ix":456,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.042,0.026],[-0.026,0.041],[0,0],[-0.041,-0.025],[0.024,-0.042]],"o":[[-0.024,0.041],[-0.041,-0.025],[0,0],[0.026,-0.042],[0.042,0.025],[0,0]],"v":[[-0.227,0.548],[-0.347,0.577],[-0.376,0.457],[0.226,-0.547],[0.346,-0.577],[0.377,-0.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[271.593,346.055],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 457","np":4,"cix":2,"ix":457,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.025,0.042],[-0.041,-0.026],[0,0],[0.026,-0.042],[0.042,0.026]],"o":[[-0.042,-0.025],[0.025,-0.041],[0,0],[0.041,0.025],[-0.024,0.042],[0,0]],"v":[[-0.544,-0.227],[-0.574,-0.348],[-0.454,-0.377],[0.545,0.228],[0.574,0.349],[0.454,0.378]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[266.86,347.231],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 458","np":4,"cix":2,"ix":458,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.025,0.042],[-0.041,-0.026],[0,0],[0.026,-0.041],[0.042,0.025]],"o":[[-0.041,-0.025],[0.025,-0.041],[0,0],[0.041,0.024],[-0.024,0.042],[0,0]],"v":[[-0.546,-0.228],[-0.575,-0.349],[-0.455,-0.378],[0.544,0.228],[0.573,0.348],[0.453,0.379]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.763,350.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 459","np":4,"cix":2,"ix":459,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.01,0.046],[-0.047,0.012],[0,0],[-0.011,-0.047],[0.047,-0.012]],"o":[[-0.047,0.012],[-0.012,-0.047],[0,0],[0.047,-0.012],[0.012,0.047],[0,0]],"v":[[-0.546,0.226],[-0.651,0.162],[-0.588,0.055],[0.545,-0.226],[0.65,-0.162],[0.587,-0.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[266.464,349.854],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 460","np":4,"cix":2,"ix":460,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.011,0.047],[-0.047,0.011],[0,0],[-0.011,-0.047],[0.047,-0.012]],"o":[[-0.047,0.012],[-0.012,-0.047],[0,0],[0.048,-0.011],[0.012,0.047],[0,0]],"v":[[-0.545,0.225],[-0.651,0.161],[-0.587,0.055],[0.545,-0.227],[0.651,-0.163],[0.587,-0.056]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[273.158,348.191],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 461","np":4,"cix":2,"ix":461,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.046,0.011],[-0.011,-0.048],[0,0],[0.047,-0.012],[0.012,0.047]],"o":[[-0.012,-0.047],[0.047,-0.012],[0,0],[0.012,0.048],[-0.046,0.012],[0,0]],"v":[[-0.224,-0.548],[-0.161,-0.654],[-0.056,-0.59],[0.224,0.548],[0.16,0.654],[0.055,0.591]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.984,345.658],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 462","np":4,"cix":2,"ix":462,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.046,0.011],[-0.012,-0.047],[0,0],[0.047,-0.012],[0.012,0.047]],"o":[[-0.011,-0.047],[0.047,-0.012],[0,0],[0.012,0.047],[-0.047,0.012],[0,0]],"v":[[-0.225,-0.548],[-0.161,-0.654],[-0.055,-0.59],[0.225,0.549],[0.161,0.655],[0.055,0.591]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[270.639,352.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 463","np":4,"cix":2,"ix":463,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.609,2.478],[-2.463,0.613],[-0.61,-2.477],[2.464,-0.612]],"o":[[-0.608,-2.477],[2.464,-0.612],[0.608,2.477],[-2.463,0.612]],"v":[[-4.462,1.108],[-1.103,-4.485],[4.462,-1.108],[1.102,4.485]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.933000033509,0.882000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.73,349.055],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 464","np":4,"cix":2,"ix":464,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.691,2.813],[-2.797,0.696],[-0.692,-2.812],[2.798,-0.695]],"o":[[-0.691,-2.813],[2.798,-0.695],[0.691,2.813],[-2.797,0.695]],"v":[[-5.066,1.259],[-1.252,-5.092],[5.066,-1.258],[1.252,5.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.729,349.055],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 465","np":4,"cix":2,"ix":465,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.06,8.892],[7.714,5.967],[4.06,-8.892],[-7.714,-5.967]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.709999952129,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.729,349.056],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 466","np":4,"cix":2,"ix":466,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.18,9.171],[8.833,5.691],[5.179,-9.17],[-8.833,-5.689]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752999997606,0.62400004069,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.73,349.055],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 467","np":4,"cix":2,"ix":467,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.22,9.428],[9.873,5.431],[6.219,-9.428],[-9.873,-5.431]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.709999952129,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.73,349.055],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 468","np":4,"cix":2,"ix":468,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.715,2.687],[5.417,0.17],[4.715,-2.687],[-5.417,-0.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.709999952129,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[277.264,379.702],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 469","np":4,"cix":2,"ix":469,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.914,5.941],[6.217,3.424],[3.914,-5.941],[-6.217,-3.424]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752999997606,0.62400004069,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.463,376.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 470","np":4,"cix":2,"ix":470,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.924,6.565],[9.169,2.568],[6.925,-6.564],[-9.168,-2.566]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752999997606,0.62400004069,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[272.165,358.96],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 471","np":4,"cix":2,"ix":471,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-7.003,9.623],[10.655,5.236],[7.002,-9.624],[-10.655,-5.237]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752999997606,0.62400004069,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[269.73,349.056],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 472","np":4,"cix":2,"ix":472,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.001,1.492],[8.657,-2.893],[9.001,-1.492],[-8.656,2.893]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.630999995213,0.510000011968,0.313999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[267.73,340.925],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 473","np":4,"cix":2,"ix":473,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.598,1.876],[8.478,-2.366],[8.598,-1.875],[-8.478,2.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.40800000359,0.344999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.541,332.02],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 474","np":4,"cix":2,"ix":474,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-8.598,1.876],[8.478,-2.366],[8.598,-1.875],[-8.477,2.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.40800000359,0.344999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[262.068,317.892],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 475","np":4,"cix":2,"ix":475,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.693,-18.09],[-4.229,-18.205],[4.694,18.089],[4.229,18.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[258.47,323.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 476","np":4,"cix":2,"ix":476,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.694,-18.09],[-4.229,-18.205],[4.694,18.09],[4.229,18.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.328,322.841],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 477","np":4,"cix":2,"ix":477,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.693,-18.089],[-4.228,-18.204],[4.694,18.09],[4.23,18.204]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[262.186,322.38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 478","np":4,"cix":2,"ix":478,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.694,-18.09],[-4.229,-18.205],[4.694,18.09],[4.229,18.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[264.044,321.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 479","np":4,"cix":2,"ix":479,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.693,-18.089],[-4.228,-18.205],[4.694,18.09],[4.229,18.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.901,321.457],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 480","np":4,"cix":2,"ix":480,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-4.693,-18.09],[-4.228,-18.205],[4.694,18.089],[4.23,18.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[267.76,320.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 481","np":4,"cix":2,"ix":481,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-5.493,0.953],[5.302,-1.729],[5.493,-0.951],[-5.302,1.73]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[258.275,302.464],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 482","np":4,"cix":2,"ix":482,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.802,-18.167],[1.14,-21.134],[10.802,18.167],[-1.141,21.134]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811999990426,0.709999952129,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[262.9,321.275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 483","np":4,"cix":2,"ix":483,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.049,0.893],[9.305,-3.915],[10.048,-0.894],[-9.307,3.914]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[258.287,302.509],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 484","np":4,"cix":2,"ix":484,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-13.133,-16.569],[3.943,-20.811],[13.133,16.569],[-3.944,20.811]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752999997606,0.62400004069,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[263.136,322.235],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 485","np":4,"cix":2,"ix":485,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.017,0.073],[-0.072,0.018],[0,0],[-0.019,-0.072],[0.072,-0.018]],"o":[[-0.071,0.018],[-0.018,-0.072],[0,0],[0.072,-0.017],[0.017,0.072],[0,0]],"v":[[-0.716,0.316],[-0.878,0.217],[-0.78,0.055],[0.717,-0.318],[0.88,-0.219],[0.781,-0.056]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.947,398.753],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 486","np":4,"cix":2,"ix":486,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.073,0.018],[-0.018,-0.073],[0,0],[0.072,-0.018],[0.018,0.072]],"o":[[-0.018,-0.072],[0.071,-0.018],[0,0],[0.019,0.072],[-0.073,0.017],[0,0]],"v":[[-0.867,-2.958],[-0.768,-3.122],[-0.607,-3.023],[0.866,2.973],[0.77,3.136],[0.607,3.037]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.234999997008,0.219999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.5,396.928],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 487","np":4,"cix":2,"ix":487,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.651,3.533],[1.644,9.921],[10.651,-0.57],[-7.347,-9.921]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[165.606,301.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 488","np":4,"cix":2,"ix":488,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-11.465,2.06],[4.32,10.259],[11.465,-0.909],[-6.533,-10.26]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.328999986836,0.161000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[164.793,301.639],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 489","np":4,"cix":2,"ix":489,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.253,0.198],[-0.389,-0.126],[-0.526,-0.35],[1.083,-0.046],[0.665,0.473],[0.23,-0.006],[-0.022,0.191]],"o":[[0.253,-0.198],[0.389,0.126],[0.527,0.349],[0,0],[0,0],[-0.231,0.007],[0.023,-0.19]],"v":[[-1.934,-0.974],[-0.74,-1.089],[0.986,-0.421],[1.204,1.215],[-1.285,-0.029],[-1.872,0.427],[-2.266,-0.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[111.566,344.783],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 490","np":4,"cix":2,"ix":490,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.374,0.814],[0,0],[0,0],[-2.154,0.469],[-0.197,-0.101],[0,0],[0,0],[0,0],[0.995,-0.357],[0.045,0.023],[0.413,0.215],[0,0]],"o":[[0,0],[0,0],[0,0],[2.155,-0.47],[0.197,0.103],[0,0],[0,0],[0,0],[-0.181,-0.091],[-0.149,-0.077],[-0.23,-0.12],[0,0]],"v":[[-2.229,-3.073],[1.021,-1.386],[-3.163,0.037],[1.442,-0.748],[4.695,-1.25],[6.673,-0.163],[-2.276,1.71],[4.044,0.825],[-1.896,3.073],[-2.259,2.89],[-3.569,2.042],[-6.673,0.555]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.398,346.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 491","np":4,"cix":2,"ix":491,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.804,0.641],[-0.068,0.132],[-0.221,0.428],[0,0],[0,0],[0,0],[-0.136,0.263],[0,0],[0,0],[0,0],[0.127,0.4],[0.063,0.2],[0.064,0.201],[-0.374,0.12],[0,0],[0.234,-0.129],[0,0],[0,0],[0.196,0.102],[0,0],[-0.672,0.216],[-0.068,0.132],[0.055,0.175],[0.699,-0.389],[0,0],[0.098,0.051],[0.638,0.321],[0,0]],"o":[[2.404,-0.549],[0.068,-0.132],[0.221,-0.43],[0,0],[0,0],[0,0],[0.135,-0.265],[0,0],[0,0],[0,0],[-0.127,-0.401],[-0.064,-0.2],[-0.063,-0.2],[0.373,-0.119],[0,0],[-0.232,0.13],[0,0],[0,0],[-0.198,-0.102],[0,0],[0.672,-0.214],[0.068,-0.132],[-0.056,-0.175],[-0.7,0.389],[0,0],[-0.069,-0.036],[0.256,-0.019],[6.179,-1.304]],"v":[[-3.785,5.051],[-0.005,4.171],[0.521,3.15],[9.954,-16.41],[10.873,-15.932],[-2.68,12.691],[-2.349,12.697],[11.128,-15.216],[13.298,-14.256],[-1.396,16.41],[-3.98,14.734],[-4.968,13.258],[-6.189,11.913],[-5.521,11.34],[-2.832,10.48],[-2.678,10.016],[-5.948,11.118],[-6.794,11.146],[-7.454,10.085],[-8.11,9.66],[-3.115,8.116],[-1.854,7.768],[-1.244,6.663],[-5.876,8.229],[-8.29,9.526],[-11.639,7.869],[-13.298,7.039],[-12.768,6.99]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.994,342.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 492","np":4,"cix":2,"ix":492,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.851,0.088],[0.002,-0.186],[0,0],[0.27,0.077],[-0.027,0.111]],"o":[[0.851,-0.088],[-0.002,0.186],[-0.175,0.159],[-0.27,-0.078],[0.026,-0.111]],"v":[[-0.483,-1.315],[1.894,-1.358],[0.577,1.384],[-1.062,1.438],[-1.869,-0.789]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[145.428,325.224],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 493","np":4,"cix":2,"ix":493,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.428,-1.157],[1.013,-0.221]],"o":[[0,0],[0,0],[0,0]],"v":[[-0.002,-1.388],[1.554,1.072],[-1.554,1.389]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.014,321.895],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 494","np":4,"cix":2,"ix":494,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.212,-7.204],[3.989,-6.8],[-3.211,7.204],[-3.989,6.8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.583,313.526],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 495","np":4,"cix":2,"ix":495,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.372,-7.514],[4.149,-7.111],[-3.371,7.514],[-4.149,7.111]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.485,314.389],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 496","np":4,"cix":2,"ix":496,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.473,-7.711],[4.249,-7.307],[-3.473,7.711],[-4.249,7.308]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.568,315.2],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 497","np":4,"cix":2,"ix":497,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.738,-7.987],[4.32,-7.685],[-3.739,7.987],[-4.32,7.685]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.46,316.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 498","np":4,"cix":2,"ix":498,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.238,-3.904],[0,0],[2.561,3.698],[0.096,-4.467],[0.267,0.263],[0.027,-0.173],[0,0],[3.749,7.255],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.268,-0.264],[-0.027,0.173],[0,0],[0,0],[0,0]],"v":[[3.639,-0.208],[2.236,2.458],[-0.561,-3.917],[0.488,6.16],[-0.529,5.727],[-1.075,6.004],[-2.708,9.361],[-3.639,-8.6],[-3.185,-9.361]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.564,333.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 499","np":4,"cix":2,"ix":499,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.756,-8.517],[4.74,-8.006],[-3.756,8.517],[-4.74,8.006]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[157.471,319.074],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 500","np":4,"cix":2,"ix":500,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.079,-8.784],[4.77,-8.426],[-4.079,8.785],[-4.77,8.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.714,320.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 501","np":4,"cix":2,"ix":501,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[4.393,-9.161],[4.895,-8.9],[-4.392,9.161],[-4.895,8.901]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.546,321.126],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 502","np":4,"cix":2,"ix":502,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.312,0.289],[0,0],[0.957,0.99]],"v":[[4.152,-5.349],[-3.169,7.303],[-3.202,7.368],[-4.152,6.999],[3.018,-7.658]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[147.536,348.199],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 503","np":4,"cix":2,"ix":503,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.083,-0.162],[0.18,-0.192],[0,0]],"o":[[0,0],[-0.083,0.162],[-0.181,0.192],[0,0]],"v":[[3.159,-6.43],[3.993,-5.914],[-3.028,6.238],[-4.076,5.898]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[148.625,350.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 504","np":4,"cix":2,"ix":504,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.435,-0.989],[0,0],[0,0],[-0.095,-0.3],[0,0],[0,0],[-0.867,-1.372],[0,0],[0.08,0.387],[-0.004,-0.001],[-0.005,-0.023],[0,0],[0,0],[-0.035,-0.111],[0,0],[0,0],[-0.246,-0.286],[0,0],[0.662,0.345],[0.229,0.013],[0.966,0.212],[0.03,0.095],[0.057,0.346],[0.09,0.284],[0.165,0.139],[0,0],[-0.281,-0.014],[-1.035,-1.249]],"o":[[0.435,0.99],[0,0],[0,0],[0.095,0.3],[0,0],[0,0],[0.867,1.373],[0,0],[-0.011,-0.027],[0.004,0.002],[0.17,0.396],[0,0],[0,0],[0.036,0.11],[0,0],[0,0],[0.247,0.286],[0,0],[-0.662,-0.344],[-0.229,-0.014],[-0.965,-0.212],[-0.03,-0.094],[-0.058,-0.347],[-0.09,-0.283],[-0.165,-0.138],[0,0],[0.281,0.014],[1.036,1.25]],"v":[[-1.037,0.488],[-0.18,2.646],[0.193,0.389],[1.105,2.287],[1.546,2.858],[0.654,-0.61],[2.266,1.15],[3.941,4.523],[3.616,0.883],[3.604,0.843],[3.616,0.883],[5.512,4.576],[4.314,-0.131],[6.152,2.669],[7.292,3.92],[5.096,-2.518],[8.378,-0.997],[9.223,7.506],[3.447,4.82],[0.217,3.249],[-1.919,3.272],[-3.654,2.264],[-3.982,1.119],[-6.036,-2.689],[-7.69,-5.182],[-9.223,-7.506],[-6.374,-7.08],[-4.18,-5.282]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.103,363.486],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 505","np":4,"cix":2,"ix":505,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.222,0.108],[0,0],[0,0]],"o":[[-0.702,-0.343],[2.719,2.639],[-0.309,0.116]],"v":[[0.227,3.168],[-2.071,-3.796],[2.071,3.68]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[142.854,361.943],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 506","np":4,"cix":2,"ix":506,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.257,0.368],[0,0],[0,0],[-0.149,-0.291],[0,0]],"o":[[-0.257,-0.369],[0,0],[0,0],[0.148,0.291],[-0.881,0.099]],"v":[[-1.391,1.44],[-1.559,-3.118],[0.012,-2.366],[0.356,-1.545],[1.648,3.019]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.613,361.923],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 507","np":4,"cix":2,"ix":507,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.067,0.212],[-0.078,0.151],[-0.171,-0.089],[0,0]],"o":[[-0.067,-0.212],[0.077,-0.15],[0.171,0.089],[-0.309,0.098]],"v":[[-0.616,1.818],[-0.376,-2.442],[0.512,-2.062],[0.527,2.493]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138.25,360.775],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 508","np":4,"cix":2,"ix":508,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.333,-0.456],[0.137,-0.045],[0.129,0.408],[0,0],[0.276,-0.153],[0,0],[0.13,0.129],[0,0],[-0.158,0.117],[-0.183,0.103],[-0.104,-0.054],[0,0],[0,0]],"o":[[-0.333,0.456],[0,0],[-0.13,-0.409],[0,0],[-0.275,0.154],[0,0],[-0.129,-0.131],[0,0],[0.158,-0.115],[0.184,-0.102],[0.103,0.053],[0,0],[0,0]],"v":[[1.495,1.628],[0.243,3.617],[0.149,2.25],[-0.201,0.809],[-1.443,1.027],[-2.818,1.599],[-1.921,-0.146],[-2.497,-1.003],[-2.279,-1.682],[-0.288,-3.514],[0.363,-3.439],[2.818,-1.966],[2.713,2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.657,360.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 509","np":4,"cix":2,"ix":509,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.354,0.102],[-0.23,0.343],[-0.129,-0.013],[0,0],[0.177,-0.345]],"o":[[0,0],[0.231,-0.343],[0.129,0.012],[0,0],[-0.176,0.344]],"v":[[-1.434,1.799],[0.253,-1.272],[1.058,-1.888],[1.434,-1.776],[0.149,0.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.508,364.608],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 510","np":4,"cix":2,"ix":510,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.183,0.014],[0.235,0.176],[-0.045,0.086],[-0.159,-0.218]],"o":[[0,0],[-0.183,-0.014],[-0.234,-0.176],[0.044,-0.086],[0.158,0.218]],"v":[[0.447,0.416],[0.026,0.497],[-0.485,0.068],[-0.23,-0.426],[0.561,-0.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.671,366.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 511","np":4,"cix":2,"ix":511,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.036,0.114],[-0.007,0.188],[0.149,0.132],[-0.055,0.107],[-0.329,-0.416],[0,0]],"o":[[-0.036,-0.114],[0.007,-0.186],[-0.149,-0.132],[0.055,-0.108],[0.328,0.415],[-0.082,0.148]],"v":[[-0.034,0.636],[-0.184,0.122],[-0.665,-0.454],[-0.378,-1.013],[0.486,-0.374],[0.248,0.973]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.881,364.21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 512","np":4,"cix":2,"ix":512,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.689,0.878],[0,0],[-0.128,-0.013],[-0.033,0.064],[-0.055,0.107],[0.159,0.11],[0,0],[-0.142,0.118],[-0.146,0.047],[-0.236,-0.068],[0.056,-0.108],[0.13,-0.041],[0.122,-0.291],[0.089,-0.172],[-0.171,-0.089],[-0.037,-0.114],[0.122,-0.236],[-0.138,-0.153],[-0.211,0.068],[-0.107,-0.055],[0,0]],"o":[[-1.689,-0.877],[0,0],[0.13,0.012],[0.033,-0.065],[0.056,-0.108],[-0.16,-0.11],[0,0],[0.141,-0.117],[0.146,-0.047],[0.236,0.069],[-0.055,0.107],[-0.13,0.042],[-0.122,0.29],[-0.088,0.171],[0.171,0.088],[0.036,0.114],[-0.121,0.236],[0.137,0.153],[0.21,-0.067],[0.107,0.055],[0,0]],"v":[[-0.748,2.811],[-1.826,0.481],[-0.498,0.954],[-0.139,0.731],[-0.069,0.278],[-0.386,-0.105],[-1.377,-0.865],[-0.491,-2.747],[1.187,-3.481],[2.071,-3.621],[2.381,-2.643],[1.84,-2.434],[0.966,-2.261],[0.704,-1.172],[0.569,-0.698],[1.372,-0.363],[1.342,0.221],[0.645,1.683],[1.522,2.084],[1.901,1.873],[2.253,2.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.604,365.952],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 513","np":4,"cix":2,"ix":513,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.253,-0.44],[0,0],[-0.166,0.322],[-0.208,-0.018],[0.111,-0.214],[0.11,-0.161]],"o":[[-0.253,0.439],[0,0],[0.166,-0.322],[0.207,0.018],[-0.11,0.215],[-0.11,0.161]],"v":[[-0.025,0.177],[-1.835,2.695],[0.31,-2.372],[0.922,-2.455],[1.725,-1.964],[0.927,-0.2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.303,361.971],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 514","np":4,"cix":2,"ix":514,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.14,0.656],[-0.465,-0.656],[1.14,0.125]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.298,351.525],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 515","np":4,"cix":2,"ix":515,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[1.336,0.826],[0,0],[0,0]],"v":[[-0.283,-1.236],[1.02,1.237],[-1.053,0.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.059,350.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 516","np":4,"cix":2,"ix":516,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.053,-0.103],[0,0],[-0.159,0.308],[0,0]],"o":[[-0.053,0.103],[0,0],[0.157,-0.306],[0,0]],"v":[[2.512,-4.471],[-2.239,4.768],[-2.406,4.176],[2.107,-4.768]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[143.378,333.834],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 517","np":4,"cix":2,"ix":517,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.305,0.029],[0,0],[-0.105,3.974],[-0.02,0.123],[-0.125,0.245],[0,0],[0.497,-5.277],[0.172,-0.646]],"o":[[-0.264,-0.025],[0,0],[0.105,-3.973],[0.019,-0.123],[0.126,-0.245],[0,0],[-0.497,5.275],[-0.164,0.617]],"v":[[-1.201,11.206],[-1.367,10.667],[-0.539,1.943],[-0.659,-7.416],[-0.271,-9.029],[0.511,-11.234],[0.968,-1.701],[-0.617,10.403]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[147.094,336.948],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 518","np":4,"cix":2,"ix":518,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.131,0.414],[2.724,2.152],[-0.141,0.273],[0,0],[0.296,-5.513],[0.208,-0.237],[0.936,1.611],[0,0],[-0.406,-1.638],[0.074,-0.394],[0.225,-0.072]],"o":[[-0.131,-0.415],[0,0],[0.14,-0.273],[0,0],[-0.296,5.514],[-0.208,0.239],[-0.936,-1.611],[0,0],[0.406,1.639],[-0.073,0.395],[-0.226,0.072]],"v":[[0.849,8.787],[-3.764,2.021],[-0.022,-5.421],[2.212,-10.1],[3.467,-1.748],[2.827,6.527],[1.211,3.395],[-0.065,1.607],[1.253,5.406],[1.977,8.767],[1.406,10.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[141.458,344.537],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 519","np":4,"cix":2,"ix":519,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.861,-2.886],[1.674,2.308]],"o":[[0,0],[0,0],[0,0]],"v":[[0.629,-4.361],[0.497,4.362],[-1.358,-0.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[145.361,334.167],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 520","np":4,"cix":2,"ix":520,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.845,1.575],[0.113,0.138],[0,0]],"o":[[-0.926,0.522],[-0.845,-1.575],[-0.113,-0.137],[2.095,1.088]],"v":[[2.163,2.525],[-0.141,-0.151],[-2.049,-2.569],[-1.751,-3.047]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138.958,349.708],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 521","np":4,"cix":2,"ix":521,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.303,0.027],[0,0]],"o":[[0,0],[0,0],[0.304,-0.027],[0,0]],"v":[[-2.438,1.053],[-1.699,-0.385],[0.883,-1.025],[2.439,-0.013]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.844,353.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 522","np":4,"cix":2,"ix":522,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.124,-0.115],[0.2,-0.196],[0,0],[-0.146,0.323],[0,0],[-0.093,-0.128]],"o":[[-0.124,0.115],[-0.199,0.195],[0,0],[0.147,-0.323],[0,0],[0.093,0.128]],"v":[[1.099,-0.741],[-0.639,0.892],[-1.294,1.509],[-1.468,0.92],[-0.43,-0.866],[1.521,-1.38]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.719,357.486],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 523","np":4,"cix":2,"ix":523,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.458,0.758],[0,0],[-0.213,0.068],[-0.434,-0.332]],"o":[[0,0],[-1.459,-0.758],[0,0],[0.213,-0.068],[0.433,0.333]],"v":[[2.58,1.761],[-0.228,0.587],[-2.58,-0.921],[0.127,-1.693],[1.546,-1.135]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.617,357.154],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 524","np":4,"cix":2,"ix":524,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.207,0.16],[0.188,-0.007],[0,0],[0,0],[-0.142,0.045],[-0.734,-0.461],[0,0],[0.094,-0.03]],"o":[[-0.207,-0.16],[-0.188,0.008],[0,0],[0,0],[0.141,-0.046],[0.735,0.461],[0,0],[-0.095,0.03]],"v":[[1.386,0.774],[-0.69,0.672],[-4.874,1.298],[-4.051,-0.097],[1.194,-1.253],[4.139,0.171],[4.816,1.103],[2.154,1.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.426,354.669],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 525","np":4,"cix":2,"ix":525,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[2.496,1.481],[-0.623,0.6],[-0.312,-1.642],[0,0]],"v":[[-1.267,-2.428],[1.589,1.828],[0.162,1.589],[-1.589,-1.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.668,349.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 526","np":4,"cix":2,"ix":526,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.336,-0.102],[-0.325,-0.218],[0.025,-0.426],[0.117,-0.086],[0.115,0.06],[0.026,0.233],[0.096,0.05],[0,0],[-0.041,0.222]],"o":[[0.335,0.102],[0.325,0.217],[-0.025,0.424],[-0.116,0.085],[-0.115,-0.059],[-0.026,-0.232],[-0.095,-0.05],[-0.345,-0.179],[0.042,-0.221]],"v":[[-1.183,-1.476],[0.817,-0.558],[1.748,0.413],[1.599,1.456],[1.203,1.518],[0.949,1.069],[0.466,0.453],[-0.232,0.163],[-1.732,-0.787]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[162.128,372.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 527","np":4,"cix":2,"ix":527,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.516,-1.062],[-1.227,-0.525],[-1.339,-0.417],[-2.011,-1.158],[-0.832,-0.431],[-0.064,-0.2],[-0.569,-0.296],[-0.569,-0.296],[0,0],[0.708,-1.917],[-2.32,-1.205],[-0.627,0.789],[0,0],[-1.119,-0.304],[-0.525,-0.273],[-0.459,-0.294],[-0.308,-0.049],[-0.242,-0.069],[-0.219,-0.114],[0,0],[-0.846,-0.357],[-0.256,0.119],[0,0],[-0.497,-0.063],[-0.15,0.51],[0.406,0.238],[0,0],[0.07,0.568],[0.251,0.213],[0,0],[0.656,0.713],[0,0],[-0.003,0.217],[0,0],[0.041,0.13],[0,0],[-0.004,0.261],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.158,-0.308],[1.089,-2.333],[0,0],[0.597,-0.191],[0,0],[0,0],[1.087,-0.494],[0.429,-0.725],[1.03,0.369],[0.294,-0.572]],"o":[[0,0],[1.227,0.526],[1.338,0.417],[0,0],[0.831,0.433],[0.063,0.201],[0.569,0.295],[0.569,0.296],[0,0],[-0.709,1.918],[2.32,1.205],[0.628,-0.789],[0,0],[1.12,0.303],[0.525,0.273],[0.459,0.294],[0.308,0.048],[0.241,0.071],[0.219,0.113],[0,0],[0.847,0.355],[0.255,-0.118],[0,0],[0.496,0.061],[0.15,-0.508],[-0.406,-0.239],[0,0],[-0.069,-0.568],[-0.252,-0.215],[0,0],[-0.656,-0.713],[0,0],[0.002,-0.218],[0,0],[-0.042,-0.131],[0,0],[0.003,-0.261],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.159,0.309],[-1.089,2.333],[0,0],[-0.598,0.192],[0,0],[0,0],[-1.086,0.495],[0,0],[-1.031,-0.368],[-0.294,0.572]],"v":[[-29.099,4.568],[-28.263,5.733],[-23.456,7.172],[-13.888,11.753],[-12.913,13.094],[-11.827,14.216],[-9.57,16.839],[-8.023,18.144],[-6.36,19.008],[-8.724,24.469],[-7.206,29.607],[-2.743,28.692],[0.885,22.716],[4.89,24.742],[7.592,25.42],[8.998,25.705],[10.77,26.681],[11.961,26.63],[13.041,26.579],[22.478,31.732],[24.091,33.41],[26.835,34.89],[27.207,34.329],[29.283,35.324],[30.19,34.424],[28.766,31.784],[22.577,28.4],[23.131,26.619],[21.677,21.334],[15.246,17.881],[13.906,15.558],[11.769,13.748],[17.484,3.31],[16.815,2.875],[17.713,1.045],[17.251,0.63],[19.81,-4.515],[19.698,-5.186],[31.615,-27.882],[30.346,-28.541],[19.985,-8.392],[19.591,-8.596],[29.641,-28.574],[29.071,-28.758],[19.114,-9.178],[18.856,-9.647],[28.657,-29.14],[24.695,-31.143],[15.986,-14.204],[14.892,-14.773],[23.447,-31.736],[22.835,-32.054],[14.464,-15.776],[13.72,-16.162],[22.068,-32.397],[18.48,-34.371],[17.87,-34.912],[17.282,-35.385],[9.788,-20.379],[9.396,-20.695],[9.612,-22.087],[9.063,-22.205],[5.58,-15.43],[5.094,-15.348],[-1.439,-1.348],[-4.387,4.925],[-5.816,4.684],[-8.195,4.564],[-16.756,0.506],[-18.857,1.031],[-23.08,3.743],[-28.268,1.214],[-31.161,1.663]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.328999986836,0.161000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.592,340.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 528","np":4,"cix":2,"ix":528,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.747,-15.272],[12.825,-8.22],[0.747,15.271],[-12.825,8.219]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.545000023935,0.361000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[155.195,319.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 529","np":4,"cix":2,"ix":529,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.224,-2.305],[0,0]],"o":[[0,0],[-0.384,2.093],[1.223,2.306],[-2.306,-4.925]],"v":[[-3.009,-7.531],[-3.075,-7.628],[0.382,2.305],[3.459,7.628]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.144999994016,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.317,103.786],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 530","np":4,"cix":2,"ix":530,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.455,-0.975],[0,0],[0.052,0.18],[0.258,0.897],[0,0]],"o":[[0.455,0.976],[0,0],[-0.051,-0.179],[-0.258,-0.896],[0,0]],"v":[[-0.247,0.887],[1.085,2.831],[0.942,1.999],[-0.358,-1.042],[-1.085,-2.831]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.144999994016,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.849,94.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 531","np":4,"cix":2,"ix":531,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.01,-3.242],[-0.392,-2.237],[0,0],[-0.081,1.131],[2.573,8.539]],"o":[[0,0],[1.011,3.243],[0.335,1.911],[0,0],[0.08,-1.131],[-2.572,-8.538]],"v":[[-4.982,-16.176],[-0.083,-1.796],[3.755,12.747],[4.393,16.176],[4.902,14.318],[1.665,1.794]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.144999994016,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.301,86.358],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 532","np":4,"cix":2,"ix":532,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.144,-0.544],[-0.299,-0.437],[-0.432,-0.297],[0,0],[0.122,1.111],[-0.245,2.377],[-0.157,-0.029],[-0.175,-0.522],[0,0],[0,0],[0.175,-1.546],[0.183,0.034],[-0.286,4.521],[0,0],[0.206,-3.637],[-0.187,-0.606],[-0.185,-0.47],[0,0],[0,0]],"o":[[0.144,0.544],[0.299,0.436],[0.433,0.298],[0,0],[-0.121,-1.112],[0.246,-2.377],[0.158,0.029],[0.176,0.522],[-0.667,-3.308],[0,0],[-0.175,1.547],[-0.183,-0.034],[0.287,-4.52],[-0.668,1.427],[-0.205,3.637],[0.187,0.606],[0.185,0.469],[-0.628,-0.116],[0,0]],"v":[[-1.935,7.67],[-1.132,9.643],[-0.256,10.92],[1.141,11.424],[0.396,9.136],[0.176,0.874],[1.129,-2.407],[1.711,-0.557],[2.238,0.412],[1.256,-9.896],[-0.342,0.451],[-0.907,3.831],[-1.255,-2.549],[0.209,-11.424],[-1.806,-2.351],[-1.436,4.06],[-0.835,5.805],[-0.406,8.633],[-2.238,5.627]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.144999994016,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.965,77.019],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 533","np":4,"cix":2,"ix":533,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.131,-0.191],[-0.295,-0.055],[-0.089,-0.267],[0.065,0.096],[0,0],[-0.088,-0.128],[-0.241,-0.045],[-0.112,-0.299],[0.064,-0.35],[-0.112,-0.299],[0,0],[0,0],[0,0],[0,0],[0.288,-0.058],[0.484,0.229],[0.393,0.573],[0.365,0.123],[0.319,-0.08],[0.365,0.123],[0.194,0.148],[0.066,0.095],[-0.127,0.088],[0.109,0.159],[0,0],[0,0],[-0.03,0.162],[0,0],[0.107,0.02],[0,0],[0,0],[0.19,-0.132],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.133,-0.025],[0,0],[0,0],[0.034,-0.188],[0,0],[0,0],[-0.19,0.132],[0,0],[0,0],[0.134,0.025],[0.134,0.025],[0.175,0.256],[0.35,0.51],[0.151,0.084],[0.216,0.179],[0.087,0.128],[0.153,0.223],[0.248,0.157],[0.161,0.03],[0,0],[0,0],[0.109,0.159],[-0.105,0.119],[0.109,0.159],[-0.389,0.458],[0.08,0.321],[0.377,0.209],[0.096,-0.066],[0.111,0.299],[0.128,0.664],[0,0],[0.137,-0.142],[0,0],[0.516,-0.545],[0,0],[-0.627,0.245],[-0.095,0.066],[0.049,-0.269],[-0.424,0.2],[-0.214,-0.04],[0.027,-0.149],[0.7,-0.344],[0.168,-0.028],[0,0],[0,0],[-0.585,0.922],[-0.107,-0.02],[0.286,-0.197],[0.178,-0.218],[0.025,-0.135],[-0.204,-0.094],[-0.285,0.197],[-0.283,0.337],[-0.175,-0.254],[0.096,-0.066],[0,0],[-0.321,-0.059],[-0.294,-0.054],[-0.133,-0.331],[-0.307,0.165],[-0.173,-0.115],[-0.068,-0.235],[0.254,-0.175],[-0.222,0.154],[-0.292,-0.222],[-0.109,-0.159],[-0.431,-0.219],[-0.509,-0.4],[-0.284,-0.414],[-0.065,-0.095],[0.006,0.419],[-0.256,0.036],[-0.136,-0.471],[-0.087,-1.491],[0.431,0.22],[0.058,0.289],[-0.054,0.296],[0.109,0.16],[0,0],[-0.026,-0.311],[-0.132,-0.191],[0,0],[-0.457,-0.53],[-0.222,1.212],[0.014,0.225],[0,0],[-0.18,-0.534],[0.177,-1.721],[0,0],[-0.134,-0.025],[0.049,-0.269],[-0.257,-0.103],[-0.244,0.121],[0.109,0.16],[0,0],[-0.131,-0.191],[-0.131,-0.191],[-0.13,-0.191],[0,0],[0.014,0.226],[-0.03,0.162],[0.109,0.159],[0.014,0.226],[-0.105,0.12],[0,0],[0.06,0.429],[0,0],[-0.059,-0.289],[-0.197,-0.287],[0,0],[0.101,0.353],[-0.05,0.269],[-0.307,0.165],[0,0],[0.066,0.095],[0,0],[-0.044,0.242],[0.095,-0.066],[0.066,0.096],[-0.049,0.27],[0,0],[-0.066,-0.095],[0.095,-0.066],[0,0],[0,0],[0,0],[-0.087,-0.128],[-0.241,-0.044],[-0.087,-0.128],[-0.244,0.121],[-0.058,-0.289],[0.346,-0.381],[0,0],[-0.309,0.026],[-0.428,-0.079],[-0.248,-0.157],[-0.284,0.337],[0,0],[-0.28,-0.135],[-0.554,0.148],[-0.788,-0.536],[0,0],[0.333,0.146],[0,0],[0.04,-0.215],[0.476,-1.693],[-1.357,-0.001],[0.455,-0.973],[0.309,-0.778],[-0.218,-0.318],[-0.312,-0.113],[-0.928,-1.285],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.132,0.191],[0.196,0.287],[0,0],[0,0],[0,0],[0,0],[0,0],[1.029,1.638],[-0.005,0.333],[-0.081,-0.015],[-0.455,-0.391],[0,0],[0.261,0.382],[0,0],[0.281,0.887],[0,0],[-0.049,0.27],[0.132,0.192],[0,0],[0,0],[-0.223,0.154],[-0.196,0.465],[0.094,0.546],[0.286,0.554],[0,0],[-0.145,0.335],[0.175,0.255],[0.194,0.148],[-0.125,0.227],[0.109,0.159],[0,0]],"o":[[0,0],[0,0],[0.131,0.192],[0.294,0.054],[0.09,0.267],[-0.066,-0.095],[0,0],[0.087,0.127],[0.241,0.045],[0.111,0.299],[-0.064,0.351],[0.111,0.299],[0,0],[0,0],[0,0],[0,0],[-0.287,0.058],[-0.484,-0.228],[-0.393,-0.574],[-0.365,-0.124],[-0.32,0.08],[-0.365,-0.124],[-0.195,-0.147],[-0.065,-0.096],[0.127,-0.087],[-0.11,-0.159],[0,0],[0,0],[0.03,-0.161],[0,0],[-0.107,-0.02],[0,0],[0,0],[-0.191,0.132],[0,0],[0,0],[0,0],[0,0],[0,0],[0.135,0.025],[0,0],[0,0],[-0.035,0.189],[0,0],[0,0],[0.19,-0.131],[0,0],[0,0],[-0.134,-0.024],[-0.134,-0.024],[-0.175,-0.255],[-0.349,-0.51],[-0.151,-0.083],[-0.216,-0.179],[-0.088,-0.127],[-0.153,-0.223],[-0.248,-0.157],[-0.161,-0.03],[0,0],[0,0],[-0.109,-0.16],[0.105,-0.12],[-0.109,-0.16],[0.388,-0.457],[-0.08,-0.321],[-0.377,-0.209],[-0.094,0.066],[-0.111,-0.299],[-0.127,-0.663],[0,0],[-0.137,0.141],[0.247,0.769],[-0.515,0.545],[0.243,1.241],[0.627,-0.246],[0.095,-0.066],[-0.049,0.269],[0.425,-0.2],[0.215,0.04],[-0.027,0.148],[-0.7,0.343],[-0.168,0.028],[0,0],[0,0],[0.584,-0.921],[0.107,0.019],[-0.285,0.198],[-0.178,0.217],[-0.024,0.135],[0.205,0.093],[0.285,-0.198],[0.284,-0.338],[0.174,0.256],[-0.095,0.066],[0,0],[0.322,0.06],[0.295,0.055],[0.134,0.331],[0.307,-0.166],[0.173,0.115],[0.067,0.235],[-0.254,0.176],[0.222,-0.154],[0.292,0.221],[0.11,0.16],[0.43,0.219],[0.508,0.401],[0.284,0.415],[0.066,0.096],[-0.007,-0.419],[0.256,-0.036],[0.135,0.47],[0.087,1.492],[-0.431,-0.218],[-0.058,-0.289],[0.054,-0.297],[-0.11,-0.159],[0,0],[0.027,0.311],[0.131,0.191],[0,0],[0.457,0.53],[0.222,-1.212],[-0.014,-0.225],[0,0],[0.179,0.534],[-0.176,1.721],[0.523,0.014],[0.134,0.025],[-0.05,0.269],[0.259,0.103],[0.244,-0.122],[-0.109,-0.159],[0,0],[0.131,0.192],[0.132,0.192],[0.132,0.192],[0,0],[-0.014,-0.225],[0.029,-0.162],[-0.109,-0.16],[-0.014,-0.225],[0.105,-0.12],[0,0],[-0.06,-0.428],[0,0],[0.057,0.289],[0.196,0.286],[0,0],[-0.102,-0.352],[0.049,-0.269],[0.308,-0.166],[0,0],[-0.065,-0.096],[0,0],[0.045,-0.242],[-0.095,0.066],[-0.066,-0.096],[0.049,-0.269],[0,0],[0.066,0.096],[-0.095,0.066],[0,0],[0,0],[0,0],[0.088,0.127],[0.241,0.045],[0.088,0.128],[0.244,-0.122],[0.057,0.289],[-0.347,0.381],[0,0],[0.31,-0.026],[0.429,0.08],[0.248,0.157],[0.283,-0.338],[0,0],[0.28,0.135],[0.553,-0.148],[0.788,0.535],[0,0],[-0.333,-0.145],[0,0],[-0.039,0.215],[-0.477,1.694],[1.357,0.001],[-0.456,0.974],[-0.308,0.778],[0.219,0.319],[0.312,0.114],[0.928,1.286],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.13,-0.192],[-0.197,-0.287],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.029,-1.638],[0.006,-0.333],[0.08,0.015],[0.455,0.39],[0,0],[-0.263,-0.383],[0,0],[-0.281,-0.887],[0,0],[0.05,-0.269],[-0.131,-0.191],[0,0],[0,0],[0.222,-0.154],[0.196,-0.465],[-0.094,-0.547],[-0.286,-0.554],[0,0],[0.145,-0.335],[-0.174,-0.255],[-0.195,-0.147],[0.125,-0.228],[-0.11,-0.16],[0,0]],"v":[[15.677,-19.352],[14.888,-19.275],[15.115,-16.283],[16.213,-15.773],[16.868,-14.816],[16.067,-14.826],[15.281,-15.222],[15.061,-14.928],[15.966,-14.427],[16.467,-13.833],[16.198,-12.519],[16.481,-11.492],[15.822,-11.224],[15.642,-10.394],[16.119,-3.624],[9.311,-14.99],[8.559,-15.269],[6.821,-15.758],[4.976,-17.63],[2.123,-19.745],[0.437,-19.612],[-1.246,-19.951],[-3.129,-20.857],[-4.343,-21.944],[-4.171,-22.581],[-4.546,-23.402],[-5.569,-23.87],[-6.711,-25.194],[-8.036,-27.333],[-4.027,-31.379],[-8.827,-28.76],[-9.281,-29.15],[-7.266,-33.649],[-10.859,-29.609],[-11.782,-29.864],[-12.259,-34.518],[-13.222,-29.713],[-14.045,-29.002],[-18.198,-32.332],[-15.3,-27.898],[-16.196,-27.089],[-21.744,-27.337],[-16.89,-25.715],[-16.556,-24.817],[-19.607,-22.375],[-16.156,-23.825],[-15.539,-23.265],[-17.096,-21.716],[-17.753,-21.309],[-19.394,-21.724],[-20.383,-22.826],[-21.863,-24.575],[-24.333,-26.814],[-26.225,-28.278],[-27.138,-29.338],[-30.164,-33.684],[-31.03,-34.401],[-32.619,-34.194],[-32.956,-34.619],[-32.814,-35.093],[-33.263,-35.816],[-33.111,-36.345],[-33.641,-36.777],[-33.013,-37.636],[-32.594,-38.866],[-34.127,-40.625],[-36.212,-39.981],[-36.595,-40.609],[-36.635,-42.51],[-37.574,-43.881],[-37.517,-42.227],[-39.516,-45.075],[-39.427,-41.328],[-40.599,-41.127],[-38.496,-39.151],[-37.146,-40.321],[-37.08,-39.474],[-36.342,-39.421],[-34.821,-39.863],[-34.589,-39.388],[-37.116,-37.615],[-38.483,-36.334],[-39.153,-35.264],[-38.575,-35.241],[-38.237,-36.181],[-35.66,-38.153],[-35.696,-37.659],[-37.487,-36.041],[-38.086,-35.345],[-37.875,-34.832],[-36.914,-35.069],[-35.912,-35.722],[-34.868,-35.975],[-35.794,-35.004],[-36.289,-34.567],[-35.879,-34.241],[-35.363,-34.034],[-34.648,-33.4],[-33.832,-33.165],[-32.83,-33.342],[-32.428,-32.21],[-33.239,-31.414],[-32.693,-31.368],[-31.045,-31.146],[-28.664,-27.059],[-27.04,-26.396],[-23.473,-24.4],[-21.398,-22.123],[-18.295,-17.595],[-18.176,-18.241],[-17.746,-20.138],[-16.889,-18.615],[-17.032,-14.661],[-17.757,-11.761],[-18.656,-13.959],[-18.681,-14.882],[-19.126,-16.079],[-20.163,-16.771],[-19.754,-14.469],[-19.417,-13.432],[-18.839,-14.021],[-17.891,-10.727],[-16.633,-12.304],[-16.786,-16.759],[-16.637,-18.179],[-16.183,-17.176],[-16.194,-11.527],[-16.848,-9.616],[-15.883,-10.049],[-15.661,-8.839],[-14.945,-8.066],[-14.05,-8.262],[-13.975,-8.973],[-14.801,-11.269],[-14.111,-10.195],[-12.959,-8.172],[-12.589,-7.018],[-11.951,-6.565],[-11.898,-7.308],[-12.032,-8.39],[-13.151,-10.295],[-13.728,-11.683],[-13.743,-12.66],[-12.511,-11.068],[-12.411,-12.219],[-12.193,-14.016],[-10.805,-5.713],[-10.454,-3.699],[-8.75,-3.328],[-11.771,-15.107],[-11.745,-16.912],[-10.498,-17.07],[-9.863,-17.51],[-12.77,-21.75],[-12.676,-22.568],[-12.085,-23.071],[-12.617,-23.643],[-13.25,-23.816],[-12.985,-24.658],[-12.595,-25.727],[-10.403,-25.6],[-11.255,-24.727],[-11.439,-24.177],[-10.424,-22.764],[-10.983,-22.283],[-10.935,-21.939],[-10.27,-21.789],[-9.865,-21.129],[-9.046,-21.367],[-8.547,-20.913],[-9.349,-19.558],[-10.815,-18.966],[-9.855,-19.067],[-8.462,-18.81],[-6.164,-18.05],[-4.949,-17.574],[-2.877,-18.305],[-1.357,-18.134],[0.276,-18.278],[3.024,-17.407],[5.457,-14.813],[0.801,-16.761],[0.559,-16.499],[22.375,12.873],[19.103,19.7],[21.114,21.27],[22.36,23.087],[18.995,29.508],[18.848,31.067],[19.864,31.116],[21.899,32.857],[23.512,37.053],[20.265,39.208],[18.656,43.002],[20.076,45.075],[20.14,45.031],[40.599,30.862],[40.074,30.097],[38.969,29.029],[37.182,28.197],[36.548,27.273],[35.724,27.844],[36.165,28.761],[34.198,30.123],[29.491,22.709],[28.085,19.498],[28.649,19.296],[34.002,26.356],[35.205,27.497],[34.169,26.053],[32.695,23.97],[32.563,21.663],[28.121,15.523],[28.727,14.633],[26.891,11.955],[27.004,10.89],[18.979,1.025],[19.443,0.61],[19.959,-0.547],[20.395,-3.529],[19.855,-6.023],[17.862,-9.204],[18.468,-10.094],[18.47,-11.318],[17.962,-12.471],[17.818,-13.499],[17.634,-15.064],[16.202,-16.471]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.144999994016,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[123.667,81.505],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 534","np":4,"cix":2,"ix":534,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.646,6.982],[-3.286,-5.465],[0,0],[0.699,1.02]],"o":[[0,0],[3.285,5.465],[0,0],[-0.699,-1.021]],"v":[[-7.863,-13.761],[-0.826,-1.148],[7.863,13.761],[6.77,12.583]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.144999994016,0.493999974868,0.510000011968,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.511,85.627],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 535","np":4,"cix":2,"ix":535,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.141,0.577],[-0.225,-0.443],[0,0],[0.35,0.916],[0.041,-1.187],[-0.029,-0.101],[-0.108,0.075],[-0.091,-0.017],[-0.012,-0.192],[0.114,-0.239],[-0.057,-0.2],[0,0],[-0.335,0.032],[-0.175,-0.197],[0,0],[-0.083,-0.063],[-0.12,-0.117],[0,0],[-0.029,-0.1],[0,0],[0,0],[-0.029,0.16],[0,0],[0,0],[-0.047,-0.127],[-0.085,-0.181],[-0.167,-0.243],[0,0],[-0.205,-0.038],[-0.165,-0.125],[-0.093,-0.135],[0,0],[0,0],[0.112,0.162],[0,0],[0,0],[0,0],[0,0],[-0.056,-0.081],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.148,-0.215],[0,0],[-0.123,-0.179],[-0.074,-0.107],[0,0],[-0.025,-0.036],[-0.097,-0.143],[-0.041,-0.059],[-0.028,-0.067],[-0.033,-0.048],[0,0],[0,0],[0,0],[0.036,-0.024],[0,0],[0,0],[0,0],[0,0],[0.141,0.026],[0.072,0.055],[0,0],[0.851,1.243],[0.277,0.301],[0.49,0.613],[0.279,0.406],[0.113,0.062],[1.144,1.67],[0,0],[0.643,0.119],[0.618,0.594],[0.488,0.917],[0,0],[0.569,0.523],[0.318,1.436],[0,0],[0.328,0.478],[0,0],[0.195,0.182],[0,0],[0.366,0.169],[-0.04,0.556],[0,0],[0.415,-0.111],[0.636,0.723],[0.296,0.994],[0.036,0.257],[0.25,0.108],[0.551,0.394],[1.485,1.756],[0.275,0.197],[0.254,0.142],[0.482,0.653],[0.389,0.26],[0.132,0.295],[0.065,0.095],[0.272,-0.013],[0,0],[0.422,0.307],[0.375,-0.118],[0.115,0.167],[-0.305,0.987],[0,0],[0.179,0.158],[0.062,0.091],[0.002,0.668],[0,0],[-0.24,-0.045]],"o":[[0,0],[0.224,0.444],[0,0],[0,0],[-0.041,1.186],[0.029,0.099],[0.108,-0.074],[0.091,0.017],[0.013,0.191],[-0.114,0.239],[0.058,0.199],[0,0],[0.335,-0.033],[0.176,0.198],[0,0],[0.083,0.062],[0.12,0.116],[0,0],[0.028,0.1],[0,0],[0,0],[0.03,-0.16],[0,0],[0,0],[0.047,0.127],[0.084,0.181],[0.167,0.244],[0,0],[0.204,0.037],[0.165,0.125],[0,0],[0,0],[0,0],[-0.111,-0.163],[0,0],[0,0],[0,0],[0,0],[0.056,0.081],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.147,0.215],[0,0],[0.122,0.179],[0.074,0.108],[0,0],[0.024,0.035],[0.097,0.142],[0.04,0.06],[0.029,0.067],[0.032,0.047],[0,0],[0,0],[0,0],[-0.035,0.025],[0,0],[0,0],[0,0],[0,0],[-0.14,-0.026],[-0.073,-0.055],[0,0],[-0.852,-1.242],[-0.277,-0.302],[-0.49,-0.612],[-0.278,-0.406],[-0.113,-0.063],[-1.145,-1.67],[0,0],[-0.642,-0.119],[-0.617,-0.594],[-0.488,-0.917],[0,0],[-0.569,-0.522],[-0.319,-1.437],[0,0],[-0.327,-0.478],[0,0],[-0.195,-0.182],[0,0],[-0.367,-0.169],[0.039,-0.556],[0,0],[-0.415,0.111],[-0.635,-0.723],[-0.295,-0.993],[-0.036,-0.257],[-0.25,-0.109],[-0.55,-0.394],[-1.484,-1.757],[-0.275,-0.197],[-0.255,-0.141],[-0.482,-0.652],[-0.388,-0.259],[-0.133,-0.296],[-0.066,-0.096],[-0.272,0.012],[0,0],[-0.42,-0.308],[-0.374,0.118],[-0.114,-0.168],[0.306,-0.986],[0,0],[-0.178,-0.158],[-0.063,-0.09],[-0.002,-0.668],[0,0],[0.242,0.044]],"v":[[-37.618,-43.177],[-36.311,-41.966],[-35.938,-41.306],[-35.918,-42.957],[-34.346,-39.533],[-34.273,-37.427],[-33.958,-36.968],[-32.196,-37.469],[-31.222,-36.626],[-31.299,-35.175],[-31.556,-33.52],[-30.703,-32.393],[-29.748,-32.216],[-28.673,-31.923],[-27.885,-30.831],[-23.579,-24.549],[-21.421,-22.849],[-18.625,-20.393],[-17.14,-18.227],[-15.295,-18.028],[-13.039,-18.792],[-11.985,-21.079],[-10.985,-23.329],[-9.981,-24.183],[-5.956,-22.02],[-4.686,-19.704],[-2.889,-17.835],[2.489,-16.248],[3.933,-16.17],[6.311,-14.903],[8.396,-12.673],[10.684,-11.942],[12.109,-12.529],[12.57,-12.609],[12.102,-15.958],[17.295,-16.501],[18.038,-15.238],[18.05,-13.888],[18.586,-13.221],[19.534,-12.361],[19.866,-10.833],[19.933,-9.402],[19.263,-5.802],[20.124,-2.858],[20.214,-0.118],[19.534,2.573],[20.083,4.677],[27.556,15.504],[28.679,18.6],[30.791,20.838],[32.104,21.832],[33.18,23.095],[34.227,25.065],[34.544,26.313],[35.121,27.206],[35.624,27.888],[36.133,28.531],[36.477,28.905],[36.848,29.346],[38.424,31.189],[38.828,31.626],[38.496,32.257],[37.553,32.91],[31.344,37.476],[29.578,40.321],[26.504,42.485],[24.015,43.151],[23.19,42.56],[22.749,42.019],[21.889,39.69],[19.688,36.633],[18.158,35.014],[15.92,32.159],[15.237,31.469],[12.463,27.677],[6.676,18.262],[5.533,17.926],[3.157,16.505],[0.567,11.907],[-0.027,10.887],[-2.376,9.659],[-4.277,5.761],[-6.082,-0.249],[-8.269,-0.779],[-9.136,-3.068],[-10.021,-3.336],[-11.288,-5.031],[-12.526,-5.055],[-13.186,-6.113],[-13.34,-7.769],[-14.39,-6.795],[-16.485,-7.6],[-18.047,-11.311],[-18.544,-14.032],[-18.556,-14.764],[-20.923,-16.684],[-23.195,-19.128],[-26.604,-23.745],[-27.962,-24.32],[-30.139,-27.112],[-31.679,-28.336],[-32.853,-29.742],[-32.979,-30.642],[-33.628,-31.179],[-34.264,-31.902],[-35.22,-31.557],[-36.239,-32.226],[-36.965,-32.569],[-37.008,-34.372],[-36.16,-36.051],[-36.989,-37.31],[-38.164,-38.23],[-38.826,-40.196],[-38.608,-41.616],[-37.803,-40.799]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.33300000359,0.773000021542,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.261,78.73],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 536","np":4,"cix":2,"ix":536,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.038,30.58],[23.2,21.794],[-10.607,-16.366],[-23.2,-30.58],[-23.199,-30.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.409,92.42],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 537","np":4,"cix":2,"ix":537,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.249,10.088],[-1.253,5.833],[2.492,7.914],[2.826,4.155],[5.567,6.197],[6.296,4.126],[-6.297,-10.088],[-5.745,8.367],[-4.088,6.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.505,71.928],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 538","np":2,"cix":2,"ix":538,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.924,10.297],[-10.883,-27.863],[-11.611,-25.791],[-14.354,-27.833],[-14.687,-24.074],[-18.432,-26.156],[-19.429,-21.9],[-21.266,-25.783],[-22.924,-23.621],[-21.385,27.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352999997606,0.556999954523,0.607999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.684,103.917],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 539","np":2,"cix":2,"ix":539,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.091,-19.047],[-7.888,-25.911],[-8.765,11.847],[-9.092,25.912],[-9.079,25.898]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[173.428,318.32],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 540","np":4,"cix":2,"ix":540,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.574,-5.388],[0.804,-3.655],[-0.212,-6.701],[-2.351,-4.885],[-2.827,-7.391],[-4.311,-6.673],[-4.638,7.392],[4.637,-2.661],[2.586,-2.379]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[168.974,336.84],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 541","np":2,"cix":2,"ix":541,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-16.535,-21.026],[-17.412,16.732],[-15.928,16.014],[-15.452,18.52],[-13.313,16.703],[-12.296,19.75],[-9.528,18.017],[-10.514,21.026],[-8.463,20.744],[17.412,-7.302]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352999997606,0.556999954523,0.607999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[182.075,313.435],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 542","np":2,"cix":2,"ix":542,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-13.727,20.469],[4.822,30.464],[11.31,-13.927],[13.726,-30.464],[13.71,-30.449]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[278.67,98.383],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 543","np":4,"cix":2,"ix":543,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.238,5.529],[-1.8,3.798],[-1.071,7.502],[1.655,5.603],[1.839,8.607],[3.652,7.929],[6.068,-8.607],[-6.068,2.198],[-3.666,2.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[286.329,76.527],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 544","np":2,"cix":2,"ix":544,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[15.299,25.113],[21.786,-19.279],[19.975,-18.6],[19.79,-21.605],[17.065,-19.706],[16.336,-23.41],[12.898,-21.678],[14.47,-25.113],[12.068,-25.01],[-21.786,5.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352999997606,0.556999954523,0.607999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[268.194,103.735],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 545","np":2,"cix":2,"ix":545,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.665,-29.901],[-13.451,-27.618],[6.146,14.29],[13.447,29.901],[13.451,29.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[233.759,340.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 546","np":4,"cix":2,"ix":546,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.903,-9.378],[1.169,-5.878],[-1.463,-8.632],[-2.546,-5.404],[-4.363,-7.876],[-5.408,-6.232],[1.893,9.379],[5.408,-7.004],[3.58,-5.508]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[245.313,361.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 547","np":2,"cix":2,"ix":547,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-20.109,-19.086],[-0.511,22.823],[0.534,21.178],[2.35,23.651],[3.433,20.423],[6.065,23.177],[7.799,19.677],[8.476,23.547],[10.304,22.051],[20.109,-23.651]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352999997606,0.556999954523,0.607999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[240.417,332.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 548","np":2,"cix":2,"ix":548,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-27.04,-4.975],[-25.066,11.466],[12.898,-5.24],[27.04,-11.462],[27.022,-11.466]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[349.024,204.557],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 549","np":4,"cix":2,"ix":549,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.474,-2.335],[-5.318,-0.969],[-7.818,1.23],[-4.906,2.067],[-7.148,3.593],[-5.667,4.423],[8.474,-1.8],[-6.316,-4.423],[-4.974,-2.949]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[367.59,194.894],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 550","np":2,"cix":2,"ix":550,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-17.39,16.436],[20.576,-0.27],[19.094,-1.1],[21.337,-2.626],[18.424,-3.463],[20.924,-5.662],[17.768,-7.028],[21.269,-7.642],[19.926,-9.116],[-21.336,-16.436]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352999997606,0.556999954523,0.607999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[341.347,199.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 551","np":2,"cix":2,"ix":551,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.939,4.311],[36.251,-17.694],[-19.262,8.086],[-39.939,17.69],[-39.911,17.693]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.966,207.006],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 552","np":4,"cix":2,"ix":552,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.577,2.936],[7.833,1.364],[11.439,-1.816],[7.083,-2.695],[10.337,-4.945],[8.102,-5.938],[-12.577,3.665],[9.475,5.938],[7.415,4.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[53.603,221.031],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 553","np":2,"cix":2,"ix":553,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[24.579,-21.997],[-30.934,3.783],[-28.699,4.776],[-31.953,7.026],[-27.597,7.905],[-31.202,11.085],[-26.459,12.657],[-31.621,13.786],[-29.561,15.659],[31.953,21.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352999997606,0.556999954523,0.607999973671,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.639,211.31],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 554","np":2,"cix":2,"ix":554,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.5,118.5,0],"ix":2},"a":{"a":0,"k":[118.5,118.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[64.805,0],[0,-64.805],[-64.805,0],[0,64.805]],"o":[[-64.805,0],[0,64.805],[64.805,0],[0,-64.805]],"v":[[118.34,1],[1,118.34],[118.34,235.68],[235.68,118.34]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"w":237,"h":237,"ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/windmill.json b/example/resource/windmill.json new file mode 100644 index 0000000000..69874abc93 --- /dev/null +++ b/example/resource/windmill.json @@ -0,0 +1 @@ +{"v":"5.2.0","fr":30,"ip":0,"op":90,"w":128,"h":128,"nm":"icons/features/windmill","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"▽ ic_windmill","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19,-121,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"▽ propeler","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[0]},{"t":95}],"ix":10,"x":"var $bm_rt;\n$bm_rt = transform.rotation;"},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9,"s":[0,0,0],"e":[0,125,0],"to":[0,20.8333339691162,0],"ti":[0,-20.8333339691162,0]},{"t":14}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.05;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n $bm_rt = sum(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Stroke 45","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48.43,38.07,0],"ix":2},"a":{"a":0,"k":[5.08,5.08,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.16,0],[0,10.16]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Fill 43","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48.43,38.07,0],"ix":2},"a":{"a":0,"k":[5.08,5.08,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.16,0],[0,10.16]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995509028435,0.995630025864,0.995441973209,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Stroke 13","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.26,48.24,0],"ix":2},"a":{"a":0,"k":[5.08,5.08,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,10.16],[10.16,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Fill 11","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.26,48.24,0],"ix":2},"a":{"a":0,"k":[5.08,5.08,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,10.16],[10.16,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995509028435,0.995630025864,0.995441973209,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Stroke 9","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.075,64.8,0],"ix":2},"a":{"a":0,"k":[19.065,17.44,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.07,3.08],[0,0]],"o":[[0,0],[0,0],[3.07,3.08],[0,0],[0,0]],"v":[[26.2,0],[0,26.2],[6.37,32.57],[17.49,32.57],[38.13,11.93]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Stroke 41","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.991,19.88,0],"ix":2},"a":{"a":0,"k":[17.441,19.07,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[3.07,-3.08],[0,0]],"o":[[0,0],[0,0],[3.07,3.07],[0,0],[0,0]],"v":[[0,26.21],[26.21,0],[32.58,6.37],[32.58,17.5],[11.93,38.14]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Stroke 33","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48.445,48.245,0],"ix":2},"a":{"a":0,"k":[5.085,5.085,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.17,10.17],[0,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Stroke 31","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[66.66,64.831,0],"ix":2},"a":{"a":0,"k":[19.09,17.461,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[3.08,3.07],[0,0]],"o":[[0,0],[0,0],[-3.07,3.07],[0,0],[0,0]],"v":[[11.93,0],[38.18,26.25],[31.81,32.62],[20.68,32.62],[0,11.93]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Stroke 23","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.28,38.08,0],"ix":2},"a":{"a":0,"k":[5.08,5.08,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[10.16,10.16]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Stroke 21","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[21.719,19.895,0],"ix":2},"a":{"a":0,"k":[17.439,19.065,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.07,-3.07],[0,0]],"o":[[0,0],[0,0],[-3.07,3.07],[0,0],[0,0]],"v":[[34.88,26.2],[8.67,0],[2.3,6.37],[2.3,17.49],[22.95,38.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Combined Shape","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43.335,41.448,0],"ix":2},"a":{"a":0,"k":[42.295,40.648,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.89,20.62],[20.62,11.89],[8.73,0],[0,8.73]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[17.44,46.55],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 3","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.89,20.62],[20.62,11.89],[8.73,0],[0,8.73]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[8.73,55.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 5","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-3.21,3.21]],"o":[[0,0],[0,0],[0,0],[0,0],[3.2,3.21],[0,0]],"v":[[17.7,14.81],[20.62,11.89],[8.73,0],[0,8.73],[6.09,14.81],[17.7,14.81]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,64.02],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 7","np":1,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,11.85],[8.73,20.58],[20.58,8.73],[11.85,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[17.52,17.49],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 15","np":1,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 3","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,11.85],[8.73,20.58],[20.58,8.73],[11.85,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[8.76,8.77],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 17","np":1,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 4","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-3.2,-3.2]],"o":[[0,0],[0,0],[0,0],[0,0],[-3.2,3.21],[0,0]],"v":[[2.4,17.66],[5.33,20.59],[17.19,8.73],[8.46,0],[2.4,6.05],[2.4,17.66]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[3.44,0.04],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 19","np":1,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 5","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.73,20.59],[0,11.86],[11.85,0],[20.58,8.73]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[46.55,46.62],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 25","np":1,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 6","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.73,20.59],[0,11.86],[11.85,0],[20.58,8.73]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[55.27,55.38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 27","np":1,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 7","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[3.2,3.21]],"o":[[0,0],[0,0],[0,0],[0,0],[-3.21,3.21],[0,0]],"v":[[2.93,14.78],[0,11.85],[11.85,0],[20.59,8.73],[14.54,14.78],[2.93,14.78]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[64,64.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 29","np":1,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 8","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.62,11.89],[11.89,20.62],[0,8.73],[8.73,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[46.49,17.46],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 35","np":1,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 9","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.62,11.89],[11.89,20.62],[0,8.73],[8.73,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[55.25,8.73],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 37","np":1,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 10","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[3.2,-3.21]],"o":[[0,0],[0,0],[0,0],[0,0],[3.2,3.2],[0,0]],"v":[[14.82,17.7],[11.89,20.62],[0,8.73],[8.73,0],[14.82,6.09],[14.82,17.7]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[63.99,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 39","np":1,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 11","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850979983807,0.231372997165,0.125489994884,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 40","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined Shape","np":24,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"door","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6,"s":[43.33,89.975,0],"e":[43.33,210.475,0],"to":[0,20.0833339691162,0],"ti":[0,-20.0833339691162,0]},{"t":11}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.05;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n $bm_rt = sum(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[9.84,15.655,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-4.34,0],[0,0],[0,-4.34]],"o":[[0,0],[0,0],[0,-4.34],[0,0],[4.35,0],[0,0]],"v":[[19.68,31.31],[0,31.31],[0,7.87],[7.87,0],[11.81,0],[19.68,7.87]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":3,"nm":"▽ bottom","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,105,0],"e":[0,225,0],"to":[0,20,0],"ti":[0,-20,0]},{"t":5}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.05;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n $bm_rt = sum(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Fill 51","parent":15,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43.335,13.395,0],"ix":2},"a":{"a":0,"k":[1.955,1.955,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.07,0],[0,1.08],[-1.09,0],[0,-1.09]],"o":[[0,1.08],[-1.09,0],[0,-1.09],[1.07,0],[0,0]],"v":[[3.91,1.96],[1.96,3.91],[0,1.96],[1.96,0],[3.91,1.96]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Stroke 47","parent":15,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43.33,7.395,0],"ix":2},"a":{"a":0,"k":[43.33,6.025,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.58,0],[0,0],[0,-2.17],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-2.17],[0,0],[2.58,0],[0,0],[0,0],[0,0]],"v":[[33.97,12.05],[0,12.05],[0,3.93],[4.67,0],[81.99,0],[86.66,3.93],[86.66,12.05],[52.66,12.05]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"top","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[42.55,59.74,0],"e":[42.55,179.5,0],"to":[0,19.9599990844727,0],"ti":[0,-20.2099990844727,0]},{"t":8}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.05;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n $bm_rt = sum(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[21.22,45.9,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-10.86,0],[0,0],[0,-10.86]],"o":[[0,0],[0,0],[0,-10.86],[0,0],[10.87,0],[0,0]],"v":[[42.44,91.8],[0,91.8],[0,19.67],[19.67,0],[22.76,0],[42.44,19.67]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.039216000587,0.141176000237,0.207843005657,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[{"tm":90,"cm":"1","dr":0}]} \ No newline at end of file diff --git a/example/resource/world_locations.json b/example/resource/world_locations.json new file mode 100644 index 0000000000..519200ec4f --- /dev/null +++ b/example/resource/world_locations.json @@ -0,0 +1 @@ +{"v":"5.0.1","fr":60,"ip":0,"op":301,"w":800,"h":600,"nm":"World","ddd":0,"assets":[{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"here 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[100],"e":[0]},{"t":75}],"ix":11,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"r":{"a":0,"k":-22.856,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[-252.5,-48.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p14_1_0p167_0p167","0p14_1_0p167_0p167"],"t":15,"s":[2,2],"e":[40,40]},{"t":75}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.972549019608,0.576470588235,0.188235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.14],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p14_1_0p167_0p167"],"t":15,"s":[10],"e":[0]},{"t":75}],"ix":5,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-252.5,-48.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":715,"st":15,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"here","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[100],"e":[0]},{"t":60}],"ix":11,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"r":{"a":0,"k":-22.856,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[-252.5,-48.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.14,0.14],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p14_1_0p167_0p167","0p14_1_0p167_0p167"],"t":0,"s":[2,2],"e":[60,60]},{"t":60}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.972549019608,0.576470588235,0.188235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.14],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p14_1_0p167_0p167"],"t":0,"s":[10],"e":[0]},{"t":60}],"ix":5,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-252.5,-48.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":730,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":-9,"ix":10},"p":{"a":0,"k":[396,281,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":72,"op":301,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rings 4","parent":2,"sr":1,"ks":{"o":{"a":0,"k":35,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.436,59.877,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[334,66.48],"ix":2},"p":{"a":0,"k":[0,55],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274509804,0.933333333333,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,-9.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":210,"s":[21.5],"e":[26]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":225.6,"s":[26],"e":[79]},{"t":262}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":210,"s":[21.5],"e":[79]},{"t":236}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":210,"op":301,"st":210,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rings 3","parent":2,"sr":1,"ks":{"o":{"a":0,"k":35,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,70,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[417,83],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274509804,0.933333333333,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,-9.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":202,"s":[15],"e":[26]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":217.6,"s":[26],"e":[84]},{"t":254}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":202,"s":[15],"e":[84]},{"t":228}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":202,"op":301,"st":202,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rings 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":35,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.436,59.877,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[334,66.48],"ix":2},"p":{"a":0,"k":[0,55],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274509804,0.933333333333,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,-9.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[21.5],"e":[26]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75.6,"s":[26],"e":[79]},{"t":112}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[21.5],"e":[79]},{"t":86}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":60,"op":301,"st":60,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rings","parent":2,"sr":1,"ks":{"o":{"a":0,"k":35,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,70,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[417,83],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274509804,0.933333333333,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,-9.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":52,"s":[15],"e":[26]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.6,"s":[26],"e":[84]},{"t":104}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":52,"s":[15],"e":[84]},{"t":78}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":52,"op":301,"st":52,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"maspMask 5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662744978362,0.67843095368,0.650979973288,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Here rings","parent":16,"tt":1,"refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70.408,63.975,0],"ix":2},"a":{"a":0,"k":[75,75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":150,"h":150,"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"maspMask 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662744978362,0.67843095368,0.650979973288,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Here rings","parent":16,"tt":1,"refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-80.007,318.38,0],"ix":2},"a":{"a":0,"k":[75,75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":150,"h":150,"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"maspMask 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662744978362,0.67843095368,0.650979973288,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Here rings","parent":16,"tt":1,"refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-170.998,95.543,0],"ix":2},"a":{"a":0,"k":[75,75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":150,"h":150,"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"maspMask 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662744978362,0.67843095368,0.650979973288,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"Here rings","parent":16,"tt":1,"refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-191.425,-28.874,0],"ix":2},"a":{"a":0,"k":[75,75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":150,"h":150,"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"maspMask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662744978362,0.67843095368,0.650979973288,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"map","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.95],"y":[0]},"n":["0p833_0p833_0p95_0"],"t":16,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":86,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.95],"y":[0]},"n":["0p833_0p833_0p95_0"],"t":180,"s":[100],"e":[0]},{"t":239}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.14],"y":[1]},"o":{"x":[0.58],"y":[0]},"n":["0p14_1_0p58_0"],"t":16,"s":[-22.856],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":146,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.72],"y":[0]},"n":["0p833_0p833_0p72_0"],"t":180,"s":[0],"e":[51]},{"t":246}],"ix":10},"p":{"a":0,"k":[240.55,-287.518,0],"ix":2},"a":{"a":0,"k":[-409.527,-960.177,0],"ix":1},"s":{"a":0,"k":[53.851,53.851,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.207,0.165],[0.867,1.221],[-0.146,-1.605],[-0.425,-1.251],[1.443,0.861]],"o":[[0.99,-1.532],[0.914,1.268],[0.125,1.365],[-0.831,-1.273],[0.19,-0.107]],"v":[[53.422,-169.413],[53.886,-174.034],[55.387,-169.683],[56.25,-165.777],[52.829,-169.024]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.221,0.036],[0.202,-0.081]],"o":[[-0.202,0.081],[0.179,-0.142]],"v":[[79.925,-218.282],[79.321,-218.037]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-0.097,0.141],[0.026,-0.316],[0.23,-0.223],[-0.222,0.297]],"o":[[-0.005,0.307],[-0.328,0.057],[0.146,-0.325],[0.107,-0.144]],"v":[[70.501,91.15],[70.466,92.085],[69.632,92.509],[70.199,91.575]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-0.302,-0.569],[-2.966,1.735],[-0.508,0.195],[-0.288,0.188],[-0.146,-0.057],[0.432,-0.165],[-0.447,-1.656],[2.425,0.115],[0.108,0.207],[0.313,1.452]],"o":[[1.559,2.949],[0.534,-0.286],[0.261,-0.182],[0.144,0.056],[-0.41,0.1],[-2.584,1.813],[-1.28,-1.834],[-0.111,-0.206],[0.406,-1.54],[0.28,0.576]],"v":[[58.462,-160.873],[65.125,-158.758],[66.684,-159.461],[67.511,-160.019],[67.945,-159.848],[66.684,-159.461],[63.503,-154.417],[57.797,-157.441],[57.467,-158.059],[57.588,-162.59]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[2.019,-0.203],[1.848,1.224],[0.979,0.677],[0.668,0.287],[0.085,0.232],[0.382,0.604],[3.152,1.27],[0.544,4.318],[2.55,2.615],[0,0],[-1.086,3.211],[3.016,0.917],[1.605,3.901],[0,0.003],[-1.369,0.237],[-0.134,-0.385],[-2.91,-12.044],[-0.776,-0.561],[-4.493,-5.058],[-1.334,-0.655],[-1.389,-3.659],[-0.091,-0.245]],"o":[[-1.847,-1.226],[-0.005,-1.235],[-0.657,-0.321],[-0.084,-0.232],[0.504,-0.437],[-1.885,-2.146],[-2.966,-2.857],[-0.431,-3.362],[0,0],[-2.126,-1.468],[1.301,-3.024],[-3.297,-2.917],[0,0],[0.67,-1.565],[0.184,0.361],[6.125,10.035],[0.229,0.933],[5.65,4.112],[0.963,1.083],[-2.97,3.861],[0.093,0.263],[-2.088,0.607]],"v":[[-9.095,165.196],[-14.642,161.523],[-16.196,158.702],[-18.175,157.758],[-18.433,157.066],[-18.231,155.506],[-22.932,148.401],[-28.253,137.917],[-32.158,128.44],[-32.158,128.44],[-35.338,122.303],[-38.049,116.461],[-44.127,105.489],[-44.127,105.486],[-41.037,102.837],[-40.546,103.952],[-22.555,134.295],[-21.068,136.785],[-8.533,152.74],[-5.465,155.753],[-3.832,166.843],[-3.559,167.585]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[-1.611,0.833],[-2.113,1.572],[-0.011,0.004],[1.444,9.227],[-1.949,0.979],[-1.452,5.235],[-1.205,-0.651],[-4.261,3.828],[-1.263,0.803],[-0.064,-0.102],[-2.206,-0.692],[0.03,-0.378],[-5.151,-1.208],[-0.767,-0.452],[-0.467,0.059],[0.03,-0.127],[-1.628,0.466],[0.059,-0.628],[6.221,-0.498],[0.058,-3.047],[-2.229,-0.301],[-0.498,0.26],[-1.904,3.28],[-0.126,-0.064],[-1.598,0.955],[-0.054,0.758],[0,0],[-0.512,3.445],[0,0],[-0.487,1.3],[0.803,0.474],[1.709,0.909],[1.051,5.31],[-0.615,4.649],[-0.034,0.039],[-3.736,-3.599],[-2.427,1.091],[-0.07,-0.076],[-1.559,-0.503],[-0.899,-1.636],[-1.047,0.186],[-0.034,-0.256],[-1.297,-0.448],[-0.139,-0.02],[-0.027,-0.276],[0,0],[-0.999,-2.421],[0,0],[1.108,-0.057],[-0.083,-1.499],[-0.989,0.016],[-2.42,0.89],[-4.521,6.094],[-0.582,0.696],[-0.485,0.149],[-0.209,0.003],[1.303,1.458],[1.388,-0.047],[0.247,0.085],[0.344,1.099],[-0.115,0.437],[0,0.003],[-0.003,-0.003],[-4.402,-0.406],[-3.696,-5.259],[-0.385,-0.139],[-2.098,0.334],[-0.023,-0.097],[-8.01,-2.744],[-1.77,1.139],[-0.63,0.44],[-2.018,-2.544],[-0.091,-1.878],[-0.222,-0.482],[0.301,-0.402],[0.104,-0.517],[-0.023,-0.642],[0.47,-0.164],[-0.034,-0.892],[-0.07,-0.18],[0.831,-2.62],[-0.003,-0.054],[0.615,-0.059],[3.769,-1.769],[5.721,0.761],[2.154,-0.758],[0.06,-0.102],[3.676,1.63],[2.718,-0.603],[2.103,-3.244],[1.166,0.107],[-0.016,0.057],[1.988,1.048],[1.886,1.985],[4.131,0.57],[1.834,1.419],[1.213,-0.773],[0.02,-0.177],[0.928,0.318],[0.218,0.508],[-0.088,0.127],[-1.262,0.764],[0.092,1.911],[0.298,2.018],[2.657,0.046],[1.323,-1.104],[5.808,0.145],[4.091,-2.217],[7.579,1.333],[0,0]],"o":[[2.34,-0.055],[0.008,-0.006],[6.339,-3.243],[-0.341,-2.19],[4.754,-2.396],[0.447,-1.605],[6.806,3.662],[1.155,-1.247],[0.038,0.107],[1.46,1.238],[0.768,0.07],[1.181,5.686],[0.766,0.451],[0.466,-0.065],[-0.034,0.112],[0.248,1.67],[-0.321,0.486],[1.331,3.842],[-2.368,0.19],[0.314,2.527],[0.493,-0.291],[2.456,0.85],[0.123,0.054],[1.885,-0.534],[0.057,-0.76],[0,0],[2.081,-3.217],[0,0],[1.063,-0.279],[0.408,-1.091],[-1.668,-0.984],[-2.968,-3.323],[-2.772,-2.806],[0.032,-0.039],[3.051,4.341],[2.424,0.062],[0.066,0.078],[1.276,1.041],[-0.368,1.915],[0.798,0.638],[0.046,0.251],[0.357,1.338],[0.139,0.031],[0.026,0.271],[0,0],[-0.497,3.113],[0,0],[-1.104,0.053],[0.084,1.498],[0.988,-0.014],[0.416,1.976],[4.432,5.832],[0.542,-0.729],[0.485,-0.148],[0.203,0.027],[1.449,-1.446],[-1.389,0.047],[-0.23,-0.122],[-0.345,-1.097],[0.115,-0.44],[0,-0.003],[0,0.003],[3.945,-0.73],[-2.902,4.527],[0.383,0.134],[-0.168,1.234],[0.026,0.097],[6.16,9.39],[1.782,0.611],[0.65,-0.42],[2.869,-2.015],[-2.336,1.185],[0.378,0.528],[-0.305,0.402],[-0.349,0.39],[0.02,0.645],[-0.364,0.196],[-0.571,0.665],[0.081,0.175],[-2.24,1.809],[0.003,0.053],[-0.613,0.055],[-4.027,0.405],[-6.048,2.836],[-2.042,-0.274],[-0.073,0.102],[-3.675,-1.638],[-2.72,-2.133],[-3.403,2.794],[-0.918,0.868],[0.02,-0.053],[-0.621,-2.811],[-2.199,-1.156],[-2.232,-4.026],[-2.065,-0.284],[-1.066,-0.812],[-0.037,0.195],[-0.929,-0.321],[-0.219,-0.509],[0.085,-0.126],[-0.144,-1.586],[1.259,-1.353],[-0.249,-2.031],[-1.116,-2.459],[-1.873,0.022],[-5.796,-0.195],[-4.63,-0.114],[-6.651,3.599],[0,0],[-3.783,-2.584]],"v":[[-201.566,62.709],[-194.681,61.622],[-194.655,61.608],[-183.507,45.949],[-180.181,40.758],[-170.687,29.554],[-167.799,27.419],[-152.89,22.353],[-148.702,21.522],[-148.572,21.84],[-145.009,26.319],[-144.486,27.273],[-134.181,36.711],[-131.879,38.065],[-130.483,37.875],[-130.585,38.214],[-128.112,40.538],[-128.689,42.202],[-132.312,50.08],[-136.83,55.238],[-132.614,59.013],[-131.128,58.178],[-124.193,57.479],[-123.824,57.651],[-119.271,54.426],[-119.103,52.147],[-119.337,51.87],[-117.907,41.525],[-117.911,41.525],[-114.869,40.42],[-116.404,38.211],[-121.52,35.461],[-130.877,25.963],[-136.711,16.196],[-136.612,16.074],[-125.442,26.945],[-118.188,27.941],[-117.982,28.172],[-113.845,30.7],[-111.917,35.777],[-109.302,36.953],[-109.169,37.714],[-106.71,40.417],[-106.296,40.482],[-106.216,41.3],[-106.216,41.3],[-103.035,48.467],[-103.035,48.467],[-106.357,48.631],[-106.11,53.128],[-103.145,53.081],[-99.585,55.694],[-90.636,55.43],[-88.891,53.342],[-87.434,52.895],[-86.822,52.931],[-86.808,48.574],[-90.976,48.715],[-91.689,48.411],[-92.718,45.108],[-92.371,43.79],[-92.371,43.785],[-92.368,43.79],[-81.592,38.933],[-80.377,54.881],[-79.229,55.302],[-76.788,56.965],[-76.71,57.257],[-52.36,64.331],[-46.798,63.699],[-46.333,63.351],[-39.024,64.139],[-39.642,69.508],[-38.749,71.019],[-39.653,72.228],[-40.336,73.588],[-40.267,75.519],[-41.517,76.057],[-42.337,78.395],[-42.119,78.927],[-45.435,86.313],[-45.422,86.477],[-47.266,86.651],[-58.981,85.35],[-76.231,84.787],[-82.382,84.095],[-82.566,84.399],[-93.591,79.497],[-101.744,79.508],[-105.271,90.199],[-108.457,91.09],[-108.39,90.932],[-113.533,86.784],[-120.418,84.2],[-130.54,78.38],[-136.647,77.044],[-140.045,76.711],[-140.12,77.255],[-142.905,76.291],[-143.561,74.77],[-143.301,74.392],[-141.42,70.987],[-139.529,66.158],[-139.967,60.053],[-145.607,56.263],[-150.687,57.382],[-168.093,58.274],[-181.952,61.6],[-202.708,66.412],[-202.708,66.412]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-1.116,3.287],[-0.344,0.171],[-1.207,1.991],[0.318,2.654],[-0.707,2.084],[-0.673,0.718],[5.35,5.919],[0.21,1.62],[-2.657,4.037],[-1.909,2.382],[-0.008,0.005],[0,0],[-0.238,-0.085],[-0.011,0.762],[-3.676,3.086],[-0.295,-1.163],[-0.144,-0.482],[1.821,-1.878],[-2.039,-8.125],[-3.893,1.121],[-4.719,3.957],[0.33,-1.953],[5.02,-5.165],[0.073,-0.259],[-3.032,-5.406],[-2.358,-4.092],[-0.176,-0.314],[-0.062,-0.051],[2.156,0.831],[6.284,-4.668],[2.378,-0.054],[-0.382,0.781]],"o":[[0.302,-0.138],[2.953,-0.811],[1.253,-1.586],[-0.255,-2.098],[0.361,-0.94],[5.4,-5.754],[-1.156,-1.281],[-0.64,-4.967],[1.909,-2.383],[0.011,-0.006],[0,0],[0.177,0.107],[0.781,-0.149],[0.069,-5.266],[0.276,1.173],[0.039,0.486],[0.628,3.093],[-5.884,6.076],[1.032,4.123],[5.479,-1.58],[0.846,1.802],[-5.823,-1.471],[-0.099,0.259],[-3.071,2.233],[-4.573,5.976],[0.069,0.309],[0.066,0.051],[-1.594,1.491],[-8.455,-3.258],[-1.886,-1.498],[0.38,-0.781],[0.879,-3.651]],"v":[[-133.233,-45.102],[-132.261,-45.565],[-126.05,-49.778],[-124.521,-55.992],[-123.943,-62.386],[-122.303,-64.802],[-122.196,-77.796],[-123.883,-82.015],[-120.423,-95.355],[-114.695,-102.503],[-114.664,-102.52],[-114.664,-102.52],[-114.048,-102.227],[-112.273,-103.47],[-105.785,-115.441],[-104.018,-112.477],[-103.792,-111.005],[-106.7,-103.64],[-111.81,-82.533],[-100.901,-72.481],[-84.436,-77.663],[-83.989,-71.987],[-100.637,-69.66],[-100.888,-68.883],[-105.265,-59.672],[-108.594,-44.484],[-108.231,-43.553],[-108.041,-43.4],[-113.651,-42.339],[-134.728,-36.408],[-141.209,-38.32],[-140.065,-40.663]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0.003,0],[0,0],[-0.003,-0.003]],"o":[[0,-0.003],[0.003,0.003],[-0.003,0]],"v":[[310.8,75.721],[310.8,75.715],[310.806,75.721]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0.01,0.008],[0,0],[-0.005,-0.005],[0.003,-0.003]],"o":[[0,0],[0.009,0.008],[0,0.003],[-0.008,-0.011]],"v":[[-185.481,178.021],[-185.478,178.021],[-185.455,178.05],[-185.458,178.055]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[-0.011,0.005],[0,-0.026],[0,0],[0,0],[0.011,0.018]],"o":[[0.003,0.023],[0,0],[0,0],[-0.012,-0.018],[0.008,-0.003]],"v":[[-99.502,344.448],[-99.498,344.516],[-99.498,344.516],[-99.498,344.516],[-99.533,344.462]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[-0.108,-0.217],[0.471,0.573],[0.233,0.213],[0.886,0.39],[1.429,-0.141],[-1.49,-0.653],[-0.849,-0.764],[-0.754,-0.144]],"o":[[-0.658,0.102],[-0.222,-0.274],[-0.911,-0.44],[-1.575,-0.307],[1.639,-1.078],[0.925,0.18],[0.707,0.344],[0.066,0.234]],"v":[[-49.604,-113.833],[-51.367,-114.558],[-52.056,-115.276],[-54.738,-116.618],[-59.361,-116.48],[-54.738,-116.618],[-52.056,-115.276],[-49.866,-114.513]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[0.139,-0.083],[-0.154,0.068]],"o":[[0.149,-0.083],[-0.154,0.074]],"v":[[-36.011,3.559],[-35.554,3.341]],"c":true},"ix":2},"nm":"Path 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[-0.061,0.01],[-0.003,-0.001],[0.066,-0.008]],"o":[[0.001,0],[-0.062,0.007],[0.06,-0.01]],"v":[[-32.657,-59.234],[-32.646,-59.228],[-32.83,-59.219]],"c":true},"ix":2},"nm":"Path 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[0.007,-0.003],[0.003,0.003],[0,0],[0,-0.005]],"o":[[-0.005,0],[0,0],[0.006,0.005],[-0.008,0.005]],"v":[[-27.527,88.936],[-27.538,88.93],[-27.511,88.902],[-27.503,88.918]],"c":true},"ix":2},"nm":"Path 14","mn":"ADBE Vector Shape - Group","hd":false},{"ind":14,"ty":"sh","ix":15,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.026,0],[0.032,-0.027],[-0.009,0.019]],"o":[[0,0],[0.011,0.016],[0.028,-0.003],[-0.032,0.019],[0.008,-0.019],[0,0]],"v":[[-28.811,89.04],[-28.811,89.037],[-28.785,89.077],[-28.707,89.071],[-28.813,89.129],[-28.785,89.077]],"c":true},"ix":2},"nm":"Path 15","mn":"ADBE Vector Shape - Group","hd":false},{"ind":15,"ty":"sh","ix":16,"ks":{"a":0,"k":{"i":[[-0.018,-0.001],[0,0],[0.008,-0.022],[0.008,0.026]],"o":[[0,0],[-0.01,0.023],[-0.008,-0.024],[0.013,0.003]],"v":[[-71.66,-97.691],[-71.66,-97.691],[-71.683,-97.626],[-71.704,-97.702]],"c":true},"ix":2},"nm":"Path 16","mn":"ADBE Vector Shape - Group","hd":false},{"ind":16,"ty":"sh","ix":17,"ks":{"a":0,"k":{"i":[[0.177,-0.039],[0.104,0.042],[-0.173,0.068],[0.008,0.013],[-0.158,-0.039],[-0.049,-0.084],[0.028,-0.003],[0.072,-0.023]],"o":[[-0.106,-0.045],[0.173,-0.042],[-0.005,-0.012],[-0.168,-0.31],[0.049,0.088],[-0.023,0.005],[-0.068,0.031],[0.043,0.123]],"v":[[-95.533,34.766],[-95.851,34.646],[-95.331,34.508],[-95.339,34.477],[-95.207,34.154],[-95.06,34.414],[-95.12,34.435],[-95.331,34.508]],"c":true},"ix":2},"nm":"Path 17","mn":"ADBE Vector Shape - Group","hd":false},{"ind":17,"ty":"sh","ix":18,"ks":{"a":0,"k":{"i":[[2.527,-1.28],[0.267,1.108],[-1.144,0.263],[-0.364,0.852],[-2.1,1.244],[0.589,-2.386]],"o":[[-0.267,-1.108],[1.143,-0.232],[0.871,-0.437],[2.811,1.19],[-2.084,1.297],[-2.77,-0.317]],"v":[[-47.475,12.071],[-48.274,8.747],[-44.841,7.984],[-42.88,6.145],[-36.207,3.677],[-39.671,9.604]],"c":true},"ix":2},"nm":"Path 18","mn":"ADBE Vector Shape - Group","hd":false},{"ind":18,"ty":"sh","ix":19,"ks":{"a":0,"k":{"i":[[2.326,-0.569],[2.464,5.289],[0.217,1.67],[2.272,3.953],[0.753,-0.057],[1.62,3.556],[-3.727,2.745],[-0.019,0.055],[-3.113,-1.19],[-7.056,-8.008],[-0.68,-1.657],[-1.373,-0.446],[-2.937,-5.949]],"o":[[-5.159,1.258],[0.677,-1.331],[1.93,-5.086],[-0.696,-0.516],[-0.023,-4.294],[-1.992,-4.385],[0.018,-0.055],[2.945,0.789],[-5.583,9.238],[1.164,1.323],[0.601,1.473],[1.77,6.553],[0.116,2.49]],"v":[[29.439,56.595],[15.329,48.478],[16.1,44.011],[12.809,31.195],[10.654,30.33],[5.95,19.415],[7.881,9.355],[7.94,9.19],[16.648,7.13],[18.286,26.251],[21.18,30.589],[24.056,33.625],[32.894,51.476]],"c":true},"ix":2},"nm":"Path 19","mn":"ADBE Vector Shape - Group","hd":false},{"ind":19,"ty":"sh","ix":20,"ks":{"a":0,"k":{"i":[[5.909,-2.578],[3.184,-1.656],[1.664,2.897],[-0.902,1.963],[-0.374,0.81],[1.932,1.4],[-0.264,0.271],[-0.182,0.508],[-0.199,0.865],[-0.735,1.217],[-3.293,-2.581],[-0.175,-0.065],[0.022,-0.177],[-0.563,-0.414],[0,0],[0,0],[0.13,-0.341],[-4.339,3.307],[-0.043,-0.065],[-0.673,0.646],[-2.567,-1.178],[-1.068,-0.649],[-4.329,-5.037],[0.253,-0.693],[1.165,-0.428],[4.804,2.149]],"o":[[-3.267,1.461],[-2.478,0.014],[-0.906,-1.966],[0.378,-0.81],[0.815,-1.729],[0.265,-0.276],[0.376,-0.456],[0.515,-0.565],[1.999,0.942],[2.131,-3.532],[0.183,0.054],[-0.024,0.175],[0.566,0.412],[0,0],[0,0],[-0.064,0.362],[3.166,6.834],[0.039,0.065],[0.826,0.393],[2.638,-1.45],[0.697,0.802],[5.652,3.444],[-0.038,0.57],[-1.22,0.085],[-5.069,0.609],[-5.562,-2.485]],"v":[[-56.802,30.617],[-66.388,35.498],[-72.809,31.836],[-72.809,25.944],[-71.683,23.515],[-71.995,18.663],[-71.198,17.84],[-70.361,16.393],[-69.309,14.232],[-66.234,11.502],[-58.273,9.815],[-57.734,9.993],[-57.803,10.521],[-56.109,11.761],[-56.107,11.761],[-56.107,11.761],[-56.396,12.813],[-48.462,16.592],[-48.356,16.782],[-46.108,16.444],[-38.561,16.483],[-35.892,18.647],[-20.681,31.097],[-21.129,32.987],[-24.742,33.5],[-39.374,31.275]],"c":true},"ix":2},"nm":"Path 20","mn":"ADBE Vector Shape - Group","hd":false},{"ind":20,"ty":"sh","ix":21,"ks":{"a":0,"k":{"i":[[0.099,-0.104],[-0.362,0.765],[-0.715,2.416],[-0.046,0.421],[0.588,1.469],[-0.808,-0.642],[-0.022,-0.167],[-0.02,-0.056],[0.441,-1.194],[0.066,-0.215],[1.086,-2.298],[0.608,-0.708]],"o":[[0.574,-0.674],[0.945,-2.377],[0.042,-0.429],[0.221,-2.034],[0.466,0.589],[0.02,0.169],[0.019,0.057],[-0.771,0.922],[-0.076,0.21],[-0.241,2.527],[-0.316,0.793],[-0.088,0.088]],"v":[[61.858,-136.661],[63.232,-138.833],[64.818,-146.287],[64.948,-147.562],[64.345,-152.843],[66.262,-151.002],[66.323,-150.499],[66.373,-150.333],[65.031,-146.926],[64.818,-146.287],[63.232,-138.833],[61.882,-136.571]],"c":true},"ix":2},"nm":"Path 21","mn":"ADBE Vector Shape - Group","hd":false},{"ind":21,"ty":"sh","ix":22,"ks":{"a":0,"k":{"i":[[-0.807,-3.649],[-1.399,-4.245],[-0.712,-1.1],[0.574,-4.915],[-1.324,-0.956],[-0.976,-0.487],[-1.391,-1.193],[-0.225,-0.16],[-1.304,-1.701],[0,0],[0.001,-0.076],[-0.242,-1.433],[-0.488,-0.288],[-0.344,-0.125],[-5.449,-1.576],[0.567,1.506],[-0.028,0.956],[0,0],[1.128,-0.037],[1.167,2.823],[1.564,1.207],[0,0],[2.28,1.802],[-0.023,0.184],[1.901,2.264],[-1.429,3.142],[0.034,0.295],[-0.226,0.122],[-0.261,0.559],[-0.265,1.487],[-0.138,0.074],[-0.321,-0.539],[-0.542,-0.24],[-1.567,-0.244],[-3.629,-3.523],[-0.072,-1.182],[-0.573,0.325],[-0.108,0.118],[-1.744,0.383],[-0.022,1.913],[0.944,10.711],[0.494,0.431],[-0.004,0.394],[0,0],[3.534,2.829],[0.348,3.396],[-1.645,2.172],[0.111,1.036],[-0.474,0.199],[-2.643,-3.472],[-1.381,1.467],[-1.609,0.758],[-0.494,0.226],[-1.618,1.036],[-1.691,0.232],[-4.585,5.144],[-2.095,3.047],[-1.703,3.467],[2.53,4.066],[0.073,1.768],[0.241,1.242],[-0.012,0.817],[0.119,-0.008],[0.012,0.325],[1.752,3.587],[2.276,-0.336],[0,0],[-1.448,1.813],[-3.936,0.745],[0.037,1.759],[1.407,0.049],[4.088,-3.545],[1.492,1.274],[-0.956,0.748],[-4.453,1.698],[-1.905,-1.334],[-1.262,0.226],[-2.595,2.039],[-0.089,-0.12],[-0.187,-2.248],[-4.186,1.261],[-0.481,0.454],[2.348,-3.207],[0.291,-2.826],[-2.102,-0.682],[-0.925,2.14],[0.034,0.301],[-0.157,0.107],[0.655,4.438],[0,0],[0,0],[-0.295,0.011],[0.206,0.516],[0.436,1.109],[0.381,0.562],[-0.079,0.077],[0.494,0.466],[0,0],[2.941,0.883],[0,0],[0.55,0.742],[0.449,0.945],[0.45,0.341],[0.123,0.107],[-0.752,2.795],[0.115,0.102],[-0.004,1.839],[-6.347,0.454],[-0.5,5.495],[-0.636,1.477],[1.678,14.476],[0.21,0.594],[1.433,4.343],[-0.033,-0.052],[-1.319,-0.896],[-0.318,-0.118],[-3.097,-3.1],[0.16,-0.314],[0.435,-3.068],[-0.234,-0.526],[-1.862,-1.808],[-0.256,-0.096],[-0.413,1.41],[-1.774,-1.653],[-0.273,0.028],[0.221,1.591],[1.523,0.626],[1.647,3.857],[0.068,0.357],[0,0],[-0.001,0],[-0.516,0.301],[0.98,2.026],[3.138,9.498],[1.829,1.555],[0.385,1.163],[-1.003,-2.729],[-0.802,-0.018],[0.309,-1.326],[2.995,1.481],[1.842,-0.764],[1.215,-0.798],[0.371,-0.257],[-0.156,2.279],[-0.455,1.075],[0.318,0.153],[0.737,-1.357],[0.173,-0.175],[0.064,0.054],[-0.409,2.177],[-1.16,7.173],[-10.416,2.261],[-0.157,0.225],[-0.409,0.379],[-0.754,0.276],[-0.772,1.35],[-0.404,0.459],[-3.725,-1.453],[-0.963,-0.196],[-2.554,0.386],[-2.512,-0.18],[0,0],[-0.103,-0.337],[0,0],[0,0],[5.675,0.762],[0.141,1.23],[-0.042,0.345],[-0.023,0.066],[-0.127,2.156],[0.139,1.649],[0.045,0.218],[-0.007,0.152],[-0.628,1.479],[-3.273,-1.667],[-0.608,-0.663],[-1.526,-0.271],[-0.238,1.242],[-0.576,0.645],[-0.571,1.301],[-0.937,0],[0.035,-0.394],[0.477,-1.395],[0.692,-7.284],[3.383,-3.274],[-0.008,-0.259],[1.077,-2.578],[-0.994,-3.453],[-2.554,-4.171],[-4.011,-6.665],[-2.329,0.473],[-0.402,2.133],[-1.285,3.606],[2.779,2.398],[0,0],[-3.205,1.714],[1.959,2.708],[-4.146,3.303],[-0.036,0.854],[1.383,0.15],[0.003,0],[0,0],[-0.8,3.858],[3.93,-1.915],[0,0],[0.099,2.058],[1.051,3.217],[-2.828,1.427],[-0.088,0.126],[-0.445,-0.233],[-0.501,1.487],[-0.647,-0.008],[-1.014,-0.041],[0,1.133],[0,0],[-5.72,-3.465],[-1.605,0.334],[-7.3,9.258],[-0.962,3.635],[2.918,1.709],[1.587,2.631],[0.198,0.533],[-1.481,3.857],[0.004,0],[6.409,5.404],[-1.336,1.748],[-0.94,-0.585],[-1.793,0.026],[-4.432,-1.916],[-3.111,1.82],[0,0],[-1.083,0.868],[0.111,1.519],[1.449,0.421],[0.177,0.118],[3.01,1.369],[0.003,0],[-0.234,1.397],[2.631,2.707],[0,0],[3.541,0.288],[0,0],[2.336,0.708],[0.968,-2.901],[1.135,0.421],[2.135,-2.58],[-0.004,-0.001],[0,0],[2.543,0.326],[4.76,1.236],[8.932,-4.175],[2.573,0.688],[-2.045,-2.011],[1.722,-3.863],[3.49,2.098],[0.367,0.509],[3.797,-1.129],[-0.148,-0.374],[0.056,-0.05],[4.058,-0.097],[1.693,-1.355],[-0.024,0.009],[0,0],[-0.007,0.004],[1.572,-1.174],[2.631,4.89],[1.209,0.712],[0.368,0.404],[5.423,-4.199],[4.473,5.058],[0.917,2.928],[4.796,-2.159],[0,0],[1.188,-0.149],[2.914,-1.374],[0,0],[0.232,-7.153],[-0.2,-2.077],[-1.086,0.643],[0,0],[8.845,-2.674],[1.904,-0.299],[0,0],[1.307,-0.301],[2.544,-0.594],[0.144,-0.096],[0.517,-0.431],[-0.536,-0.766],[0.05,-0.423],[-0.904,-2.237],[5.945,1.767],[0.061,0.605],[-0.043,1.693],[2.113,0.255],[0,0],[0.198,0.322],[0.746,1.479],[4.325,-4.347],[0,0],[1.836,-0.004],[-0.727,-3.593],[3.027,-1.448],[3.553,3.098],[0.493,-0.046],[0.849,0.142],[0.326,0.133],[0.053,1.991],[4.274,-0.78],[4.132,1.378],[-0.536,-4.567],[-0.29,-0.767],[-0.003,0],[0,0],[3.996,-0.186],[0.315,0.414],[0,0],[0,0],[-3.008,9.428],[1.148,1.272],[0.091,0.375],[0,0],[5.807,2.783],[0,0],[1.521,-0.827],[0.849,-0.585],[0,0.001],[1.58,0.315],[0,0],[0,0],[0.666,-0.16],[0.425,5.946],[2.108,0.173],[0.414,-1.815],[-3.724,-3.965],[-0.015,-1.228],[-0.003,0],[0,-0.001],[0.815,-0.054],[0.223,-0.704],[0.145,-0.395],[0,0],[0.473,-0.39],[0,-0.001],[3.005,5.111],[2.046,-2.306],[0.12,-1.464],[0,-0.001],[1.721,-1.511],[0.244,-7.916],[-1.098,-0.38],[0,0],[-0.819,-0.459],[0,0],[0.626,-1.522],[0.753,-0.077],[3.687,-1.093],[-1.315,-3.533],[-3.709,-3.07],[1.674,-0.108],[0.233,0.088],[4.429,-1.278],[1.303,0.096],[-1.693,-1.484],[0.779,-0.45],[0.008,-0.386],[0,0],[0.001,-0.001],[0.099,0.103],[1.11,0.394],[0.498,0.773],[0.854,-1.8],[0,0],[0.328,-0.019],[-3.225,-3.158],[-0.18,-0.222],[0.213,0.127],[0.777,5.163],[0.739,0.821],[2.91,-0.412],[-0.232,-1.848],[-0.031,-0.387],[-0.19,-0.971],[-0.047,-0.918],[0.479,-2.657],[0.026,-0.062],[-0.034,-0.596],[0.087,-1.224],[-0.161,-2.433],[-3.579,-1.731],[-0.008,-0.007],[4.74,2.206],[2.811,-1.406],[2.251,2.689],[-2.283,-1.541],[-1.921,-1.075],[-0.176,-0.329],[4.599,1.297],[0.514,-0.257],[0.374,-0.222],[0.594,0.005],[1.697,0.976],[3.425,-1.782],[0.552,-0.588],[0.598,-0.275],[0.344,-0.44],[0.176,-0.406],[0.603,-0.371],[0.753,-0.423],[0.711,-1.93],[1.805,1.021],[-0.329,1.628],[0.003,0],[0,0],[0,0],[4.402,-0.418],[-0.915,-3.134],[-0.222,-1.58],[-0.355,-0.456],[-0.031,-0.039],[0.032,-0.042],[-0.362,-0.325],[2.386,0.054],[0.202,4.087],[1.618,0.813],[0.038,-0.015],[0.088,0.073],[0.563,0.596],[3.483,3.1],[5.932,-0.571],[2.164,6.149],[0,0],[5.104,-1.989],[3.096,-3.499],[0,0],[0.003,-0.003],[0,0],[0.502,-0.301],[0.5,-0.32],[1.406,-0.279],[3.074,-1.634],[0.692,-0.741],[1.033,-1.301],[1.362,-0.229],[-1.106,-3.477],[-0.085,-0.638],[-0.171,-1.009],[1.637,-1.047],[-0.726,-1.198],[-0.114,-0.077],[0,0],[0.232,-0.121],[4.607,-3.434],[0.623,-1.28],[4.335,-3.542],[-2.306,-6.346],[0.118,-3.965],[-6.062,1.783],[-2.539,2.613],[-0.852,-2.71],[-1.636,-0.779],[-0.023,-0.077],[-0.211,-0.539],[-0.36,-0.589],[0.027,-0.6],[1.099,-1.086],[0.45,0.129],[0.214,-0.073],[-0.062,0.219],[0.978,3.047],[2.007,-0.479],[-2.674,-5.847],[-0.013,-0.024],[0.165,-0.015],[-0.932,-1.477],[0,0],[-0.053,-0.49],[0.861,-0.844],[0.232,-0.081],[2.007,-6.069],[4.382,-0.961],[-0.67,1.652],[2.31,1.293],[1.124,0.624],[0.034,0.416],[1.816,1.239],[0,0],[-0.018,5.31],[2.886,3.173],[3.522,-1.743],[-1.205,-4.66],[7.166,-1.587],[0.175,-0.352],[1.171,-1.189],[0.05,-2.841],[1.354,-2.295],[0,0],[-4.268,-0.781],[-1.533,0.062],[-2.05,0.853],[2.354,4.06],[-0.175,1.686],[-1.682,1.351],[-0.066,0.186],[-0.543,-0.26],[-0.003,0.004],[-0.795,-0.746],[0,0],[0.716,0.011],[-0.188,-0.41],[0.853,-0.891],[0.443,-0.542],[-1.067,-1.102],[0,0],[0,-0.001],[-0.095,-0.083],[0.035,-0.037],[0.103,-0.619],[0.003,-0.362],[-0.418,-1.909],[-0.666,0.028],[0.005,-2.014],[1.075,-0.754],[-1.324,-0.252],[-0.385,-0.406],[-1.119,0.164],[-1.04,0.295],[-1.209,0.497],[1.471,-0.416],[1.089,-0.164],[0.542,-1.487],[0.02,-0.387],[0,0],[-1.132,-2.378],[-0.822,0.273],[-0.769,-0.039],[2.497,-5.881],[0,0],[2.819,0.482],[6.447,0.176],[-1.251,-4.047],[1.102,-3.372],[-0.914,-1.467],[0.638,-0.039],[0.023,-0.367],[-0.749,-1.596],[-2.684,-1.477],[-1.556,-0.367],[-0.742,-3.18],[0,0],[0,0],[0.042,-1.171],[-0.035,-0.275],[0.26,-0.257],[1.905,-0.753],[0.585,-5.937],[6.563,-2.544],[-1.393,-2.279],[0.963,-4.657],[0,0],[0.13,-0.689],[3.496,-3.12],[-0.865,-1.743],[-0.36,-0.398],[-0.378,-0.042],[-0.02,-0.226],[1.328,-5.318],[-0.104,-0.467],[-2.127,-4.531],[-0.15,-0.902],[0.046,-0.305],[-0.813,-1.007],[0,0],[-0.012,-0.84],[-2.218,0.014],[-3.677,-2.576],[-0.043,-1.156],[-0.393,-0.383],[-0.032,-0.44],[0,0],[-3.647,-0.956],[-0.406,-0.191],[-1.564,-0.776],[0,0],[0,0],[-2.168,-1.323],[0,0],[0,0],[-2.112,1.077],[-6.09,-1.156],[0,0.003],[-3.942,2.565],[-5.958,-2.25],[0,0],[-0.417,-0.821],[-0.558,-1.074],[0,0],[-3.955,1.005],[0,0],[-1.081,-0.417],[0.527,-3.766],[-0.007,-0.037],[0.336,-0.533],[0.107,-0.81],[-0.481,-0.02],[-8.822,-5.763],[-0.367,-0.445],[0,-0.003],[-0.248,-0.293],[-0.005,0],[0,-0.003],[-0.146,-0.737],[-0.624,-0.409],[0,0.003],[0,0],[-2.14,-1.82],[0,0],[-2.1,-5.427],[2.349,-2.341],[0.248,-7.189],[-1.485,-2.547],[-0.937,-7.016],[-7.77,-8.623],[-0.072,0.2],[0,0],[-0.115,-0.034],[0.153,-0.184],[0.11,-6.744],[-5.36,1.089],[-4.519,-0.471],[-5.621,4.118],[-6.52,6.975],[0.519,2.934],[-1.044,2.412],[-1.958,3.579],[2.299,3.839],[0,0],[0.135,0.386],[-0.349,1.779],[0.003,-0.003],[0,0],[-2.563,2.07],[-0.802,1.649],[0,0],[-0.543,0.539],[0,0],[0,0],[-0.012,8.503],[-0.143,3.72],[2.318,1.334],[1.289,4.305],[-1.801,4.037],[-2.455,4.425],[0,0],[-0.08,0.375],[-7.348,2.897],[-0.799,0.691],[0.429,0.527],[-0.119,0.221],[-0.364,0.122],[-0.389,0.397],[-0.668,0.699],[-0.326,0.042],[-1.063,1.693],[-0.446,-0.028],[-1.578,3.54],[0.19,0.333],[-0.142,0.104],[-0.859,2.714],[2.191,3.19],[3.073,-0.214],[8.345,2.373],[-0.03,0.245],[0.284,0.313],[-1.569,0.706],[-1.811,0.465],[-3.954,1.993],[-0.031,2.841],[0.064,0.157],[0.06,0.078],[0,0],[0.018,0.007],[0.009,0.015],[0,0.034],[-0.064,-0.164],[-0.225,-0.16],[-3.523,1.915],[-2.237,2.331],[0,0],[-3.515,3.336],[-2.133,0.825],[-2.066,2.378],[6.161,6.603],[-0.004,0.003],[2.574,0.485],[1.231,1.969],[0,0],[0,0],[-0.061,0.428],[2.194,0.497],[0.241,-1.066],[0,0],[1.476,-1.308],[0.424,-1.139],[1.128,-0.46],[2.802,1.816],[0,0],[0.391,1.597],[0,0],[-0.362,0.364],[1.324,0.192],[0.238,-0.872],[0.929,0.548],[3.346,1.774],[0,0],[0.857,1.559],[1.077,0.922],[0,0],[0,0.003],[-0.309,1.06],[-0.789,-0.013],[-1.383,-2.205],[-3.67,-2.813],[-0.879,-0.224],[-1.113,-0.167],[-1.492,0.362],[-1.147,-0.37],[-1.885,-1.339],[-6.972,1.368],[-0.627,-0.474],[-1.556,0.046],[-4.902,-7.687],[-1.555,1.15],[-1.11,-2.922],[-7.365,2.975],[-0.408,-1.495],[-0.819,-2.513],[-6.512,-14.625],[-3.354,2.93],[-1.301,3.18],[-0.007,0.054],[-0.141,1.503],[-6.411,8.54],[-1.373,1.354],[-9.085,3.303],[-1.471,-0.046],[-2.227,0.055],[-1.647,-1.794],[0.52,-8.358],[-0.764,-0.62],[-2.417,0.857]],"o":[[0.984,4.44],[0.58,1.308],[-0.074,4.942],[0.037,1.676],[0.967,0.513],[0.808,1.69],[0.229,0.158],[0.378,2.02],[0,0],[-0.005,0.077],[-2.261,1.018],[0.019,0.576],[0.362,0.073],[3.352,4.434],[1.514,-1.515],[0.031,-0.956],[0,0],[-0.539,-0.895],[-0.289,-2.962],[-1.564,-1.208],[0,0],[-2.276,-1.806],[0.033,-0.169],[0.245,-3.384],[-2.322,-2.753],[-0.032,-0.297],[0.207,-0.096],[0.471,-0.383],[0.707,-1.378],[0.118,-0.099],[0.326,0.544],[0.419,0.42],[1.517,0.547],[3.625,3.522],[0.074,1.185],[0.475,0.46],[0.141,-0.115],[2.095,0.589],[0.578,-1.575],[9.253,-2.987],[-0.49,-0.425],[0.003,-0.393],[0,0],[-0.169,-4.948],[-5.716,-4.578],[1.175,-2.458],[0.678,-0.742],[0.422,0.37],[3.704,-1.555],[1.196,1.574],[1.173,-1.246],[0.517,-0.156],[1.625,-1.032],[1.393,-1.125],[7.145,-0.984],[2.593,-2.914],[1.104,-3.758],[1.94,-3.942],[-0.964,-1.549],[-0.603,-1.159],[0.011,-0.815],[-0.118,0.007],[-0.024,-0.328],[-1.942,-3.383],[-0.98,-2.011],[0,0],[-1.085,-1.504],[2.144,-2.693],[1.741,-0.326],[-0.03,-1.513],[-3.783,-0.127],[-1.72,1.49],[-1.089,-0.932],[3.352,-2.615],[1.07,1.919],[0.963,0.727],[2.681,-1.848],[0.091,0.12],[2.146,1.713],[0.338,4.076],[0.57,-0.345],[2.06,1.461],[-0.111,2.761],[-0.213,2.061],[2.127,0.695],[0.064,-0.329],[0.183,-0.019],[5.282,1.337],[0,0],[0,0],[0.288,0.064],[-0.207,-0.519],[-0.436,-1.114],[-0.379,-0.562],[0.079,-0.07],[0.363,-0.581],[0,0],[-0.138,-3.06],[0,0],[-0.139,-1.167],[-0.41,-0.971],[-0.325,-0.46],[-0.129,-0.096],[1.185,-2.555],[-0.118,-0.099],[1.205,-1.25],[0.008,-6.589],[4.872,-0.352],[1.53,-0.149],[5.575,-12.967],[-0.036,-0.63],[-3.716,-3.586],[0.034,0.05],[0.938,1.33],[0.303,0.158],[-0.696,4.539],[-0.2,0.234],[-0.546,3.089],[0.095,0.565],[1.018,2.29],[0.26,0.093],[0.758,0.237],[1.238,-4.213],[0.273,0.005],[2.053,-2.202],[-0.961,-1.255],[-4.443,-2.826],[0.073,-0.357],[0,0],[0,0],[0.515,-0.301],[1.232,-0.058],[-4.443,-8.767],[0.259,-2.876],[-0.383,-1.162],[-1.508,-0.024],[0.506,0.559],[-0.844,0.947],[-2.217,-2.528],[-1.935,-0.52],[-1.166,0.891],[-0.401,0.195],[-1.097,-1.567],[0.894,0.039],[0.15,-0.356],[-1.354,-0.666],[-0.171,0.175],[-0.062,-0.054],[-2.206,-2.153],[1.346,-7.131],[1.781,-11.005],[0.154,-0.229],[0.19,-0.831],[0.775,-0.227],[1.661,-0.062],[0.357,-0.626],[3.398,-2.008],[0.903,0.429],[-0.614,1.086],[2.301,-0.349],[0,0],[0.064,0.348],[0,0],[0,0],[-0.567,-1.456],[-1.441,-0.551],[0.024,-0.348],[0.018,-0.065],[0.764,-2.083],[0.28,-1.61],[-0.064,-0.229],[0.007,-0.154],[1.037,-1.208],[2.854,-2.267],[0.796,0.995],[0.755,1.617],[1.632,0.288],[0.47,-0.462],[0.049,-1.381],[0.538,-0.607],[0.018,0.38],[0.104,1.359],[-2.435,7.094],[-0.456,4.803],[0.133,0.219],[3.138,1.162],[-1.495,3.584],[1.379,4.784],[4.062,6.633],[0.967,1.609],[2.196,-0.447],[0.668,-3.554],[3.108,-0.845],[0,0],[-0.364,-3.098],[4.685,-2.508],[-2.072,-2.863],[0.773,0.414],[0.045,-1.12],[0,0],[0,0],[-0.129,-3.299],[1.016,-4.535],[0,0],[-2.5,-0.971],[-0.158,-3.334],[-1.095,-2.596],[0.092,-0.122],[0.44,0.234],[0.5,-1.486],[0.647,0.008],[0.031,0.961],[1.613,0.061],[0,0],[3.695,-5.842],[1.338,0.808],[-1.844,-12.259],[2.305,-0.913],[1.017,-3.831],[-2.762,-1.617],[-0.198,-0.532],[-0.947,-2.191],[0,0],[2.676,-8.425],[-1.534,-1.295],[1.98,-2.59],[1.483,0.93],[0.856,-3.014],[2.288,3.866],[0.003,0],[1.117,0.945],[1.281,0.026],[-0.137,-1.934],[-0.059,-0.209],[0.473,-3.013],[0,0],[-0.662,-1.07],[2.552,-1.621],[0,0],[0.687,-3.859],[0,0],[-2.339,-0.71],[-1.1,2.768],[-1.135,-0.422],[-1.926,-0.672],[0,0.001],[0,0],[-1.894,-2.589],[-4.916,-0.628],[-8.887,-2.306],[-2.232,1.045],[-4.148,3.717],[2.307,2.271],[-2.949,-2.994],[-0.395,-0.421],[-0.027,-2.061],[0.146,0.372],[-0.053,0.045],[-0.429,3.789],[-1.785,0.042],[0.024,-0.011],[0,0],[0.007,-0.005],[-1.748,0.757],[-4.593,3.442],[-0.678,-1.258],[-0.371,-0.404],[-6.569,-3.724],[-5.285,4.092],[-3.802,1.87],[-2.741,-8.755],[0,0],[-1.186,0.15],[-3.016,-0.561],[0,0],[-3.005,1.273],[-1.383,0.502],[0.118,1.179],[0,0.001],[1.054,3.257],[-1.892,0.303],[0.003,0.001],[-1.304,0.301],[-1.73,3.231],[-0.15,0.088],[-0.538,-0.515],[-1.005,0.837],[-0.148,0.347],[0.613,2.295],[-6.488,-0.5],[-0.058,-0.607],[1.068,0.295],[0.06,-2.257],[0,0],[-0.045,-0.379],[-0.746,-1.477],[-3.357,-1.633],[0,0.001],[-1.839,-0.552],[-2.287,0.007],[0.328,1.628],[-2.963,1.42],[-0.497,0.05],[-1.358,0.688],[-0.326,-0.142],[-0.869,-0.659],[-4.274,0.781],[-3.43,3.203],[-2.733,-0.911],[0.288,0.768],[0,0],[-0.003,0.001],[-1.655,3.039],[-0.315,-0.412],[0,0.001],[0,0],[3.709,-9.216],[-1.147,-1.273],[0.047,-0.383],[0,0],[-4.16,-5.358],[0,0],[-1.368,1.16],[-0.848,0.588],[0,0],[-2.903,1.427],[0,0],[0,0],[-0.738,-0.156],[-3.048,0.726],[-0.154,-2.167],[-2.164,-0.179],[-1.078,4.685],[0.018,1.231],[0,0],[0,0],[-0.812,0.055],[-0.221,0.703],[-0.144,0.394],[0,0],[-0.468,0.39],[0,0],[-1.885,1.469],[-0.594,-1.013],[-0.93,0.116],[0,0],[-1.052,2.325],[-5.204,4.562],[1.096,0.382],[0,0],[0.821,0.46],[0,0],[0.781,1.063],[-0.754,0.081],[-2.994,2.692],[-3.403,1.009],[1.988,5.331],[0.356,3.037],[-0.225,-0.095],[-3.375,-2.238],[-0.081,-1.461],[-0.917,1.473],[-0.779,0.451],[-0.008,0.383],[0,-0.001],[0,0.003],[-0.1,-0.104],[-1.109,-0.394],[-0.5,-0.773],[-0.248,2.095],[0,0],[-0.33,0.055],[-1.388,3.817],[0.207,0.207],[-0.157,-0.161],[-5.112,-3.063],[-0.482,-1.06],[-2.123,-2.367],[-1.517,0.214],[0.049,0.389],[-0.487,0.707],[0.188,0.945],[-0.299,2.683],[-0.024,0.062],[-0.222,0.562],[-0.19,1.212],[1.014,2.088],[0.261,4.064],[0.038,0.023],[-4.756,-2.149],[-3.035,-0.129],[-3.07,-0.611],[-2.849,1.458],[1.819,1.227],[-0.024,0.355],[2.321,4.378],[-0.532,-0.149],[-0.376,0.206],[-0.595,-0.004],[-2.572,0.621],[-4.622,-2.665],[-0.55,0.589],[-0.657,0.177],[-0.494,0.247],[-0.047,0.508],[-0.6,0.37],[-0.75,0.423],[-2.163,0.815],[-0.917,1.139],[-1.997,-1.125],[-0.003,0],[0,0],[0,0],[-0.163,-5.221],[-5.174,0.489],[0.437,1.504],[0.165,0.562],[0.03,0.039],[-0.031,0.036],[-0.176,0.236],[0.869,2.011],[-1.862,-0.042],[1.155,-2.049],[-0.035,0.016],[-0.085,-0.073],[0.294,-0.654],[-2.693,-4.264],[-4.302,-3.831],[-4.955,-1.649],[0,0],[-4.534,-1.468],[-3.613,-0.952],[0.003,0],[0,0],[0,0],[-0.479,0.34],[-0.509,0.305],[-1.292,0.623],[-2.137,3.555],[-0.787,0.612],[-1.36,0.989],[-0.994,0.733],[-3.112,1.839],[0.221,0.687],[-0.248,0.96],[-0.433,1.449],[-0.955,0.982],[0.116,0.104],[0,0],[-0.234,0.12],[-3.733,3.916],[-0.83,1.062],[-2.229,5.637],[-6.772,4.607],[1.393,3.833],[-0.19,6.431],[3.538,-1.04],[-0.251,2.845],[0.872,1.664],[0.026,0.076],[0.095,0.571],[0.44,0.737],[-0.027,0.6],[-1.606,0.055],[-0.424,0.031],[-0.242,0.024],[0.047,-0.222],[2.592,-3.151],[-0.58,-1.809],[-5.762,1.369],[0.015,0.024],[-0.152,0.004],[-1.101,1.637],[0,0],[0.394,0.665],[-0.592,1.035],[-0.218,0.088],[-4.525,2.114],[-1.553,4.714],[-1.025,-1.766],[0.917,-2.24],[-0.848,-1.362],[-0.035,-0.414],[1.786,-2.123],[0,0],[-2.966,-4.348],[0.018,-4.337],[-1.815,-1.996],[-3.553,1.755],[1.79,6.902],[-0.233,0.052],[-1.17,1.189],[-2.612,0.598],[-0.045,2.305],[0,0],[-2.177,4.494],[1.583,0.288],[1.819,-1.555],[3.328,-1.381],[2.387,0.108],[0.245,-2.391],[0.095,-0.177],[0.542,0.259],[0,0],[0.795,0.746],[0,0],[-0.711,-0.012],[0.187,0.409],[-1.169,0.38],[-0.441,0.54],[-1.46,1.144],[0,0],[0,0],[0.089,0.081],[-0.038,0.035],[-0.357,0.506],[-0.007,0.361],[-1.121,0.443],[0.668,-0.029],[0.84,2.148],[-1.078,0.753],[-1.036,2.6],[0.389,0.409],[1.311,0.597],[0.953,-0.516],[1.311,-0.687],[-0.876,1.154],[-0.967,0.508],[-1.066,0.573],[-0.034,0.38],[0,0],[-1.591,2.443],[0.819,0.635],[0.657,0.404],[6.836,5.625],[0,0],[-0.976,4.439],[-6.428,-1.097],[-2.947,2.716],[1.078,3.487],[-0.309,1.616],[-0.632,0.039],[-0.003,0.37],[0.749,1.597],[-2.152,2.546],[1.559,0.366],[3.106,0.139],[0,0],[0,0],[-0.042,1.169],[0.039,0.272],[-0.181,0.303],[-0.534,2.095],[-6.014,2.378],[-0.777,7.968],[-2.39,0.925],[-3.327,2.883],[-0.003,0],[-0.133,0.685],[-5.143,1.824],[-0.506,1.477],[0.357,0.398],[0.32,0.385],[0.02,0.21],[-0.909,5.349],[-0.008,0.498],[-1.266,3.893],[0.84,0.894],[0,0.311],[-0.894,1.571],[0,0],[0.01,0.834],[2.213,-0.019],[2.57,3.732],[0.045,1.159],[0.394,0.384],[0.035,0.437],[0,0],[0.959,4.183],[0.41,0.195],[0.34,2.096],[0,0],[0,0],[1.342,2.433],[0,0],[0,0],[2.065,1.831],[5.689,-2.906],[0,-0.003],[5.018,2.107],[5.7,-1.661],[0.003,0],[0.414,0.821],[0.556,1.075],[0.003,0],[3.458,4.672],[0,0],[0.247,1.304],[3.689,1.427],[0.011,0.037],[-0.49,0.156],[-0.103,0.803],[0.481,0.02],[-4.014,10.272],[0.364,0.445],[0,0.003],[0.081,0.385],[0,0],[-0.005,0],[0.145,0.742],[0.625,0.412],[0,0],[0,0.003],[-0.632,2.68],[0,0],[0.83,5.626],[1.156,2.993],[-5.352,5.334],[-0.845,2.898],[3.532,6.047],[1.476,11.017],[0.005,-0.221],[0,0],[0.116,0.039],[-0.154,0.18],[0.742,6.314],[-0.088,5.323],[4.299,-0.88],[7.104,0.739],[7.839,-5.74],[1.797,-1.927],[1.031,-2.408],[4.089,-0.666],[1.882,-4.188],[0,0.003],[-0.137,-0.387],[0.349,-1.778],[-0.003,0],[0,0],[2.559,-2.073],[1.877,-0.229],[0,0],[0.54,-0.539],[0,-0.003],[0,0],[8.484,-2.425],[0.009,-3.722],[0.102,-2.534],[-1.117,-4.601],[-1.48,-4.953],[2.18,-4.886],[0,0],[0.249,-0.283],[5.981,-4.604],[0.796,-0.691],[0.387,-0.584],[0.119,-0.229],[0.358,-0.045],[0.504,-0.219],[0.825,-0.576],[0.302,-0.15],[1.06,-1.69],[0.447,0.028],[1.58,-3.541],[0.311,-0.427],[0.126,-0.122],[1.096,-2.534],[1.07,-3.385],[-2.448,-3.556],[-8.042,0.554],[0.047,-0.078],[0.045,-0.352],[-0.349,-2.62],[1.16,-0.11],[4.107,-1.521],[1.825,-0.919],[-0.053,-0.186],[-0.057,-0.082],[0.012,-0.01],[-0.016,-0.011],[-0.008,-0.013],[-0.003,-0.031],[0.076,0.141],[0.175,0.228],[4.206,0.723],[1.966,-2.576],[0,0],[5.106,-0.628],[2.73,0.635],[0.998,-2.618],[5.693,-6.539],[0,0],[-2.578,-0.488],[-1.234,-1.974],[0,0],[0,0],[0.062,-0.435],[-0.413,-1.453],[-0.925,-0.209],[0,0],[-1.473,1.305],[-0.423,1.143],[-1.125,0.46],[-2.944,-1.278],[0,-0.003],[-0.389,-1.594],[0,0],[0.363,-0.367],[-0.364,-1.274],[-0.229,0.875],[-0.928,-0.552],[-0.387,-3.802],[0,0],[-0.861,-1.56],[-0.149,-1.332],[0,0],[0,0],[0.301,-1.059],[0.88,-0.181],[2.278,0.719],[2.566,4.087],[0.669,0.62],[1.067,0.42],[1.397,0.654],[1.182,0.138],[2.635,-0.482],[6.011,4.279],[0.019,0.727],[1.473,0.708],[6.676,-0.789],[0.956,1.5],[0.199,3.366],[2.906,7.61],[2.91,0.05],[0.096,2.531],[4.975,15.332],[1.85,4.153],[2.46,-2.148],[0.006,-0.05],[1.077,-0.443],[0.955,-10.279],[1.416,-1.312],[6.658,-6.57],[1.327,0.691],[2.164,-1.067],[-0.642,2.758],[5.074,5.534],[-0.061,0.951],[2.481,1.104],[3.277,-1.159]],"v":[[229.306,161.004],[234.246,173.453],[235.961,177.415],[234.814,192.198],[236.897,196.127],[239.817,197.622],[243.442,201.67],[244.115,202.155],[246.197,207.887],[246.197,207.889],[246.201,208.121],[245.658,212.21],[246.404,213.515],[247.459,213.814],[260.108,223.578],[260.093,219.049],[260.181,216.177],[260.18,216.158],[257.967,214.416],[256.639,205.605],[251.943,201.989],[251.943,201.989],[245.104,196.573],[245.197,196.065],[241.788,187.655],[240.412,179.201],[240.311,178.31],[240.953,178.001],[242.058,176.597],[242.916,172.143],[243.302,171.883],[244.287,173.5],[245.715,174.516],[250.314,175.833],[261.19,186.402],[261.405,189.95],[262.979,190.153],[263.347,189.806],[268.205,187.59],[270.661,183.298],[280.962,166.312],[279.487,165.027],[279.505,163.848],[279.504,163.848],[272.931,152.782],[264.467,142.605],[267.482,134.941],[268.654,132.397],[270.029,132.823],[279.395,135.116],[283.88,134.783],[287.586,131.269],[289.106,130.699],[294.373,128.732],[299.122,126.815],[315.602,116.052],[320.298,106.095],[325.157,95.591],[325.406,83.424],[323.973,78.487],[322.75,74.877],[322.787,72.429],[322.435,72.45],[322.381,71.467],[316.014,61.65],[311.116,58.208],[311.116,58.208],[310.772,53.47],[318.165,46.517],[320.65,43.027],[318.443,39.957],[307.017,39.517],[301.871,38.133],[300.761,34.567],[308.93,25.015],[311.689,30.736],[314.936,31.791],[323.889,28.322],[324.156,28.685],[325.824,35.125],[332.19,39.935],[333.735,38.693],[335.03,45.012],[335.643,53.239],[338.529,57.862],[343.217,55.574],[343.255,54.634],[343.769,54.458],[349.329,48.465],[349.328,48.465],[349.329,48.462],[350.208,48.541],[349.587,46.986],[348.275,43.652],[347.134,41.968],[347.375,41.762],[347.178,40.194],[346.949,40.389],[342.482,34.352],[342.498,34.346],[341.458,31.487],[339.948,28.702],[338.812,27.487],[338.441,27.174],[342.84,19.972],[342.491,19.67],[344.116,15.112],[352.351,6.114],[359.95,-2.139],[362.934,-4.934],[370.991,-45.634],[370.627,-47.465],[366.477,-60.555],[366.569,-60.402],[370.079,-57.202],[371.012,-56.793],[375.769,-41.198],[375.222,-40.394],[376.27,-31.452],[376.732,-29.809],[380.267,-23.23],[381.042,-22.944],[383.282,-22.616],[387.957,-23.223],[388.781,-23.261],[387.593,-27.889],[384.193,-31.076],[380.032,-42.932],[380.038,-44.006],[380.038,-44.006],[380.04,-44.006],[381.587,-44.904],[383.261,-46.878],[369.356,-72.851],[365.804,-78.741],[364.646,-82.228],[362.265,-79.944],[363.909,-78.492],[361.632,-75.474],[353.644,-81.256],[347.985,-80.82],[344.445,-78.25],[343.279,-77.575],[340.469,-82.546],[342.855,-83.299],[342.407,-84.706],[339.211,-83.555],[338.697,-83.031],[338.515,-83.198],[338.452,-89.724],[344.35,-110.563],[357.196,-124.625],[357.661,-125.307],[358.581,-127.074],[360.872,-127.835],[365.109,-128.854],[366.256,-130.47],[376.783,-131.583],[379.559,-130.562],[381.738,-129.195],[387.688,-132.106],[387.688,-132.105],[387.937,-131.078],[388.317,-131.149],[388.704,-131.149],[388.118,-135.669],[385.589,-138.629],[385.685,-139.672],[385.73,-139.869],[386.897,-146.246],[387.213,-151.122],[387.087,-151.778],[387.107,-152.237],[389.011,-156.663],[398.192,-157.695],[400.275,-155.221],[404.252,-152.499],[406.248,-154.838],[407.797,-156.487],[408.996,-160.477],[411.145,-161.476],[411.128,-160.315],[411.484,-156.237],[409.06,-134.339],[404.417,-122.337],[404.631,-121.616],[406.91,-115.381],[407.304,-105.091],[413.484,-91.825],[425.747,-71.974],[429.176,-67.962],[432.108,-73.257],[431.253,-83.674],[432.43,-88.357],[432.43,-88.358],[434.166,-96.96],[434.601,-103.975],[434.246,-113.435],[435.861,-114.05],[434.066,-116.398],[434.063,-116.397],[434.063,-116.398],[429.751,-123.942],[425.186,-127.617],[425.184,-127.617],[422.637,-133.011],[421.498,-142.903],[423.277,-149.179],[423.544,-149.557],[424.868,-148.855],[426.374,-153.315],[428.315,-153.289],[429.273,-150.842],[430.573,-153.482],[430.573,-153.482],[441.355,-156.249],[445.536,-155.018],[455.446,-186.725],[462.425,-188.449],[457.481,-196.742],[451.249,-203.129],[450.655,-204.728],[446.812,-210.617],[446.808,-210.617],[442.402,-227.075],[441.362,-231.552],[444.438,-230.343],[449.199,-228.638],[455.082,-233.115],[463.442,-231.85],[463.445,-231.85],[466.738,-231.919],[468.821,-233.842],[465.737,-236.583],[465.379,-237.073],[462.278,-243.978],[462.275,-243.979],[461.063,-247.47],[462.303,-253.675],[462.303,-253.673],[457.588,-259.526],[457.588,-259.525],[450.577,-261.648],[444.912,-255.709],[441.512,-256.973],[435.635,-257.37],[435.639,-257.366],[435.642,-257.347],[428.34,-259.575],[413.603,-261.441],[387.1,-261.674],[379.747,-260.731],[381.621,-253.373],[386.007,-245.645],[375.632,-252.09],[374.508,-253.546],[369.421,-255.492],[369.861,-254.372],[369.706,-254.243],[363.487,-248.448],[357.794,-247.266],[357.864,-247.297],[357.774,-247.253],[357.794,-247.266],[352.712,-244.641],[341.745,-246.839],[339.079,-249.86],[337.967,-251.072],[319.297,-249.47],[305.507,-249.887],[295.404,-251.458],[283.349,-254.705],[283.349,-254.705],[279.788,-254.257],[270.86,-253.741],[270.86,-253.741],[262.093,-249.402],[259.219,-246.563],[261.175,-245.634],[261.175,-245.633],[260.643,-236.082],[254.956,-235.177],[254.961,-235.175],[251.046,-234.273],[243.604,-231.854],[243.164,-231.577],[241.479,-232.011],[241.446,-229.621],[241.137,-228.476],[242.342,-221.45],[225.726,-229.562],[225.545,-231.378],[228.216,-232.148],[224.44,-235.715],[224.44,-235.716],[224.072,-236.77],[221.834,-241.203],[211.261,-243.003],[211.261,-243.001],[205.747,-244.548],[201.668,-240.416],[201.684,-235.494],[192.228,-234.317],[190.748,-234.174],[187.458,-233.38],[186.48,-233.791],[185.118,-237.806],[172.301,-235.462],[160.733,-233.414],[156.168,-230.706],[157.032,-228.405],[157.034,-228.407],[157.032,-228.405],[149.738,-222.128],[148.792,-223.365],[148.792,-223.364],[148.792,-223.364],[156.8,-251.936],[153.355,-255.755],[153.286,-256.892],[153.285,-256.892],[137.36,-267.571],[137.268,-267.602],[132.592,-265.373],[130.051,-263.614],[130.049,-263.615],[126.665,-266.33],[126.665,-266.33],[126.665,-266.33],[124.464,-266.754],[117.786,-269.924],[112.382,-272.381],[108.81,-269.223],[110.783,-255.889],[110.831,-252.199],[110.834,-252.199],[110.831,-252.197],[108.389,-252.035],[107.725,-249.921],[107.293,-248.738],[107.293,-248.738],[105.882,-247.566],[105.882,-247.564],[99.679,-246.809],[93.531,-243.207],[92.055,-240.668],[92.055,-240.666],[86.882,-236.139],[76.03,-219.176],[79.321,-218.034],[79.318,-218.034],[81.777,-216.655],[81.777,-216.655],[82.897,-213.064],[80.638,-212.823],[70.221,-208.031],[67.729,-201.89],[78.204,-191.867],[74.787,-189.219],[74.098,-189.492],[62.972,-192.863],[60.706,-194.984],[60.689,-190.552],[58.355,-189.2],[58.33,-188.047],[58.63,-187.741],[58.628,-187.735],[58.33,-188.047],[55.001,-189.227],[53.504,-191.55],[52.636,-185.739],[52.636,-185.739],[51.649,-185.626],[53.094,-174.968],[53.672,-174.323],[53.124,-174.76],[46.482,-188.022],[44.998,-191.168],[37.092,-193.456],[33.955,-190.622],[34.068,-189.46],[33.569,-186.926],[33.917,-184.132],[32.569,-176.14],[32.5,-175.956],[32.239,-174.208],[31.808,-170.557],[34.087,-164.011],[40.089,-155.455],[40.307,-155.271],[25.444,-159.575],[16.379,-159.609],[8.445,-164.618],[8.255,-159.886],[13.935,-156.547],[14.122,-155.512],[10.626,-151.038],[8.998,-150.648],[7.877,-150.001],[6.095,-150.02],[-1.48,-148.415],[-12.447,-146.437],[-14.097,-144.671],[-16.06,-144.066],[-17.317,-143.038],[-17.668,-141.68],[-19.471,-140.568],[-21.73,-139.303],[-25.206,-134.545],[-28.606,-132.3],[-28.887,-137.031],[-28.892,-137.031],[-28.889,-137.031],[-28.781,-137.05],[-35.399,-144.02],[-38.164,-137.169],[-37.847,-132.437],[-37.155,-130.862],[-37.059,-130.745],[-37.155,-130.648],[-36.875,-129.809],[-38.757,-126.366],[-43.736,-128.607],[-45.384,-132.472],[-45.495,-132.424],[-45.758,-132.642],[-46.133,-134.518],[-57.564,-142.032],[-72.804,-147.631],[-85.581,-155.946],[-85.581,-155.946],[-99.515,-158.357],[-109.876,-157.097],[-109.873,-157.097],[-109.876,-157.094],[-109.979,-157.19],[-111.451,-156.23],[-112.958,-155.289],[-116.875,-153.557],[-126.166,-148.801],[-128.356,-146.732],[-131.925,-143.255],[-135.399,-141.734],[-138.432,-133.716],[-137.996,-131.739],[-138.165,-128.775],[-141.219,-125.017],[-141.624,-121.754],[-141.28,-121.51],[-141.28,-121.51],[-141.984,-121.148],[-149.28,-107.248],[-152.103,-104.406],[-163.566,-92.227],[-169.594,-78.191],[-167.983,-66.632],[-157.406,-58.486],[-148.16,-63.69],[-145.802,-55.535],[-141.904,-52.028],[-141.831,-51.805],[-141.377,-50.127],[-140.191,-48.159],[-140.276,-46.358],[-144.278,-44.542],[-145.578,-44.655],[-146.257,-44.492],[-146.111,-45.163],[-146.311,-54.508],[-150.379,-56.804],[-156.271,-43.003],[-156.229,-42.927],[-156.691,-42.905],[-156.348,-38.28],[-156.342,-38.266],[-155.693,-36.544],[-157.983,-33.804],[-158.656,-33.551],[-171.347,-25.769],[-180.502,-17.958],[-180.127,-22.97],[-181.727,-28.478],[-185.275,-29.856],[-185.373,-31.1],[-186.485,-35.88],[-186.485,-35.882],[-193.945,-49.588],[-197.441,-59.927],[-203.31,-63.523],[-211.093,-55.338],[-217.257,-42.82],[-217.783,-41.803],[-221.294,-38.236],[-224.919,-33.252],[-224.781,-26.377],[-224.793,-26.367],[-221.569,-18.268],[-217,-18.756],[-210.737,-21.084],[-207.177,-28.439],[-204.179,-32.129],[-201.108,-37.409],[-200.887,-37.962],[-199.258,-37.183],[-199.255,-37.187],[-196.869,-34.95],[-196.991,-34.464],[-199.131,-34.495],[-198.569,-33.265],[-201.499,-31.195],[-202.821,-29.57],[-202.765,-26.21],[-202.765,-26.21],[-202.765,-26.208],[-202.49,-25.961],[-202.607,-25.865],[-203.297,-24.183],[-203.307,-23.102],[-205.069,-20.253],[-203.069,-20.339],[-204.159,-14.44],[-207.388,-12.177],[-205.093,-9.758],[-203.934,-8.533],[-200.309,-7.989],[-197.24,-9.086],[-193.495,-11.096],[-197.24,-9.086],[-200.309,-7.989],[-202.832,-5.069],[-202.913,-3.919],[-202.913,-3.919],[-202.753,3.291],[-200.293,3.931],[-198.14,4.554],[-192.333,19.947],[-192.348,19.967],[-199.678,23.306],[-218.997,22.262],[-221.867,32.216],[-222.602,42.521],[-222.922,47.285],[-224.824,47.403],[-224.865,48.507],[-222.618,53.296],[-221.363,59.23],[-216.69,60.326],[-210.793,65.144],[-210.793,65.144],[-210.795,65.144],[-210.919,68.651],[-210.806,69.47],[-211.448,70.324],[-215.283,74.431],[-225.352,87.832],[-236.938,102.194],[-239.044,106.997],[-246.47,117.555],[-246.473,117.555],[-246.867,119.612],[-255.189,130.685],[-256.031,135.251],[-254.956,136.444],[-253.912,137.064],[-253.854,137.699],[-255.384,153.885],[-255.253,155.337],[-257.304,167.34],[-257.277,170.05],[-257.348,170.973],[-256.266,174.442],[-255.985,174.437],[-255.952,176.949],[-249.307,176.899],[-239.894,186.314],[-239.758,189.786],[-238.579,190.934],[-238.468,192.249],[-238.466,192.249],[-230.757,198.987],[-229.531,199.566],[-225.944,203.084],[-225.944,203.081],[-225.944,203.084],[-219.967,207.759],[-219.967,207.759],[-219.967,207.759],[-213.612,207.969],[-195.889,206.084],[-195.889,206.079],[-183.009,202.967],[-165.662,201.766],[-165.659,201.766],[-164.414,204.225],[-162.74,207.449],[-162.737,207.449],[-151.256,208.812],[-151.256,208.812],[-149.051,211.387],[-144.752,219.359],[-144.73,219.469],[-145.847,220.815],[-146.163,223.234],[-144.723,223.294],[-136.766,247.084],[-135.669,248.42],[-135.669,248.425],[-135.172,249.441],[-135.164,249.441],[-135.17,249.444],[-134.734,251.665],[-132.857,252.891],[-132.857,252.889],[-132.857,252.891],[-130.835,259.717],[-130.835,259.717],[-127.991,276.545],[-129.764,284.671],[-136.436,304.101],[-134.719,311.762],[-126.449,331.05],[-115.826,361.523],[-115.711,360.896],[-115.711,360.896],[-115.364,360.981],[-115.826,361.523],[-112.052,380.234],[-102.549,386.039],[-89.537,383.822],[-70.739,377.834],[-51.905,356.273],[-49.853,348.473],[-46.746,341.242],[-37.947,334.497],[-38.929,322.495],[-38.929,322.498],[-39.338,321.336],[-38.295,316.005],[-38.301,316.007],[-38.298,316.005],[-30.616,309.791],[-26.789,306.728],[-26.792,306.728],[-25.168,305.111],[-25.168,305.108],[-25.168,305.108],[-13.582,290.175],[-13.416,279.009],[-16.118,273.003],[-18.142,259.085],[-16.131,247.055],[-7.073,235.017],[-7.073,235.017],[-6.577,234.03],[10.73,219.432],[13.124,217.359],[13.051,215.692],[13.407,215.018],[14.486,214.778],[15.828,213.85],[18.041,211.915],[18.977,211.608],[22.164,206.53],[23.505,206.612],[28.233,195.992],[28.395,194.861],[28.793,194.52],[32.973,187.457],[33.688,177.245],[24.58,176.839],[0.556,179.555],[0.671,179.076],[0.311,178.078],[2.83,173.776],[7.221,172.882],[19.646,168.663],[23.842,164.567],[23.67,164.048],[23.502,163.803],[23.528,163.785],[23.478,163.765],[23.451,163.723],[23.451,163.624],[23.67,164.048],[24.255,164.648],[35.516,161.56],[41.691,154.079],[41.691,154.076],[53.575,146.331],[59.876,143.617],[63.458,136.022],[62.723,122.35],[62.604,122.475],[54.875,121.016],[51.176,115.099],[51.175,115.099],[51.175,115.099],[51.358,113.807],[50.113,109.596],[48.923,112.416],[48.922,112.416],[44.497,116.337],[43.225,119.761],[39.841,121.141],[30.675,118.557],[30.675,118.555],[29.502,113.768],[29.502,113.768],[30.594,112.672],[28.143,110.38],[27.448,113],[24.667,111.347],[19.169,102.91],[19.169,102.913],[16.592,98.237],[15.113,94.696],[15.113,94.696],[15.113,94.693],[16.021,91.519],[18.516,91.296],[24.21,95.425],[34.068,105.108],[36.403,106.363],[39.687,107.184],[44.017,107.661],[47.52,108.354],[53.511,111.138],[73.223,114.523],[74.338,116.263],[78.931,116.777],[97.487,121.138],[101.749,121.855],[106.573,129.266],[119.325,134.8],[121.549,138.723],[122.279,146.299],[141.346,190.398],[149.744,192.139],[155.912,184.509],[155.929,184.35],[157.461,180.969],[166.207,152.023],[170.444,148.083],[191.156,129.373],[195.474,129.904],[202.147,129.432],[204.662,136.001],[214.007,155.495],[215.594,157.842],[222.809,157.422]],"c":true},"ix":2},"nm":"Path 22","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"null","np":23,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"outline fill","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.58],"y":[0]},"n":["0p833_0p833_0p58_0"],"t":30,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":114,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.72],"y":[0]},"n":["0p833_0p833_0p72_0"],"t":180,"s":[100],"e":[0]},{"t":262}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":7,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":301,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"outline","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.37],"y":[1]},"o":{"x":[0.58],"y":[0]},"n":["0p37_1_0p58_0"],"t":0,"s":[180],"e":[785]},{"i":{"x":[0.564],"y":[1]},"o":{"x":[0.182],"y":[0]},"n":["0p564_1_0p182_0"],"t":120,"s":[785],"e":[809]},{"i":{"x":[0.41],"y":[1]},"o":{"x":[0.339],"y":[0]},"n":["0p41_1_0p339_0"],"t":180,"s":[809],"e":[1260]},{"t":300}],"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[-18.5,-5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-81.462,0],[0,-81.462],[81.462,0],[0,81.462]],"o":[[81.462,0],[0,81.462],[-81.462,0],[0,-81.462]],"v":[[-18.5,-153],[129,-5.5],[-18.5,142],[-166,-5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.37],"y":[1]},"o":{"x":[0.58],"y":[0]},"n":["0p37_1_0p58_0"],"t":0,"s":[99.9],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":120,"s":[0],"e":[0]},{"i":{"x":[0.41],"y":[1]},"o":{"x":[0.58],"y":[0]},"n":["0p41_1_0p58_0"],"t":180,"s":[0],"e":[99.9]},{"t":300}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"n":["0p833_0p833_0p5_0"],"t":0,"s":[23],"e":[4]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":60,"s":[4],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.5],"y":[0]},"n":["0p833_0p833_0p5_0"],"t":248,"s":[4],"e":[23]},{"t":300}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":301,"st":0,"bm":0}]} \ No newline at end of file From cb03e6e947be74e4210147578e261ea5e894d558 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 30 Aug 2018 14:00:47 +0900 Subject: [PATCH 209/672] lottie: fixed proper handling of offset property in trim object. The offset property is in degree and wraps after 360 degree to 0. so normalize the offset property to [0 - 1] and pass it to pathmesure object. Change-Id: Ifd56f0926c1971dd5dd549787dcf5e5c35ed875a --- src/lottie/lottiemodel.h | 2 +- src/vector/vpathmesure.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 85e50777b1..61e0d9b402 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -656,7 +656,7 @@ public: {visitor->visit(this);} float start(int frameNo) const {return mStart.value(frameNo)/100.0f;} float end(int frameNo) const {return mEnd.value(frameNo)/100.0f;} - float offset(int frameNo) const {return mOffset.value(frameNo);} + float offset(int frameNo) const {return mOffset.value(frameNo)/ 360.0f;} LOTTrimData::TrimType type() const {return mTrimType;} public: LOTAnimatable mStart{0}; diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 05c61b623a..d588dc6300 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -26,7 +26,7 @@ VPath VPathMesure::trim(const VPath &path) return oneSegment(length * mStart, length * mEnd, path); } else { float length = path.length(); - float offset = fmod(mOffset, length); + float offset = length * mOffset; float start = length * mStart; float end = length * mEnd; start += offset; From 81a1c0bbf73ac83ed43607a1f6a966d45678b0f0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 30 Aug 2018 14:16:18 +0900 Subject: [PATCH 210/672] lottie/resource: added new resource going to be used by mobile/vd team. Change-Id: Ia25247bda7349c34df14aeeab24f1ec42e864d8c --- example/resource/circuit.json | 1 + example/resource/dead_lift.json | 1 + example/resource/hiking.json | 1 + 3 files changed, 3 insertions(+) create mode 100755 example/resource/circuit.json create mode 100755 example/resource/dead_lift.json create mode 100755 example/resource/hiking.json diff --git a/example/resource/circuit.json b/example/resource/circuit.json new file mode 100755 index 0000000000..4bb2205dfe --- /dev/null +++ b/example/resource/circuit.json @@ -0,0 +1 @@ +{"v":"5.2.0","fr":30,"ip":0,"op":61,"w":200,"h":200,"nm":"circuit_training_lottie","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":3,"ty":4,"nm":"circuit training/icons_100x100 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.5,140.5,0],"ix":2},"a":{"a":0,"k":[37,34,0],"ix":1},"s":{"a":0,"k":[173,173,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.046],[-1.53,0],[-0.217,0.061],[0,0],[1.279,2.253]],"o":[[0,0],[-0.782,0.519],[0,1.619],[0.234,0],[0.356,-0.098],[0.618,-0.303],[-1.867,-3.289]],"v":[[-10.707,9.669],[-27.268,19.298],[-28.57,21.774],[-25.799,24.706],[-25.122,24.614],[-6.874,16.208],[-5.85,11.509]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.769,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p769_1_0p167_0p167","t":0,"s":[20.32,46.588],"e":[20.97,42.388],"to":[0.10833333432674,-0.69999998807907],"ti":[-2.00833344459534,0.23333333432674]},{"i":{"x":0.355,"y":0.974},"o":{"x":0.171,"y":0},"n":"0p355_0p974_0p171_0","t":3.214,"s":[20.97,42.388],"e":[32.37,45.188],"to":[2.00833344459534,-0.23333333432674],"ti":[-1.32500004768372,-0.40000000596046]},{"i":{"x":0.861,"y":0.52},"o":{"x":0.31,"y":0.095},"n":"0p861_0p52_0p31_0p095","t":6.964,"s":[32.37,45.188],"e":[28.92,44.788],"to":[1.32500004768372,0.40000000596046],"ti":[0.57499998807907,0.0666666701436]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.29,"y":0.29},"n":"0p667_0p667_0p29_0p29","t":16.608,"s":[28.92,44.788],"e":[28.92,44.788],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":42.642,"s":[28.92,44.788],"e":[33.02,45.538],"to":[0.68333333730698,0.125],"ti":[1.54999995231628,0.80833333730698]},{"i":{"x":0.854,"y":0.881},"o":{"x":0.29,"y":0.093},"n":"0p854_0p881_0p29_0p093","t":46,"s":[33.02,45.538],"e":[19.62,39.938],"to":[-1.54999995231628,-0.80833333730698],"ti":[2.11666655540466,-0.17499999701977]},{"i":{"x":0.57,"y":0.547},"o":{"x":0.427,"y":0.889},"n":"0p57_0p547_0p427_0p889","t":49.93,"s":[19.62,39.938],"e":[20.32,46.588],"to":[-2.11666655540466,0.17499999701977],"ti":[-0.11666666716337,-1.10833334922791]},{"i":{"x":0.579,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p579_1_0p167_0p167","t":54.929,"s":[20.32,46.588],"e":[20.659,47.114],"to":[0,0],"ti":[0,0]},{"i":{"x":1,"y":1},"o":{"x":0.505,"y":0},"n":"1_1_0p505_0","t":57.608,"s":[20.659,47.114],"e":[20.32,46.588],"to":[0,0],"ti":[0,0]},{"t":60.287109375}],"ix":2},"a":{"a":0,"k":[-8.5,12.7],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[-28]},{"i":{"x":[0.349],"y":[0.639]},"o":{"x":[0.17],"y":[0]},"n":["0p349_0p639_0p17_0"],"t":3.214,"s":[-28],"e":[-46]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6.964,"s":[-46],"e":[-55]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":16.608,"s":[-55],"e":[-55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":42.642,"s":[-55],"e":[-43]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":46,"s":[-43],"e":[-63]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49.93,"s":[-63],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.929,"s":[0],"e":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":57.608,"s":[2],"e":[0]},{"t":60.287109375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"foot","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[2.431,-5.537],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}],"e":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[0.961,-5.672],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3.214,"s":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[0.961,-5.672],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}],"e":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[0.605,-6.5],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5.358,"s":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[0.605,-6.5],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}],"e":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[2.418,-5.713],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6.964,"s":[{"i":[[6.772,1.174],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.601,-0.451],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[2.418,-5.713],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}],"e":[{"i":[[6.678,-1.627],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-3.137,0.764],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.786,"s":[{"i":[[6.678,-1.627],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-3.137,0.764],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-5.189,-1.951],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}],"e":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.608,"s":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[7.185,0.633]],"c":true}],"e":[{"i":[[4.507,-1.001],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-1.723,0.431],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.761,-5.066],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[8.116,-2.067]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.142,"s":[{"i":[[4.507,-1.001],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-1.723,0.431],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.761,-5.066],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[8.116,-2.067]],"c":true}],"e":[{"i":[[6.922,-1.912],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.864,0.791],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[6.837,-1.97]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.642,"s":[{"i":[[6.922,-1.912],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.864,0.791],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[6.837,-1.97]],"c":true}],"e":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[8.538,-0.044]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[8.538,-0.044]],"c":true}],"e":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[9.446,-0.658]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.93,"s":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[9.446,-0.658]],"c":true}],"e":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[9.446,-0.658]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.929,"s":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[9.446,-0.658]],"c":true}],"e":[{"i":[[6.27,-2.816],[0.764,-1.605],[0,0],[-0.488,-1.87],[0,0],[-0.453,0.52],[0,0]],"o":[[-2.711,1.217],[-1.886,3.97],[0,0],[0.872,3.339],[0.618,-0.303],[0,0],[0,0]],"v":[[-0.84,-5.385],[-4.995,-1.794],[-10.707,9.669],[-10.867,13.298],[-6.874,16.208],[-5.249,14.959],[9.446,-0.658]],"c":true}]},{"t":60.287109375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[28.72,31.888],"e":[24.72,26.188],"to":[-0.66666668653488,-0.94999998807907],"ti":[1.875,-1.22500002384186]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":3.214,"s":[24.72,26.188],"e":[17.47,39.238],"to":[-1.875,1.22500002384186],"ti":[-0.21666666865349,-0.41666665673256]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6.964,"s":[17.47,39.238],"e":[20.809,33.847],"to":[0.1134230569005,0.21812126040459],"ti":[-2.2276554107666,2.72240781784058]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.786,"s":[20.809,33.847],"e":[26.02,28.688],"to":[2.02772879600525,-2.47807836532593],"ti":[0.10324361175299,0.37326535582542]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.608,"s":[26.02,28.688],"e":[26.02,28.688],"to":[-0.21666666865349,-0.78333336114883],"ti":[0.10324361175299,0.37326535582542]},{"t":25.714,"s":[26.02,28.688],"h":1},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[26.02,28.688],"e":[26.02,28.688],"to":[-0.21666666865349,-0.78333336114883],"ti":[0.10324361175299,0.37326535582542]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":35.142,"s":[26.02,28.688],"e":[16.17,34.538],"to":[-0.21666666865349,-0.78333336114883],"ti":[1.24166667461395,-1.60833334922791]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":42.642,"s":[16.17,34.538],"e":[18.57,38.338],"to":[-1.24166667461395,1.60833334922791],"ti":[0.41666665673256,1.71666669845581]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[18.57,38.338],"e":[13.67,24.238],"to":[-0.41666665673256,-1.71666669845581],"ti":[-1.69166672229767,1.07500004768372]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.93,"s":[13.67,24.238],"e":[28.72,31.888],"to":[1.69166672229767,-1.07500004768372],"ti":[-2.50833344459534,-1.27499997615814]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":54.929,"s":[28.72,31.888],"e":[29.848,32.414],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":57.608,"s":[29.848,32.414],"e":[28.72,31.888],"to":[0,0],"ti":[0,0]},{"t":60.287109375}],"ix":2},"a":{"a":0,"k":[-0.1,-2],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.769],"y":[0.961]},"o":{"x":[0.578],"y":[0.195]},"n":["0p769_0p961_0p578_0p195"],"t":0,"s":[0],"e":[-16]},{"i":{"x":[0.495],"y":[0.776]},"o":{"x":[0.138],"y":[0.006]},"n":["0p495_0p776_0p138_0p006"],"t":3.214,"s":[-16],"e":[-94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.225],"y":[0.144]},"n":["0p833_0p833_0p225_0p144"],"t":6.964,"s":[-94],"e":[-39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.608,"s":[-39],"e":[-39]},{"t":25.714,"s":[-39],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[-39],"e":[-39]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":35.142,"s":[-39],"e":[-79]},{"i":{"x":[0.681],"y":[1.334]},"o":{"x":[0.369],"y":[0]},"n":["0p681_1p334_0p369_0"],"t":42.642,"s":[-79],"e":[-90]},{"i":{"x":[0.443],"y":[0.125]},"o":{"x":[0.153],"y":[0.105]},"n":["0p443_0p125_0p153_0p105"],"t":46,"s":[-90],"e":[-50]},{"i":{"x":[0.896],"y":[0.982]},"o":{"x":[0.152],"y":[0.163]},"n":["0p896_0p982_0p152_0p163"],"t":49.93,"s":[-50],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.161],"y":[0]},"n":["0p667_1_0p161_0"],"t":54.929,"s":[0],"e":[1.65]},{"i":{"x":[0.892],"y":[1.304]},"o":{"x":[0.333],"y":[0]},"n":["0p892_1p304_0p333_0"],"t":57.608,"s":[1.65],"e":[0]},{"t":60.287109375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6.964,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.515,-1.701],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-1.237,4.09],[3.748,2.341],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.111,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-5.346,-2.068],[-1.021,2.521],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.515,-1.701],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.378,1.806],[3.748,2.341],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.684,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.827,-2.402],[-1.021,2.521],[7.378,0.799],[20.429,-8.957],[25.83,-12.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.786,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.515,-1.701],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.378,1.806],[3.748,2.341],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.684,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.827,-2.402],[-1.021,2.521],[7.378,0.799],[20.429,-8.957],[25.83,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.608,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}]},{"t":25.714,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}],"h":1},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.142,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.883,-1.543],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.928,1.622],[3.682,-2.166],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.629,-2.247],[1.098,4.683],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.417,-1.726],[-1.158,0.818],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.984,4.058],[2.823,-1.995],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-5.567,-1.009],[1.675,5.038],[7.378,0.799],[20.429,-8.957],[25.831,-12.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.642,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.417,-1.726],[-1.158,0.818],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.984,4.058],[2.823,-1.995],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-5.567,-1.009],[1.675,5.038],[7.378,0.799],[20.429,-8.957],[25.831,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.356,-1.741],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.826,4.038],[3.748,2.341],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.851,-2.138],[-1.021,2.521],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.356,-1.741],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-0.826,4.038],[3.748,2.341],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.112,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-4.851,-2.138],[-1.021,2.521],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}],"e":[{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.636,0.73],[3.454,-3.007],[4.681,-4.57],[0.515,-1.701],[-4.257,-2.659],[0,0],[0,0],[-4.251,3.487]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-3.01,-3.457],[0,0],[-1.272,1.241],[-1.237,4.09],[3.748,2.341],[0,0],[0,0],[2.786,-2.286]],"v":[[27.129,-18.601],[27.111,-18.645],[27.103,-18.66],[25.685,-20.883],[13.976,-21.699],[-2.12,-6.237],[-5.346,-2.068],[-1.021,2.521],[7.378,0.799],[20.428,-8.957],[25.831,-12.875]],"c":true}]},{"t":49.9296875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.191,3.922],[3.923,-1.19],[-1.194,-3.92],[-3.923,1.19]],"o":[[-1.19,-3.922],[-3.92,1.192],[1.19,3.925],[3.923,-1.192]],"v":[[40.457,-27.506],[31.197,-32.448],[26.254,-23.193],[35.513,-18.245]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[28.52,31.688],"e":[26.12,25.788],"to":[-0.40000000596046,-0.98333334922791],"ti":[1.52499997615814,-0.41666665673256]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":3.214,"s":[26.12,25.788],"e":[19.37,34.188],"to":[-1.52499997615814,0.41666665673256],"ti":[-0.00833333376795,-0.80000001192093]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6.964,"s":[19.37,34.188],"e":[21.79,32.794],"to":[0.00443106330931,0.42538207769394],"ti":[-1.79745173454285,0.98597133159637]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.786,"s":[21.79,32.794],"e":[26.17,30.588],"to":[1.58294785022736,-0.86830765008926],"ti":[-0.00780453998595,0.35120430588722]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.608,"s":[26.17,30.588],"e":[26.17,30.588],"to":[0.0166666675359,-0.75],"ti":[-0.00780453998595,0.35120430588722]},{"t":26,"s":[26.17,30.588],"h":1},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[26.17,30.588],"e":[26.17,30.588],"to":[0.0166666675359,-0.75],"ti":[-0.00780453998595,0.35120430588722]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":35.142,"s":[26.17,30.588],"e":[19.47,29.688],"to":[0.0166666675359,-0.75],"ti":[1.01666665077209,-0.59166663885117]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":42.642,"s":[19.47,29.688],"e":[20.07,34.138],"to":[-1.01666665077209,0.59166663885117],"ti":[0.16666667163372,1.39166665077209]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[20.07,34.138],"e":[18.47,21.338],"to":[-0.16666667163372,-1.39166665077209],"ti":[-1.40833330154419,0.40833333134651]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.93,"s":[18.47,21.338],"e":[28.52,31.688],"to":[1.40833330154419,-0.40833333134651],"ti":[-1.67499995231628,-1.72500002384186]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":54.929,"s":[28.52,31.688],"e":[30.024,32.59],"to":[0,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":57.608,"s":[30.024,32.59],"e":[28.52,31.688],"to":[0,0],"ti":[0,0]},{"t":60.287109375}],"ix":2},"a":{"a":0,"k":[-0.3,-2.2],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[16]},{"i":{"x":[0.42],"y":[0.414]},"o":{"x":[0.213],"y":[0.007]},"n":["0p42_0p414_0p213_0p007"],"t":3.214,"s":[16],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6.964,"s":[3],"e":[-17.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.786,"s":[-17.5],"e":[-52]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.608,"s":[-52],"e":[-60]},{"t":25.714,"s":[-60],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[-60],"e":[-52]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":35.142,"s":[-52],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":42.642,"s":[10],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":46,"s":[3],"e":[28]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49.93,"s":[28],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":54.929,"s":[0],"e":[-2]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":57.608,"s":[-2],"e":[0]},{"t":60.287109375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"torso","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.345],[10.746,0],[0,7.347],[-10.746,0]],"o":[[0,7.347],[-10.746,0],[0,-7.345],[10.746,0]],"v":[[19.457,-0.001],[0.001,13.301],[-19.457,-0.001],[0.001,-13.301]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[53.922,43.869],"e":[53.922,43.869],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3.214,"s":[53.922,43.869],"e":[53.922,43.869],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6.964,"s":[53.922,43.869],"e":[55.276,42.817],"to":[-0.23827975988388,-0.76558405160904],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9.108,"s":[55.276,42.817],"e":[51.968,24.32],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13.392,"s":[51.968,24.32],"e":[45.652,8.982],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.608,"s":[45.652,8.982],"e":[37.832,-18.537],"to":[0,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":21.964,"s":[37.832,-18.537],"e":[24.9,-25.905],"to":[0,0],"ti":[0,0]},{"t":26,"s":[24.9,-25.905],"h":1},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":30,"s":[24.9,-25.905],"e":[37.279,-22.447],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31.392,"s":[37.279,-22.447],"e":[54.471,-7.71],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35.142,"s":[54.471,-7.71],"e":[59.283,18.982],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":38.892,"s":[59.283,18.982],"e":[58.682,33.697],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.036,"s":[58.682,33.697],"e":[54.02,43.418],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.642,"s":[54.02,43.418],"e":[53.986,43.577],"to":[0,0],"ti":[0.018888913095,-0.08717959374189]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[53.986,43.577],"e":[53.922,43.869],"to":[-0.02431087568402,0.11220403760672],"ti":[0.00916767958552,-0.04231236875057]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.929,"s":[53.922,43.869],"e":[53.922,43.869],"to":[-0.01629072614014,0.07518796622753],"ti":[0.00916767958552,-0.04231236875057]},{"t":60.287109375}],"ix":2},"a":{"a":0,"k":[-0.3,-9.8],"ix":1},"s":{"a":0,"k":[88.481,86.045],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3.214,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6.964,"s":[0],"e":[-3.926]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9.108,"s":[-3.926],"e":[-62.926]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.392,"s":[-62.926],"e":[-129.926]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":16.608,"s":[-129.926],"e":[-174.926]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":21.964,"s":[-174.926],"e":[-174.926]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":26,"s":[-174.926],"e":[-174.926]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":30,"s":[-174.926],"e":[-120.926]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":35.142,"s":[-120.926],"e":[-6.926]},{"i":{"x":[0.649],"y":[0.77]},"o":{"x":[0.301],"y":[0]},"n":["0p649_0p77_0p301_0"],"t":42.642,"s":[-6.926],"e":[-5.488]},{"i":{"x":[0.824],"y":[0.918]},"o":{"x":[0.41],"y":[0.187]},"n":["0p824_0p918_0p41_0p187"],"t":46,"s":[-5.488],"e":[0]},{"i":{"x":[0.824],"y":[0.73]},"o":{"x":[0.167],"y":[0]},"n":["0p824_0p73_0p167_0"],"t":54.929,"s":[0],"e":[0]},{"t":60.287109375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.142,0.344],[0,0],[0.004,0.004],[0.959,0.131],[1.954,-1.639],[0,0],[0,0],[-1.098,-0.225],[-0.222,0.012],[0.081,1.399],[0.14,3.596]],"o":[[0,0],[-0.002,-0.007],[-0.318,-0.749],[-4.055,-0.555],[0,0],[0,0],[0.065,1.174],[0.211,0.043],[1.396,-0.079],[0,0],[-0.143,-3.601]],"v":[[27.129,-18.601],[27.111,-18.645],[27.103,-18.66],[24.885,-20.933],[18.776,-18.499],[20.428,-8.957],[21.233,-3.332],[23.904,-0.181],[25.307,-0.203],[28.112,-3.944],[28.43,-12.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.575,"y":0.794},"o":{"x":0.167,"y":0.167},"n":"0p575_0p794_0p167_0p167","t":0,"s":[52.62,16.388],"e":[53.626,16.156],"to":[0.04026137664914,-0.00671022897586],"ti":[0.34859979152679,-0.12173779308796]},{"i":{"x":0.432,"y":0.386},"o":{"x":0.584,"y":0},"n":"0p432_0p386_0p584_0","t":1.608,"s":[53.626,16.156],"e":[52.92,16.338],"to":[-0.08432108163834,0.0294465534389],"ti":[0.29865115880966,-0.09576314687729]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.002},"n":"0p833_0p833_0p333_0p002","t":3.214,"s":[52.92,16.338],"e":[43.42,19.338],"to":[-1.53333330154419,0.49166667461395],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6.964,"s":[43.42,19.338],"e":[42.217,17.533],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9.108,"s":[42.217,17.533],"e":[39.042,11.46],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11.786,"s":[39.042,11.46],"e":[29.042,3.265],"to":[0,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":16.608,"s":[29.042,3.265],"e":[25.583,3.265],"to":[0,0],"ti":[0,0]},{"t":25.714,"s":[25.583,3.265],"h":1},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":30,"s":[25.583,3.265],"e":[26.583,3.265],"to":[0,0],"ti":[0,0]},{"i":{"x":0.667,"y":0.159},"o":{"x":0.167,"y":0.167},"n":"0p667_0p159_0p167_0p167","t":32.464,"s":[26.583,3.265],"e":[31.339,2.66],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.341},"n":"0p833_0p833_0p333_0p341","t":35.68,"s":[31.339,2.66],"e":[41.395,8.828],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":38.892,"s":[41.395,8.828],"e":[45.001,17.844],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42.642,"s":[45.001,17.844],"e":[44.704,19.129],"to":[0,0],"ti":[0,0]},{"i":{"x":0.648,"y":0.727},"o":{"x":0.167,"y":0.167},"n":"0p648_0p727_0p167_0p167","t":44,"s":[44.704,19.129],"e":[44.413,19.648],"to":[0,0],"ti":[-0.81385338306427,0.62691289186478]},{"i":{"x":0.668,"y":0.612},"o":{"x":0.331,"y":0.208},"n":"0p668_0p612_0p331_0p208","t":46,"s":[44.413,19.648],"e":[46.415,17.298],"to":[0.48852136731148,-0.37630900740623],"ti":[-0.92009681463242,0.68212902545929]},{"i":{"x":0.698,"y":0.843},"o":{"x":0.353,"y":0.277},"n":"0p698_0p843_0p353_0p277","t":49.93,"s":[46.415,17.298],"e":[52.074,16.106],"to":[1.68465304374695,-1.24894547462463],"ti":[-0.97134160995483,0.64888244867325]},{"i":{"x":0.667,"y":1},"o":{"x":0.363,"y":0.571},"n":"0p667_1_0p363_0p571","t":54.929,"s":[52.074,16.106],"e":[53.055,15.863],"to":[0.50108367204666,-0.33473744988441],"ti":[-0.33789697289467,0.2170657813549]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":57.608,"s":[53.055,15.863],"e":[52.62,16.388],"to":[0.63269644975662,-0.40644565224648],"ti":[-0.01226478349417,0.00204413058236]},{"t":60.287109375}],"ix":2},"a":{"a":0,"k":[23.8,-17.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":3.214,"s":[0],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6.964,"s":[-25],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9.108,"s":[-25],"e":[0.714]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.786,"s":[0.714],"e":[-18.286]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":16.608,"s":[-18.286],"e":[-177.286]},{"t":25.714,"s":[-177.286],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":30,"s":[-177.286],"e":[-146.286]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32.464,"s":[-146.286],"e":[-19.286]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38.892,"s":[-19.286],"e":[-7.286]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42.642,"s":[-7.286],"e":[-11.286]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[-11.286],"e":[-5.098]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":46,"s":[-5.098],"e":[-7.707]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49.93,"s":[-7.707],"e":[1.826]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":54.929,"s":[1.826],"e":[3.452]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":57.608,"s":[3.452],"e":[0]},{"t":60.287109375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hand","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.19,-2.835],[0,0],[-0.093,-0.241],[-0.401,2.723],[0.02,0.346],[0.14,3.596]],"o":[[0.126,1.144],[0.015,0.272],[0.281,2.714],[0.109,-0.308],[0,0],[-1.386,-5.195]],"v":[[21.279,-3.357],[22.426,5.837],[22.592,6.61],[27.341,6.538],[27.48,5.55],[28.156,-3.85]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.575,"y":0.9},"o":{"x":0.167,"y":0.167},"n":"0p575_0p9_0p167_0p167","t":0,"s":[53.72,30.688],"e":[54.657,30.542],"to":[0.02196365967393,-0.00549091491848],"ti":[-0.05722231045365,0.015421140939]},{"i":{"x":0.944,"y":1},"o":{"x":0.68,"y":0.203},"n":"0p944_1_0p68_0p203","t":1.608,"s":[54.657,30.542],"e":[53.92,30.638],"to":[0.02962161041796,-0.00798288267106],"ti":[0.1790723502636,-0.08243013173342]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.14,"y":0},"n":"0p833_0p833_0p14_0","t":3.214,"s":[53.92,30.638],"e":[52.82,30.838],"to":[-0.52499997615814,0.24166665971279],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5.358,"s":[52.82,30.838],"e":[50.57,32.138],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.51},"o":{"x":0,"y":0.001},"n":"0p833_0p51_0_0p001","t":6.964,"s":[50.57,32.138],"e":[49.367,30.333],"to":[0,0],"ti":[0,0]},{"i":{"x":0.514,"y":0.608},"o":{"x":0,"y":0},"n":"0p514_0p608_0_0","t":9.108,"s":[49.367,30.333],"e":[40.384,25.198],"to":[0,0],"ti":[0,0]},{"i":{"x":0.844,"y":0.784},"o":{"x":0.431,"y":0.627},"n":"0p844_0p784_0p431_0p627","t":11.786,"s":[40.384,25.198],"e":[37.939,21.311],"to":[0,0],"ti":[0,0]},{"i":{"x":0.844,"y":0.878},"o":{"x":0,"y":0},"n":"0p844_0p878_0_0","t":13.93,"s":[37.939,21.311],"e":[34.255,15.897],"to":[0,0],"ti":[0,0]},{"i":{"x":0.381,"y":0.365},"o":{"x":0.001,"y":0},"n":"0p381_0p365_0p001_0","t":16.608,"s":[34.255,15.897],"e":[37.447,13.886],"to":[0,0],"ti":[0,0]},{"i":{"x":0.625,"y":0.667},"o":{"x":0.287,"y":0.268},"n":"0p625_0p667_0p287_0p268","t":17.435,"s":[37.447,13.886],"e":[39.87,10.531],"to":[0,0],"ti":[0,0]},{"i":{"x":0.646,"y":0.763},"o":{"x":0.31,"y":0.248},"n":"0p646_0p763_0p31_0p248","t":18.263,"s":[39.87,10.531],"e":[41.045,6.095],"to":[0,0],"ti":[0,0]},{"i":{"x":0.653,"y":0.761},"o":{"x":0.313,"y":0.237},"n":"0p653_0p761_0p313_0p237","t":19.09,"s":[41.045,6.095],"e":[39.106,-2.528],"to":[0,0],"ti":[0,0]},{"i":{"x":0.687,"y":0.717},"o":{"x":0.339,"y":0.221},"n":"0p687_0p717_0p339_0p221","t":20.892,"s":[39.106,-2.528],"e":[30.531,-11.142],"to":[0,0],"ti":[0,0]},{"i":{"x":0.726,"y":0.562},"o":{"x":0.38,"y":0.606},"n":"0p726_0p562_0p38_0p606","t":23.231,"s":[30.531,-11.142],"e":[25.794,-12.37],"to":[0,0],"ti":[0,0]},{"i":{"x":0.78,"y":0.4},"o":{"x":0.15,"y":1},"n":"0p78_0p4_0p15_1","t":24.888,"s":[25.794,-12.37],"e":[25.232,-12.524],"to":[0,0],"ti":[0,0]},{"t":25.714,"s":[25.232,-12.524],"h":1},{"i":{"x":0.78,"y":0.816},"o":{"x":0,"y":0},"n":"0p78_0p816_0_0","t":30,"s":[25.232,-12.524],"e":[33.601,-9.967],"to":[0,0],"ti":[0,0]},{"i":{"x":0.436,"y":0.468},"o":{"x":0.001,"y":0},"n":"0p436_0p468_0p001_0","t":32.464,"s":[33.601,-9.967],"e":[40.445,-1.957],"to":[0,0],"ti":[0,0]},{"i":{"x":0.656,"y":0.493},"o":{"x":0.314,"y":0.465},"n":"0p656_0p493_0p314_0p465","t":34.071,"s":[40.445,-1.957],"e":[44.005,0.741],"to":[0,0],"ti":[0,0]},{"i":{"x":0.669,"y":0.622},"o":{"x":0.334,"y":0.387},"n":"0p669_0p622_0p334_0p387","t":35.142,"s":[44.005,0.741],"e":[45.516,3.157],"to":[0,0],"ti":[0,0]},{"i":{"x":0.799,"y":0.895},"o":{"x":0.411,"y":0.437},"n":"0p799_0p895_0p411_0p437","t":35.68,"s":[45.516,3.157],"e":[46.683,21.386],"to":[0,0],"ti":[0,0]},{"i":{"x":0.491,"y":0.479},"o":{"x":0,"y":0},"n":"0p491_0p479_0_0","t":38.892,"s":[46.683,21.386],"e":[48.102,31.953],"to":[0,0],"ti":[0,0]},{"i":{"x":0.807,"y":0.062},"o":{"x":0.21,"y":1},"n":"0p807_0p062_0p21_1","t":42.642,"s":[48.102,31.953],"e":[48.638,32.589],"to":[0,0],"ti":[0,0]},{"i":{"x":0.456,"y":0.844},"o":{"x":0.001,"y":0.001},"n":"0p456_0p844_0p001_0p001","t":44,"s":[48.638,32.589],"e":[47.157,33.424],"to":[0,0],"ti":[-0.62224984169006,0.76814323663712]},{"i":{"x":0.67,"y":0.749},"o":{"x":0.328,"y":0.128},"n":"0p67_0p749_0p328_0p128","t":46,"s":[47.157,33.424],"e":[49.677,31.625],"to":[0.24896945059299,-0.30734312534332],"ti":[-0.66650778055191,0.32694971561432]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.427,"y":0.393},"n":"0p833_0p833_0p427_0p393","t":49.93,"s":[49.677,31.625],"e":[52.818,30.838],"to":[1.71637678146362,-0.84195399284363],"ti":[-0.00310659385286,0.00077664846322]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.929,"s":[52.818,30.838],"e":[53.359,31.112],"to":[0.02196365967393,-0.00549091491848],"ti":[-0.14638511836529,0.1448450088501]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":57.608,"s":[53.359,31.112],"e":[53.72,30.688],"to":[0.3058257997036,-0.30260822176933],"ti":[-0.00732801295817,0.00183200323954]},{"t":60.287109375}],"ix":2},"a":{"a":0,"k":[24.9,-3.2],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.728],"y":[0.956]},"o":{"x":[0.185],"y":[0.026]},"n":["0p728_0p956_0p185_0p026"],"t":0,"s":[0],"e":[4.274]},{"i":{"x":[0.856],"y":[1]},"o":{"x":[0.341],"y":[-0.104]},"n":["0p856_1_0p341_-0p104"],"t":1.608,"s":[4.274],"e":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":3.214,"s":[2],"e":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5.358,"s":[-3],"e":[-20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6.964,"s":[-20],"e":[-20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9.108,"s":[-20],"e":[-80]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.93,"s":[-80],"e":[-125]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16.608,"s":[-125],"e":[-171.455]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":19.09,"s":[-171.455],"e":[-178]},{"t":25.714,"s":[-178],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[-178],"e":[-104]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38.892,"s":[-104],"e":[-31.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42.642,"s":[-31.5],"e":[-35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[-35],"e":[-43.633]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":46,"s":[-43.633],"e":[-23.032]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49.93,"s":[-23.032],"e":[-4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54.929,"s":[-4],"e":[-2.375]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":57.608,"s":[-2.375],"e":[0]},{"t":60.287109375}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":70,"st":0,"bm":0}],"markers":[{"tm":15.5009765625,"cm":"3","dr":0},{"tm":20.0009765625,"cm":"1","dr":0},{"tm":25.5,"cm":"2","dr":0}]} \ No newline at end of file diff --git a/example/resource/dead_lift.json b/example/resource/dead_lift.json new file mode 100755 index 0000000000..3d20b4b6a6 --- /dev/null +++ b/example/resource/dead_lift.json @@ -0,0 +1 @@ +{"v":"5.2.0","fr":30,"ip":0,"op":59,"w":200,"h":200,"nm":"dead_lift_lottie","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"weights","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[9.577,20.488],[4.45,19.365],[5.573,14.238],[10.7,15.361]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"head","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[49],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37.5,"s":[49],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":61,"s":[0],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.5,"s":[-13],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75,"s":[-13],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78,"s":[0],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[49],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112.5,"s":[49],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136,"s":[0],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[-13],"e":[-13]},{"t":150}],"ix":10},"p":{"a":0,"k":[28.1,16.1,0],"ix":2},"a":{"a":0,"k":[28.1,16.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.6,0.391],[0.385,3.596],[3.595,-0.383],[-0.378,-3.593]],"o":[[3.585,-0.378],[-0.38,-3.598],[-3.597,0.378],[0.387,3.593]],"v":[[11.984,-19.214],[17.794,-26.411],[10.594,-32.226],[4.775,-25.024]],"c":true},"ix":2},"nm":"head","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"hands","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.869]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p869_0p167_0p167"],"t":0,"s":[0],"e":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.23]},"n":["0p667_1_0p167_0p23"],"t":15,"s":[30],"e":[47]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[47],"e":[47]},{"i":{"x":[0.928],"y":[0.939]},"o":{"x":[0.333],"y":[0]},"n":["0p928_0p939_0p333_0"],"t":37.5,"s":[47],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.163],"y":[0.296]},"n":["0p667_1_0p163_0p296"],"t":61,"s":[0],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.5,"s":[-6],"e":[-6]},{"i":{"x":[0.833],"y":[0.706]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p706_0p333_0"],"t":73,"s":[-6],"e":[0]},{"i":{"x":[0.833],"y":[0.884]},"o":{"x":[0.167],"y":[0.141]},"n":["0p833_0p884_0p167_0p141"],"t":78,"s":[0],"e":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.256]},"n":["0p667_1_0p167_0p256"],"t":90,"s":[30],"e":[47]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[47],"e":[47]},{"i":{"x":[0.833],"y":[0.853]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p853_0p333_0"],"t":112.5,"s":[47],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.319]},"n":["0p667_1_0p167_0p319"],"t":136,"s":[0],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[-6],"e":[-6]},{"t":150}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[27.439,19.512,0],"e":[27.053,20.09,0],"to":[-0.06430775672197,0.09626676887274,0],"ti":[0.06430775672197,-0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[27.053,20.09,0],"e":[27.053,20.09,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[27.053,20.09,0],"e":[27.439,19.512,0],"to":[0.06430775672197,-0.09626676887274,0],"ti":[-0.06430775672197,0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[27.439,19.512,0],"e":[27.053,20.09,0],"to":[-0.06430775672197,0.09626676887274,0],"ti":[0.06430775672197,-0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[27.053,20.09,0],"e":[27.053,20.09,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.5,"s":[27.053,20.09,0],"e":[27.439,19.512,0],"to":[0.06430775672197,-0.09626676887274,0],"ti":[-0.06430775672197,0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":142.5,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150}],"ix":2},"a":{"a":0,"k":[27.439,19.512,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.839,-0.295],[-0.129,2.689],[1.844,3.448],[1.127,-3.074]],"o":[[0,0],[1.833,-0.412],[0.128,-2.242],[0.244,-5.19],[-1.739,-3.252],[-1.186,3.234]],"v":[[3.992,-4.48],[4.392,4.402],[9.964,4.223],[10.357,-2.089],[10.249,-14.607],[3.946,-14.093]],"c":true},"ix":2},"nm":"hand","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.627,33.039],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":28,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"weights matt","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[29.116,53.347],[23.989,52.224],[25.112,47.097],[30.239,48.22]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"torso ","parent":7,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[-119]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[-119],"e":[-119]},{"i":{"x":[0.833],"y":[0.851]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p851_0p333_0"],"t":37.5,"s":[-119],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.289]},"n":["0p667_1_0p167_0p289"],"t":61,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":67.5,"s":[17],"e":[17]},{"i":{"x":[0.833],"y":[0.792]},"o":{"x":[0.321],"y":[0.041]},"n":["0p833_0p792_0p321_0p041"],"t":73,"s":[17],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.161]},"n":["0p833_0p833_0p167_0p161"],"t":78,"s":[0],"e":[-119]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[-119],"e":[-119]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112.5,"s":[-119],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[17],"e":[17]},{"t":150}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[4.825,31.85,0],"e":[6.859,33.368,0],"to":[0.27745488286018,0.19427600502968,0],"ti":[-0.67366856336594,-0.47170782089233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19.5,"s":[6.859,33.368,0],"e":[7.528,33.743,0],"to":[0.42024019360542,0.2942553460598,0],"ti":[-0.15734429657459,-0.11017366498709,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[7.528,33.743,0],"e":[7.528,33.743,0],"to":[0.40957602858543,0.28678822517395,0],"ti":[-0.15734429657459,-0.11017366498709,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[7.528,33.743,0],"e":[6.859,33.368,0],"to":[0.40957602858543,0.28678822517395,0],"ti":[-0.67366856336594,-0.47170782089233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.5,"s":[6.859,33.368,0],"e":[4.825,31.85,0],"to":[0.42024019360542,0.2942553460598,0],"ti":[0.28288394212723,0.45438802242279,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[4.825,31.85,0],"e":[5.162,30.642,0],"to":[-0.28288394212723,-0.45438802242279,0],"ti":[-0.05611232668161,0.20132550597191,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[5.162,30.642,0],"e":[5.162,30.642,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[5.162,30.642,0],"e":[4.825,31.85,0],"to":[-0.05611232668161,0.20132550597191,0],"ti":[-0.3534637093544,-0.48811373114586,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[4.825,31.85,0],"e":[7.282,33.571,0],"to":[0.3534637093544,0.48811373114586,0],"ti":[-0.40957602858543,-0.28678822517395,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[7.282,33.571,0],"e":[7.282,33.571,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.5,"s":[7.282,33.571,0],"e":[4.825,31.85,0],"to":[-0.40957602858543,-0.28678822517395,0],"ti":[0.40957602858543,0.28678822517395,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[4.825,31.85,0],"e":[4.825,31.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":142.5,"s":[4.825,31.85,0],"e":[4.825,31.85,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150}],"ix":2},"a":{"a":0,"k":[4.825,31.85,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-4.115,5.518],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.888,-5.492],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8.5,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-4.115,5.518],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.888,-5.492],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.775,-5.227],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.775,-5.227],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":37.5,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.704,-5.203],[-17.473,4.318],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":55.5,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.704,-5.203],[-17.473,4.318],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"t":105}],"ix":2},"nm":"torso","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"weights matt 3","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[29.116,53.347],[23.989,52.224],[25.112,47.097],[30.239,48.22]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"thigh","parent":9,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[55],"e":[55]},{"i":{"x":[0.833],"y":[0.843]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p843_0p333_0"],"t":37.5,"s":[55],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.217]},"n":["0p667_1_0p167_0p217"],"t":61,"s":[0],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.5,"s":[-11],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":72,"s":[-11],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78,"s":[0],"e":[55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[55],"e":[55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112.5,"s":[55],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136,"s":[0],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[-11],"e":[-11]},{"t":150}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[20.025,42.75,0],"e":[20.025,43.85,0],"to":[0,0.18333333730698,0],"ti":[0,-0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[20.025,43.85,0],"e":[20.025,43.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[20.025,43.85,0],"e":[20.025,42.75,0],"to":[0,-0.18333333730698,0],"ti":[0,0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[20.025,42.75,0],"e":[20.025,43.85,0],"to":[0,0.18333333730698,0],"ti":[0,-0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[20.025,43.85,0],"e":[20.025,43.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.5,"s":[20.025,43.85,0],"e":[20.025,42.75,0],"to":[0,-0.18333333730698,0],"ti":[0,0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":142.5,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150}],"ix":2},"a":{"a":0,"k":[20.19,42.716,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}]},{"t":78}],"ix":2},"nm":"thigh","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"weights matt 2","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[29.116,53.347],[23.989,52.224],[25.112,47.097],[30.239,48.22]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"legs","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[494.375,799.75,0],"ix":2},"a":{"a":0,"k":[19.437,62.975,0],"ix":1},"s":{"a":0,"k":[1000,1000,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"t":105}],"ix":2},"nm":"toes","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Dead_lift_layers_V2","refId":"comp_0","sr":0.75,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.125,100.062,0],"ix":2},"a":{"a":0,"k":[489.773,414.205,0],"ix":1},"s":{"a":0,"k":[22,22,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":59.25,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/hiking.json b/example/resource/hiking.json new file mode 100755 index 0000000000..42defb3c3d --- /dev/null +++ b/example/resource/hiking.json @@ -0,0 +1 @@ +{"v":"5.2.0","fr":30,"ip":0,"op":30,"w":200,"h":200,"nm":"hiking_lottie","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Arm Front","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.791]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p791_0p167_0p167"],"t":0,"s":[0],"e":[14.952]},{"i":{"x":[0.833],"y":[0.997]},"o":{"x":[0.167],"y":[0.137]},"n":["0p833_0p997_0p167_0p137"],"t":13,"s":[14.952],"e":[36]},{"i":{"x":[0.833],"y":[0.838]},"o":{"x":[0.167],"y":[-0.005]},"n":["0p833_0p838_0p167_-0p005"],"t":25,"s":[36],"e":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.176]},"n":["0p833_0p833_0p167_0p176"],"t":44.033,"s":[16],"e":[6.311]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54,"s":[6.311],"e":[0]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[517.5,323,0],"ix":2},"a":{"a":0,"k":[23.617,21.138,0],"ix":1},"s":{"a":0,"k":[1054,1054,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.843,-2.751],[-1.257,0.721],[0.745,1.4],[1.544,2.649],[1.598,-0.917],[-0.87,-1.54]],"o":[[0.781,1.166],[1.229,-0.706],[-1.477,-2.775],[-0.619,-1.062],[-1.46,0.837],[1.321,2.338]],"v":[[-4.014,-15.08],[-0.363,-14.066],[0.457,-17.473],[-5.18,-27.854],[-9.623,-29.411],[-10.997,-24.969]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.186,48.287],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Arm","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Elbow Front","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.977]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p977_0p333_0"],"t":25,"s":[0],"e":[-38]},{"i":{"x":[0.744],"y":[0.885]},"o":{"x":[0.167],"y":[-0.015]},"n":["0p744_0p885_0p167_-0p015"],"t":44.033,"s":[-38],"e":[-8]},{"i":{"x":[0.74],"y":[0.751]},"o":{"x":[0.272],"y":[0.298]},"n":["0p74_0p751_0p272_0p298"],"t":54,"s":[-8],"e":[0]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[30.353,31.479,0],"ix":2},"a":{"a":0,"k":[30.353,31.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.263,-0.087],[0,0],[0.04,1.289],[1.288,-0.04],[3.586,0.642],[0.127,-1.434]],"o":[[4.099,0.281],[1.29,-0.043],[-0.043,-1.286],[0,0],[-1.244,-0.223],[-0.148,1.673]],"v":[[-3.047,-14.016],[8.84,-13.072],[11.1,-15.48],[8.692,-17.735],[-2.38,-19.75],[-5.596,-17.276]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.336,31.487],"ix":2},"a":{"a":0,"k":[-3,-16.85],"ix":1},"s":{"a":0,"k":[103,103],"ix":3},"r":{"a":0,"k":10.727,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Elbow","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Stick","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.904]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p904_0p333_0"],"t":0,"s":[0],"e":[7]},{"i":{"x":[0.833],"y":[0.331]},"o":{"x":[0.167],"y":[0.806]},"n":["0p833_0p331_0p167_0p806"],"t":13,"s":[7],"e":[7.773]},{"i":{"x":[0.833],"y":[1.344]},"o":{"x":[0.167],"y":[0.113]},"n":["0p833_1p344_0p167_0p113"],"t":25.033,"s":[7.773],"e":[15]},{"i":{"x":[0.833],"y":[0.95]},"o":{"x":[0.167],"y":[0.044]},"n":["0p833_0p95_0p167_0p044"],"t":44.033,"s":[15],"e":[-15]},{"i":{"x":[0.874],"y":[0.848]},"o":{"x":[0.167],"y":[-0.066]},"n":["0p874_0p848_0p167_-0p066"],"t":54,"s":[-15],"e":[0]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[43.114,35.179,0],"ix":2},"a":{"a":0,"k":[43.114,35.179,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,0.014],[0.014,-0.708],[0,0],[-0.415,-0.002],[-0.016,0.506],[0,0]],"o":[[-0.708,-0.014],[0,0],[-0.015,0.505],[0.415,0.002],[0,0],[0.014,-0.706]],"v":[[21.135,-21.998],[19.829,-20.743],[19.315,29.155],[20.04,30.077],[20.822,29.166],[22.389,-20.694]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.653,45.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"stick","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"hiking_Layers_v2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":30,"op":60.5,"st":30,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"hiking_Layers_v2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":30.5,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"head","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":12,"ix":10},"p":{"a":0,"k":[26.05,15.81,0],"ix":2},"a":{"a":0,"k":[24.334,16.966,0],"ix":1},"s":{"a":0,"k":[94.877,94.877,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.955,0.722],[0.719,3.946],[3.946,-0.716],[-0.708,-3.944]],"o":[[3.937,-0.71],[-0.708,-3.948],[-3.949,0.709],[0.716,3.945]],"v":[[1.297,7.139],[7.139,-1.293],[-1.294,-7.145],[-7.15,1.292]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.298,8.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Thigh Back","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.842]},"o":{"x":[0.251],"y":[0.207]},"n":["0p833_0p842_0p251_0p207"],"t":0,"s":[2],"e":[27.02]},{"i":{"x":[0.833],"y":[0.892]},"o":{"x":[0.167],"y":[0.175]},"n":["0p833_0p892_0p167_0p175"],"t":9.385,"s":[27.02],"e":[54.62]},{"i":{"x":[0.758],"y":[2.134]},"o":{"x":[0.167],"y":[0.465]},"n":["0p758_2p134_0p167_0p465"],"t":20.881,"s":[54.62],"e":[60]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[22.634,39.387,0],"e":[23.203,38.296,0],"to":[0.09487666189671,-0.18184693157673,0],"ti":[-0.09487666189671,0.18184693157673,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[21.834,43.916,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[97.877,97.877,100],"e":[101.877,101.877,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.188,-1.209],[1.472,4.473],[9.661,14.867],[14.376,16.249]],"c":true}],"e":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.586,0.678],[0.504,5.089],[9.661,14.867],[14.376,16.249]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.587,"s":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.586,0.678],[0.504,5.089],[9.661,14.867],[14.376,16.249]],"c":true}],"e":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.188,-1.209],[1.473,4.473],[9.661,14.868],[14.376,16.249]],"c":true}]},{"t":30.5}],"ix":2},"nm":"l_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Leg Back","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.943]},"o":{"x":[0.116],"y":[0.359]},"n":["0p833_0p943_0p116_0p359"],"t":0,"s":[0],"e":[-14]},{"i":{"x":[0.752],"y":[0.297]},"o":{"x":[0.167],"y":[-0.053]},"n":["0p752_0p297_0p167_-0p053"],"t":20.881,"s":[-14],"e":[-7]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[34.319,61.409,0],"e":[33.939,60.92,0],"to":[-0.06338728219271,-0.08141442388296,0],"ti":[0.06338728219271,0.08141442388296,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[34.209,61.291,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,102,100],"e":[103,102,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.449,5.274],[2.016,-0.941],[-0.516,-1.524],[0,0],[-1.238,0],[-0.282,0.085],[0.468,1.529]],"o":[[-0.424,-1.544],[-1.718,0.802],[1.65,4.878],[0.381,1.245],[0.282,0],[1.529,-0.468],[0,0]],"v":[[16.137,12.346],[11.679,10.269],[9.969,14.857],[14.544,29.85],[17.198,32.21],[18.337,32.05],[20.065,28.48]],"c":true},"ix":2},"nm":"l_foot","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Leg back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Thigh Front","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.238],"y":[0.228]},"n":["0p833_0p898_0p238_0p228"],"t":0,"s":[2.5],"e":[-42]},{"i":{"x":[0.836],"y":[0.904]},"o":{"x":[0.167],"y":[0.348]},"n":["0p836_0p904_0p167_0p348"],"t":9.385,"s":[-42],"e":[-58]},{"i":{"x":[0.845],"y":[0.069]},"o":{"x":[0.147],"y":[-0.382]},"n":["0p845_0p069_0p147_-0p382"],"t":20.922,"s":[-58],"e":[-55]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[22.919,39.6,0],"e":[23.583,40.312,0],"to":[0.11068943887949,0.11859582364559,0],"ti":[-0.11068943887949,-0.11859582364559,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[21.834,43.741,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[101.877,101.877,100],"e":[97.877,97.877,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-4.9,-4.622],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}],"e":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-5.777,-4.958],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5.293,"s":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-5.777,-4.958],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}],"e":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-6.058,-5.209],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9.326,"s":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-6.058,-5.209],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}],"e":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-4.9,-4.622],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}]},{"t":30.5}],"ix":2},"nm":"R_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Leg Front","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.127],"y":[0.177]},"n":["0p667_1_0p127_0p177"],"t":0,"s":[-4],"e":[54]},{"i":{"x":[0.805],"y":[0.993]},"o":{"x":[0.333],"y":[0]},"n":["0p805_0p993_0p333_0"],"t":9.385,"s":[54],"e":[-3.419]},{"i":{"x":[0.752],"y":[0.23]},"o":{"x":[0.196],"y":[-0.049]},"n":["0p752_0p23_0p196_-0p049"],"t":20.922,"s":[-3.419],"e":[3.5]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[13.857,62.221,0],"e":[13.787,62.753,0],"to":[-0.01168949250132,0.08866687119007,0],"ti":[0.01168949250132,-0.08866687119007,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[13.884,62.316,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[100,100,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.857,1.296],[0.872,-1.201],[0,0],[-1.227,-0.977],[-0.619,0],[-0.562,0.702],[-3.613,4.33]],"o":[[-1.839,-1.283],[-3.081,4.247],[-0.979,1.229],[0.523,0.415],[0.836,0],[0,0],[0.907,-1.088]],"v":[[-5.65,11.629],[-10.708,12.773],[-20.055,25.4],[-19.605,29.391],[-17.837,30.014],[-15.611,28.941],[-4.676,16.291]],"c":true},"ix":2},"nm":"Leg front","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"R_foot","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"TORSO","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[511,506,0],"e":[511,496.248,0],"to":[0,-1.62533092498779,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10.587,"s":[511,496.248,0],"e":[511,506,0],"to":[0,0,0],"ti":[0,-1.62533092498779,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[23,38.5,0],"ix":1},"s":{"a":0,"k":[1054,1054,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}],"e":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-1.887,-1.611],[-1.795,-0.058],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.843,0.72],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-3.979,-0.971],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.587,"s":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-1.887,-1.611],[-1.795,-0.058],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.843,0.72],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-3.979,-0.971],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}],"e":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.922,"s":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}],"e":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}]},{"t":30.5}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.653,45.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"torso","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.571,-0.187],[-0.062,-0.002],[-0.096,2.661],[0,0],[-2.471,2.067],[8.487,-0.754],[0.256,-1.657],[0.01,-0.309],[0,0]],"o":[[0.062,0.008],[2.657,0.096],[0,0],[0,0],[1.822,-1.522],[-3.647,0.322],[-0.066,0.292],[0,0],[-0.094,2.601]],"v":[[-3.066,13.395],[-2.881,13.407],[2.105,8.764],[2.967,0.785],[5.798,-7.349],[-1.637,-12.749],[-6.521,-7.084],[-6.641,-6.177],[-7.525,8.418]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.603,23.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"back_pack","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"hiking_layers_stick_v2","refId":"comp_0","sr":0.5,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.688,100,0],"ix":2},"a":{"a":0,"k":[506.25,515.909,0],"ix":1},"s":{"a":0,"k":[22,22,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":30,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 14d9f8ebf119d0dfd7493aef3d3340d5cbc368b0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 31 Aug 2018 14:37:33 +0900 Subject: [PATCH 211/672] lottie/vector: add a local arena allocator. Change-Id: I7f76ab73d457ee9f4e9b5e35c1303c63c14efcea --- src/vector/vstackallocator.h | 134 +++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/vector/vstackallocator.h diff --git a/src/vector/vstackallocator.h b/src/vector/vstackallocator.h new file mode 100644 index 0000000000..ce5c7b5c19 --- /dev/null +++ b/src/vector/vstackallocator.h @@ -0,0 +1,134 @@ +#ifndef VSTACK_ALLOCATOR_H +#define VSTACK_ALLOCATOR_H + +#include +#include + +template +class arena +{ + alignas(alignment) char buf_[N]; + char* ptr_; + +public: + ~arena() {ptr_ = nullptr;} + arena() noexcept : ptr_(buf_) {} + arena(const arena&) = delete; + arena& operator=(const arena&) = delete; + + template char* allocate(std::size_t n); + void deallocate(char* p, std::size_t n) noexcept; + + static constexpr std::size_t size() noexcept {return N;} + std::size_t used() const noexcept {return static_cast(ptr_ - buf_);} + void reset() noexcept {ptr_ = buf_;} + +private: + static + std::size_t + align_up(std::size_t n) noexcept + {return (n + (alignment-1)) & ~(alignment-1);} + + bool + pointer_in_buffer(char* p) noexcept + {return buf_ <= p && p <= buf_ + N;} +}; + +template +template +char* +arena::allocate(std::size_t n) +{ + static_assert(ReqAlign <= alignment, "alignment is too small for this arena"); + assert(pointer_in_buffer(ptr_) && "stack_alloc has outlived arena"); + auto const aligned_n = align_up(n); + if (static_cast(buf_ + N - ptr_) >= aligned_n) + { + char* r = ptr_; + ptr_ += aligned_n; + return r; + } + + static_assert(alignment <= alignof(std::max_align_t), "you've chosen an " + "alignment that is larger than alignof(std::max_align_t), and " + "cannot be guaranteed by normal operator new"); + return static_cast(::operator new(n)); +} + +template +void +arena::deallocate(char* p, std::size_t n) noexcept +{ + assert(pointer_in_buffer(ptr_) && "stack_alloc has outlived arena"); + if (pointer_in_buffer(p)) + { + n = align_up(n); + if (p + n == ptr_) + ptr_ = p; + } + else + ::operator delete(p); +} + +template +class stack_alloc +{ +public: + using value_type = T; + static auto constexpr alignment = Align; + static auto constexpr size = N; + using arena_type = arena; + +private: + arena_type& a_; + +public: + stack_alloc(const stack_alloc&) = default; + stack_alloc& operator=(const stack_alloc&) = delete; + + stack_alloc(arena_type& a) noexcept : a_(a) + { + static_assert(size % alignment == 0, + "size N needs to be a multiple of alignment Align"); + } + template + stack_alloc(const stack_alloc& a) noexcept + : a_(a.a_) {} + + template struct rebind {using other = stack_alloc<_Up, N, alignment>;}; + + T* allocate(std::size_t n) + { + return reinterpret_cast(a_.template allocate(n*sizeof(T))); + } + void deallocate(T* p, std::size_t n) noexcept + { + a_.deallocate(reinterpret_cast(p), n*sizeof(T)); + } + + template + friend + bool + operator==(const stack_alloc& x, const stack_alloc& y) noexcept; + + template friend class stack_alloc; +}; + +template +inline +bool +operator==(const stack_alloc& x, const stack_alloc& y) noexcept +{ + return N == M && A1 == A2 && &x.a_ == &y.a_; +} + +template +inline +bool +operator!=(const stack_alloc& x, const stack_alloc& y) noexcept +{ + return !(x == y); +} + +#endif // VSTACK_ALLOCATOR_H From 5b53b71f4eb7b39c6474c6385e301cca57920771 Mon Sep 17 00:00:00 2001 From: Jaeun Choi Date: Wed, 29 Aug 2018 23:24:45 +0900 Subject: [PATCH 212/672] lottie/example: enhanced lottieviewer example Change-Id: I0eb2a8c528376397190c75b084e9510c3698c034 --- example/lottieview.cpp | 77 ++++++++++-- example/lottieview.h | 7 +- example/lottieviewer.cpp | 234 ++++++++++++++++++++++++++++++------ example/resource/layout.edc | 31 ++++- example/resource/layout.edj | Bin 8870 -> 9149 bytes 5 files changed, 296 insertions(+), 53 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 79ce8fb025..82eba73349 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -6,8 +6,12 @@ static Eina_Bool animator(void *data , double pos) { LottieView *view = static_cast(data); - view->seek(pos); - if (pos == 1.0) { + float nextPos = pos + view->mStartPos; + if (nextPos > 1.0) nextPos = 1.0; + + view->seek(nextPos); + if (nextPos == 1.0) { + view->mAnimator = NULL; view->finished(); return EINA_FALSE; } @@ -81,6 +85,38 @@ void LottieView::update(const std::vector &renderList) evas_object_vg_root_node_set(mVg, root); } +static void mImageDelCb(void *data, Evas *evas, Evas_Object *obj, void *) +{ + LottieView *lottie = (LottieView *)data; + + if (lottie->mImage != obj) return; + + lottie->mImage = NULL; + lottie->stop(); +} + +static void mVgDelCb(void *data, Evas *evas, Evas_Object *obj, void *) +{ + LottieView *lottie = (LottieView *)data; + if (lottie->mVg != obj) return; + + lottie->mVg = NULL; + lottie->stop(); +} + +void LottieView::initializeBufferObject(Evas *evas) +{ + if (mRenderMode) { + mImage = evas_object_image_filled_add(evas); + evas_object_image_colorspace_set(mImage, EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(mImage, EINA_TRUE); + evas_object_event_callback_add(mImage, EVAS_CALLBACK_DEL, mImageDelCb, this); + } else { + mVg = evas_object_vg_add(evas); + evas_object_event_callback_add(mVg, EVAS_CALLBACK_DEL, mVgDelCb, this); + } +} + LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr) { mPalying = false; @@ -95,13 +131,7 @@ LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullpt mRenderMode = renderMode; mAsyncRender = asyncRender; - if (mRenderMode) { - mImage = evas_object_image_filled_add(evas); - evas_object_image_colorspace_set(mImage, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(mImage, EINA_TRUE); - } else { - mVg = evas_object_vg_add(evas); - } + initializeBufferObject(evas); } LottieView::~LottieView() @@ -115,6 +145,14 @@ LottieView::~LottieView() delete mPlayer; } +Evas_Object *LottieView::getImage() { + if (mRenderMode) { + return mImage; + } else { + return mVg; + } +} + void LottieView::show() { if (mRenderMode) { @@ -139,16 +177,17 @@ void LottieView::seek(float pos) if (mPalying && mReverse) pos = 1.0 - pos; + mPos = pos; + if (mRenderMode) { LOTBuffer buf; evas_object_image_size_get(mImage, &buf.width, &buf.height); if (mAsyncRender) { if (mRenderTask.valid()) return; mDirty = true; - mPendingPos = pos; buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); buf.bytesPerLine = evas_object_image_stride_get(mImage); - mRenderTask = mPlayer->render(mPendingPos, buf); + mRenderTask = mPlayer->render(mPos, buf); mBuffer = buf; // to force a redraw evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); @@ -168,6 +207,11 @@ void LottieView::seek(float pos) } } +float LottieView::getPos() +{ + return mPos; +} + void LottieView::render() { if (!mDirty) return; @@ -186,7 +230,7 @@ void LottieView::render() } mBuffer.buffer = nullptr; } else { - const std::vector &renderList = mPlayer->renderList(mPendingPos); + const std::vector &renderList = mPlayer->renderList(mPos); update(renderList); } } @@ -239,6 +283,8 @@ void LottieView::setRepeatMode(LottieView::RepeatMode mode) void LottieView::play() { + mStartPos = mPos; + if (mAnimator) ecore_animator_del(mAnimator); mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this); mReverse = false; mCurCount = mRepeatCount; @@ -253,6 +299,10 @@ void LottieView::pause() void LottieView::stop() { mPalying = false; + if (mAnimator) { + ecore_animator_del(mAnimator); + mAnimator = NULL; + } } void LottieView::restart() @@ -263,6 +313,9 @@ void LottieView::restart() mReverse = !mReverse; else mReverse = false; + + mStartPos = 0; + if (mAnimator) ecore_animator_del(mAnimator); mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this); } } diff --git a/example/lottieview.h b/example/lottieview.h index e3e02d5d14..c94247c125 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -25,7 +25,7 @@ public: }; LottieView(Evas *evas, bool renderMode = true, bool asyncRender = true); ~LottieView(); - Evas_Object * getImage() { return mRenderMode ? mImage : mVg; } + Evas_Object *getImage(); void setSize(int w, int h); void setPos(int x, int y); void setFilePath(const char *filePath); @@ -39,11 +39,13 @@ public: long getTotalFrame() const { return mTotalFrame; } public: void seek(float pos); + float getPos(); void finished(); void play(); void pause(); void stop(); void render(); + void initializeBufferObject(Evas *evas); private: void createVgNode(LOTNode *node, Efl_VG *parent); void update(const std::vector &); @@ -67,7 +69,8 @@ public: bool mRenderMode; bool mAsyncRender; bool mDirty; - float mPendingPos; + float mStartPos; + float mPos; float mFrameRate; long mTotalFrame; std::future mRenderTask; diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 9e80c5596c..1d0b2e347e 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -2,6 +2,10 @@ #include "lottieview.h" #include #include +#include +#include +#include +#include using namespace std; @@ -9,13 +13,74 @@ typedef struct _AppInfo AppInfo; struct _AppInfo { LottieView *view; Evas_Object *layout; + Evas_Object *slider; + Evas_Object *button; + Ecore_Evas *ee; + Eina_Bool autoPlaying; }; +typedef struct _ItemData ItemData; +struct _ItemData { + int index; +}; + +Eina_List *jsonFiles; +bool renderMode = true; + static void -_win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +_layout_del_cb(void *data, Evas *, Evas_Object *, void *) { - LottieView *view = (LottieView *)data; - delete view; + AppInfo *info = (AppInfo *)data; + if (info->view) delete info->view; + info->view = NULL; + + ecore_evas_data_set(info->ee, "AppInfo", NULL); + + free(info); +} + +static void +_update_frame_info(AppInfo *info, double pos) +{ + int frameNo = pos * info->view->getTotalFrame(); + char buf[64]; + + sprintf(buf, "%d / %ld", frameNo, info->view->getTotalFrame()); + elm_object_part_text_set(info->layout, "text", buf); +} + +static void +_toggle_start_button(AppInfo *info) +{ + if (!info->autoPlaying) + { + info->autoPlaying = EINA_TRUE; + info->view->play(); + elm_object_text_set(info->button, "Stop"); + } + else + { + info->autoPlaying = EINA_FALSE; + info->view->stop(); + elm_object_text_set(info->button, "Start"); + } +} + +static void +_ee_pre_render_cb(Ecore_Evas *ee) +{ + AppInfo *info = (AppInfo *)ecore_evas_data_get(ee, "AppInfo"); + + if (info && info->autoPlaying && info->view) + { + float pos = info->view->getPos(); + _update_frame_info(info, pos); + elm_slider_value_set(info->slider, (double)pos); + info->view->render(); + + if (pos >= 1.0) + _toggle_start_button(info); + } } static void @@ -24,37 +89,34 @@ _slider_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) double val = elm_slider_value_get(obj); AppInfo *info = (AppInfo *)data; - int frameNo = val * info->view->getTotalFrame(); - char buf[64]; + _update_frame_info(info, val); - sprintf(buf, "%d / %ld", frameNo, info->view->getTotalFrame()); - - elm_object_part_text_set(info->layout, "text", buf); - - info->view->seek(val); - info->view->render(); + if (!info->autoPlaying) + { + info->view->seek(val); + info->view->render(); + } } -EAPI_MAIN int -elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) +static void +_button_clicked_cb(void *data, Evas_Object *obj, void *event_info) { - Evas_Object *win, *layout, *slider, *image; - bool renderMode = true; + AppInfo *info = (AppInfo *)data; + + _toggle_start_button(info); +} + +Evas_Object * +create_layout(Evas_Object *parent, char *file) +{ + Evas_Object *layout, *slider, *image, *button; + Evas *e; + Ecore_Evas *ee; char buf[64]; - AppInfo appInfo; + AppInfo *info = (AppInfo *)calloc(sizeof(AppInfo), 1); - if (argc > 1) { - if (!strcmp(argv[1], "--disable-render")) - renderMode = false; - } - - elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); - win = elm_win_util_standard_add("lottie", "LottieViewer"); - elm_win_autodel_set(win, EINA_TRUE); - evas_object_resize(win, 500, 700); - evas_object_show(win); - - layout = elm_layout_add(win); + //LAYOUT + layout = elm_layout_add(parent); evas_object_show(layout); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -62,29 +124,42 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) edjPath +="layout.edj"; elm_layout_file_set(layout, edjPath.c_str(), "layout"); - elm_win_resize_object_add(win, layout); + //LOTTIEVIEW + LottieView *view = new LottieView(evas_object_evas_get(layout), renderMode); std::string filePath = DEMO_DIR; - filePath +="insta_camera.json"; + filePath +=file; - LottieView *view = new LottieView(evas_object_evas_get(win), renderMode); view->setFilePath(filePath.c_str()); view->setSize(500, 500); - evas_object_smart_callback_add(win, "delete,request", _win_del_cb, (void *)view); - + //IMAGE from LOTTIEVIEW image = view->getImage(); evas_object_show(image); evas_object_size_hint_min_set(image, 500, 500); elm_object_part_content_set(layout, "lottie", image); - appInfo.view = view; - appInfo.layout = layout; - + //SLIDER slider = elm_slider_add(layout); - evas_object_show(slider); elm_object_part_content_set(layout, "slider", slider); - evas_object_smart_callback_add(slider, "changed", _slider_cb, (void *)&appInfo); + evas_object_smart_callback_add(slider, "changed", _slider_cb, (void *)info); + + button = elm_button_add(layout); + elm_object_text_set(button, "Start"); + elm_object_part_content_set(layout, "button", button); + evas_object_smart_callback_add(button, "clicked", _button_clicked_cb, (void *)info); + + e = evas_object_evas_get(layout); + ee = ecore_evas_ecore_evas_get(e); + ecore_evas_data_set(ee, "AppInfo", info); + ecore_evas_callback_pre_render_set(ee, _ee_pre_render_cb); + + info->view = view; + info->layout = layout; + info->slider = slider; + info->button = button; + info->ee = ee; + evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, _layout_del_cb, (void *)info); sprintf(buf, "%d / %ld", 0, view->getTotalFrame()); elm_object_part_text_set(layout, "text", buf); @@ -92,6 +167,89 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) view->seek(0.0); view->render(); + return layout; +} + +static void +_gl_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *nf = (Evas_Object *)data; + Elm_Object_Item *it = (Elm_Object_Item *)event_info; + elm_genlist_item_selected_set(it, EINA_FALSE); + + Evas_Object *layout = create_layout(nf, (char *)eina_list_nth(jsonFiles, (elm_genlist_item_index_get(it) - 1))); + elm_naviframe_item_push(nf, NULL, NULL, NULL, layout, NULL); +} + +static char * +_gl_text_get(void *data, Evas_Object *obj, const char *part) +{ + ItemData *id = (ItemData *) data; + char *str = (char *)eina_list_nth(jsonFiles, id->index); + return strdup(str); +} + +static void +_gl_del(void *data, Evas_Object *obj) +{ +} + +EAPI_MAIN int +elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) +{ + Evas_Object *win, *nf, *genlist; + Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); + ItemData *itemData; + DIR *dir; + struct dirent *ent; + int i, fileCount = 0; + + if (argc > 1) { + if (!strcmp(argv[1], "--disable-render")) + renderMode = false; + } + + //WIN + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + win = elm_win_util_standard_add("lottie", "LottieViewer"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_resize(win, 500, 700); + evas_object_show(win); + + //NAVIFRAME + nf = elm_naviframe_add(win); + evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, nf); + evas_object_show(nf); + + //GENLIST + genlist = elm_genlist_add(nf); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(genlist, "selected", _gl_selected_cb, nf); + + itc->item_style = "default"; + itc->func.text_get = _gl_text_get; + itc->func.del = _gl_del; + + std::string rscPath = DEMO_DIR; + + dir = opendir(rscPath.c_str()); + while ((ent = readdir(dir)) != NULL) { + if (!strncmp(ent->d_name + (strlen(ent->d_name) - 4), "json", 4)) { + jsonFiles = eina_list_append(jsonFiles, strdup(ent->d_name)); + fileCount++; + } + } + closedir(dir); + + for (i = 0; i < fileCount; i++) { + itemData = (ItemData *)calloc(sizeof(ItemData), 1); + itemData->index = i; + elm_genlist_item_append(genlist, itc, (void *)itemData, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + elm_naviframe_item_push(nf, "Lottie Viewer", NULL, NULL, genlist, NULL); + elm_run(); return 0; diff --git a/example/resource/layout.edc b/example/resource/layout.edc index f13e870896..97544161d7 100644 --- a/example/resource/layout.edc +++ b/example/resource/layout.edc @@ -45,22 +45,51 @@ collections { align: 0.5 1.0; rel1.to_x: "left_pad"; rel1.relative: 1.0 1.0; - rel2.to_x: "right_pad"; + rel2.to_x: "button_left_pad"; rel2.relative: 0.0 1.0; + fixed: 0 1; } } spacer { "left_pad"; desc { state: "default" 0.0; + fixed: 1 0; min: 20 0; + align: 0.0 0.5; rel2.relative: 0.0 0.0; } } spacer { "right_pad"; desc { state: "default" 0.0; + fixed: 1 0; min: 20 0; + align: 1.0 0.5; rel1.relative: 1.0 0.0; } } + swallow { "button"; + desc { state: "default" 0.0; + fixed: 1 1; + min: 80 55; + align: 1.0 0.5; + rel1.to_x: "right_pad"; + rel1.to_y: "slider"; + rel1.relative: 0.0 0.5; + rel2.to_x: "right_pad"; + rel2.to_y: "slider"; + rel2.relative: 0.0 0.5; + } + } + spacer { "button_left_pad"; + desc { state: "default" 0.0; + fixed: 1 0; + min: 20 0; + align: 1.0 0.5; + rel1.to_x: "button"; + rel1.relative: 0.0 0.0; + rel2.to_x: "button"; + rel2.relative: 0.0 1.0; + } + } } } } diff --git a/example/resource/layout.edj b/example/resource/layout.edj index 38add6be83136ffc2092b212719c747638201afc..8a74b1a345c76154f724cb537a3974272c7a2e73 100644 GIT binary patch literal 9149 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 PpXNHJzn#|QdXD=qmaHS* literal 8870 zcmZ{n34Bav_s6d##1dqer6DOz5Q9W)MP*MUku=f}%D9=ilUycq$K07D6IHQ`G*qu$kljv6Fd)kTbZ9^ zm=@O=rhgoG0hqguGq=%S2))%y`GI~8>_f;FXbiy+J;0ViI#H||Yz6vlsc$EOeG2A6 zv3X!Sz?>=O5B4QkJBkehI|9}kO_?_otP0)slwB>@1u$pI4!&`{hCaQPyI{Y8wW93W zfYqVjh8k}<*b^{%eb}q(3kL?DyOFV)qbcjNf{}I5tO$(won~KwwFjg3(E!#N3~REF zhqG`CM3>$h*5=m3f$aqA2S&zJ)-oLoK5XK@GO!phdcV8DQV2s+zWoa<6J0tEnt{Db z7-i=JmW@8`=c!Xv%)$!Hy9|+06v|39JKUw*>5#14CZ8!Cz8tDdRN<`^SO3jx-~A zOwSt(Msk>*_a<03FnY}oz`_VaQ|8csjX;<7eKy!g!q61Ej$j$+(!M$jrUs+q>MmFg zVZ;Z-9_=}p;9y7A0>9erRM1a?&48q12!3*3Kp5rIJ7Dl(6TAChs~qe;1zQj1f~M?a z9N136sPT|*?$`_CM(pqq-);jt3rYLnbFj;VQQx8lxz{={oVj})m=u4II3H#jSUn`| zzh+>>N75XSerP|S9FzUi>qGu|cqt6BH5%6Efmo3I3&FsK=?zBwNYAkWY%mx-UKLmz z7@g-|fTe@EqA9+@JRXRTCjR>p%m_x}O|e6sddxxBmGVmk*vDYrlpW5^13qL(eIm~w zv`DaHko1|8dC!1(qLGKhBG%@CSYSM+u`|)|pz%J}?sF^mxy}iXB)u7>Qk9>f11|tq!ao*m1(p zl)WKVJa0JI;Xd(faA3$cFL#AO_D6$_7vh6?4UIhHJ^b!Pd`s8o@nC6SEvWU)1se@U za#>l+Hn554N;L;E77a1vWq_1o2$J{>ce~dNNc!8&U<<+M^FUmAk^GhX2bqM181N!~ zk>Y@?2l{-lZy>#>_2DeMeg<==814kGyI@Z8cO9YgVD};ETzCS8bF$|unF~JhZth@* zT=OPlNc({7h4v8`IiC(_ieHMrLeM2KNFL$~#IrZz(w3Ky#J`Ap?-7vFJqVeK248uT zyhI#IPY(W?z{W!QQG4qKCW6uXI0se?CgnaPY6~+0tQ3;|eNYFs+=0Qz-s{2WxOWD_ z88^B2TY&8WlY9@^18p+c_mFgbCcdf$lg5LbiuM@n8YITG`wB7XeH&e6zbtf|x%X2@ zsWw4keC7aB4RbfS&oN%-wuGUPXC~ToFye3J?(v463FZR{-`eNh1xD%tozt~op$da+ zgSH!N2*t=av%wM+CdbwtFwA4iBgj!`|!el#NuzIkLq)#5`-5JJ*oSU>anc<9m$hpwI9}Wgv>Hbsl2>$dL0jAuc z^PxWki-)9R?IakA^TB$FbjG<*aE`Pl(it% ze3lX>?_n->+krc!JObSoH%dnpGY zhoUtDBj={ffjJr2`XQ$6>W=(IRV5%BKj9EROV^9^!(#jO#;ER}8vi|TGbtb2=y-|m2 z86989X;lTX%w_U;L!L#i%4PF8jMtBhCZhsHk&N&OxXPy6rq5#w3B_Mf{IyZh%o(v1 zNmv!&tkXt~CQgUVm^ghu75=bhKA%$;I`pl!zM#{IoLPA*_vClHR^iYj z7UnP>)tBGXviGZYk|r1=A?68!nH+;r#p;c@ zwppYp)Uri3tC^y)==G9Kks##BgG#EEk!)2(Mm=lb)TAtXqG*#|J^BBXK!y|xME@{t!JL1wEFacVn1b+(|jGMr9_Qp4m4 z7Lili3>ns7=GCZ+L&jwF z2qOauwR9V(^EfjC95Ep9Bv;jW0_?Cnlhvk*9Jvi_y2fG>1=$4U*36S&W>}4e1RWyJ z%pv7-dA%0(T`f5X>z!)hO~^N?jFVGRW_m@`X|}l;yQ>ZdkE;?xpTStC_nrXYLZG)mqY??4mk3uf;BIQ3i z?lXvoL_JO$&f|1Qa8}EhNMV*V5hWQv2e4^X0k1_(pg=As)o-IoFp{edx1wD|?U1N+ zSK8HFM$cLWi8bCe$$C`kSj8$b%02~V zh)o|AnJm8=ofa7#o33<5MW&5TNL7}Q5<5CUJt{RuSw?bVe1h^WIx;0TJyQNI6Wd5t z1|hc>lVcJrM!7WFD-3GC;stdKijT%Dpqj;!nr2IyIC4=BmQR1ZcA?9J&q@<6*E1gnwQm2#FO#&Nyulx<{AcjQ6Cd_Z>DO#k zhp-QZo?UFMtvs=mZ#3T>v~E%D2f@|#u8oVYEbj8nj2+LnPWgM{H=WF{FE2WFYtyQ) znw|7Zj!$>?;#Iqw=S`TCw&j%aBunw_gAeQAfS**E%I>TlrWsruJO*CU>Ch>sk43m$Ku12D;wf zsoT5uqrj`W)u$I~MJ(uYM``{4-;pdaH1E+4e_H4W~+m#&%2G zUF0&Q%j2JBK4qM~i}vtc{9$;&(%_KH`PWDPlvZ#kXVWvwsm+yVS6_PTbitXIzYTx7 zH+J1R@A~Vr4sCeU>!I&E9}Mh&qrBjkVGSdOpPw=GTw}7T%KPER??o>evL*ZQvzva? z-3Q@cM`?X^tK!q#-}awBa6@3rUcQx+VqN{3=f`@qTX^`X@7v#AKe);H$@OV}PKaL| zaA;8N2V>4I^6vQV(4vLHz}1J=ea$xS=N??rCtN7(^6bisf~V7;<$t+z)1{^BDtI9x zrB`TARpL+Yy;V`=GpbAJq2QEXo~~^0SaM^^uf2oR_fG}id+Z*w>+gLTIja*gm)7NX zx%c?}lG8z(e(O|qUo-!Q5|h8z^Ouk7^PL7+63$Ob+STepdW@;r#pUm2c6~9R-$Czb z+al(fTsBRNz7au0;WvU^+DH#M<*>5 zhd=046_?|5=~3FDsCj`N*_Ag7C&j1L#HZK9pPL!#c6a_e0|xl|`9+s`R^K^sJ|be# z-o?RdL(aFXsR~M&HEiXqHK`lFug*>VthC-e>aC-PiW|$$94kI^r1(tSirL414LW@^ z`;n_x*U106 zPAwR7erG0|oLReeN95Sj<39&}e&YJTA9DwsZ`{|04L{;FXPfiYPJ3VfW5lJBo$c6x zM*?~$XWb9Z$_&Z+Ze8d#_WSc~>n?Ol%2}~%kJHLrQ}TKz?cLa{qPLe#?4H#9RKoYW zf)<4KuI!PtyqvqnS&Ow6$Jh-f4!-XHMpY5M=b7=S5bJY?1+h6VYxCiexZ&>R<@4$|cB`GDn z)3d{Cx*7)0F?PPWAmR3l#JUv;@$893)qz7I-#dS3-IIa&ZO0EUGq$=JdSvjNN1dOv zGoS8rzW3ekLu&g}`^<<9*jxPj)>)gb`>x)Sns)EjfgPngVlN)J^xF7)*{LD-vP1nZ zTPoi?J^y6>IPXV?=Y*dgxV^(T?~6~qduLneg}UfHJ4*8=Pw;=b>(KV=`{s2$mGRh` zp0ca`)3UAQ8_T)Rzn=QV)`8on_BrJ@a@m96q%XbHHy-vRZaEnG+Q?;tGT5!(1+_G9Pc^)VYxr2XCFaeeZ-+r7)zRX_0# bnm)6-ru(ql@68?dbzI^4qrz&v_Wl0@ZYZFE From 288bd33029c57b35699bc219435f4dca5b74ec3a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 12:26:50 +0900 Subject: [PATCH 213/672] lottie/example: sort the file list before showing it in list view. Change-Id: I3dd2c2d332cfc13265694e1ac6ee2a4bae6e1afd --- example/lottieviewer.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 1d0b2e347e..eaa9bfadcd 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace std; @@ -24,7 +25,8 @@ struct _ItemData { int index; }; -Eina_List *jsonFiles; + +std::vector jsonFiles; bool renderMode = true; static void @@ -107,7 +109,7 @@ _button_clicked_cb(void *data, Evas_Object *obj, void *event_info) } Evas_Object * -create_layout(Evas_Object *parent, char *file) +create_layout(Evas_Object *parent, const char *file) { Evas_Object *layout, *slider, *image, *button; Evas *e; @@ -177,7 +179,7 @@ _gl_selected_cb(void *data, Evas_Object *obj, void *event_info) Elm_Object_Item *it = (Elm_Object_Item *)event_info; elm_genlist_item_selected_set(it, EINA_FALSE); - Evas_Object *layout = create_layout(nf, (char *)eina_list_nth(jsonFiles, (elm_genlist_item_index_get(it) - 1))); + Evas_Object *layout = create_layout(nf, jsonFiles[elm_genlist_item_index_get(it) - 1].c_str()); elm_naviframe_item_push(nf, NULL, NULL, NULL, layout, NULL); } @@ -185,8 +187,7 @@ static char * _gl_text_get(void *data, Evas_Object *obj, const char *part) { ItemData *id = (ItemData *) data; - char *str = (char *)eina_list_nth(jsonFiles, id->index); - return strdup(str); + return strdup(jsonFiles[id->index].c_str()); } static void @@ -202,7 +203,6 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) ItemData *itemData; DIR *dir; struct dirent *ent; - int i, fileCount = 0; if (argc > 1) { if (!strcmp(argv[1], "--disable-render")) @@ -236,13 +236,14 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) dir = opendir(rscPath.c_str()); while ((ent = readdir(dir)) != NULL) { if (!strncmp(ent->d_name + (strlen(ent->d_name) - 4), "json", 4)) { - jsonFiles = eina_list_append(jsonFiles, strdup(ent->d_name)); - fileCount++; + jsonFiles.push_back(ent->d_name); } } closedir(dir); - for (i = 0; i < fileCount; i++) { + std::sort(jsonFiles.begin(), jsonFiles.end(), [](auto & a, auto &b){return a < b;}); + + for (uint i = 0; i < jsonFiles.size(); i++) { itemData = (ItemData *)calloc(sizeof(ItemData), 1); itemData->index = i; elm_genlist_item_append(genlist, itc, (void *)itemData, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); From 84905d783004f91c0d0c2821fe1c8005c56b3026 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 12:31:16 +0900 Subject: [PATCH 214/672] lottie/parser: wrap the trim offset value before normalize. Change-Id: I5bce3b840cc54d626ea2397d35c4a7ef90e7be7e --- src/lottie/lottiemodel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 61e0d9b402..7d4518ea0d 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -656,7 +656,7 @@ public: {visitor->visit(this);} float start(int frameNo) const {return mStart.value(frameNo)/100.0f;} float end(int frameNo) const {return mEnd.value(frameNo)/100.0f;} - float offset(int frameNo) const {return mOffset.value(frameNo)/ 360.0f;} + float offset(int frameNo) const {return fmod(mOffset.value(frameNo), 360.0f)/ 360.0f;} LOTTrimData::TrimType type() const {return mTrimType;} public: LOTAnimatable mStart{0}; From d3be153e8277ae233c1c98f7c3eafb1e2aeb043b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 15:03:52 +0900 Subject: [PATCH 215/672] lottie: fixed cmake build issue. Change-Id: I48591bd78dd173d7f148cc2dcb3c31dd8cd9d1a2 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f8b631877e..084ce98672 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) #install header -install(FILES inc/lottieplayer.h DESTINATION include) +install(FILES inc/lotplayer.h inc/lotcommon.h DESTINATION include) #install lib install( TARGETS lottie-player EXPORT lottie-player-targets From 46ec17191e729730a63a23ccfc752976efcfe016 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 31 Aug 2018 17:27:49 +0900 Subject: [PATCH 216/672] lottieplayer: keep API coding convention. Not use "get" prefix so far. Change-Id: Iabc2852cd78d5ac4f4fa29f8b3b7195eafe1d804 --- example/lottieview.cpp | 4 ++-- inc/lotplayer.h | 4 ++-- src/lottie/lottieplayer.cpp | 17 ++++++++--------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 82eba73349..4a1254ca3c 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -238,8 +238,8 @@ void LottieView::render() void LottieView::setFilePath(const char *filePath) { mPlayer->setFilePath(filePath); - mFrameRate = mPlayer->getFrameRate(); - mTotalFrame = mPlayer->getTotalFrame(); + mFrameRate = mPlayer->frameRate(); + mTotalFrame = mPlayer->totalFrame(); } void LottieView::setSize(int w, int h) diff --git a/inc/lotplayer.h b/inc/lotplayer.h index 144d74c02b..0aab90d82e 100644 --- a/inc/lotplayer.h +++ b/inc/lotplayer.h @@ -24,9 +24,9 @@ public: float pos() const; - float getFrameRate() const; + float frameRate() const; - long getTotalFrame() const; + long totalFrame() const; const std::vector &renderList(float pos) const; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 733d464781..089e28a721 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -19,8 +19,8 @@ public: VSize size() const; float playTime() const; float pos(); - float getFrameRate() const; - long getTotalFrame() const; + float frameRate() const; + long totalFrame() const; const std::vector &renderList(float pos); bool render(float pos, const LOTBuffer &buffer, bool forceRender); @@ -33,7 +33,7 @@ private: float mPos = 0.0; }; -float LOTPlayerPrivate::getFrameRate() const +float LOTPlayerPrivate::frameRate() const { if (!mModel) { vWarning << "Model Data is not existed yet, please setFilePath() first."; @@ -43,7 +43,7 @@ float LOTPlayerPrivate::getFrameRate() const return mModel->frameRate(); } -long LOTPlayerPrivate::getTotalFrame() const +long LOTPlayerPrivate::totalFrame() const { if (!mModel) { vWarning << "Model Data is not existed yet, please setFilePath() first."; @@ -278,17 +278,16 @@ float LOTPlayer::pos() const return d->pos(); } -float LOTPlayer::getFrameRate() const +float LOTPlayer::frameRate() const { - return d->getFrameRate(); + return d->frameRate(); } -long LOTPlayer::getTotalFrame() const +long LOTPlayer::totalFrame() const { - return d->getTotalFrame(); + return d->totalFrame(); } - const std::vector &LOTPlayer::renderList(float pos) const { return d->renderList(pos); From d511c6cc504f46cdd455de67003f4719ec3d1b8f Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 31 Aug 2018 17:31:03 +0900 Subject: [PATCH 217/672] lottieplayer binding: ++apis bindings. Change-Id: I6becf969ae71d1b19399cc44ce1b38e92f3920d3 --- src/binding/c/lotplayer_capi.h | 2 ++ src/binding/c/lottieplayer_c.cpp | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/binding/c/lotplayer_capi.h b/src/binding/c/lotplayer_capi.h index ab8230b853..15af6dc329 100644 --- a/src/binding/c/lotplayer_capi.h +++ b/src/binding/c/lotplayer_capi.h @@ -18,6 +18,8 @@ LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file); LOT_EXPORT int lotplayer_set_size(LOTPlayer *player, int w, int h); LOT_EXPORT int lotplayer_get_size(const LOTPlayer *player, int* w, int* h); LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player); +LOT_EXPORT long lotplayer_get_totalframe(const LOTPlayer *player); +LOT_EXPORT float lotplayer_get_framerate(const LOTPlayer *player); LOT_EXPORT float lotplayer_get_pos(const LOTPlayer *player); LOT_EXPORT size_t lotplayer_get_node_count(const LOTPlayer *player, float pos); LOT_EXPORT const LOTNode* lotplayer_get_node(LOTPlayer *player, float pos, size_t idx); diff --git a/src/binding/c/lottieplayer_c.cpp b/src/binding/c/lottieplayer_c.cpp index 93ee843202..dcbf95acb5 100644 --- a/src/binding/c/lottieplayer_c.cpp +++ b/src/binding/c/lottieplayer_c.cpp @@ -77,6 +77,26 @@ LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player) return player->playTime(); } +LOT_EXPORT long lotplayer_get_totalframe(const LOTPlayer *player) +{ + if (!player) { + vWarning << "Invalid parameter player = nullptr"; + return 0; + } + + return player->totalFrame(); +} + +LOT_EXPORT float lotplayer_get_framerate(const LOTPlayer *player) +{ + if (!player) { + vWarning << "Invalid parameter player = nullptr"; + return 0.0f; + } + + return player->frameRate(); +} + LOT_EXPORT const LOTNode* lotplayer_get_node(LOTPlayer *player, float pos, size_t idx) { if (!player) { From b9b13e5923e1d3eb12a21d4677e3ac21f0154104 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 15:49:10 +0900 Subject: [PATCH 218/672] lottie/render: don't try to render invisible layer. Change-Id: I2544b6a04d07eaf155fbddc405952e739b14eaf1 --- src/lottie/lottieitem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 0681437a68..03336f2e5c 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -159,6 +159,8 @@ VRle LOTMaskItem::rle() void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { + if (!visible()) return; + VRle matteRle; if (matteSource) { mDrawableList.clear(); @@ -348,6 +350,8 @@ void LOTCompLayerItem::updateStaticProperty() void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { + if (!visible()) return; + VRle matteRle; if (matteSource) { mDrawableList.clear(); From 8bdea992bca5ab4ea10a04e0629bb25a7252aa01 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Mon, 3 Sep 2018 16:33:37 +0900 Subject: [PATCH 219/672] lottie/vector: fix build failure for non-arm devices Change-Id: Id03173880629859df24e8c195a5060d8494f8d88 --- src/vector/vdrawhelper_neon.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vector/vdrawhelper_neon.cpp b/src/vector/vdrawhelper_neon.cpp index 65fd57a0a2..49502d1ce8 100644 --- a/src/vector/vdrawhelper_neon.cpp +++ b/src/vector/vdrawhelper_neon.cpp @@ -1,3 +1,4 @@ +#if defined(__ARM_NEON__) #include "vdrawhelper.h" @@ -16,3 +17,5 @@ void memfill32(uint32_t *dest, uint32_t value, int length) length, value); } + +#endif From 6f2d9ddf1a36eea3e42b9b085dbefd3df965336c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 16:39:34 +0900 Subject: [PATCH 220/672] lottie/render: hide the layer when matte layer is hidden. in AE matte layers visibility affects the layer below. Change-Id: I0d1c6e19f78bc3d25ac6ae8a56ec5371a925e300 --- src/lottie/lottieitem.cpp | 10 ++++------ src/lottie/lottieitem.h | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 03336f2e5c..951f64bfe1 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -159,8 +159,6 @@ VRle LOTMaskItem::rle() void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { - if (!visible()) return; - VRle matteRle; if (matteSource) { mDrawableList.clear(); @@ -350,8 +348,6 @@ void LOTCompLayerItem::updateStaticProperty() void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { - if (!visible()) return; - VRle matteRle; if (matteSource) { mDrawableList.clear(); @@ -388,10 +384,12 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const } if (matteLayer) { - matteLayer->render(painter, mask, matteRle, layer); + if (matteLayer->visible() && layer->visible()) + matteLayer->render(painter, mask, matteRle, layer); matteLayer = nullptr; } else { - layer->render(painter, mask, matteRle, nullptr); + if (layer->visible()) + layer->render(painter, mask, matteRle, nullptr); } } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 1396311850..99db81ef25 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -66,6 +66,7 @@ public: virtual void updateStaticProperty(); virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } + bool visible() const; protected: virtual void updateContent() = 0; @@ -74,7 +75,6 @@ protected: inline float combinedAlpha() const {return mCombinedAlpha;} inline bool isStatic() const {return mStatic;} float opacity(int frameNo) const; - bool visible() const; inline DirtyFlag flag() const {return mDirtyFlag;} VRle maskRle(const VRect &clipRect); bool hasMask() const {return !mMasks.empty();} From c7c391453e1fcedbcf1520dd186918017faee3c5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 17:19:11 +0900 Subject: [PATCH 221/672] lottie: mordernize using clang-tidy "modernize-use-override" Change-Id: Ice8612f9ceb3b99ebeeb6b618a54e9298b4cb66f --- src/lottie/lottieitem.h | 6 +++--- src/lottie/lottiemodel.cpp | 26 +++++++++++++------------- src/lottie/lottieparser.cpp | 30 +++++++++++++++--------------- src/vector/vdebug.cpp | 2 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 99db81ef25..83fbda9afd 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -362,7 +362,7 @@ class LOTPaintDataItem : public LOTContentItem public: LOTPaintDataItem(bool staticContent); void addPathItems(std::vector &list, int startOffset); - virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) override; void renderList(std::vector &list) final; protected: virtual void updateContent(int frameNo) = 0; @@ -476,8 +476,8 @@ class LOTRepeaterItem : public LOTContentItem { public: LOTRepeaterItem(LOTRepeaterData *data); - virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - virtual void renderList(std::vector &list) final; + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + void renderList(std::vector &list) final; private: LOTRepeaterData *mData; }; diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 5d4145f73c..58b7f4b5bf 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -6,19 +6,19 @@ class LottieRepeaterProcesser : public LOTDataVisitor { public: LottieRepeaterProcesser() : mRepeaterFound(false) {} - void visit(LOTCompositionData *) {} - void visit(LOTLayerData *) {} - void visit(LOTTransformData *) {} - void visit(LOTShapeGroupData *) {} - void visit(LOTShapeData *) {} - void visit(LOTRectData *) {} - void visit(LOTEllipseData *) {} - void visit(LOTTrimData *) {} - void visit(LOTRepeaterData *) { mRepeaterFound = true; } - void visit(LOTFillData *) {} - void visit(LOTStrokeData *) {} - void visit(LOTPolystarData *) {} - void visitChildren(LOTGroupData *obj) + void visit(LOTCompositionData *) override {} + void visit(LOTLayerData *) override {} + void visit(LOTTransformData *) override {} + void visit(LOTShapeGroupData *) override {} + void visit(LOTShapeData *) override {} + void visit(LOTRectData *) override {} + void visit(LOTEllipseData *) override {} + void visit(LOTTrimData *) override {} + void visit(LOTRepeaterData *) override { mRepeaterFound = true; } + void visit(LOTFillData *) override {} + void visit(LOTStrokeData *) override {} + void visit(LOTPolystarData *) override {} + void visitChildren(LOTGroupData *obj) override { for (auto child : obj->mChildren) { child.get()->accept(this); diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index be8dbc9caa..5a0b05f03d 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1856,13 +1856,13 @@ void LottieParserImpl::parseProperty(LOTAnimatable &obj) class LOTDataInspector : public LOTDataVisitor { public: - void visit(LOTCompositionData *obj) + void visit(LOTCompositionData *obj) override { vDebug << "[COMP_START:: static:" << obj->isStatic() << " v:" << obj->mVersion << " [{ stFm endFm fmRate } { " << obj->mStartFrame << " " << obj->mEndFrame << " }]\n"; } - void visit(LOTLayerData *obj) + void visit(LOTLayerData *obj) override { vDebug << "[LAYER_START:: type:" << layerType(obj->mLayerType) << " id:" << obj->mId << " Pid:" << obj->mParentId @@ -1871,57 +1871,57 @@ public: << obj->mOutFrame << " " << obj->mStartFrame << " " << obj->mTimeStreatch << " }]"; } - void visit(LOTTransformData *t) + void visit(LOTTransformData *t) override { vDebug << "[TRANSFORM: static: " << t->isStatic() << " ]"; } - void visit(LOTShapeGroupData *o) + void visit(LOTShapeGroupData *o) override { vDebug << "[GROUP_START:: static:" << o->isStatic() << "]"; } - void visit(LOTShapeData *s) + void visit(LOTShapeData *s) override { vDebug << "[SHAPE: static:" << s->isStatic() << "]"; } - void visit(LOTRectData *r) + void visit(LOTRectData *r) override { vDebug << "[RECT: static:" << r->isStatic() << "]"; } - void visit(LOTEllipseData *e) + void visit(LOTEllipseData *e) override { vDebug << "[ELLIPSE: static:" << e->isStatic() << "]"; } - void visit(LOTPolystarData *e) + void visit(LOTPolystarData *e) override { vDebug << "[POLYSTAR: static:" << e->isStatic() << "]"; } - void visit(LOTTrimData *t) + void visit(LOTTrimData *t) override { vDebug << "[TRIM: static: " << t->isStatic() << " ]"; } - void visit(LOTRepeaterData *r) + void visit(LOTRepeaterData *r) override { vDebug << "[REPEATER: static:" << r->isStatic() << "]"; } - void visit(LOTFillData *f) + void visit(LOTFillData *f) override { vDebug << "[FILL: static:" << f->isStatic() << "]"; } - void visit(LOTGFillData *f) + void visit(LOTGFillData *f) override { vDebug << "[GFILL: static:" << f->isStatic() << " ty:" << f->mGradientType << " s:" << f->mStartPoint.value(0) << " e:" << f->mEndPoint.value(0) << "]"; } - void visit(LOTGStrokeData *f) + void visit(LOTGStrokeData *f) override { vDebug << "[GSTROKE: static:" << f->isStatic() << "]"; } - void visit(LOTStrokeData *s) + void visit(LOTStrokeData *s) override { vDebug << "[STROKE: static:" << s->isStatic() << "]"; } - void visitChildren(LOTGroupData *obj) + void visitChildren(LOTGroupData *obj) override { for (auto child : obj->mChildren) child.get()->accept(this); switch (obj->type()) { diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 22e131b0b3..2d8b3a8a43 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -397,7 +397,7 @@ public: static_assert(sizeof(Item) == 256, "Unexpected size != 256"); } - ~RingBuffer() + ~RingBuffer() override { for (size_t i = 0; i < m_size; ++i) { m_ring[i].~Item(); From d19359f8cb3295a1ebd0557426c34473c6faf30c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 18:10:45 +0900 Subject: [PATCH 222/672] lottie: modernize using clang-tidy "modernize-use-equals-default" Change-Id: Ic09bf5651333f63f2603c8e3d9dd8afd4b73c7aa --- src/lottie/lottieitem.h | 5 ++--- src/lottie/lottieloader.cpp | 6 +----- src/lottie/lottieloader.h | 1 - src/lottie/lottiemodel.h | 4 ++-- src/lottie/rapidjson/document.h | 4 ++-- src/lottie/rapidjson/internal/ieee754.h | 2 +- src/vector/vbezier.h | 2 +- src/vector/vbrush.h | 2 +- src/vector/vdrawhelper.h | 2 +- src/vector/vpath.cpp | 14 -------------- src/vector/vpath.h | 2 -- 11 files changed, 11 insertions(+), 33 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 83fbda9afd..0f90c4cd30 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -55,7 +55,7 @@ class LOTLayerItem { public: LOTLayerItem(LOTLayerData *layerData); - virtual ~LOTLayerItem(){} + virtual ~LOTLayerItem()= default; int id() const {return mLayerData->id();} int parentId() const {return mLayerData->parentId();} void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;} @@ -169,8 +169,7 @@ class LOTTrimItem; class LOTContentItem { public: - LOTContentItem(){} - virtual ~LOTContentItem(){} + virtual ~LOTContentItem()= default; virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0; virtual void renderList(std::vector &){} void setParent(LOTContentItem *parent) {mParent = parent;} diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index b97dd6861d..a948e4a3c2 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -8,7 +8,6 @@ using namespace std; class LottieFileCache { public: - ~LottieFileCache(); static LottieFileCache &get() { static LottieFileCache CACHE; @@ -19,12 +18,11 @@ public: void add(std::string &key, std::shared_ptr value); private: - LottieFileCache() {} + LottieFileCache() = default; std::unordered_map> mHash; }; -LottieFileCache::~LottieFileCache() {} std::shared_ptr LottieFileCache::find(std::string &key) { auto search = mHash.find(key); @@ -40,8 +38,6 @@ void LottieFileCache::add(std::string &key, std::shared_ptr value) mHash[key] = value; } -LottieLoader::LottieLoader() {} - bool LottieLoader::load(std::string &path) { LottieFileCache &fileCache = LottieFileCache::get(); diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index 0c4367b480..e87cd79d33 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -8,7 +8,6 @@ class LOTModel; class LottieLoader { public: - LottieLoader(); bool load(std::string &filePath); std::shared_ptr model(); private: diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 7d4518ea0d..4abf4e5cbc 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -35,7 +35,7 @@ class LOTMaskData; class LOTDataVisitor { public: - virtual ~LOTDataVisitor() {} + virtual ~LOTDataVisitor() = default; virtual void visit(LOTCompositionData *) = 0; virtual void visit(LOTLayerData *) = 0; virtual void visit(LOTTransformData *) = 0; @@ -269,7 +269,7 @@ public: Repeater }; LOTData(LOTData::Type type): mType(type){} - virtual ~LOTData(){} + virtual ~LOTData()= default; inline LOTData::Type type() const {return mType;} virtual void accept(LOTDataVisitor *){} bool isStatic() const{return mStatic;} diff --git a/src/lottie/rapidjson/document.h b/src/lottie/rapidjson/document.h index aeca757d56..98c4eb1d9f 100644 --- a/src/lottie/rapidjson/document.h +++ b/src/lottie/rapidjson/document.h @@ -2547,7 +2547,7 @@ public: GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } - ~GenericArray() {} + ~GenericArray() = default; SizeType Size() const { return value_.Size(); } SizeType Capacity() const { return value_.Capacity(); } @@ -2602,7 +2602,7 @@ public: GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } - ~GenericObject() {} + ~GenericObject() = default; SizeType MemberCount() const { return value_.MemberCount(); } SizeType MemberCapacity() const { return value_.MemberCapacity(); } diff --git a/src/lottie/rapidjson/internal/ieee754.h b/src/lottie/rapidjson/internal/ieee754.h index c2684ba2a3..56b2bb16ff 100644 --- a/src/lottie/rapidjson/internal/ieee754.h +++ b/src/lottie/rapidjson/internal/ieee754.h @@ -22,7 +22,7 @@ namespace internal { class Double { public: - Double() {} + Double() = default; Double(double d) : d_(d) {} Double(uint64_t u) : u_(u) {} diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index ccb573374a..4323616995 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -7,7 +7,7 @@ V_BEGIN_NAMESPACE class VBezier { public: - VBezier() {} + VBezier() = default; VPointF pointAt(float t) const; VBezier onInterval(float t0, float t1) const; float length() const; diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index 29711f9537..f2e6d217b1 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -17,7 +17,7 @@ public: enum class Type { Linear, Radial }; VGradient(VGradient::Type type); void setStops(const VGradientStops &stops); - VGradient() {} + VGradient() = default; public: static constexpr int colorTableSize = 1024; diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index bf66854244..51a068b324 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -103,7 +103,7 @@ struct VGradientData { struct VSpanData { class Pinnable { protected: - ~Pinnable() {} + ~Pinnable() = default; }; enum class Type { None, Solid, LinearGradient, RadialGradient }; diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 5114603540..08e0938896 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -8,20 +8,6 @@ V_BEGIN_NAMESPACE -VPath::VPathData::VPathData() - : m_points(), m_elements(), m_segments(0), mStartPoint(), mNewSegment(true) -{ -} - -VPath::VPathData::VPathData(const VPathData &o) - : m_points(o.m_points), - m_elements(o.m_elements), - m_segments(o.m_segments), - mStartPoint(o.mStartPoint), - mNewSegment(o.mNewSegment) -{ -} - void VPath::VPathData::transform(const VMatrix &m) { for (auto &i : m_points) { diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 8845b415cf..24fce594a7 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -50,8 +50,6 @@ public: private: struct VPathData { - VPathData(); - VPathData(const VPathData &o); bool isEmpty() const { return m_elements.empty(); } void moveTo(float x, float y); void lineTo(float x, float y); From 886b17756ffca68ed5d4847d4f34194adc2a3824 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 18:27:12 +0900 Subject: [PATCH 223/672] lottie: avoid extra copy by using std::move Change-Id: Iaa61ee36a87e26b2c26676cae4b7cf2e94b595a0 --- src/vector/vdrawhelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 315b59b42f..ccb1168309 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -7,7 +7,7 @@ class VGradientCache { public: struct CacheInfo : public VSpanData::Pinnable { - inline CacheInfo(VGradientStops s) : stops(s) {} + inline CacheInfo(VGradientStops s) : stops(std::move(s)) {} uint32_t buffer32[VGradient::colorTableSize]; VGradientStops stops; bool alpha; From 59778f7c2d098c4a0aeea721bde65031127023b1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 18:36:19 +0900 Subject: [PATCH 224/672] lottie: moderize using clang-tidy 'modernize-return-braced-init-list' Change-Id: I4186243915c8bda61aade79e55f87e286801d2da --- src/vector/vbezier.h | 10 +++++----- src/vector/vline.h | 4 ++-- src/vector/vmatrix.cpp | 4 ++-- src/vector/vpath.cpp | 2 +- src/vector/vpoint.h | 6 +++--- src/vector/vrect.h | 4 ++-- src/vector/vregion.cpp | 6 +++--- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index 4323616995..f41e532630 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -18,10 +18,10 @@ public: inline void split(VBezier *firstHalf, VBezier *secondHalf) const; float tAtLength(float len) const; void splitAtLength(float len, VBezier *left, VBezier *right); - VPointF pt1() const { return VPointF(x1, y1); } - VPointF pt2() const { return VPointF(x2, y2); } - VPointF pt3() const { return VPointF(x3, y3); } - VPointF pt4() const { return VPointF(x4, y4); } + VPointF pt1() const { return {x1, y1}; } + VPointF pt2() const { return {x2, y2}; } + VPointF pt3() const { return {x3, y3}; } + VPointF pt4() const { return {x4, y4}; } private: VPointF derivative(float t) const; @@ -62,7 +62,7 @@ inline VPointF VBezier::pointAt(float t) const b = b * m_t + c * t; y = a * m_t + b * t; } - return VPointF(x, y); + return {x, y}; } inline void VBezier::parameterSplitLeft(float t, VBezier *left) diff --git a/src/vector/vline.h b/src/vector/vline.h index 47ddff40ba..5ac6eb317a 100644 --- a/src/vector/vline.h +++ b/src/vector/vline.h @@ -19,8 +19,8 @@ public: } float length() const { return length(mX1, mY1, mX2, mY2);} void splitAtLength(float length, VLine &left, VLine &right) const; - VPointF p1() const { return VPointF(mX1, mY1); } - VPointF p2() const { return VPointF(mX2, mY2); } + VPointF p1() const { return {mX1, mY1}; } + VPointF p2() const { return {mX2, mY2}; } static float length(float x1, float y1, float x2, float y2); diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 5fff287249..08be579e99 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -582,7 +582,7 @@ VRect VMatrix::map(const VRect &rect) const h = -h; y -= h; } - return VRect(x, y, w, h); + return {x, y, w, h}; } else if (t < MatrixType::Project) { // see mapToPolygon for explanations of the algorithm. float x = 0, y = 0; @@ -665,7 +665,7 @@ VPointF VMatrix::map(const VPointF &p) const y *= w; } } - return VPointF(x, y); + return {x, y}; } static std::string type_helper(VMatrix::MatrixType t) { diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 08e0938896..ad30a2ad67 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -350,7 +350,7 @@ static VPointF curvesForArc(const VRectF &rect, float startAngle, int *point_count) { if (rect.isNull()) { - return VPointF(); + return {}; } float x = rect.x(); diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 2ee01f0bd4..a2bee124c1 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -15,7 +15,7 @@ public: inline float & ry() noexcept { return my; } inline void setX(float x) { mx = x; } inline void setY(float y) { my = y; } - inline VPointF operator-() noexcept { return VPointF(-mx, -my); } + inline VPointF operator-() noexcept { return {-mx, -my}; } inline VPointF & operator+=(const VPointF &p) noexcept; inline VPointF & operator-=(const VPointF &p) noexcept; friend const VPointF operator+(const VPointF &p1, const VPointF &p2) @@ -43,7 +43,7 @@ inline bool fuzzyCompare(const VPointF &p1, const VPointF &p2) inline VPointF operator-(const VPointF &p1, const VPointF &p2) { - return VPointF(p1.mx - p2.mx, p1.my - p2.my); + return {p1.mx - p2.mx, p1.my - p2.my}; } inline const VPointF operator*(const VPointF &p, float c) @@ -116,7 +116,7 @@ inline VDebug &operator<<(VDebug &os, const VPoint &o) inline VPoint operator-(const VPoint &p1, const VPoint &p2) { - return VPoint(p1.mx - p2.mx, p1.my - p2.my); + return {p1.mx - p2.mx, p1.my - p2.my}; } constexpr inline bool VPoint::operator==(const VPoint &o) const diff --git a/src/vector/vrect.h b/src/vector/vrect.h index eea0b81e1c..f946e9b49e 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -115,7 +115,7 @@ V_CONSTEXPR inline int VRect::height() const inline VRect VRect::translated(int dx, int dy) const { - return VRect(x1 + dx, y1 + dy, x2 - x1, y2 - y1); + return {x1 + dx, y1 + dy, x2 - x1, y2 - y1}; } inline void VRect::translate(int dx, int dy) @@ -165,7 +165,7 @@ public: V_CONSTEXPR inline float y() const; V_CONSTEXPR inline VPointF center() const { - return VPointF(x1 + (x2 - x1) / 2.f, y1 + (y2 - y1) / 2.f); + return {x1 + (x2 - x1) / 2.f, y1 + (y2 - y1) / 2.f}; } inline void setLeft(float l) { x1 = l; } inline void setTop(float t) { y1 = t; } diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index f482330bde..71aa1ea468 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -1785,7 +1785,7 @@ const VRegionData shared_empty; inline VRect box_to_rect(box_type_t *box) { - return VRect(box->x1, box->y1, box->x2 - box->x1, box->y2 - box->y1); + return {box->x1, box->y1, box->x2 - box->x1, box->y2 - box->y1}; } void VRegion::cleanUp(VRegionData *x) @@ -1984,7 +1984,7 @@ int VRegion::rectCount() const VRect VRegion::rectAt(int index) const { VRegionPrivate *reg = d->rgn; - if (!reg) return VRect(); + if (!reg) return {}; box_type_t *box = PIXREGION_RECTS(reg) + index; @@ -2052,7 +2052,7 @@ bool VRegion::operator==(const VRegion &r) const VRect VRegion::boundingRect() const noexcept { - if (isEmpty()) return VRect(); + if (isEmpty()) return {}; return box_to_rect(&d->rgn->extents); } From 234a92d533255126229cab56974ecad446e52509 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 18:50:54 +0900 Subject: [PATCH 225/672] lottie: modernize using clang-tidy 'modernize-use-default-member-init' Change-Id: I6ee31ae694d9f9cfb6cabbe160a980cd5277d1a7 --- src/lottie/lottiemodel.cpp | 3 +-- src/lottie/lottiemodel.h | 16 ++++++---------- src/vector/vbrush.h | 4 ++-- src/vector/velapsedtimer.h | 3 +-- src/vector/vpoint.h | 18 +++++++++--------- src/vector/vrect.h | 20 ++++++++++---------- 6 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 58b7f4b5bf..7c75c074e2 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -5,7 +5,6 @@ class LottieRepeaterProcesser : public LOTDataVisitor { public: - LottieRepeaterProcesser() : mRepeaterFound(false) {} void visit(LOTCompositionData *) override {} void visit(LOTLayerData *) override {} void visit(LOTTransformData *) override {} @@ -46,7 +45,7 @@ public: } public: - bool mRepeaterFound; + bool mRepeaterFound{false}; }; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 4abf4e5cbc..b4bbddf33a 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -74,15 +74,15 @@ enum class LayerType { class LottieColor { public: - LottieColor():r(1),g(1), b(1){} + LottieColor() = default; LottieColor(float red, float green , float blue):r(red), g(green),b(blue){} VColor toColor(float a=1){ return VColor((255 * r), (255 * g), (255 * b), (255 * a));} friend inline LottieColor operator+(const LottieColor &c1, const LottieColor &c2); friend inline LottieColor operator-(const LottieColor &c1, const LottieColor &c2); public: - float r; - float g; - float b; + float r{1}; + float g{1}; + float b{1}; }; inline LottieColor operator-(const LottieColor &c1, const LottieColor &c2) @@ -185,18 +185,14 @@ template class LOTKeyFrame { public: - LOTKeyFrame(): mStartFrame(0), - mEndFrame(0), - mInterpolator(nullptr){} - T value(int frameNo) const { float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); return mValue.value(progress); } public: - int mStartFrame; - int mEndFrame; + int mStartFrame{0}; + int mEndFrame{0}; std::shared_ptr mInterpolator; LOTKeyFrameValue mValue; }; diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index f2e6d217b1..ca03a1dce0 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -53,14 +53,14 @@ public: class VBrush { public: enum class Type { NoBrush, Solid, LinearGradient, RadialGradient, Texture }; - VBrush() : mType(Type::NoBrush) {} + VBrush() = default; VBrush(const VColor &color); VBrush(const VGradient *gradient); VBrush(int r, int g, int b, int a); inline VBrush::Type type() const { return mType; } public: - VBrush::Type mType; + VBrush::Type mType{Type::NoBrush}; VColor mColor; const VGradient *mGradient; }; diff --git a/src/vector/velapsedtimer.h b/src/vector/velapsedtimer.h index f8d2f9a8e7..77dc0da45c 100644 --- a/src/vector/velapsedtimer.h +++ b/src/vector/velapsedtimer.h @@ -6,7 +6,6 @@ class VElapsedTimer { public: - VElapsedTimer() : m_valid(false) {} double elapsed() const; bool hasExpired(double millsec); void start(); @@ -15,6 +14,6 @@ public: private: std::chrono::high_resolution_clock::time_point clock; - bool m_valid; + bool m_valid{false}; }; #endif // VELAPSEDTIMER_H diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index a2bee124c1..3eb8ed5d66 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -7,7 +7,7 @@ V_BEGIN_NAMESPACE class VPointF { public: - constexpr inline VPointF() noexcept : mx(0), my(0) {} + VPointF() = default; constexpr inline VPointF(float x, float y) noexcept : mx(x), my(y) {} constexpr inline float x() const noexcept { return mx; } constexpr inline float y() const noexcept { return my; } @@ -32,8 +32,8 @@ public: friend inline const VPointF operator/(float val, const VPointF &); private: - float mx; - float my; + float mx{0}; + float my{0}; }; inline bool fuzzyCompare(const VPointF &p1, const VPointF &p2) @@ -88,7 +88,7 @@ inline VPointF &VPointF::operator-=(const VPointF &p) noexcept class VPoint { public: - constexpr inline VPoint() noexcept : mx(0), my(0) {} + VPoint() = default; constexpr inline VPoint(int x, int y) noexcept : mx(x), my(y) {} constexpr inline int x() const noexcept { return mx; } constexpr inline int y() const noexcept { return my; } @@ -105,8 +105,8 @@ public: inline friend VDebug &operator<<(VDebug &os, const VPoint &o); private: - int mx; - int my; + int mx{0}; + int my{0}; }; inline VDebug &operator<<(VDebug &os, const VPoint &o) { @@ -140,7 +140,7 @@ inline VPoint &VPoint::operator-=(const VPoint &p) noexcept class VSize { public: - constexpr inline VSize() noexcept : mw(0), mh(0) {} + VSize() = default; constexpr inline VSize(int w, int h) noexcept : mw(w), mh(h) {} bool isEmpty() const {return (mw <= 0 || mh <= 0);} constexpr inline int width() const noexcept { return mw; } @@ -157,8 +157,8 @@ public: inline friend VDebug &operator<<(VDebug &os, const VSize &o); private: - int mw; - int mh; + int mw{0}; + int mh{0}; }; inline VDebug &operator<<(VDebug &os, const VSize &o) { diff --git a/src/vector/vrect.h b/src/vector/vrect.h index f946e9b49e..b6c4d96907 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -7,7 +7,7 @@ V_BEGIN_NAMESPACE class VRect { public: - V_CONSTEXPR VRect() : x1(0), y1(0), x2(-1), y2(-1) {} + VRect() = default; V_CONSTEXPR VRect(int left, int top, int width, int height); V_CONSTEXPR inline bool isEmpty() const; V_CONSTEXPR inline bool isNull() const; @@ -37,10 +37,10 @@ public: friend VDebug & operator<<(VDebug &os, const VRect &o); private: - int x1; - int y1; - int x2; - int y2; + int x1{0}; + int y1{0}; + int x2{-1}; + int y2{-1}; }; inline bool VRect::intersects(const VRect &r) @@ -144,7 +144,7 @@ V_CONSTEXPR inline VRect::VRect(int left, int top, int width, int height) class VRectF { public: - V_CONSTEXPR VRectF() : x1(0), y1(0), x2(-1), y2(-1) {} + VRectF() = default; VRectF(float left, float top, float width, float height) { x1 = left; @@ -182,10 +182,10 @@ public: } private: - float x1; - float y1; - float x2; - float y2; + float x1{0}; + float y1{0}; + float x2{-1}; + float y2{-1}; }; V_CONSTEXPR inline bool VRectF::isEmpty() const From 8288c8cf8376f44a36ff1e7c56c06ff3be9d4c19 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Sep 2018 19:10:44 +0900 Subject: [PATCH 226/672] lottie: fixed inefficiency using clang-tidy performance option. Change-Id: I7fc33842e177091a596f980b87759a1cb90ed79e --- src/lottie/lottieloader.cpp | 2 +- src/lottie/lottiemodel.cpp | 4 ++-- src/lottie/lottieparser.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index a948e4a3c2..e819e3c80f 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -35,7 +35,7 @@ std::shared_ptr LottieFileCache::find(std::string &key) void LottieFileCache::add(std::string &key, std::shared_ptr value) { - mHash[key] = value; + mHash[key] = std::move(value); } bool LottieLoader::load(std::string &path) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 7c75c074e2..bbbaba228a 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -19,7 +19,7 @@ public: void visit(LOTPolystarData *) override {} void visitChildren(LOTGroupData *obj) override { - for (auto child : obj->mChildren) { + for (const auto& child : obj->mChildren) { child.get()->accept(this); if (mRepeaterFound) { LOTRepeaterData *repeater = @@ -31,7 +31,7 @@ public: // copy all the child of the object till repeater and // move that in to a group and then add that group to // the repeater object. - for (auto cpChild : obj->mChildren) { + for (const auto& cpChild : obj->mChildren) { if (cpChild == child) break; // there shouldn't be any trim object left in the child list if (cpChild.get()->type() == LOTData::Type::Trim) { diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 5a0b05f03d..90be955711 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -533,7 +533,7 @@ VRect LottieParserImpl::getRect() void LottieParserImpl::resolveLayerRefs() { - for (auto i : mLayersToUpdate) { + for (const auto& i : mLayersToUpdate) { LOTLayerData *layer = i.get(); auto search = compRef->mAssets.find(layer->mPreCompRefId); if (search != compRef->mAssets.end()) { @@ -801,11 +801,11 @@ std::shared_ptr LottieParserImpl::parseLayer() } // update the static property of layer bool staticFlag = true; - for (auto child : layer->mChildren) { + for (const auto& child : layer->mChildren) { staticFlag &= child.get()->isStatic(); } - for (auto mask : layer->mMasks) { + for (const auto& mask : layer->mMasks) { staticFlag &= mask->isStatic(); } @@ -955,7 +955,7 @@ std::shared_ptr LottieParserImpl::parseGroupObject() } } bool staticFlag = true; - for (auto child : group->mChildren) { + for (const auto& child : group->mChildren) { staticFlag &= child.get()->isStatic(); } @@ -1923,7 +1923,7 @@ public: } void visitChildren(LOTGroupData *obj) override { - for (auto child : obj->mChildren) child.get()->accept(this); + for (const auto& child : obj->mChildren) child.get()->accept(this); switch (obj->type()) { case LOTData::Type::Layer: { LOTLayerData *layer = static_cast(obj); From 6f5efb5eb38af4ef5afb1f7438772476ccea5e74 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Sep 2018 18:15:09 +0900 Subject: [PATCH 227/672] lottie: fixed warning. Change-Id: I5b4bf56ed2ad38d0d12a031791e23b24083ff573 --- src/lottie/lottieitem.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 0f90c4cd30..322592ca4f 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -161,7 +161,6 @@ public: LOTNode mCNode; }; -class LOTNode; class LOTPathDataItem; class LOTPaintDataItem; class LOTTrimItem; From dbf479dbd51cd27aee3702b9c1445b0a0f820646 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Sep 2018 18:41:47 +0900 Subject: [PATCH 228/672] lottie: added new loadfromdata() api in lottie player. Change-Id: Iadc6e57953190bdb860415cb3a4d4d02a6ac3cf6 --- inc/lotplayer.h | 2 ++ src/lottie/lottieloader.cpp | 21 ++++++++++++++++++--- src/lottie/lottieloader.h | 1 + src/lottie/lottieplayer.cpp | 23 +++++++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/inc/lotplayer.h b/inc/lotplayer.h index 0aab90d82e..a22547874a 100644 --- a/inc/lotplayer.h +++ b/inc/lotplayer.h @@ -18,6 +18,8 @@ public: ~LOTPlayer(); LOTPlayer(); + bool loadFromData(const char *jsonData, const char *key); + bool setFilePath(const char *filePath); float playTime() const; diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index e819e3c80f..289876ffc0 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -1,4 +1,4 @@ -#include "lottieloader.h" +#include "lottieloader.h" #include "lottieparser.h" #include @@ -14,7 +14,7 @@ public: return CACHE; } - std::shared_ptr find(std::string &key); + std::shared_ptr find(const std::string &key); void add(std::string &key, std::shared_ptr value); private: @@ -23,7 +23,7 @@ private: std::unordered_map> mHash; }; -std::shared_ptr LottieFileCache::find(std::string &key) +std::shared_ptr LottieFileCache::find(const std::string &key) { auto search = mHash.find(key); if (search != mHash.end()) { @@ -65,6 +65,21 @@ bool LottieLoader::load(std::string &path) return true; } +bool LottieLoader::loadFromData(const char *jsonData, const char *key) +{ + LottieFileCache &fileCache = LottieFileCache::get(); + std::string keyString(key); + + mModel = fileCache.find(std::string(keyString)); + if (mModel) return true; + + LottieParser parser(const_cast(jsonData)); + mModel = parser.model(); + fileCache.add(keyString, mModel); + + return true; +} + std::shared_ptr LottieLoader::model() { return mModel; diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index e87cd79d33..32ec5aaa3b 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -9,6 +9,7 @@ class LottieLoader { public: bool load(std::string &filePath); + bool loadFromData(const char *jsonData, const char *key); std::shared_ptr model(); private: std::shared_ptr mModel; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 089e28a721..551f56a225 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -14,6 +14,8 @@ public: LOTPlayerPrivate(); bool update(float pos); bool setFilePath(std::string path); + bool loadFromData(const char *jsonData, + const char *key); void setSize(const VSize &sz); void setPos(float pos); VSize size() const; @@ -151,6 +153,22 @@ bool LOTPlayerPrivate::setFilePath(std::string path) return false; } +bool LOTPlayerPrivate::loadFromData(const char *jsonData, const char *key) +{ + if (!jsonData) { + vWarning << "jason data is empty"; + return false; + } + + LottieLoader loader; + if (loader.loadFromData(jsonData, key)) { + mModel = loader.model(); + mCompItem = std::make_unique(mModel.get()); + return true; + } + return false; +} + /* * Implement a task stealing schduler to perform render task * As each player draws into its own buffer we can delegate this @@ -250,6 +268,11 @@ LOTPlayer::~LOTPlayer() * @param path add the details */ +bool LOTPlayer::loadFromData(const char *jsonData, const char *key) +{ + return d->loadFromData(jsonData, key); +} + bool LOTPlayer::setFilePath(const char *filePath) { return d->setFilePath(filePath); From 5eecb9ad36835944396a4f2ad657ae4292206952 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Sep 2018 19:10:32 +0900 Subject: [PATCH 229/672] lottie/example: use loadfromData() api in demo app. Change-Id: I8e5ce194f1795ca30ac8aad319ba25706a6023cf --- example/demo.cpp | 10 +++++++++- example/lottieview.cpp | 7 +++++++ example/lottieview.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/example/demo.cpp b/example/demo.cpp index 4bd2b8e997..19a7180f85 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -2,6 +2,8 @@ #include "lottieview.h" #include #include +#include +#include using namespace std; static void @@ -27,8 +29,14 @@ main(void) std::string filePath = DEMO_DIR; filePath +="mask.json"; + std::ifstream f; + f.open(filePath); + std::stringstream buf; + buf << f.rdbuf(); + f.close(); + LottieView *view = new LottieView(app->evas()); - view->setFilePath(filePath.c_str()); + view->loadFromData(buf.str().data(), "test_key"); view->setPos(0, 0); view->setSize(800, 800); view->show(); diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 4a1254ca3c..cb8ce89295 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -242,6 +242,13 @@ void LottieView::setFilePath(const char *filePath) mTotalFrame = mPlayer->totalFrame(); } +void LottieView::loadFromData(const char *jsonData, const char *key) +{ + mPlayer->loadFromData(jsonData, key); + mFrameRate = mPlayer->frameRate(); + mTotalFrame = mPlayer->totalFrame(); +} + void LottieView::setSize(int w, int h) { if (mRenderMode) { diff --git a/example/lottieview.h b/example/lottieview.h index c94247c125..30098ffcd7 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -29,6 +29,7 @@ public: void setSize(int w, int h); void setPos(int x, int y); void setFilePath(const char *filePath); + void loadFromData(const char *jsonData, const char *key); void show(); void hide(); void loop(bool loop); From 6f3dfc1c2d1b862308fc555815cf6dcda6cf35ec Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 5 Sep 2018 19:37:36 +0900 Subject: [PATCH 230/672] lottie/render: add neon path srcOver compostion mode for solid src. Change-Id: I711dc309b02911de1155b0e788c6e79b6630fb7a --- src/vector/vdrawhelper.cpp | 12 ++++-------- src/vector/vdrawhelper_neon.cpp | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index ccb1168309..90f20ebb88 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -674,15 +674,11 @@ void vInitDrawhelperFunctions() #if defined(__ARM_NEON__) // update fast path for NEON -// extern void comp_func_solid_SourceOver_neon( -// uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); -// extern void comp_func_solid_Source_neon( -// uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); + extern void comp_func_solid_SourceOver_neon( + uint32_t * dest, int length, uint32_t color, uint32_t const_alpha); -// COMP_functionForModeSolid_C[VPainter::CompModeSrc] = -// comp_func_solid_Source_neon; -// COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = -// comp_func_solid_SourceOver_neon; + COMP_functionForModeSolid_C[VPainter::CompModeSrcOver] = + comp_func_solid_SourceOver_neon; #endif #if defined(__SSE2__) diff --git a/src/vector/vdrawhelper_neon.cpp b/src/vector/vdrawhelper_neon.cpp index 49502d1ce8..806a8b566f 100644 --- a/src/vector/vdrawhelper_neon.cpp +++ b/src/vector/vdrawhelper_neon.cpp @@ -9,6 +9,13 @@ pixman_composite_src_n_8888_asm_neon (int32_t w, int32_t dst_stride, uint32_t src); +extern "C" void +pixman_composite_over_n_8888_asm_neon(int32_t w, + int32_t h, + uint32_t *dst, + int32_t dst_stride, + uint32_t src); + void memfill32(uint32_t *dest, uint32_t value, int length) { pixman_composite_src_n_8888_asm_neon(length, @@ -18,4 +25,16 @@ void memfill32(uint32_t *dest, uint32_t value, int length) value); } +void +comp_func_solid_SourceOver_neon(uint32_t *dest, int length, uint32_t color, + uint32_t const_alpha) +{ + if (const_alpha != 255) color = BYTE_MUL(color, const_alpha); + + pixman_composite_over_n_8888_asm_neon(length, + 1, + dest, + length, + color); +} #endif From de902032de788c3bcb02492ae310f2ee56cf2309 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 5 Sep 2018 16:47:09 +0900 Subject: [PATCH 231/672] lottie: optimize VColor structure. uchar is enough to store 0-255 possible color value. Change-Id: Iaf6a24dd99158483723e98a930f12478770fac58 --- src/vector/vglobal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index a46742fd1c..f23719b364 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -260,10 +260,10 @@ public: } public: - ushort a; - ushort r; - ushort g; - ushort b; + uchar a; + uchar r; + uchar g; + uchar b; }; enum class FillRule { EvenOdd, Winding }; From 81b77d5f3a64d1e482f6a722af3d354fc3817d09 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 5 Sep 2018 16:56:38 +0900 Subject: [PATCH 232/672] lottie/vector: optimize VMatrix size requirement. Change-Id: I64efd97336904669d60c6ce99f83d5737f83d9b7 --- src/vector/vmatrix.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 7acf53aff0..f09acbd5d5 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -10,7 +10,7 @@ struct VMatrixData; class VMatrix { public: enum class Axis { X, Y, Z }; - enum class MatrixType { + enum class MatrixType: unsigned char { None = 0x00, Translate = 0x01, Scale = 0x02, @@ -55,11 +55,11 @@ public: private: friend struct VSpanData; - mutable MatrixType mType{MatrixType::None}; - mutable MatrixType dirty{MatrixType::None}; float m11{1}, m12{0}, m13{0}; float m21{0}, m22{1}, m23{0}; float mtx{0}, mty{0}, m33{1}; + mutable MatrixType mType{MatrixType::None}; + mutable MatrixType dirty{MatrixType::None}; }; inline VPointF VMatrix::map(float x, float y) const From da0613c3ae85acc53f7b490e496bbe5f71a6353e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 5 Sep 2018 17:34:24 +0900 Subject: [PATCH 233/672] packaging: include c api header. Change-Id: I2b495d978474f7d5e3447fc23dd4126303beaf1e --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 084ce98672..ceed7e9125 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) #install header -install(FILES inc/lotplayer.h inc/lotcommon.h DESTINATION include) +install(FILES inc/lotplayer.h inc/lotcommon.h src/binding/c/lotplayer_capi.h DESTINATION include) #install lib install( TARGETS lottie-player EXPORT lottie-player-targets From 7ac6a6d6eef539f1d0e261b5e55f4662b5b59dc5 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 5 Sep 2018 20:33:30 +0900 Subject: [PATCH 234/672] lottieplayer: ++ lotplayer_set_data() Change-Id: I8f38f6473213aa2d9904aac0dd68aaa207b1e076 --- src/binding/c/lotplayer_capi.h | 1 + src/binding/c/lottieplayer_c.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/binding/c/lotplayer_capi.h b/src/binding/c/lotplayer_capi.h index 15af6dc329..5c374d1367 100644 --- a/src/binding/c/lotplayer_capi.h +++ b/src/binding/c/lotplayer_capi.h @@ -15,6 +15,7 @@ typedef struct lotplayer_s LOTPlayer; LOT_EXPORT LOTPlayer *lotplayer_create(void); LOT_EXPORT int lotplayer_destroy(LOTPlayer *player); LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file); +LOT_EXPORT int lotplayer_set_data(LOTPlayer *player, const char *data, const char *key); LOT_EXPORT int lotplayer_set_size(LOTPlayer *player, int w, int h); LOT_EXPORT int lotplayer_get_size(const LOTPlayer *player, int* w, int* h); LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player); diff --git a/src/binding/c/lottieplayer_c.cpp b/src/binding/c/lottieplayer_c.cpp index dcbf95acb5..96ffeb2d76 100644 --- a/src/binding/c/lottieplayer_c.cpp +++ b/src/binding/c/lottieplayer_c.cpp @@ -22,6 +22,16 @@ LOT_EXPORT int lotplayer_destroy(LOTPlayer *player) return LOT_PLAYER_ERROR_NONE; } +LOT_EXPORT int lotplayer_set_data(LOTPlayer *player, const char *data, const char *key) +{ + if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; + bool ret = player->loadFromData(data, key); + + if (!ret) return -1; + + return LOT_PLAYER_ERROR_NONE; +} + LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file) { if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; From 38662413407a93f637c66183ab0a57a3d98f919f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 6 Sep 2018 11:17:02 +0900 Subject: [PATCH 235/672] lottie/optimization: keep the layers in back-to-front order in scenegraph for cache coherency Change-Id: I31678bc3f4470287a4ebebc8ab88cbd0a38d2f15 --- src/lottie/lottieitem.cpp | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 951f64bfe1..6c1b1f5006 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -316,6 +316,7 @@ bool LOTLayerItem::visible() const LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) : LOTLayerItem(layerModel) { + // 1. create layer item for (auto &i : mLayerData->mChildren) { LOTLayerData *layerModel = dynamic_cast(i.get()); if (layerModel) { @@ -325,24 +326,28 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) } // 2. update parent layer - for (auto &i : mLayers) { - int id = i->parentId(); + for (const auto &layer : mLayers) { + int id = layer->parentId(); if (id >= 0) { auto search = std::find_if(mLayers.begin(), mLayers.end(), [id](const auto& val){ return val->id() == id;}); - if (search != mLayers.end()) i->setParentLayer((*search).get()); + if (search != mLayers.end()) layer->setParentLayer((*search).get()); } // update the precomp layer if its not the root layer. - if (!layerModel->root()) i->setPrecompLayer(this); + if (!layerModel->root()) layer->setPrecompLayer(this); } + + // 3. keep the layer in back-to-front order. + // as lottie model keeps the data in front-toback-order. + std::reverse(mLayers.begin(), mLayers.end()); } void LOTCompLayerItem::updateStaticProperty() { LOTLayerItem::updateStaticProperty(); - for (auto &i : mLayers) { - i->updateStaticProperty(); + for (const auto &layer : mLayers) { + layer->updateStaticProperty(); } } @@ -375,17 +380,15 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const } LOTLayerItem *matteLayer = nullptr; - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - LOTLayerItem *layer = (*i).get(); - + for (const auto &layer : mLayers) { if (!matteLayer && layer->hasMatte()) { - matteLayer = layer; + matteLayer = layer.get(); continue; } if (matteLayer) { if (matteLayer->visible() && layer->visible()) - matteLayer->render(painter, mask, matteRle, layer); + matteLayer->render(painter, mask, matteRle, layer.get()); matteLayer = nullptr; } else { if (layer->visible()) @@ -396,9 +399,8 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const void LOTCompLayerItem::updateContent() { - // update the layer from back to front - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - (*i)->update(frameNo(), combinedMatrix(), combinedAlpha()); + for (const auto &layer : mLayers) { + layer->update(frameNo(), combinedMatrix(), combinedAlpha()); } } @@ -406,9 +408,8 @@ void LOTCompLayerItem::renderList(std::vector &list) { if (!visible()) return; - // update the layer from back to front - for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) { - (*i)->renderList(list); + for (const auto &layer : mLayers) { + layer->renderList(list); } } From acfadf70a4f93655ab64c440f7813cf777b3d7dd Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 6 Sep 2018 12:16:59 +0900 Subject: [PATCH 236/672] lottie: keep the content in back-tofron order in lottie scenegraph. Change-Id: I15090782105c5e30d38e4d2df896d430d6f8cc19 --- src/lottie/lottieitem.cpp | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 6c1b1f5006..56a4532cc7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -556,6 +556,9 @@ void LOTContentGroupItem::addChildren(LOTGroupData *data) mContents.push_back(std::move(content)); } } + + // keep the content in back-to-front order. + std::reverse(mContents.begin(), mContents.end()); } void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, @@ -582,17 +585,18 @@ void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, mMatrix = m; - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - (*i)->update(frameNo, m, alpha, newFlag); + for (const auto &content : mContents) { + content->update(frameNo, m, alpha, newFlag); } } void LOTContentGroupItem::applyTrim() { - for (auto &i : mContents) { - if (auto trim = dynamic_cast(i.get())) { + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto content = (*i).get(); + if (auto trim = dynamic_cast(content)) { trim->update(); - } else if (auto group = dynamic_cast(i.get())) { + } else if (auto group = dynamic_cast(content)) { group->applyTrim(); } } @@ -600,8 +604,8 @@ void LOTContentGroupItem::applyTrim() void LOTContentGroupItem::renderList(std::vector &list) { - for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { - (*i)->renderList(list); + for (const auto &content : mContents) { + content->renderList(list); } } @@ -609,15 +613,16 @@ void LOTContentGroupItem::processPaintItems( std::vector &list) { int curOpCount = list.size(); - for (auto &i : mContents) { - if (auto pathNode = dynamic_cast(i.get())) { + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto content = (*i).get(); + if (auto pathNode = dynamic_cast(content)) { // add it to the list list.push_back(pathNode); - } else if (auto paintNode = dynamic_cast(i.get())) { + } else if (auto paintNode = dynamic_cast(content)) { // the node is a paint data node update the path list of the paint item. paintNode->addPathItems(list, curOpCount); } else if (auto groupNode = - dynamic_cast(i.get())) { + dynamic_cast(content)) { // update the groups node with current list groupNode->processPaintItems(list); } @@ -628,15 +633,16 @@ void LOTContentGroupItem::processTrimItems( std::vector &list) { int curOpCount = list.size(); - for (auto &i : mContents) { - if (auto pathNode = dynamic_cast(i.get())) { + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto content = (*i).get(); + if (auto pathNode = dynamic_cast(content)) { // add it to the list list.push_back(pathNode); - } else if (auto trimNode = dynamic_cast(i.get())) { + } else if (auto trimNode = dynamic_cast(content)) { // the node is a paint data node update the path list of the paint item. trimNode->addPathItems(list, curOpCount); } else if (auto groupNode = - dynamic_cast(i.get())) { + dynamic_cast(content)) { // update the groups node with current list groupNode->processTrimItems(list); } From 3611e1cc516864e34a59dc16d80004d0d05c9c70 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 6 Sep 2018 13:45:17 +0900 Subject: [PATCH 237/672] lottie: refactor model class to remove visitor now visitor class will use the lotnode->type to visit the tree and all the model class don't have to pay the virtual pointer overhead. Change-Id: Ie98d5e369c9f30c94222898849a6da5d0b82938c --- src/lottie/lottieitem.cpp | 8 +- src/lottie/lottiemodel.cpp | 40 ++++------ src/lottie/lottiemodel.h | 53 +------------ src/lottie/lottieparser.cpp | 149 +++++++++++++++++++----------------- 4 files changed, 100 insertions(+), 150 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 56a4532cc7..c113ea95cd 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -318,11 +318,9 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) { // 1. create layer item for (auto &i : mLayerData->mChildren) { - LOTLayerData *layerModel = dynamic_cast(i.get()); - if (layerModel) { - auto layerItem = LOTCompItem::createLayerItem(layerModel); - if (layerItem) mLayers.push_back(std::move(layerItem)); - } + LOTLayerData *layerModel = static_cast(i.get()); + auto layerItem = LOTCompItem::createLayerItem(layerModel); + if (layerItem) mLayers.push_back(std::move(layerItem)); } // 2. update parent layer diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index bbbaba228a..38179a9705 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -3,25 +3,12 @@ #include #include -class LottieRepeaterProcesser : public LOTDataVisitor { +class LottieRepeaterProcesser { public: - void visit(LOTCompositionData *) override {} - void visit(LOTLayerData *) override {} - void visit(LOTTransformData *) override {} - void visit(LOTShapeGroupData *) override {} - void visit(LOTShapeData *) override {} - void visit(LOTRectData *) override {} - void visit(LOTEllipseData *) override {} - void visit(LOTTrimData *) override {} - void visit(LOTRepeaterData *) override { mRepeaterFound = true; } - void visit(LOTFillData *) override {} - void visit(LOTStrokeData *) override {} - void visit(LOTPolystarData *) override {} - void visitChildren(LOTGroupData *obj) override + void visitChildren(LOTGroupData *obj) { for (const auto& child : obj->mChildren) { - child.get()->accept(this); - if (mRepeaterFound) { + if (child->mType == LOTData::Type::Repeater) { LOTRepeaterData *repeater = static_cast(child.get()); std::shared_ptr sharedShapeGroup = @@ -33,26 +20,31 @@ public: // the repeater object. for (const auto& cpChild : obj->mChildren) { if (cpChild == child) break; - // there shouldn't be any trim object left in the child list - if (cpChild.get()->type() == LOTData::Type::Trim) { - assert(0); - } shapeGroup->mChildren.push_back(cpChild); } - mRepeaterFound = false; } } } -public: - bool mRepeaterFound{false}; + void visit(LOTData *obj) { + switch (obj->mType) { + case LOTData::Type::Repeater: + case LOTData::Type::ShapeGroup: + case LOTData::Type::Layer:{ + visitChildren(static_cast(obj)); + break; + } + default: + break; + } + } }; void LOTCompositionData::processRepeaterObjects() { LottieRepeaterProcesser visitor; - accept(&visitor); + visitor.visit(mRootLayer.get()); } VMatrix LOTTransformData::matrix(int frameNo) const diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index b4bbddf33a..26053f0adf 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -32,27 +32,6 @@ class LottieShapeData; class LOTPolystarData; class LOTMaskData; -class LOTDataVisitor -{ -public: - virtual ~LOTDataVisitor() = default; - virtual void visit(LOTCompositionData *) = 0; - virtual void visit(LOTLayerData *) = 0; - virtual void visit(LOTTransformData *) = 0; - virtual void visit(LOTShapeGroupData *) = 0; - virtual void visit(LOTShapeData *) = 0; - virtual void visit(LOTRectData *) = 0; - virtual void visit(LOTEllipseData *) = 0; - virtual void visit(LOTPolystarData *) {}; - virtual void visit(LOTTrimData *) = 0; - virtual void visit(LOTRepeaterData *) = 0; - virtual void visit(LOTFillData *) = 0; - virtual void visit(LOTStrokeData *) = 0; - virtual void visit(LOTGFillData *){}; - virtual void visit(LOTGStrokeData *){}; - virtual void visitChildren(LOTGroupData *) = 0; -}; - enum class MatteType { None = 0, @@ -265,14 +244,12 @@ public: Repeater }; LOTData(LOTData::Type type): mType(type){} - virtual ~LOTData()= default; inline LOTData::Type type() const {return mType;} - virtual void accept(LOTDataVisitor *){} bool isStatic() const{return mStatic;} void setStatic(bool value) {mStatic = value;} public: bool mStatic{true}; - LOTData::Type mType; + LOTData::Type mType; }; class LOTGroupData: public LOTData @@ -288,8 +265,6 @@ class LOTShapeGroupData : public LOTGroupData { public: LOTShapeGroupData():LOTGroupData(LOTData::Type::ShapeGroup){} - void accept(LOTDataVisitor *visitor) override - {visitor->visit(this); visitor->visitChildren(this);} }; class LOTLayerData; @@ -317,8 +292,6 @@ public: int solidWidth() const noexcept{return mSolidLayer.mWidth;} int solidHeight() const noexcept{return mSolidLayer.mHeight;} LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} - void accept(LOTDataVisitor *visitor) override - {visitor->visit(this); visitor->visitChildren(this);} public: struct SolidLayer { int mWidth{0}; @@ -357,8 +330,6 @@ public: long endFrame() const {return mEndFrame;} VSize size() const {return mSize;} void processRepeaterObjects(); - void accept(LOTDataVisitor *visitor) override - {visitor->visit(this); mRootLayer->accept(visitor);} public: std::string mVersion; VSize mSize; @@ -382,8 +353,6 @@ public: float opacity(int frameNo) const; void cacheMatrix(); bool staticMatrix() const {return mStaticMatrix;} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} private: VMatrix computeMatrix(int frameNo) const; public: @@ -407,8 +376,6 @@ public: LOTFillData():LOTData(LOTData::Type::Fill){} float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} FillRule fillRule() const {return mFillRule;} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: FillRule mFillRule{FillRule::Winding}; /* "r" */ LOTAnimatable mColor; /* "c" */ @@ -434,8 +401,6 @@ public: float meterLimit() const{return mMeterLimit;} bool hasDashInfo() const { return !(mDash.mDashCount == 0);} int getDashInfo(int frameNo, float *array) const; - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: LOTAnimatable mColor; /* "c" */ LOTAnimatable mOpacity{100}; /* "o" */ @@ -529,8 +494,6 @@ class LOTGFillData : public LOTGradient public: LOTGFillData():LOTGradient(LOTData::Type::GFill){} FillRule fillRule() const {return mFillRule;} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: FillRule mFillRule{FillRule::Winding}; /* "r" */ }; @@ -545,8 +508,6 @@ public: float meterLimit() const{return mMeterLimit;} bool hasDashInfo() const { return !(mDash.mDashCount == 0);} int getDashInfo(int frameNo, float *array) const; - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: LOTAnimatable mWidth; /* "w" */ CapStyle mCapStyle; /* "lc" */ @@ -570,8 +531,6 @@ class LOTShapeData : public LOTPath public: LOTShapeData():LOTPath(LOTData::Type::Shape){} void process(); - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: LOTAnimatable mShape; }; @@ -600,8 +559,6 @@ class LOTRectData : public LOTPath { public: LOTRectData():LOTPath(LOTData::Type::Rect){} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: LOTAnimatable mPos; LOTAnimatable mSize; @@ -611,8 +568,6 @@ public: class LOTEllipseData : public LOTPath { public: - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} LOTEllipseData():LOTPath(LOTData::Type::Ellipse){} public: LOTAnimatable mPos; @@ -627,8 +582,6 @@ public: Polygon = 2 }; LOTPolystarData():LOTPath(LOTData::Type::Polystar){} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} public: LOTPolystarData::PolyType mType{PolyType::Polygon}; LOTAnimatable mPos; @@ -648,8 +601,6 @@ public: Individually }; LOTTrimData():LOTData(LOTData::Type::Trim){} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this);} float start(int frameNo) const {return mStart.value(frameNo)/100.0f;} float end(int frameNo) const {return mEnd.value(frameNo)/100.0f;} float offset(int frameNo) const {return fmod(mOffset.value(frameNo), 360.0f)/ 360.0f;} @@ -665,8 +616,6 @@ class LOTRepeaterData : public LOTGroupData { public: LOTRepeaterData():LOTGroupData(LOTData::Type::Repeater){} - void accept(LOTDataVisitor *visitor) final - {visitor->visit(this); visitor->visitChildren(this);} public: LOTAnimatable mCopies{0}; LOTAnimatable mOffset{0}; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 90be955711..21d4503dc6 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -947,9 +947,11 @@ std::shared_ptr LottieParserImpl::parseGroupObject() RAPIDJSON_ASSERT(PeekType() == kObjectType); parseObject(group); } - group->mTransform = std::dynamic_pointer_cast( - group->mChildren.back()); - group->mChildren.pop_back(); + if (group->mChildren.back()->mType == LOTData::Type::Transform) { + group->mTransform = std::static_pointer_cast( + group->mChildren.back()); + group->mChildren.pop_back(); + } } else { Skip(key); } @@ -1854,15 +1856,19 @@ void LottieParserImpl::parseProperty(LOTAnimatable &obj) } } -class LOTDataInspector : public LOTDataVisitor { +#ifdef DEBUG_PARSER + +class LOTDataInspector { public: - void visit(LOTCompositionData *obj) override + void visit(LOTCompositionData *obj) { vDebug << "[COMP_START:: static:" << obj->isStatic() << " v:" << obj->mVersion << " [{ stFm endFm fmRate } { " << obj->mStartFrame << " " << obj->mEndFrame << " }]\n"; + visit(obj->mRootLayer.get()); + vDebug << "[COMP End ]\n"; } - void visit(LOTLayerData *obj) override + void visit(LOTLayerData *obj) { vDebug << "[LAYER_START:: type:" << layerType(obj->mLayerType) << " id:" << obj->mId << " Pid:" << obj->mParentId @@ -1870,81 +1876,84 @@ public: << "[{ stFm endFm stTm tmStrch } { " << obj->mInFrame << " " << obj->mOutFrame << " " << obj->mStartFrame << " " << obj->mTimeStreatch << " }]"; + + visitChildren(static_cast(obj)); + + vDebug << "[LAYER_END:: type:" + << layerType(obj->mLayerType).c_str() + << " id:" << obj->mId << "\n"; } - void visit(LOTTransformData *t) override + void visitChildren(LOTGroupData *obj) { - vDebug << "[TRANSFORM: static: " << t->isStatic() << " ]"; + for (const auto& child : obj->mChildren) visit(child.get()); } - void visit(LOTShapeGroupData *o) override - { - vDebug << "[GROUP_START:: static:" << o->isStatic() << "]"; - } - void visit(LOTShapeData *s) override - { - vDebug << "[SHAPE: static:" << s->isStatic() << "]"; - } - void visit(LOTRectData *r) override - { - vDebug << "[RECT: static:" << r->isStatic() << "]"; - } - void visit(LOTEllipseData *e) override - { - vDebug << "[ELLIPSE: static:" << e->isStatic() << "]"; - } - void visit(LOTPolystarData *e) override - { - vDebug << "[POLYSTAR: static:" << e->isStatic() << "]"; - } - void visit(LOTTrimData *t) override - { - vDebug << "[TRIM: static: " << t->isStatic() << " ]"; - } - void visit(LOTRepeaterData *r) override - { - vDebug << "[REPEATER: static:" << r->isStatic() << "]"; - } - void visit(LOTFillData *f) override - { - vDebug << "[FILL: static:" << f->isStatic() << "]"; - } - void visit(LOTGFillData *f) override - { - vDebug << "[GFILL: static:" << f->isStatic() - << " ty:" << f->mGradientType << " s:" << f->mStartPoint.value(0) - << " e:" << f->mEndPoint.value(0) << "]"; - } - void visit(LOTGStrokeData *f) override - { - vDebug << "[GSTROKE: static:" << f->isStatic() << "]"; - } - void visit(LOTStrokeData *s) override - { - vDebug << "[STROKE: static:" << s->isStatic() << "]"; - } - void visitChildren(LOTGroupData *obj) override - { - for (const auto& child : obj->mChildren) child.get()->accept(this); - switch (obj->type()) { - case LOTData::Type::Layer: { - LOTLayerData *layer = static_cast(obj); - vDebug << "[LAYER_END:: type:" - << layerType(layer->mLayerType).c_str() - << " id:" << layer->mId << "\n"; + + void visit(LOTData *obj) { + switch (obj->mType) { + case LOTData::Type::Repeater: { + vDebug << "[REPEATER_START]"; + visitChildren(static_cast(obj)); + vDebug << "[REPEATER_END]"; break; } - case LOTData::Type::ShapeGroup: + case LOTData::Type::ShapeGroup: { + vDebug << "[GROUP_START:: static:" << obj->isStatic() << "]"; + visitChildren(static_cast(obj)); vDebug << "[GROUP_END]"; break; - case LOTData::Type::Composition: - vDebug << "[COMP End ]\n"; + } + case LOTData::Type::Layer:{ + visit(static_cast(obj)); break; - case LOTData::Type::Repeater: - vDebug << "[REPEATER End ]"; + } + case LOTData::Type::Trim:{ + vDebug << "[TRIM: static: " << obj->isStatic() << " ]"; break; + } + case LOTData::Type::Rect:{ + vDebug << "[RECT: static:" << obj->isStatic() << "]"; + break; + } + case LOTData::Type::Ellipse:{ + vDebug << "[RECT: static:" << obj->isStatic() << "]"; + break; + } + case LOTData::Type::Shape:{ + vDebug << "[SHAPE: static:" << obj->isStatic() << "]"; + break; + } + case LOTData::Type::Polystar:{ + vDebug << "[POLYSTAR: static:" << obj->isStatic() << "]"; + break; + } + case LOTData::Type::Transform:{ + vDebug << "[TRANSFORM: static: " << obj->isStatic() << " ]"; + break; + } + case LOTData::Type::Stroke:{ + vDebug << "[SHAPE: static:" << obj->isStatic() << "]"; + break; + } + case LOTData::Type::GStroke:{ + vDebug << "[TRANSFORM: static: " << obj->isStatic() << " ]"; + break; + } + case LOTData::Type::Fill:{ + vDebug << "[FILL: static:" << obj->isStatic() << "]"; + break; + } + case LOTData::Type::GFill:{ + auto f = static_cast(obj); + vDebug << "[GFILL: static:" << f->isStatic() + << " ty:" << f->mGradientType << " s:" << f->mStartPoint.value(0) + << " e:" << f->mEndPoint.value(0) << "]"; + break; + } default: break; } } + std::string layerType(LayerType type) { switch (type) { @@ -1973,6 +1982,8 @@ public: } }; +#endif + LottieParser::~LottieParser() { delete d; @@ -1991,7 +2002,7 @@ std::shared_ptr LottieParser::model() #ifdef DEBUG_PARSER LOTDataInspector inspector; - model->mRoot->accept(&inspector); + inspector.visit(model->mRoot.get()); #endif return model; From 860ffe847bb235a02bfef66555de88cb27356879 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 6 Sep 2018 11:42:56 +0900 Subject: [PATCH 238/672] add AUTHORS Change-Id: I966f655a2744162d85562594a64a1547d297f278 --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000000..6a3a2cab36 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Subhransu Mohanty +Hermet Park +Youngbok Shin +Jaeun Choi From 0f5edac6d1595e0fecd8d48bb7d2e5353fe9121f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 6 Sep 2018 20:18:40 +0900 Subject: [PATCH 239/672] lottie: refactor lottie interface 1. rename namespace player--> animation both cpp and c interface 2. added factory function to create animation object. 3. added render api to c interface. Change-Id: I31c99a66678b20a0c743c564d399172f4182b0d1 --- CMakeLists.txt | 2 +- example/lottieview.cpp | 91 ++++---- example/lottieview.h | 18 +- inc/lotplayer.h | 47 ---- inc/lottieanimation.h | 78 +++++++ inc/lottieanimation_capi.h | 73 ++++++ inc/{lotcommon.h => lottiecommon.h} | 13 +- inc/meson.build | 4 +- src/binding/c/lotplayer_capi.h | 33 --- src/binding/c/lottieanimation_c.cpp | 123 ++++++++++ src/binding/c/lottieplayer_c.cpp | 125 ---------- src/binding/c/meson.build | 4 +- src/lottie/CMakeLists.txt | 4 +- src/lottie/lottieanimation.cpp | 294 ++++++++++++++++++++++++ src/lottie/lottieitem.cpp | 6 +- src/lottie/lottieitem.h | 5 +- src/lottie/lottieloader.cpp | 6 +- src/lottie/lottieloader.h | 2 +- src/lottie/lottiemodel.h | 6 +- src/lottie/lottieplayer.cpp | 339 ---------------------------- src/lottie/meson.build | 2 +- 21 files changed, 655 insertions(+), 620 deletions(-) delete mode 100644 inc/lotplayer.h create mode 100644 inc/lottieanimation.h create mode 100644 inc/lottieanimation_capi.h rename inc/{lotcommon.h => lottiecommon.h} (89%) delete mode 100644 src/binding/c/lotplayer_capi.h create mode 100644 src/binding/c/lottieanimation_c.cpp delete mode 100644 src/binding/c/lottieplayer_c.cpp create mode 100644 src/lottie/lottieanimation.cpp delete mode 100644 src/lottie/lottieplayer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ceed7e9125..3fa20cfe19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) #install header -install(FILES inc/lotplayer.h inc/lotcommon.h src/binding/c/lotplayer_capi.h DESTINATION include) +install(FILES inc/lottieanimation.h inc/lottieanimation_capi.h inc/lottiecommon.h DESTINATION include) #install lib install( TARGETS lottie-player EXPORT lottie-player-targets diff --git a/example/lottieview.cpp b/example/lottieview.cpp index cb8ce89295..5fc234d688 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,6 +1,6 @@ #include"lottieview.h" -using namespace lottieplayer; +using namespace lottie; static Eina_Bool animator(void *data , double pos) @@ -119,6 +119,7 @@ void LottieView::initializeBufferObject(Evas *evas) LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr) { + mPlayer = nullptr; mPalying = false; mReverse = false; mRepeatCount = 0; @@ -127,7 +128,6 @@ LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullpt mSpeed = 1; mEvas = evas; - mPlayer = new LOTPlayer(); mRenderMode = renderMode; mAsyncRender = asyncRender; @@ -142,7 +142,6 @@ LottieView::~LottieView() if (mAnimator) ecore_animator_del(mAnimator); if (mVg) evas_object_del(mVg); if (mImage) evas_object_del(mImage); - delete mPlayer; } Evas_Object *LottieView::getImage() { @@ -174,35 +173,40 @@ void LottieView::hide() void LottieView::seek(float pos) { + if (!mPlayer) return; + if (mPalying && mReverse) pos = 1.0 - pos; mPos = pos; + // check if the pos maps to the current frame + if (mCurFrame == mPlayer->frameAtPos(mPos)) return; + + mCurFrame = mPlayer->frameAtPos(mPos); + if (mRenderMode) { - LOTBuffer buf; - evas_object_image_size_get(mImage, &buf.width, &buf.height); + int width , height; + evas_object_image_size_get(mImage, &width, &height); if (mAsyncRender) { if (mRenderTask.valid()) return; mDirty = true; - buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); - buf.bytesPerLine = evas_object_image_stride_get(mImage); - mRenderTask = mPlayer->render(mPos, buf); - mBuffer = buf; + auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); + size_t bytesperline = evas_object_image_stride_get(mImage); + lottie::Surface surface(buffer, width, height, bytesperline); + mRenderTask = mPlayer->render(mCurFrame, surface); // to force a redraw - evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); + evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } else { - buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); - buf.bytesPerLine = evas_object_image_stride_get(mImage); - bool changed = mPlayer->renderSync(pos, buf); - evas_object_image_data_set(mImage, buf.buffer); - // if the buffer is updated notify the image object - if (changed) { - evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height); - } + auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); + size_t bytesperline = evas_object_image_stride_get(mImage); + lottie::Surface surface(buffer, width, height, bytesperline); + mPlayer->renderSync(mCurFrame, surface); + evas_object_image_data_set(mImage, surface.buffer()); + evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } } else { - const std::vector &renderList = mPlayer->renderList(pos); + const std::vector &renderList = mPlayer->renderList(mCurFrame, mw, mh); update(renderList); } } @@ -214,50 +218,49 @@ float LottieView::getPos() void LottieView::render() { + if (!mPlayer) return; + if (!mDirty) return; mDirty = false; if (mRenderMode) { - if (!mBuffer.buffer) return; - bool changed = false; - if (mRenderTask.valid()) { - changed = mRenderTask.get(); - } - evas_object_image_data_set(mImage, mBuffer.buffer); - // if the buffer is updated notify the image object - if (changed) { - evas_object_image_data_update_add(mImage, 0 , 0, mBuffer.width, mBuffer.height); - } - mBuffer.buffer = nullptr; - } else { - const std::vector &renderList = mPlayer->renderList(mPos); - update(renderList); + if (!mRenderTask.valid()) return; + auto surface = mRenderTask.get(); + evas_object_image_data_set(mImage, surface.buffer()); + evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } } void LottieView::setFilePath(const char *filePath) { - mPlayer->setFilePath(filePath); - mFrameRate = mPlayer->frameRate(); - mTotalFrame = mPlayer->totalFrame(); + if (mPlayer = Animation::loadFromFile(filePath)) { + mFrameRate = mPlayer->frameRate(); + mTotalFrame = mPlayer->totalFrame(); + } else { + printf("load failed file %s\n", filePath); + } } void LottieView::loadFromData(const char *jsonData, const char *key) { - mPlayer->loadFromData(jsonData, key); - mFrameRate = mPlayer->frameRate(); - mTotalFrame = mPlayer->totalFrame(); + if (mPlayer = Animation::loadFromData(jsonData, key)) { + mFrameRate = mPlayer->frameRate(); + mTotalFrame = mPlayer->totalFrame(); + } else { + printf("load failed from data key : %s\n", key); + } } void LottieView::setSize(int w, int h) { + mw = w; mh = h; + if (mRenderMode) { evas_object_resize(mImage, w, h); evas_object_image_size_set(mImage, w, h); } else { evas_object_resize(mVg, w, h); } - mPlayer->setSize(w, h); } void LottieView::setPos(int x, int y) { @@ -290,9 +293,11 @@ void LottieView::setRepeatMode(LottieView::RepeatMode mode) void LottieView::play() { + if (!mPlayer) return; + mStartPos = mPos; if (mAnimator) ecore_animator_del(mAnimator); - mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this); + mAnimator = ecore_animator_timeline_add(mPlayer->duration()/mSpeed, animator, this); mReverse = false; mCurCount = mRepeatCount; mPalying = true; @@ -314,6 +319,8 @@ void LottieView::stop() void LottieView::restart() { + if (!mPlayer) return; + mCurCount--; if (mLoop || mRepeatCount) { if (mRepeatMode == LottieView::RepeatMode::Reverse) @@ -323,6 +330,6 @@ void LottieView::restart() mStartPos = 0; if (mAnimator) ecore_animator_del(mAnimator); - mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this); + mAnimator = ecore_animator_timeline_add(mPlayer->duration()/mSpeed, animator, this); } } diff --git a/example/lottieview.h b/example/lottieview.h index 30098ffcd7..08e98cf943 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -14,7 +14,8 @@ #include #include #include -#include"lotplayer.h" +#include "lottieanimation.h" +#include "lottieanimation_capi.h" #include class LottieView { @@ -59,7 +60,8 @@ public: Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - lottieplayer::LOTPlayer *mPlayer; + std::unique_ptr mPlayer; + size_t mCurFrame{UINT_MAX}; Ecore_Animator *mAnimator{nullptr}; bool mLoop; int mCurCount; @@ -74,7 +76,15 @@ public: float mPos; float mFrameRate; long mTotalFrame; - std::future mRenderTask; - LOTBuffer mBuffer; + std::future mRenderTask; }; + +class LottieViewCApi +{ +public: +private: + Evas *mEvas; + Lottie_Animation *mAnimation; +}; + #endif //LOTTIEVIEW_H diff --git a/inc/lotplayer.h b/inc/lotplayer.h deleted file mode 100644 index a22547874a..0000000000 --- a/inc/lotplayer.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _LOT_PLAYER_H_ -#define _LOT_PLAYER_H_ - -#include -#include - -#include "lotcommon.h" - -//TODO: Hide this. -class LOTPlayerPrivate; -#define _LOT_PLAYER_DECLARE_PRIVATE(A) \ - class A##Private *d; - -namespace lottieplayer { - -class LOT_EXPORT LOTPlayer { -public: - ~LOTPlayer(); - LOTPlayer(); - - bool loadFromData(const char *jsonData, const char *key); - - bool setFilePath(const char *filePath); - - float playTime() const; - - float pos() const; - - float frameRate() const; - - long totalFrame() const; - - const std::vector &renderList(float pos) const; - - // TODO: Consider correct position... - void setSize(int width, int height); - void size(int &width, int &height) const; - std::future render(float pos, LOTBuffer buffer, bool forceRender = false); - bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); - -private: - _LOT_PLAYER_DECLARE_PRIVATE(LOTPlayer) -}; - -} // namespace lotplayer - -#endif // _LOT_PLAYER_H_ diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h new file mode 100644 index 0000000000..ce163b9e18 --- /dev/null +++ b/inc/lottieanimation.h @@ -0,0 +1,78 @@ +#ifndef _LOTTIE_ANIMATION_H_ +#define _LOTTIE_ANIMATION_H_ + +#include +#include +#include + +#ifdef _WIN32 +#ifdef LOT_BUILD +#ifdef DLL_EXPORT +#define LOT_EXPORT __declspec(dllexport) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT __declspec(dllimport) +#endif +#else +#ifdef __GNUC__ +#if __GNUC__ >= 4 +#define LOT_EXPORT __attribute__((visibility("default"))) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT +#endif +#endif + +class AnimationImpl; +class LOTNode; + +namespace lottie { + +class LOT_EXPORT Surface { +public: + Surface() = default; + Surface(uint32_t *buffer, size_t width, size_t height, size_t bytesPerLine); + size_t width() const {return mWidth;} + size_t height() const {return mHeight;} + size_t bytesPerLine() const {return mBytesPerLine;} + uint32_t *buffer() const {return mBuffer;} + +private: + uint32_t *mBuffer; + size_t mWidth; + size_t mHeight; + size_t mBytesPerLine; +}; + +class LOT_EXPORT Animation { +public: + + static std::unique_ptr + loadFromFile(const std::string &path); + + static std::unique_ptr + loadFromData(const char *jsonData, const char *key); + + double frameRate() const; + size_t totalFrame() const; + void size(size_t &width, size_t &height) const; + double duration() const; + size_t frameAtPos(double pos); + + std::future render(size_t frameNo, Surface surface); + void renderSync(size_t frameNo, Surface surface); + + ~Animation(); + Animation(); + + const std::vector &renderList(size_t frameNo, size_t width, size_t height) const; +private: + std::unique_ptr d; +}; +} // namespace lotplayer + +#endif // _LOTTIE_ANIMATION_H_ diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h new file mode 100644 index 0000000000..2b032a7670 --- /dev/null +++ b/inc/lottieanimation_capi.h @@ -0,0 +1,73 @@ +#ifndef _LOTPLAYER_CAPI_H_ +#define _LOTPLAYER_CAPI_H_ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct Lottie_Animation_S Lottie_Animation; + +LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *file); +LOT_EXPORT Lottie_Animation *lottie_animation_from_data(const char *data, const char *key); +LOT_EXPORT void lottie_animation_destroy(Lottie_Animation *animation); +LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation *animation, size_t *w, size_t *h); +LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation *animation); +LOT_EXPORT size_t lottie_animation_get_totalframe(const Lottie_Animation *animation); +LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation *animation); + + +/* + * Request to update the content of the frame $frame_number in to Animation object. + * frame_number, the content of the animation in that frame number + * width , width of the viewbox + * height , height of the viewbox + * + * PS : user must call lottie_animation_get_node_count and lottie_animation_get_node + * to get the renderlist. + */ +LOT_EXPORT size_t lottie_animation_prepare_frame(Lottie_Animation *animation, + size_t frameNo, + size_t w, size_t h); +LOT_EXPORT size_t lottie_animation_get_node_count(const Lottie_Animation *animation); +LOT_EXPORT const LOTNode* lottie_animation_get_node(Lottie_Animation *animation, size_t idx); + +/* + * Request to render the content of the frame $frame_number to buffer $buffer asynchronously. + * frame_number, the frame number needs to be rendered. + * buffer , surface buffer use for rendering + * width , width of the surface + * height , height of the surface + * bytes_per_line, stride of the surface in bytes. + * + * PS : user must call lottie_animation_render_flush to make sure render is finished. + */ +LOT_EXPORT void +lottie_animation_render_async(Lottie_Animation *animation, + size_t frame_number, + uint32_t *buffer, + size_t width, + size_t height, + size_t bytes_per_line); + + +/* + * Request to finish the current asyn renderer job for this animation object. + * if render is finished then this call returns immidiately + * if not it waits till render job finish and then return. + * user must use lottie_animation_render_async and lottie_animation_render_flush + * together to get the benefit of async rendering. + */ +LOT_EXPORT void +lottie_animation_render_flush(Lottie_Animation *animation); + +#ifdef __cplusplus +} +#endif + +#endif //_LOTPLAYER_CAPI_H_ + diff --git a/inc/lotcommon.h b/inc/lottiecommon.h similarity index 89% rename from inc/lotcommon.h rename to inc/lottiecommon.h index aa24423019..090b4c2207 100644 --- a/inc/lotcommon.h +++ b/inc/lottiecommon.h @@ -1,5 +1,5 @@ -#ifndef _LOT_COMMON_H_ -#define _LOT_COMMON_H_ +#ifndef _LOTTIE_COMMON_H_ +#define _LOTTIE_COMMON_H_ #ifdef _WIN32 #ifdef LOT_BUILD @@ -113,12 +113,5 @@ typedef struct LOTNode { LOTFillRule mFillRule; } LOTNode; -typedef struct LOTBuffer { - uint32_t *buffer; - int width; - int height; - int bytesPerLine; - bool clear; -} LOTBuffer; -#endif // _LOT_COMMON_H_ +#endif // _LOTTIE_COMMON_H_ diff --git a/inc/meson.build b/inc/meson.build index aa65f1f780..332029f3c3 100644 --- a/inc/meson.build +++ b/inc/meson.build @@ -1 +1,3 @@ -install_headers(['lotplayer.h', 'lotcommon.h']) +install_headers(['lottieanimation.h', + 'lotcommon.h', + 'lottieanimation_capi.h']) diff --git a/src/binding/c/lotplayer_capi.h b/src/binding/c/lotplayer_capi.h deleted file mode 100644 index 5c374d1367..0000000000 --- a/src/binding/c/lotplayer_capi.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _LOTPLAYER_CAPI_H_ -#define _LOTPLAYER_CAPI_H_ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct lotplayer_s LOTPlayer; - -LOT_EXPORT LOTPlayer *lotplayer_create(void); -LOT_EXPORT int lotplayer_destroy(LOTPlayer *player); -LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file); -LOT_EXPORT int lotplayer_set_data(LOTPlayer *player, const char *data, const char *key); -LOT_EXPORT int lotplayer_set_size(LOTPlayer *player, int w, int h); -LOT_EXPORT int lotplayer_get_size(const LOTPlayer *player, int* w, int* h); -LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player); -LOT_EXPORT long lotplayer_get_totalframe(const LOTPlayer *player); -LOT_EXPORT float lotplayer_get_framerate(const LOTPlayer *player); -LOT_EXPORT float lotplayer_get_pos(const LOTPlayer *player); -LOT_EXPORT size_t lotplayer_get_node_count(const LOTPlayer *player, float pos); -LOT_EXPORT const LOTNode* lotplayer_get_node(LOTPlayer *player, float pos, size_t idx); - -#ifdef __cplusplus -} -#endif - -#endif //_LOTPLAYER_CAPI_H_ - diff --git a/src/binding/c/lottieanimation_c.cpp b/src/binding/c/lottieanimation_c.cpp new file mode 100644 index 0000000000..fa2f9f4fc2 --- /dev/null +++ b/src/binding/c/lottieanimation_c.cpp @@ -0,0 +1,123 @@ +#include "lottieanimation.h" +#include "vdebug.h" + +using namespace lottie; + +extern "C" { + +struct Lottie_Animation_S +{ + std::unique_ptr mAnimation; + size_t mCurFrame; + LOTNode **mNodeArray; + size_t mArraySize{0}; + std::future mRenderTask; +}; + +LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *file) +{ + if (auto animation = Animation::loadFromFile(file) ) { + Lottie_Animation_S *handle = new Lottie_Animation_S(); + handle->mAnimation = std::move(animation); + return handle; + } else { + return nullptr; + } +} + +Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key) +{ + if (auto animation = Animation::loadFromData(data, key) ) { + Lottie_Animation_S *handle = new Lottie_Animation_S(); + handle->mAnimation = std::move(animation); + return handle; + } else { + return nullptr; + } +} + +LOT_EXPORT void lottie_animation_destroy(Lottie_Animation_S *animation) +{ + if (animation) + delete animation; +} + +LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation_S *animation, size_t *w, size_t *h) +{ + if (!animation) return; + + animation->mAnimation->size(*w, *h); +} + +LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation_S *animation) +{ + if (!animation) return 0; + + return animation->mAnimation->duration(); +} + +LOT_EXPORT size_t lottie_animation_get_totalframe(const Lottie_Animation_S *animation) +{ + if (!animation) return 0; + + return animation->mAnimation->totalFrame(); +} + + +LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation_S *animation) +{ + if (!animation) return 0; + + return animation->mAnimation->frameRate(); +} + +LOT_EXPORT void lottie_animation_prepare_frame(Lottie_Animation_S *animation, size_t frameNo, size_t w, size_t h) +{ + if (!animation) return; + + auto list = animation->mAnimation->renderList(frameNo, w, h); + animation->mNodeArray = list.data(); + animation->mArraySize = list.size(); +} + +LOT_EXPORT size_t lottie_animation_get_node_count(const Lottie_Animation_S *animation) +{ + if (!animation) return 0; + + return animation->mArraySize; +} + +LOT_EXPORT const LOTNode* lottie_animation_get_node(const Lottie_Animation_S *animation, size_t idx) +{ + if (!animation) return nullptr; + + if (idx >= animation->mArraySize) return nullptr; + + return animation->mNodeArray[idx]; +} + +LOT_EXPORT void +lottie_animation_render_async(Lottie_Animation_S *animation, + size_t frame_number, + uint32_t *buffer, + size_t width, + size_t height, + size_t bytes_per_line) +{ + if (!animation) return; + + lottie::Surface surface(buffer, width, height, bytes_per_line); + animation->mRenderTask = animation->mAnimation->render(frame_number, surface); +} + +LOT_EXPORT void +lottie_animation_render_flush(Lottie_Animation_S *animation) +{ + if (!animation) return; + + if (animation->mRenderTask.valid()) { + animation->mRenderTask.get(); + } +} + +} diff --git a/src/binding/c/lottieplayer_c.cpp b/src/binding/c/lottieplayer_c.cpp deleted file mode 100644 index 96ffeb2d76..0000000000 --- a/src/binding/c/lottieplayer_c.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include "vdebug.h" - -using namespace lottieplayer; - -extern "C" { - -LOT_EXPORT LOTPlayer *lotplayer_create(void) -{ - LOTPlayer* p = new LOTPlayer(); - if (!p) { - vCritical << "Failed to initialize lotplayer"; - } - return p; -} - -LOT_EXPORT int lotplayer_destroy(LOTPlayer *player) -{ - if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; - delete(player); - - return LOT_PLAYER_ERROR_NONE; -} - -LOT_EXPORT int lotplayer_set_data(LOTPlayer *player, const char *data, const char *key) -{ - if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; - bool ret = player->loadFromData(data, key); - - if (!ret) return -1; - - return LOT_PLAYER_ERROR_NONE; -} - -LOT_EXPORT int lotplayer_set_file(LOTPlayer *player, const char *file) -{ - if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; - bool ret = player->setFilePath(file); - - if (!ret) return -1; - - return LOT_PLAYER_ERROR_NONE; -} - -LOT_EXPORT int lotplayer_set_size(LOTPlayer *player, int w, int h) -{ - if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; - - player->setSize(w, h); - - return LOT_PLAYER_ERROR_NONE; -} - -LOT_EXPORT int lotplayer_get_size(const LOTPlayer *player, int* w, int* h) -{ - if (!player) return LOT_PLAYER_ERROR_INVALID_PARAMETER; - - player->size(*w, *h); - - return LOT_PLAYER_ERROR_NONE; -} - -LOT_EXPORT float lotplayer_get_pos(const LOTPlayer *player) -{ - if (!player) { - vWarning << "Invalid parameter player = nullptr"; - return -1.0f; - } - - return player->pos(); -} - -LOT_EXPORT size_t lotplayer_get_node_count(const LOTPlayer *player, float pos) -{ - if (!player) return LOT_PLAYER_ERROR_NONE; - - return player->renderList(pos).size(); -} - -LOT_EXPORT float lotplayer_get_playtime(const LOTPlayer *player) -{ - if (!player) { - vWarning << "Invalid parameter player = nullptr"; - return 0.0f; - } - - return player->playTime(); -} - -LOT_EXPORT long lotplayer_get_totalframe(const LOTPlayer *player) -{ - if (!player) { - vWarning << "Invalid parameter player = nullptr"; - return 0; - } - - return player->totalFrame(); -} - -LOT_EXPORT float lotplayer_get_framerate(const LOTPlayer *player) -{ - if (!player) { - vWarning << "Invalid parameter player = nullptr"; - return 0.0f; - } - - return player->frameRate(); -} - -LOT_EXPORT const LOTNode* lotplayer_get_node(LOTPlayer *player, float pos, size_t idx) -{ - if (!player) { - vWarning << "Invalid parameter player = nullptr"; - return nullptr; - } - - if (idx >= player->renderList(pos).size()) { - vWarning << "Invalid parameter idx? (0 ~ " << player->renderList(pos).size() << "), given idx = " << idx; - return nullptr; - } - - return player->renderList(pos)[idx]; -} - -} diff --git a/src/binding/c/meson.build b/src/binding/c/meson.build index 646983b9ce..3c297fcf70 100644 --- a/src/binding/c/meson.build +++ b/src/binding/c/meson.build @@ -1,6 +1,4 @@ -install_headers(['lotplayer_capi.h']) - -source_file = files('lottieplayer_c.cpp') +source_file = files('lottieanimation_c.cpp') binding_c_dep = declare_dependency( include_directories : include_directories('.'), diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt index d6c006d340..4fb944a45b 100644 --- a/src/lottie/CMakeLists.txt +++ b/src/lottie/CMakeLists.txt @@ -5,10 +5,10 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/lottieloader.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottiemodel.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieparser.cpp" - "${CMAKE_CURRENT_LIST_DIR}/lottieplayer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottieanimation.cpp" ) target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" - ) \ No newline at end of file + ) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp new file mode 100644 index 0000000000..6d900edb17 --- /dev/null +++ b/src/lottie/lottieanimation.cpp @@ -0,0 +1,294 @@ +#include "lottieanimation.h" + +#include "lottieitem.h" +#include "lottieloader.h" +#include "lottiemodel.h" + +#include + +using namespace lottie; + +class AnimationImpl { + +public: + void init(const std::shared_ptr &model); + bool update(size_t frameNo, const VSize &size); + VSize size() const; + double duration() const; + double frameRate() const; + size_t totalFrame() const; + size_t frameAtPos(double pos) const; + const std::vector &renderList(size_t frameNo, const VSize &size); + Surface render(size_t frameNo, const Surface &surface); + +private: + std::string mFilePath; + std::shared_ptr mModel; + std::unique_ptr mCompItem; + std::atomic mRenderInProgress; +}; + +double AnimationImpl::frameRate() const +{ + return mModel->frameRate(); +} + +size_t AnimationImpl::totalFrame() const +{ + return mModel->frameDuration(); +} + +size_t AnimationImpl::frameAtPos(double pos) const +{ + if (pos < 0) pos = 0; + if (pos > 1) pos = 1; + + if (mModel->isStatic()) return 0; + + return mModel->startFrame() + pos * mModel->frameDuration(); +} + +VSize AnimationImpl::size() const +{ + return mCompItem->size(); +} + +const std::vector &AnimationImpl::renderList(size_t frameNo, const VSize &size) +{ + update(frameNo, size); + return mCompItem->renderList(); +} + +double AnimationImpl::duration() const +{ + if (mModel->isStatic()) return 0; + return double(mModel->frameDuration()) / double(mModel->frameRate()); +} + +bool AnimationImpl::update(size_t frameNo, const VSize &size) +{ + if (frameNo > mModel->frameDuration()) + frameNo = mModel->frameDuration(); + + mCompItem->resize(size); + return mCompItem->update(frameNo); +} + +Surface AnimationImpl::render(size_t frameNo, const Surface &surface) +{ + bool renderInProgress = mRenderInProgress.load(); + if (renderInProgress) + { + vCritical << "Already Rendering Scheduled for this Animation"; + return surface; + } + + mRenderInProgress.store(true); + update(frameNo, VSize(surface.width(), surface.height())); + mCompItem->render(surface); + mRenderInProgress.store(false); + + return surface; +} + +void AnimationImpl::init(const std::shared_ptr &model) +{ + mModel = model; + mCompItem = std::make_unique(mModel.get()); + mRenderInProgress = false; +} + +/* + * Implement a task stealing schduler to perform render task + * As each player draws into its own buffer we can delegate this + * task to a slave thread. The scheduler creates a threadpool depending + * on the number of cores available in the system and does a simple fair + * scheduling by assigning the task in a round-robin fashion. Each thread + * in the threadpool has its own queue. once it finishes all the task on its + * own queue it goes through rest of the queue and looks for task if it founds + * one it steals the task from it and executes. if it couldn't find one then it + * just waits for new task on its own queue. + */ +struct RenderTask { + RenderTask() { receiver = sender.get_future(); } + std::promise sender; + std::future receiver; + AnimationImpl *playerImpl; + size_t frameNo; + Surface surface; +}; + +#include +class RenderTaskScheduler { + const unsigned _count{std::thread::hardware_concurrency()}; + std::vector _threads; + std::vector> _q{_count}; + std::atomic _index{0}; + + void run(unsigned i) + { + while (true) { + RenderTask *task = nullptr; + + for (unsigned n = 0; n != _count * 32; ++n) { + if (_q[(i + n) % _count].try_pop(task)) break; + } + if (!task && !_q[i].pop(task)) break; + + auto result = task->playerImpl->render(task->frameNo, task->surface); + task->sender.set_value(result); + delete task; + } + } + +public: + RenderTaskScheduler() + { + for (unsigned n = 0; n != _count; ++n) { + _threads.emplace_back([&, n] { run(n); }); + } + } + + ~RenderTaskScheduler() + { + for (auto &e : _q) e.done(); + + for (auto &e : _threads) e.join(); + } + + std::future async(RenderTask *task) + { + auto receiver = std::move(task->receiver); + auto i = _index++; + + for (unsigned n = 0; n != _count; ++n) { + if (_q[(i + n) % _count].try_push(task)) return receiver; + } + + _q[i % _count].push(task); + + return receiver; + } + + std::future render(AnimationImpl *impl, size_t frameNo, + Surface &&surface) + { + RenderTask *task = new RenderTask(); + task->playerImpl = impl; + task->frameNo = frameNo; + task->surface = std::move(surface); + return async(task); + } +}; +static RenderTaskScheduler render_scheduler; + +/** + * \breif Brief abput the Api. + * Description about the setFilePath Api + * @param path add the details + */ +std::unique_ptr +Animation::loadFromData(const char *jsonData, const char *key) +{ + if (!jsonData) { + vWarning << "jason data is empty"; + return nullptr; + } + + LottieLoader loader; + if (loader.loadFromData(jsonData, key)) { + auto animation = std::make_unique(); + animation->d->init(loader.model()); + return animation; + } + return nullptr; +} + +std::unique_ptr +Animation::loadFromFile(const std::string &path) +{ + if (path.empty()) { + vWarning << "File path is empty"; + return nullptr; + } + + LottieLoader loader; + if (loader.load(path)) { + auto animation = std::make_unique(); + animation->d->init(loader.model()); + return animation; + } + return nullptr; +} + +void Animation::size(size_t &width, size_t &height) const +{ + VSize sz = d->size(); + + width = sz.width(); + height = sz.height(); +} + +double Animation::duration() const +{ + return d->duration(); +} + +double Animation::frameRate() const +{ + return d->frameRate(); +} + +size_t Animation::totalFrame() const +{ + return d->totalFrame(); +} + +size_t Animation::frameAtPos(double pos) +{ + return d->frameAtPos(pos); +} + +const std::vector & +Animation::renderList(size_t frameNo, size_t width, size_t height) const +{ + return d->renderList(frameNo, VSize(width, height)); +} + +std::future Animation::render(size_t frameNo, Surface surface) +{ + return render_scheduler.render(d.get(), frameNo, std::move(surface)); +} + +void Animation::renderSync(size_t frameNo, Surface surface) +{ + d->render(frameNo, surface); +} + +Animation::Animation(): d(std::make_unique()) {} + +/* + * this is only to supress build fail + * because unique_ptr expects the destructor in the same translation unit. + */ +Animation::~Animation(){} + +Surface::Surface(uint32_t *buffer, + size_t width, size_t height, size_t bytesPerLine) + :mBuffer(buffer), + mWidth(width), + mHeight(height), + mBytesPerLine(bytesPerLine) {} + + +void initLogging() +{ +#if defined(__ARM_NEON__) + set_log_level(LogLevel::OFF); +#else + initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); + set_log_level(LogLevel::INFO); +#endif +} + +V_CONSTRUCTOR_FUNCTION(initLogging) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c113ea95cd..d63a176c8a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -107,10 +107,10 @@ const std::vector &LOTCompItem::renderList() const return mRenderList; } -bool LOTCompItem::render(const LOTBuffer &buffer) +bool LOTCompItem::render(const lottie::Surface &surface) { - VBitmap bitmap((uchar *)buffer.buffer, buffer.width, buffer.height, - buffer.bytesPerLine, VBitmap::Format::ARGB32_Premultiplied, + VBitmap bitmap((uchar *)surface.buffer(), surface.width(), surface.height(), + surface.bytesPerLine(), VBitmap::Format::ARGB32_Premultiplied, nullptr, nullptr); /* schedule all preprocess task for this frame at once. diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 322592ca4f..3ee7e0a5e2 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -9,7 +9,8 @@ #include"vpath.h" #include"vpoint.h" #include"vpathmesure.h" -#include"lotcommon.h" +#include"lottiecommon.h" +#include"lottieanimation.h" #include"vpainter.h" #include"vdrawable.h" @@ -37,7 +38,7 @@ public: VSize size() const; const std::vector& renderList()const; void buildRenderList(); - bool render(const LOTBuffer &buffer); + bool render(const lottie::Surface &surface); private: VMatrix mScaleMatrix; VSize mViewSize; diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index 289876ffc0..bdbbc71d53 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -15,7 +15,7 @@ public: return CACHE; } std::shared_ptr find(const std::string &key); - void add(std::string &key, std::shared_ptr value); + void add(const std::string &key, std::shared_ptr value); private: LottieFileCache() = default; @@ -33,12 +33,12 @@ std::shared_ptr LottieFileCache::find(const std::string &key) } } -void LottieFileCache::add(std::string &key, std::shared_ptr value) +void LottieFileCache::add(const std::string &key, std::shared_ptr value) { mHash[key] = std::move(value); } -bool LottieLoader::load(std::string &path) +bool LottieLoader::load(const std::string &path) { LottieFileCache &fileCache = LottieFileCache::get(); diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index 32ec5aaa3b..da6bb3595d 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -8,7 +8,7 @@ class LOTModel; class LottieLoader { public: - bool load(std::string &filePath); + bool load(const std::string &filePath); bool loadFromData(const char *jsonData, const char *key); std::shared_ptr model(); private: diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 26053f0adf..3d0183f25e 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -625,9 +625,9 @@ class LOTModel { public: bool isStatic() const{return mRoot->isStatic();} - int frameDuration() {return mRoot->frameDuration();} - int frameRate() {return mRoot->frameRate();} - int startFrame() {return mRoot->startFrame();} + size_t frameDuration() {return mRoot->frameDuration();} + size_t frameRate() {return mRoot->frameRate();} + size_t startFrame() {return mRoot->startFrame();} public: std::shared_ptr mRoot; }; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp deleted file mode 100644 index 551f56a225..0000000000 --- a/src/lottie/lottieplayer.cpp +++ /dev/null @@ -1,339 +0,0 @@ -#include - -#include "lottieitem.h" -#include "lottieloader.h" -#include "lottiemodel.h" - -#include - -using namespace lottieplayer; - -class LOTPlayerPrivate { - -public: - LOTPlayerPrivate(); - bool update(float pos); - bool setFilePath(std::string path); - bool loadFromData(const char *jsonData, - const char *key); - void setSize(const VSize &sz); - void setPos(float pos); - VSize size() const; - float playTime() const; - float pos(); - float frameRate() const; - long totalFrame() const; - const std::vector &renderList(float pos); - bool render(float pos, const LOTBuffer &buffer, bool forceRender); - -private: - std::string mFilePath; - std::shared_ptr mModel; - std::unique_ptr mCompItem; - VSize mSize; - std::atomic mRenderInProgress; - float mPos = 0.0; -}; - -float LOTPlayerPrivate::frameRate() const -{ - if (!mModel) { - vWarning << "Model Data is not existed yet, please setFilePath() first."; - return 0.0f; - } - - return mModel->frameRate(); -} - -long LOTPlayerPrivate::totalFrame() const -{ - if (!mModel) { - vWarning << "Model Data is not existed yet, please setFilePath() first."; - return 0.0f; - } - - return mModel->frameDuration(); -} - -void LOTPlayerPrivate::setSize(const VSize &sz) -{ - mSize = sz; -} - -VSize LOTPlayerPrivate::size() const -{ - if (!mCompItem) { - return mSize; - } else { - return mCompItem->size(); - } -} - -const std::vector &LOTPlayerPrivate::renderList(float pos) -{ - if (!mCompItem) { - static std::vector empty; - return empty; - } - - update(pos); - - return mCompItem->renderList(); -} - -float LOTPlayerPrivate::playTime() const -{ - if (!mModel || mModel->isStatic()) return 0; - return float(mModel->frameDuration()) / float(mModel->frameRate()); -} - -float LOTPlayerPrivate::pos() -{ - return mPos; -} - -void LOTPlayerPrivate::setPos(float pos) -{ - if (pos > 1.0) pos = 1.0; - if (pos < 0) pos = 0; - mPos = pos; -} - -bool LOTPlayerPrivate::update(float vPos) -{ - if (!mCompItem) return false; - - mCompItem->resize(mSize); - setPos(vPos); - - int frameNumber; - if (mModel->isStatic()) frameNumber = 0; - else frameNumber = mModel->startFrame() + pos() * mModel->frameDuration(); - - return mCompItem->update(frameNumber); -} - -bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer, bool forceRender) -{ - if (!mCompItem) return false; - - bool renderInProgress = mRenderInProgress.load(); - if (renderInProgress) - { - vCritical << "Already Rendering Scheduled for this Player"; - } - - bool result = true; - - if (update(pos) || forceRender) - { - mRenderInProgress.store(true); - result = mCompItem->render(buffer); - mRenderInProgress.store(false); - } - - return result; -} - -LOTPlayerPrivate::LOTPlayerPrivate() : mRenderInProgress(false) {} - -bool LOTPlayerPrivate::setFilePath(std::string path) -{ - if (path.empty()) { - vWarning << "File path is empty"; - return false; - } - - LottieLoader loader; - if (loader.load(path)) { - mModel = loader.model(); - mCompItem = std::make_unique(mModel.get()); - return true; - } - return false; -} - -bool LOTPlayerPrivate::loadFromData(const char *jsonData, const char *key) -{ - if (!jsonData) { - vWarning << "jason data is empty"; - return false; - } - - LottieLoader loader; - if (loader.loadFromData(jsonData, key)) { - mModel = loader.model(); - mCompItem = std::make_unique(mModel.get()); - return true; - } - return false; -} - -/* - * Implement a task stealing schduler to perform render task - * As each player draws into its own buffer we can delegate this - * task to a slave thread. The scheduler creates a threadpool depending - * on the number of cores available in the system and does a simple fair - * scheduling by assigning the task in a round-robin fashion. Each thread - * in the threadpool has its own queue. once it finishes all the task on its - * own queue it goes through rest of the queue and looks for task if it founds - * one it steals the task from it and executes. if it couldn't find one then it - * just waits for new task on its own queue. - */ -struct RenderTask { - RenderTask() { receiver = sender.get_future(); } - std::promise sender; - std::future receiver; - LOTPlayerPrivate * playerImpl; - float pos; - LOTBuffer buffer; - bool forceRender; -}; - -#include -class RenderTaskScheduler { - const unsigned _count{std::thread::hardware_concurrency()}; - std::vector _threads; - std::vector> _q{_count}; - std::atomic _index{0}; - - void run(unsigned i) - { - while (true) { - RenderTask *task = nullptr; - - for (unsigned n = 0; n != _count * 32; ++n) { - if (_q[(i + n) % _count].try_pop(task)) break; - } - if (!task && !_q[i].pop(task)) break; - - bool result = task->playerImpl->render(task->pos, task->buffer, task->forceRender); - task->sender.set_value(result); - delete task; - } - } - -public: - RenderTaskScheduler() - { - for (unsigned n = 0; n != _count; ++n) { - _threads.emplace_back([&, n] { run(n); }); - } - } - - ~RenderTaskScheduler() - { - for (auto &e : _q) e.done(); - - for (auto &e : _threads) e.join(); - } - - std::future async(RenderTask *task) - { - auto receiver = std::move(task->receiver); - auto i = _index++; - - for (unsigned n = 0; n != _count; ++n) { - if (_q[(i + n) % _count].try_push(task)) return receiver; - } - - _q[i % _count].push(task); - - return receiver; - } - - std::future render(LOTPlayerPrivate *impl, float pos, - LOTBuffer &&buffer, bool forceRender) - { - RenderTask *task = new RenderTask(); - task->playerImpl = impl; - task->pos = pos; - task->buffer = std::move(buffer); - task->forceRender = forceRender; - return async(task); - } -}; -static RenderTaskScheduler render_scheduler; - -LOTPlayer::LOTPlayer() : d(new LOTPlayerPrivate()) {} - -LOTPlayer::~LOTPlayer() -{ - delete d; -} - -/** - * \breif Brief abput the Api. - * Description about the setFilePath Api - * @param path add the details - */ - -bool LOTPlayer::loadFromData(const char *jsonData, const char *key) -{ - return d->loadFromData(jsonData, key); -} - -bool LOTPlayer::setFilePath(const char *filePath) -{ - return d->setFilePath(filePath); -} - -void LOTPlayer::setSize(int width, int height) -{ - d->setSize(VSize(width, height)); -} - -void LOTPlayer::size(int &width, int &height) const -{ - VSize sz = d->size(); - - width = sz.width(); - height = sz.height(); -} - -float LOTPlayer::playTime() const -{ - return d->playTime(); -} - -float LOTPlayer::pos() const -{ - return d->pos(); -} - -float LOTPlayer::frameRate() const -{ - return d->frameRate(); -} - -long LOTPlayer::totalFrame() const -{ - return d->totalFrame(); -} - -const std::vector &LOTPlayer::renderList(float pos) const -{ - return d->renderList(pos); -} - -std::future LOTPlayer::render(float pos, LOTBuffer buffer, bool forceRender) -{ - return render_scheduler.render(d, pos, std::move(buffer), forceRender); -} - -bool LOTPlayer::renderSync(float pos, LOTBuffer buffer, bool forceRender) -{ - return d->render(pos, buffer, forceRender); -} - -void initLogging() -{ -#if defined(__ARM_NEON__) - set_log_level(LogLevel::OFF); -#else - initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); - set_log_level(LogLevel::INFO); -#endif -} - -V_CONSTRUCTOR_FUNCTION(initLogging) diff --git a/src/lottie/meson.build b/src/lottie/meson.build index ba61f0725b..1c7275f7fa 100644 --- a/src/lottie/meson.build +++ b/src/lottie/meson.build @@ -2,7 +2,7 @@ source_file = files('lottieparser.cpp') source_file += files('lottieloader.cpp') source_file += files('lottiemodel.cpp') -source_file += files('lottieplayer.cpp') +source_file += files('lottieanimation.cpp') source_file += files('lottieitem.cpp') From eb9e2cd378947d5081ea18b4c9fcafb7edbc0b25 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 7 Sep 2018 15:08:11 +0900 Subject: [PATCH 240/672] fix build break by 0f5edac6d1595e0fecd8d48bb7d2e5353fe9121f and packaging it properly. Change-Id: Ib1216034d63beb809fdd652542980e61494e1e91 --- inc/lottieanimation_capi.h | 6 +++--- inc/meson.build | 2 +- src/CMakeLists.txt | 4 +++- src/binding/CMakeLists.txt | 1 + src/binding/c/CMakeLists.txt | 9 +++++++++ 5 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 src/binding/CMakeLists.txt create mode 100644 src/binding/c/CMakeLists.txt diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index 2b032a7670..86a7bfc675 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -1,5 +1,5 @@ -#ifndef _LOTPLAYER_CAPI_H_ -#define _LOTPLAYER_CAPI_H_ +#ifndef _LOTTIE_ANIMATION_CAPI_H_ +#define _LOTTIE_ANIMATION_CAPI_H_ #include #include @@ -69,5 +69,5 @@ lottie_animation_render_flush(Lottie_Animation *animation); } #endif -#endif //_LOTPLAYER_CAPI_H_ +#endif //_LOTTIE_ANIMATION_CAPI_H_ diff --git a/inc/meson.build b/inc/meson.build index 332029f3c3..c2d6e4e1fd 100644 --- a/inc/meson.build +++ b/inc/meson.build @@ -1,3 +1,3 @@ install_headers(['lottieanimation.h', - 'lotcommon.h', + 'lottiecommon.h', 'lottieanimation_capi.h']) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fce73dbf8d..8bdefec0f1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,6 @@ add_subdirectory(vector) -add_subdirectory(lottie) \ No newline at end of file +add_subdirectory(lottie) + +add_subdirectory(binding) diff --git a/src/binding/CMakeLists.txt b/src/binding/CMakeLists.txt new file mode 100644 index 0000000000..20bc4cc4b0 --- /dev/null +++ b/src/binding/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(c) diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt new file mode 100644 index 0000000000..5d4965d132 --- /dev/null +++ b/src/binding/c/CMakeLists.txt @@ -0,0 +1,9 @@ +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/lottieanimation_c.cpp" + ) + +target_include_directories(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}" + ) From 61111eb95e1de6502e4339687a07da7cfa959d13 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 7 Sep 2018 18:21:00 +0900 Subject: [PATCH 241/672] lottie: added intial documentation in the animation interface. Change-Id: I92d802aa44492cdc83d15c8775dd8830f2cffe9d --- inc/lottieanimation.h | 158 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 154 insertions(+), 4 deletions(-) diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index ce163b9e18..b75019d578 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -34,13 +34,50 @@ namespace lottie { class LOT_EXPORT Surface { public: - Surface() = default; + /** + * @brief Surface object constructor. + * + * @param[in] buffer surface buffer. + * @param[in] width surface width. + * @param[in] height surface height. + * @param[in] bytesPerLine number of bytes in a surface scanline. + * + * @note Default surface format is ARGB32_Premultiplied. + */ Surface(uint32_t *buffer, size_t width, size_t height, size_t bytesPerLine); + + /** + * @brief Returns width of the surface. + * + * @return surface width + */ size_t width() const {return mWidth;} + + /** + * @brief Returns height of the surface. + * + * @return surface height + */ size_t height() const {return mHeight;} + + /** + * @brief Returns number of bytes in the surface scanline. + * + * @return number of bytes in scanline. + */ size_t bytesPerLine() const {return mBytesPerLine;} + + /** + * @brief Returns buffer attached tp the surface. + * + * @return buffer attaced to the Surface. + */ uint32_t *buffer() const {return mBuffer;} + /** + * @brief Default constructor. + */ + Surface() = default; private: uint32_t *mBuffer; size_t mWidth; @@ -51,28 +88,141 @@ private: class LOT_EXPORT Animation { public: + /** + * @brief Constructs an animation object from filepath. + * + * @param[in] path Lottie resource file path + * + * @return Animation object that can render the contents of the + * lottie resource represented by file path. + */ static std::unique_ptr loadFromFile(const std::string &path); + /** + * @brief Constructs an animation object from json string data. + * + * @param[in] jsonData The JSON string data. + * @param[in] key the string that will be used to cache the JSON string data. + * + * @return Animation object that can render the contents of the + * lottie resource represented by JSON string data. + */ static std::unique_ptr loadFromData(const char *jsonData, const char *key); + /** + * @brief Returns default framerate of the lottie resource. + * + * @return framerate of the lottie resource + * + */ double frameRate() const; + + /** + * @brief Returns total number of frames present in the lottie resource. + * + * @return frame count of the lottie resource. + * + * @note frame number starts with 0. + */ size_t totalFrame() const; + + /** + * @brief Returns default viewport size of the lottie resource. + * + * @param[out] width default width of the viewport. + * @param[out] height default height of the viewport. + * + */ void size(size_t &width, size_t &height) const; + + /** + * @brief Returns total animation duration of lottie resource in second. + * it uses totalFrame() and frameRate() to calcualte the duration. + * duration = totalFrame() / frameRate(). + * + * @return total animation duration in second. + * @retval 0 if the lottie resource has no animation. + * + * @see totalFrame() + * @see frameRate() + */ double duration() const; + + /** + * @brief Returns frame number for a given position. + * this function helps to map the position value retuned + * by the animator to a frame number in side the lottie resource. + * frame_number = lerp(start_frame, endframe, pos); + * + * @param[in] pos normalized position value [0 ... 1] + * + * @return frame numer maps to the position value [startFrame .... endFrame] + * + */ size_t frameAtPos(double pos); + /** + * @brief Renders the content to surface Asynchronously. + * it gives a future in return to get the result of the + * rendering at a future point. + * To get best performance user has to start rendering as soon as + * it finds that content at {frameNo} has to be rendered and get the + * result from the future at the last moment when the surface is needed + * to draw into the screen. + * + * + * @param[in] frameNo Content corresponds to the frameno needs to be drawn + * @param[in] surface Surface in which content will be drawn + * + * @return future that will hold the result when rendering finished. + * + * for Synchronus rendering @see renderSync + * @see Surface + */ std::future render(size_t frameNo, Surface surface); + + /** + * @brief Renders the content to surface synchronously. + * for performance use the asyn rendering @see render + * + * @param[in] frameNo Content corresponds to the frameno needs to be drawn + * @param[in] surface Surface in which content will be drawn + */ void renderSync(size_t frameNo, Surface surface); - ~Animation(); - Animation(); - + /** + * @brief Returns list of rendering nodes that that represents the + * content of the lottie resource at frame number {frameNo}. + * + * @param[in] frameNo Content corresponds to the frameno needs to be extracted. + * @param[in] width content viewbox width + * @param[in] height content viewbox height + * + * @return render node list. + */ const std::vector &renderList(size_t frameNo, size_t width, size_t height) const; + + /** + * @brief default destructor + */ + ~Animation(); + + /** + * @brief default constructor + * + * @note user should never construct animation object. + * they should call the one of the factory method instead. + * + * @see loadFromFile() + * @see loadFromData() + */ + Animation(); private: std::unique_ptr d; }; + } // namespace lotplayer #endif // _LOTTIE_ANIMATION_H_ From 97dc0bf2d505fd4ddec9a644e42c2c7bdc8fafe8 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 7 Sep 2018 19:40:02 +0900 Subject: [PATCH 242/672] capi: changed file name. Change-Id: Ic1c6b550751041f856814d24b668ab9f97606170 --- src/binding/c/CMakeLists.txt | 2 +- .../c/{lottieanimation_c.cpp => lottieanimation_capi.cpp} | 0 src/binding/c/meson.build | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/binding/c/{lottieanimation_c.cpp => lottieanimation_capi.cpp} (100%) diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt index 5d4965d132..7737952a86 100644 --- a/src/binding/c/CMakeLists.txt +++ b/src/binding/c/CMakeLists.txt @@ -1,6 +1,6 @@ target_sources(lottie-player PRIVATE - "${CMAKE_CURRENT_LIST_DIR}/lottieanimation_c.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottieanimation_capi.cpp" ) target_include_directories(lottie-player diff --git a/src/binding/c/lottieanimation_c.cpp b/src/binding/c/lottieanimation_capi.cpp similarity index 100% rename from src/binding/c/lottieanimation_c.cpp rename to src/binding/c/lottieanimation_capi.cpp diff --git a/src/binding/c/meson.build b/src/binding/c/meson.build index 3c297fcf70..182aba59c7 100644 --- a/src/binding/c/meson.build +++ b/src/binding/c/meson.build @@ -1,4 +1,4 @@ -source_file = files('lottieanimation_c.cpp') +source_file = files('lottieanimation_capi.cpp') binding_c_dep = declare_dependency( include_directories : include_directories('.'), From 2d622094f9090e36a9742388fa61a369dcd6290a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 7 Sep 2018 19:42:30 +0900 Subject: [PATCH 243/672] common: changed name prefix. Change-Id: I88c297713e3a899edf2eed667aafae357ea376f4 --- inc/lottiecommon.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 090b4c2207..22400e6a39 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -30,13 +30,13 @@ typedef enum { //TODO: Coding convention?? - LOT_PLAYER_ERROR_NONE = 0, - LOT_PLAYER_ERROR_NOT_PERMITTED, - LOT_PLAYER_ERROR_OUT_OF_MEMORY, - LOT_PLAYER_ERROR_INVALID_PARAMETER, - LOT_PLAYER_ERROR_RESULT_OUT_OF_RANGE, - LOT_PLAYER_ERROR_ALREADY_IN_PROGRESS, - LOT_PLAYER_ERROR_UNKNOWN + LOT_ANIMATION_ERROR_NONE = 0, + LOT_ANIMATION_ERROR_NOT_PERMITTED, + LOT_ANIMATION_ERROR_OUT_OF_MEMORY, + LOT_ANIMATION_ERROR_INVALID_PARAMETER, + LOT_ANIMATION_ERROR_RESULT_OUT_OF_RANGE, + LOT_ANIMATION_ERROR_ALREADY_IN_PROGRESS, + LOT_ANIMATION_ERROR_UNKNOWN } LOTErrorType; typedef enum From 5a645538948bc9fcf85c87401430fbb8980ec599 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 7 Sep 2018 20:30:05 +0900 Subject: [PATCH 244/672] binding: fix invalid access of LOTNode data. double-pointer is not an array of pointer. there could be proper code for fixing this. Change-Id: Ia79463fa358d485b98cf2fc3cf52d080dd67a574 --- src/binding/c/lottieanimation_capi.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index fa2f9f4fc2..c4ac80e330 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -8,10 +8,12 @@ extern "C" { struct Lottie_Animation_S { std::unique_ptr mAnimation; - size_t mCurFrame; - LOTNode **mNodeArray; + size_t mCurFrame{0}; + std::future mRenderTask; + size_t mFrameNo{0}; size_t mArraySize{0}; - std::future mRenderTask; + size_t mWidth{0}; + size_t mHeight{0}; }; LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *file) @@ -75,9 +77,10 @@ LOT_EXPORT void lottie_animation_prepare_frame(Lottie_Animation_S *animation, si { if (!animation) return; - auto list = animation->mAnimation->renderList(frameNo, w, h); - animation->mNodeArray = list.data(); - animation->mArraySize = list.size(); + animation->mFrameNo = frameNo; + animation->mWidth = w; + animation->mHeight = h; + animation->mArraySize = animation->mAnimation->renderList(frameNo, w, h).size(); } LOT_EXPORT size_t lottie_animation_get_node_count(const Lottie_Animation_S *animation) @@ -93,7 +96,7 @@ LOT_EXPORT const LOTNode* lottie_animation_get_node(const Lottie_Animation_S *an if (idx >= animation->mArraySize) return nullptr; - return animation->mNodeArray[idx]; + return animation->mAnimation->renderList(animation->mFrameNo, animation->w, animation->h)[idx]; } LOT_EXPORT void From 1a776b4f614a7ef17040747605386dc4b83b9b97 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 7 Sep 2018 20:33:33 +0900 Subject: [PATCH 245/672] binding: fix compile error. Change-Id: I3c5b0390f39ca885529475330a73f9af7dee29d0 --- src/binding/c/lottieanimation_capi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index c4ac80e330..cd500daa4c 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -96,7 +96,7 @@ LOT_EXPORT const LOTNode* lottie_animation_get_node(const Lottie_Animation_S *an if (idx >= animation->mArraySize) return nullptr; - return animation->mAnimation->renderList(animation->mFrameNo, animation->w, animation->h)[idx]; + return animation->mAnimation->renderList(animation->mFrameNo, animation->mWidth, animation->mHeight)[idx]; } LOT_EXPORT void From f14e50305a3cb07746a1e5094cb9d2490c69678f Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 8 Sep 2018 17:12:20 +0900 Subject: [PATCH 246/672] lottie/vector: refactor rect class. Change-Id: I553160f74ad06b002cf2d17d1bf55615e71f9853 --- src/lottie/lottieitem.cpp | 2 +- src/vector/vpath.cpp | 8 +- src/vector/vrect.h | 198 +++++++++----------------------------- src/vector/vregion.cpp | 6 +- src/vector/vrle.cpp | 2 +- 5 files changed, 57 insertions(+), 159 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index d63a176c8a..f03eccefe0 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -215,7 +215,7 @@ VRle LOTLayerItem::maskRle(const VRect &clipRect) break; } case LOTMaskData::Mode::Substarct: { - if (rle.isEmpty() && !clipRect.isEmpty()) + if (rle.isEmpty() && !clipRect.empty()) rle = VRle::toRle(clipRect); rle = rle - i->rle(); break; diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index ad30a2ad67..57d4b4b31d 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -142,7 +142,7 @@ void VPath::VPathData::addCircle(float cx, float cy, float radius, void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) { - if (rect.isNull()) return; + if (rect.empty()) return; float x = rect.x(); float y = rect.y(); @@ -192,7 +192,7 @@ void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) { - if (rect.isNull()) return; + if (rect.empty()) return; float x = rect.x(); float y = rect.y(); @@ -255,7 +255,7 @@ static float tForArcAngle(float angle); void findEllipseCoords(const VRectF &r, float angle, float length, VPointF *startPoint, VPointF *endPoint) { - if (r.isNull()) { + if (r.empty()) { if (startPoint) *startPoint = VPointF(); if (endPoint) *endPoint = VPointF(); return; @@ -349,7 +349,7 @@ static VPointF curvesForArc(const VRectF &rect, float startAngle, float sweepLength, VPointF *curves, int *point_count) { - if (rect.isNull()) { + if (rect.empty()) { return {}; } diff --git a/src/vector/vrect.h b/src/vector/vrect.h index b6c4d96907..10e4929962 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -4,32 +4,32 @@ #include "vpoint.h" V_BEGIN_NAMESPACE +class VRectF; class VRect { public: VRect() = default; - V_CONSTEXPR VRect(int left, int top, int width, int height); - V_CONSTEXPR inline bool isEmpty() const; - V_CONSTEXPR inline bool isNull() const; - - V_CONSTEXPR inline int left() const; - V_CONSTEXPR inline int top() const; - V_CONSTEXPR inline int right() const; - V_CONSTEXPR inline int bottom() const; - V_CONSTEXPR inline int width() const; - V_CONSTEXPR inline int height() const; - V_CONSTEXPR inline int x() const; - V_CONSTEXPR inline int y() const; - inline void setLeft(int l) { x1 = l; } - inline void setTop(int t) { y1 = t; } - inline void setRight(int r) { x2 = r; } - inline void setBottom(int b) { y2 = b; } - inline void setWidth(int w) { x2 = x1 + w; } - inline void setHeight(int h) { y2 = y1 + h; } - inline VRect translated(int dx, int dy) const; - inline void translate(int dx, int dy); - inline bool contains(const VRect &r, bool proper = false) const; - inline bool intersects(const VRect &r); + VRect(int x, int y, int w, int h):x1(x),y1(y),x2(x+w),y2(y+h){} + VRect(const VRectF &r); + V_CONSTEXPR bool empty() const {return x1 >= x2 || y1 >= y2;} + V_CONSTEXPR int left() const {return x1;} + V_CONSTEXPR int top() const {return y1;} + V_CONSTEXPR int right() const {return x2;} + V_CONSTEXPR int bottom() const {return y2;} + V_CONSTEXPR int width() const {return x2-x1;} + V_CONSTEXPR int height() const {return y2-y1;} + V_CONSTEXPR int x() const {return x1;} + V_CONSTEXPR int y() const {return y1;} + void setLeft(int l) { x1 = l; } + void setTop(int t) { y1 = t; } + void setRight(int r) { x2 = r; } + void setBottom(int b) { y2 = b; } + void setWidth(int w) { x2 = x1 + w; } + void setHeight(int h) { y2 = y1 + h; } + VRect translated(int dx, int dy) const; + void translate(int dx, int dy); + bool contains(const VRect &r, bool proper = false) const; + bool intersects(const VRect &r); friend V_CONSTEXPR inline bool operator==(const VRect &, const VRect &) noexcept; friend V_CONSTEXPR inline bool operator!=(const VRect &, @@ -39,8 +39,8 @@ public: private: int x1{0}; int y1{0}; - int x2{-1}; - int y2{-1}; + int x2{0}; + int y2{0}; }; inline bool VRect::intersects(const VRect &r) @@ -65,54 +65,6 @@ V_CONSTEXPR inline bool operator!=(const VRect &r1, const VRect &r2) noexcept return r1.x1 != r2.x1 || r1.x2 != r2.x2 || r1.y1 != r2.y1 || r1.y2 != r2.y2; } -V_CONSTEXPR inline bool VRect::isEmpty() const -{ - return x1 > x2 || y1 > y2; -} - -V_CONSTEXPR inline bool VRect::isNull() const -{ - return (((x2 - x1) == 0) || ((y2 - y1) == 0)); -} - -V_CONSTEXPR inline int VRect::x() const -{ - return x1; -} - -V_CONSTEXPR inline int VRect::y() const -{ - return y1; -} - -V_CONSTEXPR inline int VRect::left() const -{ - return x1; -} - -V_CONSTEXPR inline int VRect::top() const -{ - return y1; -} - -V_CONSTEXPR inline int VRect::right() const -{ - return x2; -} - -V_CONSTEXPR inline int VRect::bottom() const -{ - return y2; -} -V_CONSTEXPR inline int VRect::width() const -{ - return x2 - x1; -} -V_CONSTEXPR inline int VRect::height() const -{ - return y2 - y1; -} - inline VRect VRect::translated(int dx, int dy) const { return {x1 + dx, y1 + dy, x2 - x1, y2 - y1}; @@ -125,6 +77,7 @@ inline void VRect::translate(int dx, int dy) x2 += dx; y2 += dy; } + inline bool VRect::contains(const VRect &r, bool proper) const { if (!proper) { @@ -137,43 +90,34 @@ inline bool VRect::contains(const VRect &r, bool proper) const return false; } } -V_CONSTEXPR inline VRect::VRect(int left, int top, int width, int height) - : x1(left), y1(top), x2(width + left), y2(height + top) -{ -} class VRectF { public: VRectF() = default; - VRectF(float left, float top, float width, float height) - { - x1 = left; - y1 = top; - x2 = x1 + width; - y2 = y1 + height; - } + VRectF(float x, float y, float w, float h):x1(x),y1(y),x2(x+w),y2(y+h){} + VRectF(const VRect &r):x1(r.left()),y1(r.top()), + x2(r.right()),y2(r.bottom()){} - V_CONSTEXPR inline bool isEmpty() const; - V_CONSTEXPR inline bool isNull() const; - V_CONSTEXPR inline float left() const; - V_CONSTEXPR inline float top() const; - V_CONSTEXPR inline float right() const; - V_CONSTEXPR inline float bottom() const; - V_CONSTEXPR inline float width() const; - V_CONSTEXPR inline float height() const; - V_CONSTEXPR inline float x() const; - V_CONSTEXPR inline float y() const; + V_CONSTEXPR bool empty() const {return x1 >= x2 || y1 >= y2;} + V_CONSTEXPR float left() const {return x1;} + V_CONSTEXPR float top() const {return y1;} + V_CONSTEXPR float right() const {return x2;} + V_CONSTEXPR float bottom() const {return y2;} + V_CONSTEXPR float width() const {return x2-x1;} + V_CONSTEXPR float height() const {return y2-y1;} + V_CONSTEXPR float x() const {return x1;} + V_CONSTEXPR float y() const {return y1;} V_CONSTEXPR inline VPointF center() const { return {x1 + (x2 - x1) / 2.f, y1 + (y2 - y1) / 2.f}; } - inline void setLeft(float l) { x1 = l; } - inline void setTop(float t) { y1 = t; } - inline void setRight(float r) { x2 = r; } - inline void setBottom(float b) { y2 = b; } - inline void setWidth(float w) { x2 = x1 + w; } - inline void setHeight(float h) { y2 = y1 + h; } - inline void translate(float dx, float dy) + void setLeft(float l) { x1 = l; } + void setTop(float t) { y1 = t; } + void setRight(float r) { x2 = r; } + void setBottom(float b) { y2 = b; } + void setWidth(float w) { x2 = x1 + w; } + void setHeight(float h) { y2 = y1 + h; } + void translate(float dx, float dy) { x1 += dx; y1 += dy; @@ -184,58 +128,12 @@ public: private: float x1{0}; float y1{0}; - float x2{-1}; - float y2{-1}; + float x2{0}; + float y2{0}; }; -V_CONSTEXPR inline bool VRectF::isEmpty() const -{ - return x1 > x2 || y1 > y2; -} - -V_CONSTEXPR inline bool VRectF::isNull() const -{ - return (((x2 - x1) == 0) || ((y2 - y1) == 0)); -} - -V_CONSTEXPR inline float VRectF::x() const -{ - return x1; -} - -V_CONSTEXPR inline float VRectF::y() const -{ - return y1; -} - -V_CONSTEXPR inline float VRectF::left() const -{ - return x1; -} - -V_CONSTEXPR inline float VRectF::top() const -{ - return y1; -} - -V_CONSTEXPR inline float VRectF::right() const -{ - return x2; -} - -V_CONSTEXPR inline float VRectF::bottom() const -{ - return y2; -} -V_CONSTEXPR inline float VRectF::width() const -{ - return x2 - x1; -} -V_CONSTEXPR inline float VRectF::height() const -{ - return y2 - y1; -} - +inline VRect::VRect(const VRectF &r):x1(r.left()),y1(r.top()), + x2(r.right()),y2(r.bottom()){} V_END_NAMESPACE #endif // VRECT_H diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index 71aa1ea468..b5eab50895 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -1825,7 +1825,7 @@ VRegion::VRegion(int x, int y, int w, int h) VRegion::VRegion(const VRect &r) { - if (r.isEmpty()) { + if (r.empty()) { d = const_cast(&shared_empty); } else { d = new VRegionData; @@ -1938,7 +1938,7 @@ VRegion VRegion::united(const VRegion &r) const VRegion VRegion::intersected(const VRect &r) const { - if (isEmpty() || r.isEmpty()) return VRegion(); + if (isEmpty() || r.empty()) return VRegion(); /* this is fully contained in r */ if (within(r)) return *this; @@ -2009,7 +2009,7 @@ VRegion VRegion::operator-(const VRegion &r) const VRegion &VRegion::operator+=(const VRect &r) { if (isEmpty()) return *this = r; - if (r.isEmpty()) return *this; + if (r.empty()) return *this; if (contains(r)) { return *this; diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 1ab7393eb1..3d4393d344 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -680,7 +680,7 @@ static void rleSubstractWithRle(VRleHelper *a, VRleHelper *b, VRle VRle::toRle(const VRect &rect) { - if (rect.isEmpty()) return VRle(); + if (rect.empty()) return VRle(); VRle result; result.d.write().addRect(rect); From 9a50268e2c467623bbefeb17fc5d837c2f7a723f Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sun, 9 Sep 2018 11:57:30 +0900 Subject: [PATCH 247/672] lottie: rename all isEmpty() api to empty() for consistancy. Change-Id: Id3dddbd920ff00c7beafe0abd17f6da73442195b --- src/lottie/lottieitem.cpp | 22 +++++++++++----------- src/vector/vdasher.cpp | 2 +- src/vector/vpainter.cpp | 2 +- src/vector/vpath.cpp | 6 +++--- src/vector/vpath.h | 12 ++++++------ src/vector/vpoint.h | 2 +- src/vector/vraster.cpp | 4 ++-- src/vector/vregion.cpp | 32 ++++++++++++++++---------------- src/vector/vregion.h | 2 +- src/vector/vrle.h | 22 +++++++++++----------- test/testsgregion.cpp | 6 +++--- 11 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index f03eccefe0..80e655ba60 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -129,7 +129,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &/*flag*/) { if (mData->mShape.isStatic()) { - if (mLocalPath.isEmpty()) { + if (mLocalPath.empty()) { mData->mShape.value(frameNo).toPath(mLocalPath); } } else { @@ -167,7 +167,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle matteRle = matteRle + i->rle(); } - if (!inheritMatte.isEmpty()) + if (!inheritMatte.empty()) matteRle = matteRle & inheritMatte; } else { matteRle = inheritMatte; @@ -178,10 +178,10 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle VRle mask; if (hasMask()) { mask = maskRle(painter->clipBoundingRect()); - if (!inheritMask.isEmpty()) + if (!inheritMask.empty()) mask = mask & inheritMask; // if resulting mask is empty then return. - if (mask.isEmpty()) + if (mask.empty()) return; } else { mask = inheritMask; @@ -190,11 +190,11 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle for (auto &i : mDrawableList) { painter->setBrush(i->mBrush); VRle rle = i->rle(); - if (!mask.isEmpty()) rle = rle & mask; + if (!mask.empty()) rle = rle & mask; - if (rle.isEmpty()) continue; + if (rle.empty()) continue; - if (!matteRle.isEmpty()) { + if (!matteRle.empty()) { if (mLayerData->mMatteType == MatteType::AlphaInv) { rle = rle - matteRle; } else { @@ -215,7 +215,7 @@ VRle LOTLayerItem::maskRle(const VRect &clipRect) break; } case LOTMaskData::Mode::Substarct: { - if (rle.isEmpty() && !clipRect.empty()) + if (rle.empty() && !clipRect.empty()) rle = VRle::toRle(clipRect); rle = rle - i->rle(); break; @@ -359,7 +359,7 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const matteRle = matteRle + i->rle(); } - if (!inheritMatte.isEmpty()) + if (!inheritMatte.empty()) matteRle = matteRle & inheritMatte; } else { matteRle = inheritMatte; @@ -368,10 +368,10 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle mask; if (hasMask()) { mask = maskRle(painter->clipBoundingRect()); - if (!inheritMask.isEmpty()) + if (!inheritMask.empty()) mask = mask & inheritMask; // if resulting mask is empty then return. - if (mask.isEmpty()) + if (mask.empty()) return; } else { mask = inheritMask; diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index eedae3aa2d..987668e5e9 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -160,7 +160,7 @@ void VDasher::cubicTo(const VPointF &cp1, const VPointF &cp2, const VPointF &e) VPath VDasher::dashed(const VPath &path) { - if (path.isEmpty()) return VPath(); + if (path.empty()) return VPath(); mResult = VPath(); mIndex = 0; diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 064f6345a0..1249e38590 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -14,7 +14,7 @@ public: void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle) { - if (rle.isEmpty()) return; + if (rle.empty()) return; // mSpanData.updateSpanFunc(); if (!mSpanData.mUnclippedBlendFunc) return; diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 57d4b4b31d..efb8a6c5bd 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -79,7 +79,7 @@ void VPath::VPathData::cubicTo(float cx1, float cy1, float cx2, float cy2, void VPath::VPathData::close() { - if (isEmpty()) return; + if (empty()) return; const VPointF &lastPt = m_points.back(); if (!fuzzyCompare(mStartPoint, lastPt)) { @@ -91,7 +91,7 @@ void VPath::VPathData::close() void VPath::VPathData::reset() { - if (isEmpty()) return; + if (empty()) return; m_elements.clear(); m_points.clear(); @@ -123,7 +123,7 @@ void VPath::VPathData::arcTo(const VRectF &rect, float startAngle, curvesForArc(rect, startAngle, sweepLength, pts, &point_count); reserve(point_count + 1, point_count / 3 + 1); - if (isEmpty() || forceMoveTo) { + if (empty() || forceMoveTo) { moveTo(curve_start.x(), curve_start.y()); } else { lineTo(curve_start.x(), curve_start.y()); diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 24fce594a7..567d99c8a6 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -14,7 +14,7 @@ public: enum class Direction { CCW, CW }; enum class Element : uchar { MoveTo, LineTo, CubicTo, Close }; - bool isEmpty() const; + bool empty() const; void moveTo(const VPointF &p); void moveTo(float x, float y); void lineTo(const VPointF &p); @@ -50,7 +50,7 @@ public: private: struct VPathData { - bool isEmpty() const { return m_elements.empty(); } + bool empty() const { return m_elements.empty(); } void moveTo(float x, float y); void lineTo(float x, float y); void cubicTo(float cx1, float cy1, float cx2, float cy2, float ex, float ey); @@ -89,9 +89,9 @@ private: vcow_ptr d; }; -inline bool VPath::isEmpty() const +inline bool VPath::empty() const { - return d->isEmpty(); + return d->empty(); } inline void VPath::moveTo(const VPointF &p) @@ -203,9 +203,9 @@ inline void VPath::addPolygon(float points, float radius, float roundness, inline void VPath::addPath(const VPath &path) { - if (path.isEmpty()) return; + if (path.empty()) return; - if (isEmpty()) { + if (empty()) { *this = path; } else { d.write().addPath(path.d.read()); diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 3eb8ed5d66..22bd8890be 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -142,7 +142,7 @@ class VSize { public: VSize() = default; constexpr inline VSize(int w, int h) noexcept : mw(w), mh(h) {} - bool isEmpty() const {return (mw <= 0 || mh <= 0);} + bool empty() const {return (mw <= 0 || mh <= 0);} constexpr inline int width() const noexcept { return mw; } constexpr inline int height() const noexcept { return mh; } inline void setWidth(int w) { mw = w; } diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 7d20723f78..b5e58f4ea1 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -387,7 +387,7 @@ static RleTaskScheduler raster_scheduler; std::future VRaster::generateFillInfo(VPath &&path, VRle &&rle, FillRule fillRule) { - if (path.isEmpty()) { + if (path.empty()) { std::promise promise; promise.set_value(VRle()); return promise.get_future(); @@ -399,7 +399,7 @@ std::future VRaster::generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle JoinStyle join, float width, float meterLimit) { - if (path.isEmpty()) { + if (path.empty()) { std::promise promise; promise.set_value(VRle()); return promise.get_future(); diff --git a/src/vector/vregion.cpp b/src/vector/vregion.cpp index b5eab50895..5944b63473 100644 --- a/src/vector/vregion.cpp +++ b/src/vector/vregion.cpp @@ -1868,14 +1868,14 @@ VRegion::~VRegion() if (!d->ref.deref()) cleanUp(d); } -bool VRegion::isEmpty() const +bool VRegion::empty() const { return d == &shared_empty || !PREFIX(_not_empty)(d->rgn); } void VRegion::translate(const VPoint &p) { - if (p == VPoint() || isEmpty()) return; + if (p == VPoint() || empty()) return; detach(); PREFIX(_translate)(d->rgn, p.x(), p.y()); @@ -1910,7 +1910,7 @@ bool VRegion::contains(const VRect &r) const VRegion VRegion::united(const VRect &r) const { - if (isEmpty()) return r; + if (empty()) return r; if (contains(r)) { return *this; @@ -1927,8 +1927,8 @@ VRegion VRegion::united(const VRect &r) const VRegion VRegion::united(const VRegion &r) const { - if (isEmpty()) return r; - if (r.isEmpty()) return *this; + if (empty()) return r; + if (r.empty()) return *this; if (d == r.d || PREFIX(_equal)(d->rgn, r.d->rgn)) return *this; VRegion result; result.detach(); @@ -1938,7 +1938,7 @@ VRegion VRegion::united(const VRegion &r) const VRegion VRegion::intersected(const VRect &r) const { - if (isEmpty() || r.empty()) return VRegion(); + if (empty() || r.empty()) return VRegion(); /* this is fully contained in r */ if (within(r)) return *this; @@ -1955,7 +1955,7 @@ VRegion VRegion::intersected(const VRect &r) const VRegion VRegion::intersected(const VRegion &r) const { - if (isEmpty() || r.isEmpty()) return VRegion(); + if (empty() || r.empty()) return VRegion(); VRegion result; result.detach(); @@ -1966,7 +1966,7 @@ VRegion VRegion::intersected(const VRegion &r) const VRegion VRegion::subtracted(const VRegion &r) const { - if (isEmpty() || r.isEmpty()) return *this; + if (empty() || r.empty()) return *this; if (d == r.d || PREFIX(_equal)(d->rgn, r.d->rgn)) return VRegion(); VRegion result; @@ -1977,7 +1977,7 @@ VRegion VRegion::subtracted(const VRegion &r) const int VRegion::rectCount() const { - if (isEmpty()) return 0; + if (empty()) return 0; return PREFIX(_n_rects)(d->rgn); } @@ -2008,7 +2008,7 @@ VRegion VRegion::operator-(const VRegion &r) const VRegion &VRegion::operator+=(const VRect &r) { - if (isEmpty()) return *this = r; + if (empty()) return *this = r; if (r.empty()) return *this; if (contains(r)) { @@ -2025,8 +2025,8 @@ VRegion &VRegion::operator+=(const VRect &r) VRegion &VRegion::operator+=(const VRegion &r) { - if (isEmpty()) return *this = r; - if (r.isEmpty()) return *this; + if (empty()) return *this = r; + if (r.empty()) return *this; if (d == r.d || PREFIX(_equal)(d->rgn, r.d->rgn)) return *this; detach(); @@ -2041,8 +2041,8 @@ VRegion &VRegion::operator-=(const VRegion &r) bool VRegion::operator==(const VRegion &r) const { - if (isEmpty()) return r.isEmpty(); - if (r.isEmpty()) return isEmpty(); + if (empty()) return r.empty(); + if (r.empty()) return empty(); if (d == r.d) return true; @@ -2052,7 +2052,7 @@ bool VRegion::operator==(const VRegion &r) const VRect VRegion::boundingRect() const noexcept { - if (isEmpty()) return {}; + if (empty()) return {}; return box_to_rect(&d->rgn->extents); } @@ -2064,7 +2064,7 @@ inline bool rect_intersects(const VRect &r1, const VRect &r2) bool VRegion::intersects(const VRegion &r) const { - if (isEmpty() || r.isEmpty()) return false; + if (empty() || r.empty()) return false; return PREFIX(_intersects)(d->rgn, r.d->rgn); } diff --git a/src/vector/vregion.h b/src/vector/vregion.h index b312e68be7..e341b3525a 100644 --- a/src/vector/vregion.h +++ b/src/vector/vregion.h @@ -20,7 +20,7 @@ public: ~VRegion(); VRegion & operator=(const VRegion &); VRegion & operator=(VRegion &&); - bool isEmpty() const; + bool empty() const; bool contains(const VRect &r) const; VRegion united(const VRect &r) const; VRegion united(const VRegion &r) const; diff --git a/src/vector/vrle.h b/src/vector/vrle.h index e5ecc367b3..8790497582 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -19,7 +19,7 @@ public: }; typedef void (*VRleSpanCb)(int count, const VRle::Span *spans, void *userData); - bool isEmpty() const; + bool empty() const; VRect boundingRect() const; void addSpan(const VRle::Span *span, int count); @@ -44,7 +44,7 @@ private: Add, Xor }; - bool isEmpty() const { return mSpans.empty(); } + bool empty() const { return mSpans.empty(); } void addSpan(const VRle::Span *span, int count); void updateBbox() const; VRect bbox() const; @@ -66,9 +66,9 @@ private: vcow_ptr d; }; -inline bool VRle::isEmpty() const +inline bool VRle::empty() const { - return d->isEmpty(); + return d->empty(); } inline void VRle::addSpan(const VRle::Span *span, int count) @@ -93,7 +93,7 @@ inline void VRle::operator*=(int alpha) inline VRle VRle::operator&(const VRle &o) const { - if (isEmpty() || o.isEmpty()) return VRle(); + if (empty() || o.empty()) return VRle(); VRle result; result.d.write().opIntersect(d.read(), o.d.read()); @@ -103,8 +103,8 @@ inline VRle VRle::operator&(const VRle &o) const inline VRle VRle::operator+(const VRle &o) const { - if (isEmpty()) return o; - if (o.isEmpty()) return *this; + if (empty()) return o; + if (o.empty()) return *this; VRle result; result.d.write().opGeneric(d.read(), o.d.read(), VRleData::OpCode::Add); @@ -114,8 +114,8 @@ inline VRle VRle::operator+(const VRle &o) const inline VRle VRle::operator^(const VRle &o) const { - if (isEmpty()) return o; - if (o.isEmpty()) return *this; + if (empty()) return o; + if (o.empty()) return *this; VRle result; result.d.write().opGeneric(d.read(), o.d.read(), VRleData::OpCode::Xor); @@ -125,8 +125,8 @@ inline VRle VRle::operator^(const VRle &o) const inline VRle VRle::operator-(const VRle &o) const { - if (isEmpty()) return VRle(); - if (o.isEmpty()) return *this; + if (empty()) return VRle(); + if (o.empty()) return *this; VRle result; result.d.write().opSubstract(d.read(), o.d.read()); diff --git a/test/testsgregion.cpp b/test/testsgregion.cpp index ecaae0f65a..abdc4225b2 100644 --- a/test/testsgregion.cpp +++ b/test/testsgregion.cpp @@ -42,16 +42,16 @@ TEST_F(VRegionTest, moveSemantics) { rgn1 = rect1; VRegion tmp; tmp = std::move(rgn1); - ASSERT_TRUE(rgn1.isEmpty()); + ASSERT_TRUE(rgn1.empty()); // move construction rgn1 = rect1; VRegion mvrgn = std::move(rgn1); - ASSERT_TRUE(rgn1.isEmpty()); + ASSERT_TRUE(rgn1.empty()); ASSERT_TRUE(mvrgn == rect1); } TEST_F(VRegionTest, isEmpty) { - ASSERT_TRUE(emptyRgn.isEmpty()); + ASSERT_TRUE(emptyRgn.empty()); ASSERT_TRUE(emptyRgn == VRegion()); ASSERT_TRUE(emptyRgn.rectCount() == 0); ASSERT_TRUE(emptyRgn.boundingRect() == VRect()); From 446a18a1e53475d1df499ca503d7faf95544621e Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 8 Sep 2018 13:15:28 +0900 Subject: [PATCH 248/672] lottie/test: refactor unit test suite for lottie library Change-Id: I25097f0c3c637e020c51f9f679082809d0cbdaad --- test/meson.build | 34 +++--- test/test_lottieanimation.cpp | 0 test/test_vpath.cpp | 147 +++++++++++++++++++++++ test/testftraster.cpp | 30 ----- test/{ssgtestsuite.cpp => testsuite.cpp} | 2 - 5 files changed, 166 insertions(+), 47 deletions(-) create mode 100644 test/test_lottieanimation.cpp create mode 100644 test/test_vpath.cpp delete mode 100644 test/testftraster.cpp rename test/{ssgtestsuite.cpp => testsuite.cpp} (63%) diff --git a/test/meson.build b/test/meson.build index 73887404ef..686120899f 100644 --- a/test/meson.build +++ b/test/meson.build @@ -1,20 +1,24 @@ -test_sources_util = ['ssgtestsuite.cpp', - 'testsgregion.cpp' - ] -test_sources_ftraster = ['testftraster.cpp' - ] +vector_test_sources = files('testsuite.cpp') +vector_test_sources += files('test_vpath.cpp') -test_sources =[] -test_sources += test_sources_util -test_sources += test_sources_ftraster +gtest_dep = dependency('gtest') -test_dep = dependency('gtest') +vector_testsuite = executable('vectorTestSuite', + vector_test_sources, + include_directories : inc, + dependencies : [gtest_dep, library_deps]) -ssg_utest = executable('testexe', - test_sources, - include_directories : inc, - link_with : lottie_player_lib_version, - dependencies : test_dep) +test('Vector Testsuite', vector_testsuite) -test('ssgsuite test', ssg_utest) + +animation_test_sources = files('testsuite.cpp') +animation_test_sources += files('test_lottieanimation.cpp') + +animation_testsuite = executable('animationTestSuite', + animation_test_sources, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : gtest_dep) + +test('Animation Testsuite', animation_testsuite) diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_vpath.cpp b/test/test_vpath.cpp new file mode 100644 index 0000000000..a01b4c25a6 --- /dev/null +++ b/test/test_vpath.cpp @@ -0,0 +1,147 @@ +#include +#include "vpath.h" + +class VPathTest : public ::testing::Test { +public: + void SetUp() + { + pathRect.addRect({-10, -20, 100, 100}); + pathRoundRect.addRoundRect({0, 0, 100, 100}, 5, 5); + pathRoundRectZeroCorner.addRoundRect({0, 0, 100, 100}, 0, 0); + pathRoundRectHalfCircle.addRoundRect({0, 0, 100, 100}, 60, 60); + pathOval.addOval({0,0,100,50}); + pathOvalCircle.addOval({0,0,100,100}); + pathCircle.addCircle(0, 0, 100); + pathPolygon.addPolygon(10, 50, 5, 0, 0, 0); + } + void TearDown() + { + + } +public: + VPath pathEmpty; + VPath pathRect; + VPath pathRoundRect; + VPath pathRoundRectZeroCorner; + VPath pathRoundRectHalfCircle; + VPath pathOval; + VPath pathOvalCircle; + VPath pathCircle; + VPath pathPolygon; +}; + +TEST_F(VPathTest, emptyPath) { + ASSERT_EQ(sizeof(pathEmpty), sizeof(void *)); + ASSERT_TRUE(pathEmpty.empty()); + ASSERT_FALSE(pathEmpty.segments()); + ASSERT_EQ(pathEmpty.segments() , 0); + ASSERT_EQ(pathEmpty.elements().size() , 0); + ASSERT_EQ(pathEmpty.elements().capacity() , pathEmpty.elements().size()); + ASSERT_EQ(pathEmpty.points().size() , 0); + ASSERT_EQ(pathEmpty.points().capacity() , pathEmpty.points().size()); +} + +TEST_F(VPathTest, reset) { + pathRect.reset(); + ASSERT_TRUE(pathRect.empty()); + ASSERT_EQ(pathRect.segments() , 0); + ASSERT_GE(pathRect.points().capacity(), 1); + ASSERT_GE(pathRect.elements().capacity(), 1); +} + +TEST_F(VPathTest, reserve) { + pathEmpty.reserve(10, 10); + ASSERT_EQ(pathEmpty.points().capacity(), 10); + ASSERT_GE(pathEmpty.elements().capacity(), 10); + ASSERT_EQ(pathEmpty.segments() , 0); + ASSERT_EQ(pathEmpty.points().size(), 0); + ASSERT_GE(pathEmpty.elements().size(), 0); +} + +TEST_F(VPathTest, clone) { + VPath pathClone; + pathClone.clone(pathOval); + ASSERT_EQ(pathClone.segments(), pathOval.segments()); + ASSERT_EQ(pathClone.points().size(), pathOval.points().size()); + ASSERT_NE(pathClone.points().data(), pathOval.points().data()); + ASSERT_EQ(pathClone.elements().size(), pathOval.elements().size()); + ASSERT_NE(pathClone.elements().data(), pathOval.elements().data()); +} + +TEST_F(VPathTest, copyOnWrite) { + VPath pathCopy; + pathCopy = pathOval; + ASSERT_EQ(pathCopy.segments(), pathOval.segments()); + ASSERT_EQ(pathCopy.points().size(), pathOval.points().size()); + ASSERT_EQ(pathCopy.points().data(), pathOval.points().data()); + ASSERT_EQ(pathCopy.elements().size(), pathOval.elements().size()); + ASSERT_EQ(pathCopy.elements().data(), pathOval.elements().data()); +} + +TEST_F(VPathTest, addRect) { + ASSERT_FALSE(pathRect.empty()); + ASSERT_EQ(pathRect.segments() , 1); + ASSERT_EQ(pathRect.elements().capacity() , pathRect.elements().size()); + ASSERT_EQ(pathRect.points().capacity() , pathRect.points().size()); +} + +TEST_F(VPathTest, addRect_N) { + pathEmpty.addRect({}); + ASSERT_TRUE(pathEmpty.empty()); + ASSERT_EQ(pathEmpty.segments() , 0); +} + +TEST_F(VPathTest, addRoundRect) { + ASSERT_FALSE(pathRoundRect.empty()); + ASSERT_EQ(pathRoundRect.segments() , 1); + ASSERT_EQ(pathRoundRect.elements().capacity() , pathRoundRect.elements().size()); + ASSERT_EQ(pathRoundRect.points().capacity() , pathRoundRect.points().size()); +} + +TEST_F(VPathTest, addRoundRectZeoCorner) { + ASSERT_FALSE(pathRoundRectZeroCorner.empty()); + ASSERT_EQ(pathRoundRectZeroCorner.segments() , 1); + ASSERT_EQ(pathRoundRectZeroCorner.elements().size() , pathRect.elements().size()); + ASSERT_EQ(pathRoundRectZeroCorner.elements().capacity() , pathRoundRectZeroCorner.elements().size()); + ASSERT_EQ(pathRoundRectZeroCorner.points().size() , pathRect.points().size()); + ASSERT_EQ(pathRoundRectZeroCorner.points().capacity() , pathRoundRectZeroCorner.points().size()); +} + +TEST_F(VPathTest, addRoundRectHalfCircle) { + ASSERT_FALSE(pathRoundRectHalfCircle.empty()); + ASSERT_EQ(pathRoundRectHalfCircle.segments() , 1); + ASSERT_EQ(pathRoundRectHalfCircle.elements().capacity() , pathRoundRectHalfCircle.elements().size()); + ASSERT_EQ(pathRoundRectHalfCircle.points().capacity() , pathRoundRectHalfCircle.points().size()); +} + +TEST_F(VPathTest, addOval) { + ASSERT_FALSE(pathOval.empty()); + ASSERT_EQ(pathOval.segments() , 1); + ASSERT_EQ(pathOval.elements().capacity() , pathOval.elements().size()); + ASSERT_EQ(pathOval.points().capacity() , pathOval.points().size()); +} + +TEST_F(VPathTest, addOvalCircle) { + ASSERT_FALSE(pathOvalCircle.empty()); + ASSERT_EQ(pathOvalCircle.segments() , 1); + ASSERT_EQ(pathOvalCircle.elements().size() , pathOval.elements().size()); + ASSERT_EQ(pathOvalCircle.elements().capacity() , pathOvalCircle.elements().size()); + ASSERT_EQ(pathOvalCircle.points().size() , pathOval.points().size()); + ASSERT_EQ(pathOvalCircle.points().capacity() , pathOvalCircle.points().size()); +} + +TEST_F(VPathTest, addCircle) { + ASSERT_FALSE(pathCircle.empty()); + ASSERT_EQ(pathCircle.segments() , 1); + ASSERT_EQ(pathCircle.elements().size() , pathOval.elements().size()); + ASSERT_EQ(pathCircle.elements().capacity() , pathCircle.elements().size()); + ASSERT_EQ(pathCircle.points().size() , pathOval.points().size()); + ASSERT_EQ(pathCircle.points().capacity() , pathCircle.points().size()); +} + +TEST_F(VPathTest, addPolygon) { + ASSERT_FALSE(pathPolygon.empty()); + ASSERT_EQ(pathPolygon.segments() , 1); + ASSERT_EQ(pathPolygon.elements().size() , pathPolygon.elements().capacity()); + ASSERT_EQ(pathPolygon.points().size() , pathPolygon.points().capacity()); +} diff --git a/test/testftraster.cpp b/test/testftraster.cpp deleted file mode 100644 index 4743b15257..0000000000 --- a/test/testftraster.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include "vpath.h" -#include "vraster.h" - -class VRasterTest : public ::testing::Test { -public: - void SetUp() - { - path.moveTo(VPointF(0,0)); - path.lineTo(VPointF(10,0)); - path.lineTo(VPointF(10,10)); - path.lineTo(VPointF(0,10)); - path.close(); - pathRect = VRect(0,0,10,10); - } - void TearDown() - { - - } -public: - VPath path; - VRect pathRect; -}; - - -TEST_F(VRasterTest, constructor) { - FTOutline *outline = VRaster::toFTOutline(path); - ASSERT_TRUE(outline != nullptr); - VRaster::deleteFTOutline(outline); -} diff --git a/test/ssgtestsuite.cpp b/test/testsuite.cpp similarity index 63% rename from test/ssgtestsuite.cpp rename to test/testsuite.cpp index 5fa62d3f3e..64becff4b6 100644 --- a/test/ssgtestsuite.cpp +++ b/test/testsuite.cpp @@ -1,8 +1,6 @@ #include -#include"vdebug.h" int main(int argc, char **argv) { - initialize(GuaranteedLogger(), "/tmp/", "ssglog", 1); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } From fa645a52278300f5ec743337412d474c41d7bb91 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 8 Sep 2018 13:17:12 +0900 Subject: [PATCH 249/672] lottie/vector: fine tune path api. Change-Id: Ic40da16809e5e0b32f5d23cc8b06636d37072037 --- src/vector/vpath.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index efb8a6c5bd..7d6701c282 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -155,7 +155,7 @@ void VPath::VPathData::addOval(const VRectF &rect, VPath::Direction dir) float h2 = rect.height() / 2; float h2k = h2 * PATH_KAPPA; - reserve(14, 7); // 1Move + 4Cubic + 1Close + reserve(13, 6); // 1Move + 4Cubic + 1Close if (dir == VPath::Direction::CW) { // moveto 12 o'clock. moveTo(x + w2, y); @@ -199,7 +199,7 @@ void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) float w = rect.width(); float h = rect.height(); - reserve(6, 6); // 1Move + 4Line + 1Close + reserve(5, 6); // 1Move + 4Line + 1Close if (dir == VPath::Direction::CW) { moveTo(x + w, y); lineTo(x + w, y + h); @@ -233,7 +233,7 @@ void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, if (rx > w) rx = w; if (ry > h) ry = h; - reserve(14, 7); // 1Move + 4Cubic + 1Close + reserve(17, 10); // 1Move + 4Cubic + 1Close if (dir == VPath::Direction::CW) { moveTo(x + w, y + ry / 2.f); arcTo(VRectF(x + w - rx, y + h - ry, rx, ry), 0, -90, false); From b8df19759f7039cc836ff1ce1d2f0b25aeab6560 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 10 Sep 2018 14:54:15 +0900 Subject: [PATCH 250/672] lottie/test: added new unit test cases for library. Change-Id: I1c9d61d98a1028601a36c4e6118b7109d88b2ace --- test/meson.build | 1 + test/test_lottieanimation.cpp | 34 ++++++++++++++++++++++++ test/test_lottieanimation_capi.cpp | 34 ++++++++++++++++++++++++ test/test_vpath.cpp | 42 ++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 test/test_lottieanimation_capi.cpp diff --git a/test/meson.build b/test/meson.build index 686120899f..8a83c861e2 100644 --- a/test/meson.build +++ b/test/meson.build @@ -14,6 +14,7 @@ test('Vector Testsuite', vector_testsuite) animation_test_sources = files('testsuite.cpp') animation_test_sources += files('test_lottieanimation.cpp') +animation_test_sources += files('test_lottieanimation_capi.cpp') animation_testsuite = executable('animationTestSuite', animation_test_sources, diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index e69de29bb2..ee4d8a18cf 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -0,0 +1,34 @@ +#include +#include "lottieanimation.h" + +class AnimationTest : public ::testing::Test { +public: + void SetUp() + { + animationInvalid = lottie::Animation::loadFromFile("wrong_file.json"); + std::string filePath = DEMO_DIR; + filePath +="mask.json"; + animation = lottie::Animation::loadFromFile(filePath); + + } + void TearDown() + { + + } +public: + std::unique_ptr animationInvalid; + std::unique_ptr animation; +}; + +TEST_F(AnimationTest, loadFromFile_N) { + ASSERT_FALSE(animationInvalid); +} + +TEST_F(AnimationTest, loadFromFile) { + ASSERT_TRUE(animation); + ASSERT_EQ(animation->totalFrame(), 29); + size_t width, height; + animation->size(width, height); + ASSERT_EQ(width, 500); + ASSERT_EQ(height, 500); +} diff --git a/test/test_lottieanimation_capi.cpp b/test/test_lottieanimation_capi.cpp new file mode 100644 index 0000000000..1889621bc3 --- /dev/null +++ b/test/test_lottieanimation_capi.cpp @@ -0,0 +1,34 @@ +#include +#include "lottieanimation_capi.h" + +class AnimationCApiTest : public ::testing::Test { +public: + void SetUp() + { + animationInvalid = lottie_animation_from_file("wrong_file.json"); + std::string filePath = DEMO_DIR; + filePath +="mask.json"; + animation = lottie_animation_from_file(filePath.c_str()); + + } + void TearDown() + { + if (animation) lottie_animation_destroy(animation); + } +public: + Lottie_Animation *animationInvalid; + Lottie_Animation *animation; +}; + +TEST_F(AnimationCApiTest, loadFromFile_N) { + ASSERT_FALSE(animationInvalid); +} + +TEST_F(AnimationCApiTest, loadFromFile) { + ASSERT_TRUE(animation); + ASSERT_EQ(lottie_animation_get_totalframe(animation), 29); + size_t width, height; + lottie_animation_get_size(animation, &width, &height); + ASSERT_EQ(width, 500); + ASSERT_EQ(height, 500); +} diff --git a/test/test_vpath.cpp b/test/test_vpath.cpp index a01b4c25a6..8ae7e96804 100644 --- a/test/test_vpath.cpp +++ b/test/test_vpath.cpp @@ -12,7 +12,11 @@ public: pathOval.addOval({0,0,100,50}); pathOvalCircle.addOval({0,0,100,100}); pathCircle.addCircle(0, 0, 100); + pathCircleZeroRadius.addCircle(10, 10, 0); pathPolygon.addPolygon(10, 50, 5, 0, 0, 0); + pathPolystar.addPolystar(10, 50, 100, 7, 14, 0, 0, 0); + pathPolygonZero.addPolygon(10, 50, 0, 0, 0, 0); + pathPolystarZero.addPolystar(10, 50, 100, 0, 0, 0, 0, 0); } void TearDown() { @@ -27,7 +31,11 @@ public: VPath pathOval; VPath pathOvalCircle; VPath pathCircle; + VPath pathCircleZeroRadius; VPath pathPolygon; + VPath pathPolystar; + VPath pathPolygonZero; + VPath pathPolystarZero; }; TEST_F(VPathTest, emptyPath) { @@ -139,9 +147,43 @@ TEST_F(VPathTest, addCircle) { ASSERT_EQ(pathCircle.points().capacity() , pathCircle.points().size()); } +TEST_F(VPathTest, addCircleZeroRadius) { + ASSERT_TRUE(pathCircleZeroRadius.empty()); + ASSERT_EQ(pathCircleZeroRadius.segments() , 0); +} + +TEST_F(VPathTest, length) { + ASSERT_EQ(pathRect.length(), 400); +} + +TEST_F(VPathTest, lengthEmptyPath) { + ASSERT_EQ(pathEmpty.length(), 0); +} + TEST_F(VPathTest, addPolygon) { ASSERT_FALSE(pathPolygon.empty()); ASSERT_EQ(pathPolygon.segments() , 1); ASSERT_EQ(pathPolygon.elements().size() , pathPolygon.elements().capacity()); ASSERT_EQ(pathPolygon.points().size() , pathPolygon.points().capacity()); } + +TEST_F(VPathTest, addPolygonZeroRoundness) { + ASSERT_FALSE(pathPolygonZero.empty()); + ASSERT_EQ(pathPolygonZero.segments() , 1); + ASSERT_EQ(pathPolygonZero.elements().size() , pathPolygonZero.elements().capacity()); + ASSERT_EQ(pathPolygonZero.points().size() , pathPolygonZero.points().capacity()); +} + +TEST_F(VPathTest, addPolystar) { + ASSERT_FALSE(pathPolystar.empty()); + ASSERT_EQ(pathPolystar.segments() , 1); + ASSERT_EQ(pathPolystar.elements().size() , pathPolystar.elements().capacity()); + ASSERT_EQ(pathPolystar.points().size() , pathPolystar.points().capacity()); +} + +TEST_F(VPathTest, addPolystarZeroRoundness) { + ASSERT_FALSE(pathPolystarZero.empty()); + ASSERT_EQ(pathPolystarZero.segments() , 1); + ASSERT_EQ(pathPolystarZero.elements().size() , pathPolystarZero.elements().capacity()); + ASSERT_EQ(pathPolystarZero.points().size() , pathPolystarZero.points().capacity()); +} From 10e6788bb24a54d621adc87808ae663f2d2958e6 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 10 Sep 2018 20:57:28 +0900 Subject: [PATCH 251/672] capi: export one missing api. Change-Id: Iba8d035febdcbbee852aa9d946ae3202ae5433ad --- src/binding/c/lottieanimation_capi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index cd500daa4c..a619389dbe 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -27,7 +27,7 @@ LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *file) } } -Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key) +LOT_EXPORT Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key) { if (auto animation = Animation::loadFromData(data, key) ) { Lottie_Animation_S *handle = new Lottie_Animation_S(); From f4f23829645880e7cea8bbcc167a64a7ee223be8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 11 Sep 2018 13:18:04 +0900 Subject: [PATCH 252/672] lottie/optimization: efficient member packing in the VDrawable object. Change-Id: I545f9a33d1cae329bc9ee140c213e07697b8cccf --- src/lottie/lottieanimation.cpp | 4 +- src/lottie/lottieitem.cpp | 89 ++++++++++++++++++---------------- src/lottie/lottieitem.h | 2 +- src/vector/vdrawable.h | 14 +++--- src/vector/vglobal.h | 7 ++- 5 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 6d900edb17..0ccb41aa23 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -55,7 +55,9 @@ VSize AnimationImpl::size() const const std::vector &AnimationImpl::renderList(size_t frameNo, const VSize &size) { - update(frameNo, size); + if (update(frameNo, size)) { + mCompItem->buildRenderList(); + } return mCompItem->renderList(); } diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 80e655ba60..e4ad40cb63 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -83,7 +83,6 @@ bool LOTCompItem::update(int frameNo) m.scale(scale, scale).translate(tx, ty); mRootLayer->update(frameNo, m, 1.0); - buildRenderList(); mCurFrameNo = frameNo; mUpdateViewBox = false; return true; @@ -98,7 +97,7 @@ void LOTCompItem::buildRenderList() for (auto &i : mDrawableList) { LOTDrawable *lotDrawable = static_cast(i); lotDrawable->sync(); - mRenderList.push_back(&lotDrawable->mCNode); + mRenderList.push_back(lotDrawable->mCNode.get()); } } @@ -115,6 +114,8 @@ bool LOTCompItem::render(const lottie::Surface &surface) /* schedule all preprocess task for this frame at once. */ + mDrawableList.clear(); + mRootLayer->renderList(mDrawableList); for (auto &e : mDrawableList) { e->preprocess(); } @@ -990,7 +991,9 @@ void LOTRepeaterItem::renderList(std::vector &/*list*/) {} void LOTDrawable::sync() { - mCNode.mFlag = ChangeFlagNone; + if (!mCNode) mCNode = std::make_unique(); + + mCNode->mFlag = ChangeFlagNone; if (mFlag & DirtyState::None) return; if (mFlag & DirtyState::Path) { @@ -998,89 +1001,89 @@ void LOTDrawable::sync() const std::vector & pts = mPath.points(); const float *ptPtr = reinterpret_cast(pts.data()); const char * elmPtr = reinterpret_cast(elm.data()); - mCNode.mPath.elmPtr = elmPtr; - mCNode.mPath.elmCount = elm.size(); - mCNode.mPath.ptPtr = ptPtr; - mCNode.mPath.ptCount = 2 * pts.size(); - mCNode.mFlag |= ChangeFlagPath; + mCNode->mPath.elmPtr = elmPtr; + mCNode->mPath.elmCount = elm.size(); + mCNode->mPath.ptPtr = ptPtr; + mCNode->mPath.ptCount = 2 * pts.size(); + mCNode->mFlag |= ChangeFlagPath; } if (mStroke.enable) { - mCNode.mStroke.width = mStroke.width; - mCNode.mStroke.meterLimit = mStroke.meterLimit; - mCNode.mStroke.enable = 1; + mCNode->mStroke.width = mStroke.width; + mCNode->mStroke.meterLimit = mStroke.meterLimit; + mCNode->mStroke.enable = 1; switch (mFillRule) { case FillRule::EvenOdd: - mCNode.mFillRule = LOTFillRule::FillEvenOdd; + mCNode->mFillRule = LOTFillRule::FillEvenOdd; break; default: - mCNode.mFillRule = LOTFillRule::FillWinding; + mCNode->mFillRule = LOTFillRule::FillWinding; break; } switch (mStroke.cap) { case CapStyle::Flat: - mCNode.mStroke.cap = LOTCapStyle::CapFlat; + mCNode->mStroke.cap = LOTCapStyle::CapFlat; break; case CapStyle::Square: - mCNode.mStroke.cap = LOTCapStyle::CapSquare; + mCNode->mStroke.cap = LOTCapStyle::CapSquare; break; case CapStyle::Round: - mCNode.mStroke.cap = LOTCapStyle::CapRound; + mCNode->mStroke.cap = LOTCapStyle::CapRound; break; default: - mCNode.mStroke.cap = LOTCapStyle::CapFlat; + mCNode->mStroke.cap = LOTCapStyle::CapFlat; break; } switch (mStroke.join) { case JoinStyle::Miter: - mCNode.mStroke.join = LOTJoinStyle::JoinMiter; + mCNode->mStroke.join = LOTJoinStyle::JoinMiter; break; case JoinStyle::Bevel: - mCNode.mStroke.join = LOTJoinStyle::JoinBevel; + mCNode->mStroke.join = LOTJoinStyle::JoinBevel; break; case JoinStyle::Round: - mCNode.mStroke.join = LOTJoinStyle::JoinRound; + mCNode->mStroke.join = LOTJoinStyle::JoinRound; break; default: - mCNode.mStroke.join = LOTJoinStyle::JoinMiter; + mCNode->mStroke.join = LOTJoinStyle::JoinMiter; break; } - mCNode.mStroke.dashArray = mStroke.mDash.data(); - mCNode.mStroke.dashArraySize = mStroke.mDash.size(); + mCNode->mStroke.dashArray = mStroke.mDash.data(); + mCNode->mStroke.dashArraySize = mStroke.mDash.size(); } else { - mCNode.mStroke.enable = 0; + mCNode->mStroke.enable = 0; } switch (mBrush.type()) { case VBrush::Type::Solid: - mCNode.mType = LOTBrushType::BrushSolid; - mCNode.mColor.r = mBrush.mColor.r; - mCNode.mColor.g = mBrush.mColor.g; - mCNode.mColor.b = mBrush.mColor.b; - mCNode.mColor.a = mBrush.mColor.a; + mCNode->mType = LOTBrushType::BrushSolid; + mCNode->mColor.r = mBrush.mColor.r; + mCNode->mColor.g = mBrush.mColor.g; + mCNode->mColor.b = mBrush.mColor.b; + mCNode->mColor.a = mBrush.mColor.a; break; case VBrush::Type::LinearGradient: - mCNode.mType = LOTBrushType::BrushGradient; - mCNode.mGradient.type = LOTGradientType::GradientLinear; - mCNode.mGradient.start.x = mBrush.mGradient->linear.x1; - mCNode.mGradient.start.y = mBrush.mGradient->linear.y1; - mCNode.mGradient.end.x = mBrush.mGradient->linear.x2; - mCNode.mGradient.end.y = mBrush.mGradient->linear.y2; + mCNode->mType = LOTBrushType::BrushGradient; + mCNode->mGradient.type = LOTGradientType::GradientLinear; + mCNode->mGradient.start.x = mBrush.mGradient->linear.x1; + mCNode->mGradient.start.y = mBrush.mGradient->linear.y1; + mCNode->mGradient.end.x = mBrush.mGradient->linear.x2; + mCNode->mGradient.end.y = mBrush.mGradient->linear.y2; break; case VBrush::Type::RadialGradient: - mCNode.mType = LOTBrushType::BrushGradient; - mCNode.mGradient.type = LOTGradientType::GradientRadial; - mCNode.mGradient.center.x = mBrush.mGradient->radial.cx; - mCNode.mGradient.center.y = mBrush.mGradient->radial.cy; - mCNode.mGradient.focal.x = mBrush.mGradient->radial.fx; - mCNode.mGradient.focal.y = mBrush.mGradient->radial.fy; - mCNode.mGradient.cradius = mBrush.mGradient->radial.cradius; - mCNode.mGradient.fradius = mBrush.mGradient->radial.fradius; + mCNode->mType = LOTBrushType::BrushGradient; + mCNode->mGradient.type = LOTGradientType::GradientRadial; + mCNode->mGradient.center.x = mBrush.mGradient->radial.cx; + mCNode->mGradient.center.y = mBrush.mGradient->radial.cy; + mCNode->mGradient.focal.x = mBrush.mGradient->radial.fx; + mCNode->mGradient.focal.y = mBrush.mGradient->radial.fy; + mCNode->mGradient.cradius = mBrush.mGradient->radial.cradius; + mCNode->mGradient.fradius = mBrush.mGradient->radial.fradius; break; default: break; diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 3ee7e0a5e2..364da41731 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -159,7 +159,7 @@ class LOTDrawable : public VDrawable public: void sync(); public: - LOTNode mCNode; + std::unique_ptr mCNode; }; class LOTPathDataItem; diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index e43ed77504..7f2ac523e7 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -14,7 +14,7 @@ public: Brush = 0x00000100, All = (None | Path | Stroke | Brush) }; - enum class Type { + enum class Type : unsigned char{ Fill, Stroke, }; @@ -31,21 +31,21 @@ public: public: struct StrokeInfo { - bool enable{false}; + std::vector mDash; float width{0.0}; + float meterLimit{10}; + bool enable{false}; CapStyle cap{CapStyle::Flat}; JoinStyle join{JoinStyle::Bevel}; - float meterLimit{10}; - std::vector mDash; }; - DirtyFlag mFlag{DirtyState::All}; - VDrawable::Type mType{Type::Fill}; VBrush mBrush; VPath mPath; - FillRule mFillRule{FillRule::Winding}; std::future mRleTask; VRle mRle; StrokeInfo mStroke; + DirtyFlag mFlag{DirtyState::All}; + FillRule mFillRule{FillRule::Winding}; + VDrawable::Type mType{Type::Fill}; }; #endif // VDRAWABLE_H diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index f23719b364..d9cd17c3fc 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -266,10 +266,9 @@ public: uchar b; }; -enum class FillRule { EvenOdd, Winding }; - -enum class JoinStyle { Miter, Bevel, Round }; -enum class CapStyle { Flat, Square, Round }; +enum class FillRule: unsigned char { EvenOdd, Winding }; +enum class JoinStyle: unsigned char { Miter, Bevel, Round }; +enum class CapStyle: unsigned char { Flat, Square, Round }; #ifndef V_CONSTRUCTOR_FUNCTION #define V_CONSTRUCTOR_FUNCTION0(AFUNC) \ From ad517377ce703dd624dd7b3e4469378cc10b02b1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 11 Sep 2018 15:53:59 +0900 Subject: [PATCH 253/672] lottie: take a copy of the data before parsing. Change-Id: Ic25eea21093d8b533462ffd4c46e86d87f7c6f35 --- src/lottie/lottieloader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index bdbbc71d53..eb302980e0 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -73,7 +73,7 @@ bool LottieLoader::loadFromData(const char *jsonData, const char *key) mModel = fileCache.find(std::string(keyString)); if (mModel) return true; - LottieParser parser(const_cast(jsonData)); + LottieParser parser(const_cast(std::string(jsonData).c_str())); mModel = parser.model(); fileCache.add(keyString, mModel); From 6377407e38c99948c1df42bae4960cc967b2ee8f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Sep 2018 10:09:44 +0900 Subject: [PATCH 254/672] lottie: update the loadfromData() api signature. Change-Id: I801f39d06ce67d30be37dc14733ad99ae3a54da2 --- example/lottieview.cpp | 4 ++-- example/lottieview.h | 2 +- inc/lottieanimation.h | 2 +- src/lottie/lottieanimation.cpp | 6 +++--- src/lottie/lottieloader.cpp | 9 ++++----- src/lottie/lottieloader.h | 2 +- 6 files changed, 12 insertions(+), 13 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 5fc234d688..bc7eb40c6f 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -241,13 +241,13 @@ void LottieView::setFilePath(const char *filePath) } } -void LottieView::loadFromData(const char *jsonData, const char *key) +void LottieView::loadFromData(const std::string &jsonData, const std::string &key) { if (mPlayer = Animation::loadFromData(jsonData, key)) { mFrameRate = mPlayer->frameRate(); mTotalFrame = mPlayer->totalFrame(); } else { - printf("load failed from data key : %s\n", key); + printf("load failed from data key : %s\n", key.c_str()); } } diff --git a/example/lottieview.h b/example/lottieview.h index 08e98cf943..deae8e5494 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -30,7 +30,7 @@ public: void setSize(int w, int h); void setPos(int x, int y); void setFilePath(const char *filePath); - void loadFromData(const char *jsonData, const char *key); + void loadFromData(const std::string &jsonData, const std::string &key); void show(); void hide(); void loop(bool loop); diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index b75019d578..c2a4e26616 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -109,7 +109,7 @@ public: * lottie resource represented by JSON string data. */ static std::unique_ptr - loadFromData(const char *jsonData, const char *key); + loadFromData(std::string jsonData, const std::string &key); /** * @brief Returns default framerate of the lottie resource. diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 0ccb41aa23..07dfcb06bb 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -190,15 +190,15 @@ static RenderTaskScheduler render_scheduler; * @param path add the details */ std::unique_ptr -Animation::loadFromData(const char *jsonData, const char *key) +Animation::loadFromData(std::string jsonData, const std::string &key) { - if (!jsonData) { + if (jsonData.empty()) { vWarning << "jason data is empty"; return nullptr; } LottieLoader loader; - if (loader.loadFromData(jsonData, key)) { + if (loader.loadFromData(std::move(jsonData), key)) { auto animation = std::make_unique(); animation->d->init(loader.model()); return animation; diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index eb302980e0..6d2f4ccbdd 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -65,17 +65,16 @@ bool LottieLoader::load(const std::string &path) return true; } -bool LottieLoader::loadFromData(const char *jsonData, const char *key) +bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key) { LottieFileCache &fileCache = LottieFileCache::get(); - std::string keyString(key); - mModel = fileCache.find(std::string(keyString)); + mModel = fileCache.find(key); if (mModel) return true; - LottieParser parser(const_cast(std::string(jsonData).c_str())); + LottieParser parser(const_cast(jsonData.c_str())); mModel = parser.model(); - fileCache.add(keyString, mModel); + fileCache.add(key, mModel); return true; } diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index da6bb3595d..42b8e53f0b 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -9,7 +9,7 @@ class LottieLoader { public: bool load(const std::string &filePath); - bool loadFromData(const char *jsonData, const char *key); + bool loadFromData(std::string &&jsonData, const std::string &key); std::shared_ptr model(); private: std::shared_ptr mModel; From 8fa45756abf28a4e05ecbbcccda41a87b938582d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Sep 2018 11:34:36 +0900 Subject: [PATCH 255/672] lottie/parser: construct interpolator from correct argument. This is the most annoying bug because of passing argument in wrong order to the interpolaor constructor. Change-Id: Idfc307186bc1dd7d6d3849d29985c3e6f493d9d0 --- src/lottie/lottieparser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 21d4503dc6..93e5b954bc 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1767,7 +1767,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) keyframe.mInterpolator = search->second; } else { keyframe.mInterpolator = std::make_shared( - VInterpolator(inTangent, outTangent)); + VInterpolator(outTangent, inTangent)); compRef->mInterpolatorCache[interpolatorKey] = keyframe.mInterpolator; } From 4dff9ab5a56b24a32fa9fe9dca4202d0d43297ca Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Sep 2018 11:49:12 +0900 Subject: [PATCH 256/672] lottie/vector : add a example to test the vector module. Change-Id: I511b2b520b51ec8b9bf278b67a5ca94784af4c76 --- example/meson.build | 5 +++++ example/vectortest.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 example/vectortest.cpp diff --git a/example/meson.build b/example/meson.build index 72fb94258c..44a0f43c09 100644 --- a/example/meson.build +++ b/example/meson.build @@ -41,3 +41,8 @@ executable('lottieviewer', include_directories : inc, link_with : lottie_player_lib, dependencies : demo_dep) + +executable('vectorTest', + 'vectortest.cpp', + include_directories : inc, + dependencies : [library_deps]) diff --git a/example/vectortest.cpp b/example/vectortest.cpp new file mode 100644 index 0000000000..8e34f6783b --- /dev/null +++ b/example/vectortest.cpp @@ -0,0 +1,13 @@ +#include + +#include "vinterpolator.h" + +int main() +{ + VInterpolator ip({0.667, 1}, {0.333 , 0}); + for (float i = 0.0 ; i < 1.0 ; i+=0.05) { + std::cout< Date: Wed, 12 Sep 2018 15:59:39 +0900 Subject: [PATCH 257/672] lottie/parser: update the lottie tree dump method. Change-Id: Ie126e11a20493517df69fdd2a03a091bc802a733 --- src/lottie/lottieparser.cpp | 114 ++++++++++++++++++++---------------- src/vector/vdebug.cpp | 2 +- 2 files changed, 63 insertions(+), 53 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 93e5b954bc..5aa61586cf 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1,7 +1,10 @@ #include "lottieparser.h" -#define DEBUG_PARSER + +//#define DEBUG_PARSER + +#define DEBUG_PRINT_TREE // This parser implements JSON token-by-token parsing with an API that is // more direct; we don't have to create handler object and @@ -1856,97 +1859,104 @@ void LottieParserImpl::parseProperty(LOTAnimatable &obj) } } -#ifdef DEBUG_PARSER +#ifdef DEBUG_PRINT_TREE class LOTDataInspector { public: - void visit(LOTCompositionData *obj) + void visit(LOTCompositionData *obj, std::string level) { - vDebug << "[COMP_START:: static:" << obj->isStatic() - << " v:" << obj->mVersion << " [{ stFm endFm fmRate } { " - << obj->mStartFrame << " " << obj->mEndFrame << " }]\n"; - visit(obj->mRootLayer.get()); - vDebug << "[COMP End ]\n"; + vDebug <<" { " + <isStatic() + << ", v: " << obj->mVersion + << ", stFm: "<< obj->startFrame() + << ", endFm: "<< obj->endFrame()<<"\n"; + level.append("\t"); + visit(obj->mRootLayer.get(), level); + level.erase(level.end() -1 , level.end()); + vDebug << " } " <mLayerType) - << " id:" << obj->mId << " Pid:" << obj->mParentId - << " static:" << obj->isStatic() - << "[{ stFm endFm stTm tmStrch } { " << obj->mInFrame << " " - << obj->mOutFrame << " " << obj->mStartFrame << " " - << obj->mTimeStreatch << " }]"; - - visitChildren(static_cast(obj)); - - vDebug << "[LAYER_END:: type:" - << layerType(obj->mLayerType).c_str() - << " id:" << obj->mId << "\n"; + vDebug << level + <<"{ " + <mLayerType) + << ", id:" << obj->mId << " Pid:" << obj->mParentId + << ", a:" << !obj->isStatic() + << ", inFm:" << obj->mInFrame + << ", outFm:" << obj->mOutFrame + <<"\n"; + visitChildren(static_cast(obj), level); + vDebug << level + <<"} " + <mLayerType).c_str() + << ", id: " << obj->mId << "\n"; } - void visitChildren(LOTGroupData *obj) + void visitChildren(LOTGroupData *obj, std::string level) { - for (const auto& child : obj->mChildren) visit(child.get()); + level.append("\t"); + for (const auto& child : obj->mChildren) visit(child.get(), level); } - void visit(LOTData *obj) { + void visit(LOTData *obj, std::string level) { switch (obj->mType) { case LOTData::Type::Repeater: { - vDebug << "[REPEATER_START]"; - visitChildren(static_cast(obj)); - vDebug << "[REPEATER_END]"; + vDebug << level<<"{ Repeater:"; + visitChildren(static_cast(obj), level); + vDebug << level<<"} Repeater"; break; } case LOTData::Type::ShapeGroup: { - vDebug << "[GROUP_START:: static:" << obj->isStatic() << "]"; - visitChildren(static_cast(obj)); - vDebug << "[GROUP_END]"; + vDebug << level <<"{ ShapeGroup: a:" << !obj->isStatic(); + visitChildren(static_cast(obj), level); + vDebug << level <<"} ShapeGroup"; break; } case LOTData::Type::Layer:{ - visit(static_cast(obj)); + visit(static_cast(obj), level); break; } case LOTData::Type::Trim:{ - vDebug << "[TRIM: static: " << obj->isStatic() << " ]"; + vDebug << level<<"{ Trim: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Rect:{ - vDebug << "[RECT: static:" << obj->isStatic() << "]"; + vDebug <isStatic() << " }"; break; } case LOTData::Type::Ellipse:{ - vDebug << "[RECT: static:" << obj->isStatic() << "]"; + vDebug << level<<"{ Ellipse: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Shape:{ - vDebug << "[SHAPE: static:" << obj->isStatic() << "]"; + vDebug << level<<"{ Shape: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Polystar:{ - vDebug << "[POLYSTAR: static:" << obj->isStatic() << "]"; + vDebug << level<<"{ Polystar: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Transform:{ - vDebug << "[TRANSFORM: static: " << obj->isStatic() << " ]"; + vDebug << level<<"{ Transform: a: " << !obj->isStatic() << " }"; break; } case LOTData::Type::Stroke:{ - vDebug << "[SHAPE: static:" << obj->isStatic() << "]"; + vDebug << level<<"{ Stroke: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::GStroke:{ - vDebug << "[TRANSFORM: static: " << obj->isStatic() << " ]"; + vDebug << level<<"{ GStroke: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Fill:{ - vDebug << "[FILL: static:" << obj->isStatic() << "]"; + vDebug << level<<"{ Fill: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::GFill:{ auto f = static_cast(obj); - vDebug << "[GFILL: static:" << f->isStatic() - << " ty:" << f->mGradientType << " s:" << f->mStartPoint.value(0) - << " e:" << f->mEndPoint.value(0) << "]"; + vDebug << level<<"{ GFill: a:" << !f->isStatic() + << ", ty:" << f->mGradientType << ", s:" << f->mStartPoint.value(0) + << ", e:" << f->mEndPoint.value(0) << " }"; break; } default: @@ -1958,25 +1968,25 @@ public: { switch (type) { case LayerType::Precomp: - return "Precomp"; + return "Layer::Precomp"; break; case LayerType::Null: - return "Null"; + return "Layer::Null"; break; case LayerType::Shape: - return "Shape"; + return "Layer::Shape"; break; case LayerType::Solid: - return "Solid"; + return "Layer::Solid"; break; case LayerType::Image: - return "Image"; + return "Layer::Image"; break; case LayerType::Text: - return "Text"; + return "Layer::Text"; break; default: - return "Unknow"; + return "Layer::Unknown"; break; } } @@ -2000,9 +2010,9 @@ std::shared_ptr LottieParser::model() model->mRoot = d->composition(); model->mRoot->processRepeaterObjects(); -#ifdef DEBUG_PARSER +#ifdef DEBUG_PRINT_TREE LOTDataInspector inspector; - inspector.visit(model->mRoot.get()); + inspector.visit(model->mRoot.get(),""); #endif return model; diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 2d8b3a8a43..faa74b1c53 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -104,7 +104,7 @@ VDebug::VDebug(LogLevel level, char const* file, char const* function, encode(line); encode(level); if (level == LogLevel::INFO) { - m_logAll = true; + m_logAll = false; } else { m_logAll = true; } From 02cb018c75085481f9a19a392f3b5522d775dde5 Mon Sep 17 00:00:00 2001 From: Youngbok Shin Date: Wed, 12 Sep 2018 16:48:39 +0900 Subject: [PATCH 258/672] lottie/parser: fix code indentations and a duplicated code Change-Id: I01280529f6ada36ded67a31d24833049762f52ca --- src/lottie/lottieparser.cpp | 60 +++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 5aa61586cf..6afbee090f 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -746,9 +746,7 @@ std::shared_ptr LottieParserImpl::parseLayer() parenting and expressions.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mId = GetInt(); - } else if (0 == - strcmp(key, - "parent")) { /*Layer Parent. Uses "ind" of parent.*/ + } else if (0 == strcmp(key, "parent")) { /*Layer Parent. Uses "ind" of parent.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mParentId = GetInt(); } else if (0 == strcmp(key, "refId")) { /*preComp Layer reference id*/ @@ -789,8 +787,6 @@ std::shared_ptr LottieParserImpl::parseLayer() layer->mSolidLayer.mColor = toColor(GetString()); } else if (0 == strcmp(key, "tt")) { layer->mMatteType = getMatteType(); - } else if (0 == strcmp(key, "tt")) { - layer->mMatteType = getMatteType(); } else if (0 == strcmp(key, "hasMask")) { layer->mHasMask = GetBool(); } else if (0 == strcmp(key, "masksProperties")) { @@ -1865,31 +1861,31 @@ class LOTDataInspector { public: void visit(LOTCompositionData *obj, std::string level) { - vDebug <<" { " - <isStatic() + vDebug << " { " + << level + << "Composition:: a: " << !obj->isStatic() << ", v: " << obj->mVersion - << ", stFm: "<< obj->startFrame() - << ", endFm: "<< obj->endFrame()<<"\n"; + << ", stFm: " << obj->startFrame() + << ", endFm: " << obj->endFrame()<< "\n"; level.append("\t"); visit(obj->mRootLayer.get(), level); - level.erase(level.end() -1 , level.end()); - vDebug << " } " <mLayerType) + << "{ " + << layerType(obj->mLayerType) << ", id:" << obj->mId << " Pid:" << obj->mParentId << ", a:" << !obj->isStatic() << ", inFm:" << obj->mInFrame << ", outFm:" << obj->mOutFrame - <<"\n"; + << "\n"; visitChildren(static_cast(obj), level); vDebug << level - <<"} " - <mLayerType).c_str() + << "} " + << layerType(obj->mLayerType).c_str() << ", id: " << obj->mId << "\n"; } void visitChildren(LOTGroupData *obj, std::string level) @@ -1901,15 +1897,15 @@ public: void visit(LOTData *obj, std::string level) { switch (obj->mType) { case LOTData::Type::Repeater: { - vDebug << level<<"{ Repeater:"; + vDebug << level << "{ Repeater:"; visitChildren(static_cast(obj), level); - vDebug << level<<"} Repeater"; + vDebug << level << "} Repeater"; break; } case LOTData::Type::ShapeGroup: { - vDebug << level <<"{ ShapeGroup: a:" << !obj->isStatic(); + vDebug << level << "{ ShapeGroup: a:" << !obj->isStatic(); visitChildren(static_cast(obj), level); - vDebug << level <<"} ShapeGroup"; + vDebug << level << "} ShapeGroup"; break; } case LOTData::Type::Layer:{ @@ -1917,44 +1913,44 @@ public: break; } case LOTData::Type::Trim:{ - vDebug << level<<"{ Trim: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Trim: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Rect:{ - vDebug <isStatic() << " }"; + vDebug << level << "{ Rect: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Ellipse:{ - vDebug << level<<"{ Ellipse: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Ellipse: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Shape:{ - vDebug << level<<"{ Shape: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Shape: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Polystar:{ - vDebug << level<<"{ Polystar: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Polystar: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Transform:{ - vDebug << level<<"{ Transform: a: " << !obj->isStatic() << " }"; + vDebug << level << "{ Transform: a: " << !obj->isStatic() << " }"; break; } case LOTData::Type::Stroke:{ - vDebug << level<<"{ Stroke: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Stroke: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::GStroke:{ - vDebug << level<<"{ GStroke: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ GStroke: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Fill:{ - vDebug << level<<"{ Fill: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Fill: a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::GFill:{ auto f = static_cast(obj); - vDebug << level<<"{ GFill: a:" << !f->isStatic() + vDebug << level << "{ GFill: a:" << !f->isStatic() << ", ty:" << f->mGradientType << ", s:" << f->mStartPoint.value(0) << ", e:" << f->mEndPoint.value(0) << " }"; break; @@ -2012,7 +2008,7 @@ std::shared_ptr LottieParser::model() #ifdef DEBUG_PRINT_TREE LOTDataInspector inspector; - inspector.visit(model->mRoot.get(),""); + inspector.visit(model->mRoot.get(), ""); #endif return model; From d0dac9322916c54d6db81b4a67c781e18cb39724 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 13 Sep 2018 10:33:50 +0900 Subject: [PATCH 259/672] lottie: add more info to tree dump. Change-Id: I8565484b16dfb703586af2ba3b893c0c90298107 --- src/lottie/lottieparser.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 6afbee090f..59b76f2364 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1879,6 +1879,8 @@ public: << layerType(obj->mLayerType) << ", id:" << obj->mId << " Pid:" << obj->mParentId << ", a:" << !obj->isStatic() + << ", "<mMatteType) + << ", mask:"<hasMask() << ", inFm:" << obj->mInFrame << ", outFm:" << obj->mOutFrame << "\n"; @@ -1892,6 +1894,8 @@ public: { level.append("\t"); for (const auto& child : obj->mChildren) visit(child.get(), level); + if (obj->mTransform) + visit(obj->mTransform.get(), level); } void visit(LOTData *obj, std::string level) { @@ -1960,6 +1964,29 @@ public: } } + std::string matteType(MatteType type) + { + switch (type) { + case MatteType::None: + return "Matte::None"; + break; + case MatteType::Alpha: + return "Matte::Alpha"; + break; + case MatteType::AlphaInv: + return "Matte::AlphaInv"; + break; + case MatteType::Luma: + return "Matte::Luma"; + break; + case MatteType::LumaInv: + return "Matte::LumaInv"; + break; + default: + return "Matte::Unknown"; + break; + } + } std::string layerType(LayerType type) { switch (type) { From cf21f89ef079ef996c86ab279d9ad1fe64eb5c12 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 13 Sep 2018 18:08:21 +0900 Subject: [PATCH 260/672] lottie/parser: Fix crash issue when interpolation string is not present in lottie file. For some version of bodymovin file interpolation string is not part of the keyframe in those case create one and add it to the cache. Change-Id: I5853bd7a6f46140d16191c2b79622cfa1f6fb074 --- example/resource/loading_rectangles.json | 1 + src/lottie/lottieparser.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 example/resource/loading_rectangles.json diff --git a/example/resource/loading_rectangles.json b/example/resource/loading_rectangles.json new file mode 100644 index 0000000000..eeb223580c --- /dev/null +++ b/example/resource/loading_rectangles.json @@ -0,0 +1 @@ +{"ip":0,"fr":60,"v":"5.1.20","assets":[],"layers":[{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":16,"hix":10,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[35],"e":[42],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[42],"e":[42],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[42],"e":[35],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173,"s":[35],"e":[35],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":179}]},"y":{"a":0,"k":12}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":15,"hix":14,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[34.961],"e":[42],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[42],"e":[42],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[42],"e":[35],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"y":{"a":0,"k":20.509}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":14,"hix":3,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[35],"e":[42],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[42],"e":[42],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[42],"e":[35],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"y":{"a":0,"k":30}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":13,"hix":6,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[35],"e":[42],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[42],"e":[42],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[42],"e":[35],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"y":{"a":0,"k":39}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":20,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":153,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":173}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":12,"hix":9,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[26],"e":[26],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[26],"e":[33],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[33],"e":[33],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[33],"e":[26],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"y":{"a":0,"k":12}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":11,"hix":13,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[26],"e":[26],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[26],"e":[33],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[33],"e":[33],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[33],"e":[26],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"y":{"a":0,"k":21}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":10,"hix":4,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[26],"e":[26],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[26],"e":[33],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[33],"e":[33],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[33],"e":[26],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"y":{"a":0,"k":30}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":9,"hix":5,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[26],"e":[26],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[26],"e":[33],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[33],"e":[33],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[33],"e":[26],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"y":{"a":0,"k":39}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":21,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":41,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":132,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":152}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":8,"hix":16,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[17],"e":[17],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[17],"e":[24],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[24],"e":[24],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[24],"e":[17],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"y":{"a":0,"k":12}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":7,"hix":12,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[17],"e":[17],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[17],"e":[24],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[24],"e":[24],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[24],"e":[17],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"y":{"a":0,"k":21}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":6,"hix":8,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[17],"e":[17],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[17],"e":[24],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[24],"e":[24],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[24],"e":[17],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"y":{"a":0,"k":30}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":5,"hix":1,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[17],"e":[17],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[17],"e":[24],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[24],"e":[24],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[24],"e":[17],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"y":{"a":0,"k":39}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":43,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":63,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":111,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":131}]},"s":{"a":0,"k":[100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":4,"hix":11,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[8],"e":[8],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[8],"e":[15],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[15],"e":[15],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[15],"e":[8],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"y":{"a":0,"k":12}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":3,"hix":15,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[8],"e":[8],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[8],"e":[15],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[15],"e":[15],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[15],"e":[8],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"y":{"a":0,"k":21}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":2,"hix":2,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[8],"e":[8],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[8],"e":[15],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[15],"e":[15],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[15],"e":[8],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"y":{"a":0,"k":30}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179},{"ty":4,"nm":"Rectangle","ip":0,"st":0,"ind":1,"hix":7,"ks":{"o":{"a":0,"k":100},"or":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[3.5,3.5,0]},"p":{"s":true,"x":{"a":1,"k":[{"t":0,"s":[8],"e":[8],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[8],"e":[15],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[15],"e":[15],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[15],"e":[8],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"y":{"a":0,"k":39}},"rx":{"a":0,"k":0},"ry":{"a":0,"k":0},"rz":{"a":1,"k":[{"t":0,"s":[0],"e":[0],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":64,"s":[0],"e":[89.95437383553926],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":84,"s":[89.95437383553926],"e":[89.95437383553926],"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"t":90,"s":[89.95437383553926],"e":[0],"i":{"x":[0.165],"y":[1]},"o":{"x":[0.075],"y":[0.82]}},{"t":110}]},"s":{"a":0,"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","s":{"a":0,"k":[7,7]},"r":{"a":0,"k":0},"p":{"a":0,"k":[103.5,203.5]}},{"ty":"st","o":{"a":0,"k":0},"w":{"a":0,"k":0},"c":{"a":0,"k":[0,0,0,0]},"lc":3,"lj":1},{"ty":"fl","o":{"a":0,"k":100},"r":2,"c":{"a":0,"k":[0.07450980392156863,0.6941176470588235,0.8235294117647058,1]}},{"ty":"tr","o":{"a":0,"k":100},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[-100,-200]},"r":{"a":0,"k":0}}]}],"op":179}],"op":179,"w":50,"h":50} \ No newline at end of file diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 59b76f2364..5f2909322e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1714,6 +1714,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) VPointF outTangent; const char * interpolatorKey = nullptr; bool hold = false; + bool lastFrame = true; while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "i")) { inTangent = parseInperpolatorPoint(); @@ -1734,6 +1735,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) } else if (0 == strcmp(key, "t")) { keyframe.mStartFrame = GetDouble(); } else if (parseKeyFrameValue(key, keyframe.mValue)) { + lastFrame = false; continue; } else if (0 == strcmp(key, "h")) { hold = GetInt(); @@ -1759,6 +1761,13 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) keyframe.mEndFrame = keyframe.mStartFrame; } + char charArray[20]; + if (!(lastFrame || interpolatorKey)) { + snprintf(charArray, 20, "%.2f_%.2f_%.2f_%.2f", + inTangent.x(), inTangent.y(), outTangent.x(), outTangent.y()); + interpolatorKey = charArray; + } + // Try to find the interpolator from cache if (interpolatorKey) { auto search = compRef->mInterpolatorCache.find(interpolatorKey); From 7ff9061eaeac6bcfbdf91b5b63898c6ac9c077a6 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 13 Sep 2018 14:58:54 +0900 Subject: [PATCH 261/672] lottie/resource: added few more resource from internet. Change-Id: I7a22d6b9beb4741fb047f9c7556cea3a38bc21d9 --- example/resource/360º_degree.json | 1 + example/resource/file_transfer.json | 1 + example/resource/fingerprint_success.json | 1 + example/resource/imprint.json | 1 + example/resource/it's_lunch_time!.json | 1 + example/resource/maps.json | 1 + example/resource/settings.json | 1 + example/resource/tile_grid_loading_animation.json | 1 + 8 files changed, 8 insertions(+) create mode 100644 example/resource/360º_degree.json create mode 100644 example/resource/file_transfer.json create mode 100644 example/resource/fingerprint_success.json create mode 100644 example/resource/imprint.json create mode 100644 example/resource/it's_lunch_time!.json create mode 100644 example/resource/maps.json create mode 100644 example/resource/settings.json create mode 100644 example/resource/tile_grid_loading_animation.json diff --git a/example/resource/360º_degree.json b/example/resource/360º_degree.json new file mode 100644 index 0000000000..810b9a592c --- /dev/null +++ b/example/resource/360º_degree.json @@ -0,0 +1 @@ +{"v":"5.1.13","fr":30,"ip":0,"op":76,"w":1024,"h":1024,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"360º Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390.977,552.004,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.703,3.281],[8.276,0],[4.43,-1.239],[4.229,-2.916],[0,0],[-5.105,0],[-1.623,-1.02],[0,-2.114],[10.973,0],[0,0],[0,0],[0,0],[-2.516,-0.602],[-1.13,-1.184],[0,-2.188],[2.169,-1.33],[4.739,0],[3.627,0.857],[3.5,1.787],[0,0],[-3.664,-0.62],[-4.302,0],[-5.888,4.266],[0,7.438],[13.344,1.677],[0,0],[-3.027,3.555],[0,4.959]],"o":[[-4.703,-3.281],[-5.724,0],[-4.43,1.24],[0,0],[5.469,-3.427],[2.734,0],[1.622,1.021],[0,5.615],[0,0],[0,0],[0,0],[4.047,0],[2.516,0.602],[1.13,1.185],[0,2.844],[-2.17,1.331],[-3.062,0],[-3.628,-0.856],[0,0],[4.266,1.641],[3.664,0.62],[10.463,0],[5.887,-4.266],[0,-10.938],[0,0],[5.723,-1.604],[3.026,-3.555],[0,-5.76]],"v":[[51.625,-76.18],[32.156,-81.102],[16.926,-79.242],[3.938,-73.008],[12.906,-58.57],[28.766,-63.711],[35.301,-62.18],[37.734,-57.477],[21.273,-49.055],[16.242,-49.055],[16.242,-32.812],[21.164,-32.812],[31.008,-31.91],[36.477,-29.23],[38.172,-24.172],[34.918,-17.91],[24.555,-15.914],[14.52,-17.199],[3.828,-21.164],[3.828,-3.227],[15.723,0.164],[27.672,1.094],[52.199,-5.305],[61.031,-22.859],[41.016,-41.781],[41.016,-42.109],[54.141,-49.848],[58.68,-62.617]],"c":true},"ix":2},"nm":"3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439220024558,0.439220024558,0.439220024558,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.323,-6.125],[-9.443,0],[-4.959,5.086],[0,8.787],[3.919,4.576],[7.109,0],[3.281,-6.198],[0,0],[-3.537,3.172],[-7.219,0],[-3.646,-0.692],[0,0],[3.245,0],[6.216,-3.281],[3.19,-6.909],[0,-11.156]],"o":[[5.323,6.125],[8.895,0],[4.958,-5.086],[0,-8.166],[-3.92,-4.575],[-7.255,0],[0,0],[0.328,-7.182],[3.536,-3.172],[4.266,0],[0,0],[-4.339,-0.62],[-9.115,0],[-6.216,3.281],[-3.191,6.909],[0,11.011]],"v":[[77.438,-8.094],[99.586,1.094],[120.367,-6.535],[127.805,-27.344],[121.926,-46.457],[105.383,-53.32],[89.578,-44.023],[88.922,-44.023],[94.719,-59.555],[110.852,-64.312],[122.719,-63.273],[122.719,-80.172],[111.344,-81.102],[88.348,-76.18],[74.238,-60.895],[69.453,-33.797]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.495,2.242],[0,3.5],[-1.55,1.677],[-2.48,0],[0,-6.489],[1.44,-1.731],[2.297,0]],"o":[[-1.495,-2.242],[0,-2.406],[1.549,-1.677],[5.031,0],[0,3.792],[-1.441,1.732],[-2.443,0]],"v":[[93.188,-19.387],[90.945,-28],[93.27,-34.125],[99.312,-36.641],[106.859,-26.906],[104.699,-18.621],[99.094,-16.023]],"c":true},"ix":2},"nm":"6","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439220024558,0.439220024558,0.439220024558,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"6","np":5,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.867,6.909],[9.516,0],[4.739,-6.635],[0,-14.219],[-4.849,-6.872],[-9.552,0],[-4.74,6.581],[0,14.146]],"o":[[-4.867,-6.909],[-9.771,0],[-4.74,6.636],[0,13.562],[4.848,6.873],[9.77,0],[4.739,-6.58],[0,-13.672]],"v":[[185.637,-70.738],[164.062,-81.102],[142.297,-71.148],[135.188,-39.867],[142.461,-9.215],[164.062,1.094],[185.828,-8.777],[192.938,-39.867]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.13,3.427],[-2.662,0],[-1.13,-3.555],[0,-8.859],[1.112,-3.5],[2.698,0],[1.13,3.391],[0,9.042]],"o":[[1.13,-3.427],[2.661,0],[1.13,3.555],[0,8.823],[-1.113,3.5],[-2.662,0],[-1.13,-3.391],[0,-9.114]],"v":[[158.375,-58.68],[164.062,-63.82],[169.75,-58.488],[171.445,-39.867],[169.777,-21.383],[164.062,-16.133],[158.375,-21.219],[156.68,-39.867]],"c":true},"ix":2},"nm":"0","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439220024558,0.439220024558,0.439220024558,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"0","np":5,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.573,3.755],[5.723,0],[3.445,-3.609],[0,-6.453],[-3.482,-3.737],[-5.797,0],[-3.482,3.664],[0,6.344]],"o":[[-3.573,-3.755],[-6.016,0],[-3.445,3.609],[0,6.198],[3.481,3.738],[6.052,0],[3.481,-3.664],[0,-6.161]],"v":[[232.859,-75.25],[218.914,-80.883],[204.723,-75.469],[199.555,-60.375],[204.777,-45.473],[218.695,-39.867],[232.996,-45.363],[238.219,-60.375]],"c":true},"ix":2},"nm":"º","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-3.646,0],[0,-6.344],[3.609,0],[0.875,1.55],[0,3.172]],"o":[[3.609,0],[0,6.271],[-1.896,0],[-0.875,-1.549],[0,-6.344]],"v":[[218.805,-69.891],[224.219,-60.375],[218.805,-50.969],[214.648,-53.293],[213.336,-60.375]],"c":true},"ix":2},"nm":"º","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439220024558,0.439220024558,0.439220024558,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"º","np":5,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":350,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Verti","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[360]},{"t":60}],"ix":10},"p":{"a":0,"k":[512,512,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p833_0p833_0p333_0","0p833_1_0p333_0"],"t":0,"s":[310,512],"e":[1,512]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":15,"s":[1,512],"e":[310,512]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":30,"s":[310,512],"e":[512,512]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0]},"n":["0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":45,"s":[512,512],"e":[310,512]},{"t":60}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":350,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Hori","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[360]},{"t":60}],"ix":10},"p":{"a":0,"k":[512,512,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,0.833]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p833_1_0p333_0","0p833_0p833_0p333_0"],"t":0,"s":[512,310],"e":[512,512]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":15,"s":[512,512],"e":[512,310]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":30,"s":[512,310],"e":[512,1]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0.167]},"n":["0p667_1_0p167_0","0p667_1_0p167_0p167"],"t":45,"s":[512,1],"e":[512,310]},{"t":60}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":350,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Main","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512,512,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[512,512],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":350,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/file_transfer.json b/example/resource/file_transfer.json new file mode 100644 index 0000000000..ef823ffbdf --- /dev/null +++ b/example/resource/file_transfer.json @@ -0,0 +1 @@ +{"v":"5.0.6","fr":25,"ip":0,"op":50,"w":503,"h":495,"nm":"file transfer","ddd":0,"assets":[{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90.033,347.439,0],"ix":2},"a":{"a":0,"k":[64.5,97.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-17.824,0],[0,0]],"o":[[0,0],[0,17.824],[0,0],[0,0]],"v":[[-47,-79.75],[-47,47.477],[-14.727,79.75],[47,79.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.122000002394,0.187999994615,0.277999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[64.5,97.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"t":10}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0],"e":[100]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":36,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[0]},{"t":23}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[90],"e":[72]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[72],"e":[38]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":7,"s":[38],"e":[0]},{"t":8}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[42.545,272.726,0],"e":[42.545,283.601,0],"to":[0,1.8125,0],"ti":[0,-5.89583349227905,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":1,"s":[42.545,283.601,0],"e":[42.545,308.101,0],"to":[0,5.89583349227905,0],"ti":[0,-7.75,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[42.545,308.101,0],"e":[42.545,330.101,0],"to":[0,7.75,0],"ti":[0,-7.47916650772095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[42.545,330.101,0],"e":[42.545,352.976,0],"to":[0,7.47916650772095,0],"ti":[0,-8.41666698455811,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":4,"s":[42.545,352.976,0],"e":[42.545,380.601,0],"to":[0,8.41666698455811,0],"ti":[-0.33333334326744,-8.5625,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[42.545,380.601,0],"e":[44.545,404.351,0],"to":[0.33333334326744,8.5625,0],"ti":[-2.875,-6.91666650772095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6,"s":[44.545,404.351,0],"e":[59.795,422.101,0],"to":[2.875,6.91666650772095,0],"ti":[-6.0625,-3.8125,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[59.795,422.101,0],"e":[80.92,427.226,0],"to":[6.0625,3.8125,0],"ti":[-7.52083349227905,-0.85416668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8,"s":[80.92,427.226,0],"e":[104.92,427.226,0],"to":[7.52083349227905,0.85416668653488,0],"ti":[-8.25,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9,"s":[104.92,427.226,0],"e":[130.42,427.226,0],"to":[8.25,0,0],"ti":[-4.25,0,0]},{"t":10}],"ix":2},"a":{"a":0,"k":[28.637,39.774,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-11.137,-22.274],[11.137,0],[-11.137,22.274]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.122000002394,0.187999994615,0.277999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[28.637,39.774],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":36,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[251.5,247.5,0],"ix":2},"a":{"a":0,"k":[251.5,247.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":503,"h":495,"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Pre-comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[251.5,247.5,0],"ix":2},"a":{"a":0,"k":[251.5,247.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":503,"h":495,"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":20,"s":[152.057,121.25,0],"e":[350.557,373.25,0],"to":[2.08333325386047,63,0],"ti":[-199.744842529297,-2.53560209274292,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[152.25,121.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.7],[0,0],[-3.7,0],[0,0],[0,3.7],[0,0],[3.7,0],[0,0],[0,0]],"o":[[-3.7,0],[0,0],[0,3.7],[0,0],[3.7,0],[0,0],[0,-3.7],[0,0],[0,0],[0,0]],"v":[[-138.3,-114.25],[-145,-107.55],[-145,107.65],[-138.3,114.35],[138.3,114.35],[145,107.65],[145,-66.65],[138.3,-73.35],[-12.2,-73.35],[-45.5,-114.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.5,0],[0,0],[0,7.6],[0,0],[-7.6,0],[0,0],[0,0],[0,0],[0,-7.6],[0,0]],"o":[[0,0],[-7.5,0],[0,0],[0,-7.6],[0,0],[0,0],[0,0],[7.5,0],[0,0],[0,7.5]],"v":[[138.3,121.25],[-138.3,121.25],[-152,107.55],[-152,-107.55],[-138.3,-121.25],[-42.1,-121.25],[-8.8,-80.25],[138.3,-80.25],[152,-66.55],[152,107.65]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.122000002394,0.187999994615,0.277999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.25,121.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.412,0],[0,0],[0,7.412],[0,0],[-7.412,0],[0,0],[0,0],[0,0],[0,-7.412],[0,0]],"o":[[0,0],[-7.315,0],[0,0],[0,-7.315],[0,0],[0,0],[0,0],[7.314,0],[0,0],[0,7.315]],"v":[[134.878,118.25],[-134.878,118.25],[-148.239,104.889],[-148.239,-104.889],[-134.878,-118.25],[-41.059,-118.25],[-8.582,-78.265],[134.878,-78.265],[148.239,-64.903],[148.239,104.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.193,121.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":20,"s":[350.557,373.25,0],"e":[152.057,121.25,0],"to":[9.91666698455811,-261,0],"ti":[0,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[152.25,121.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.7],[0,0],[-3.7,0],[0,0],[0,3.7],[0,0],[3.7,0],[0,0],[0,0],[0,0]],"o":[[-3.7,0],[0,0],[0,3.7],[0,0],[3.7,0],[0,0],[0,-3.7],[0,0],[0,0],[0,0],[0,0]],"v":[[-138.3,-114.25],[-145,-107.55],[-145,107.65],[-138.3,114.35],[138.3,114.35],[145,107.65],[145,-66.65],[138.3,-73.35],[-12.1,-73.35],[-45.401,-114.35],[-138.3,-114.35]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[7.6,0],[0,0],[0,7.6],[0,0],[-7.6,0],[0,0],[0,0],[0,0],[0,-7.6],[0,0]],"o":[[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0],[0,0],[0,0],[7.5,0],[0,0],[0,7.5]],"v":[[138.3,121.25],[-138.3,121.25],[-152,107.55],[-152,-107.55],[-138.3,-121.25],[-42.1,-121.25],[-8.8,-80.25],[138.3,-80.25],[152,-66.55],[152,107.65]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.122000002394,0.187999994615,0.277999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.25,121.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.35,0],[0,0],[0,7.35],[0,0],[-7.349,0],[0,0],[0,0],[0,0],[0,-7.35],[0,0]],"o":[[0,0],[-7.253,0],[0,0],[0,-7.253],[0,0],[0,0],[0,0],[7.253,0],[0,0],[0,7.253]],"v":[[133.738,117.25],[-133.738,117.25],[-146.985,104.002],[-146.985,-104.002],[-133.738,-117.25],[-40.71,-117.25],[-8.51,-77.603],[133.738,-77.603],[146.986,-64.354],[146.986,104.099]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.25,121.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/fingerprint_success.json b/example/resource/fingerprint_success.json new file mode 100644 index 0000000000..e036550693 --- /dev/null +++ b/example/resource/fingerprint_success.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":60,"ip":0,"op":154,"w":800,"h":600,"nm":"Fingerprint Added","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"check-mark","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":114.999,"s":[0],"e":[100]},{"t":125.999075247122}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[478,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":112.999,"s":[40.225,40.225,100],"e":[90.225,90.225,100]},{"t":128.999075247122}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.58,0.581],[0,0],[-0.586,0.586],[0,0],[-0.586,-0.586],[0,0],[0,0],[-0.578,-0.593],[0,0],[0.593,-0.578],[0,0]],"o":[[0,0],[-0.586,-0.586],[0,0],[0.586,-0.586],[0,0],[0,0],[0.593,-0.578],[0,0],[0.578,0.593],[0,0],[-0.588,0.573]],"v":[[-6.426,14.748],[-20.11,1.063],[-20.11,-1.059],[-16.575,-4.594],[-14.454,-4.594],[-5.306,4.553],[14.506,-14.756],[16.627,-14.729],[20.117,-11.148],[20.09,-9.027],[-4.318,14.761]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":77,"op":757.023023023023,"st":-143.877877877878,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[478,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":91,"s":[118,118,100],"e":[83.4,83.4,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":104,"s":[83.4,83.4,100],"e":[100,100,100]},{"t":114}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":506.533,"s":[{"i":[[27.5,0],[0,0],[0,27.5],[0,0],[-27.5,0],[0,0],[0,-27.5],[0,0]],"o":[[0,0],[-27.5,0],[0,0],[0,-27.5],[0,0],[27.5,0],[0,0],[0,27.5]],"v":[[0,50],[0,50],[-50,0],[-50,0],[0,-50],[0,-50],[50,0],[50,0]],"c":true}],"e":[{"i":[[27.5,0],[0,0],[0,27.5],[0,0],[-27.5,0],[0,0],[0,-27.5],[0,0]],"o":[[0,0],[-27.5,0],[0,0],[0,-27.5],[0,0],[27.5,0],[0,0],[0,27.5]],"v":[[77.5,50],[-77.5,50],[-127.5,0],[-127.5,0],[-77.5,-50],[77.5,-50],[127.5,0],[127.5,0]],"c":true}]},{"t":526.552734375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.227450980392,0.717647058824,0.23137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":74,"op":574.600600600601,"st":-26,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"bg","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":460.461,"s":[35],"e":[0]},{"t":490.490234375}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400.5,299.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.083,111.167],[-18.417,129.833]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 19","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-31.333],[0,0]],"o":[[0,0],[0,26.833],[0,0]],"v":[[-2.917,0.375],[1.25,47.375],[-4.75,89.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 18","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[16.5,-45.333]],"o":[[0,0],[0,0]],"v":[[21.083,65.167],[4.75,129.833]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 17","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,34.5],[0.343,7.079],[-15.143,3.994],[-2.486,-6.934],[0,0]],"o":[[0,0],[0,-34.5],[-0.312,-6.447],[15.167,-4],[4.909,13.694],[0,0]],"v":[[-40.371,123.25],[-20.538,49.917],[-24.38,1.838],[-7.871,-22.25],[18.462,-7.583],[22.962,42.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 16","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-11.333,0],[-9.167,-11.792],[0,-58.958],[0,0]],"o":[[0,0],[10.833,0],[7.836,10.081],[0,35.958],[0,0]],"v":[[-18.417,-41.083],[-2.583,-43.75],[30.25,-27.917],[44.417,52.625],[30.25,123.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.5,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 15","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.218,33.169],[0,12.439],[0,0]],"o":[[0,0],[1.75,-26.167],[0,-22.363],[0,0]],"v":[[-59.375,115.875],[-41.875,56.792],[-45.744,2.238],[-35.625,-28.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 14","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-51.333],[0,0]],"o":[[0,0],[0,41.022],[0,0]],"v":[[57.417,-21.5],[65.083,46.5],[55.917,114.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 13","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.5,13],[0,15.5],[-25.188,12.89],[0,0]],"o":[[0,0],[-0.5,-13],[0,-15.5],[49.667,-25.417],[0,0]],"v":[[-64.25,56.042],[-63.5,32.625],[-67.333,-1.875],[-34.167,-57.125],[48.333,-40.708]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 12","np":3,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.5,11.25]],"o":[[0,0],[0,0]],"v":[[-23,35.875],[-12,9.125]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-56,68.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 11","np":3,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[25.588,51.877],[0.253,0.286]],"o":[[-0.862,-0.039],[-12.167,-24.667],[0,0]],"v":[[83.122,95.5],[73.789,-41.833],[39.122,-75.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 10","np":3,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[37.69,-39.496],[0.227,-12.901],[0,-12.5],[0,0]],"o":[[0,0],[-22.167,23.229],[-0.229,12.998],[0,29.875],[0,0]],"v":[[18.047,-83.903],[-66.12,-59.632],[-88.229,0.347],[-84.703,39.347],[-95.703,89.597]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 9","np":3,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.346,-17.25]],"o":[[0,0],[0,0]],"v":[[108.577,39.125],[107.577,65.875]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 8","np":3,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-52.475,-34.419],[0,0],[0,0]],"o":[[0,0],[46.5,30.5],[0,0],[0,0]],"v":[[-44.5,-100.374],[58.25,-89.29],[106.75,6.46],[107.5,16.21]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2,18],[0,15.375],[-45.25,31.75]],"o":[[0,0],[-2,-18],[0,-15.375],[0,0]],"v":[[-111.125,71.625],[-106.125,41.625],[-110.125,3],[-64.875,-88.125]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[35.5,34.75],[0,0]],"o":[[0,0],[-34.746,-34.012],[0,0]],"v":[[126.531,-3.938],[89.281,-91.854],[17.531,-127.937]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[31.5,-19.5],[0,0]],"o":[[0,0],[-31.5,19.5],[0,0]],"v":[[-4.75,-129.937],[-71,-110.687],[-118.75,-56.937]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-22.25],[0,0]],"o":[[0,0],[0,22.25],[0,0]],"v":[[-128.25,-36.875],[-133.5,-0.125],[-126.5,40.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.509803921569,0.427450980392,0.827450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"t":34}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":20,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Scan","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":338.338,"s":[100],"e":[0]},{"t":368.369140625}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400.5,299.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.083,111.167],[-18.417,129.833]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 19","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-31.333],[0,0]],"o":[[0,0],[0,26.833],[0,0]],"v":[[-2.917,0.375],[1.25,47.375],[-4.75,89.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 18","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[16.5,-45.333]],"o":[[0,0],[0,0]],"v":[[21.083,65.167],[4.75,129.833]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 17","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,34.5],[0.343,7.079],[-15.143,3.994],[-2.486,-6.934],[0,0]],"o":[[0,0],[0,-34.5],[-0.312,-6.447],[15.167,-4],[4.909,13.694],[0,0]],"v":[[-40.371,123.25],[-20.538,49.917],[-24.38,1.838],[-7.871,-22.25],[18.462,-7.583],[22.962,42.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 16","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-11.333,0],[-9.167,-11.792],[0,-58.958],[0,0]],"o":[[0,0],[10.833,0],[7.836,10.081],[0,35.958],[0,0]],"v":[[-18.417,-41.083],[-2.583,-43.75],[30.25,-27.917],[44.417,52.625],[30.25,123.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.5,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 15","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.218,33.169],[0,12.439],[0,0]],"o":[[0,0],[1.75,-26.167],[0,-22.363],[0,0]],"v":[[-59.375,115.875],[-41.875,56.792],[-45.744,2.238],[-35.625,-28.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 14","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-51.333],[0,0]],"o":[[0,0],[0,41.022],[0,0]],"v":[[57.417,-21.5],[65.083,46.5],[55.917,114.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 13","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.5,13],[0,15.5],[-25.188,12.89],[0,0]],"o":[[0,0],[-0.5,-13],[0,-15.5],[49.667,-25.417],[0,0]],"v":[[-64.25,56.042],[-63.5,32.625],[-67.333,-1.875],[-34.167,-57.125],[48.333,-40.708]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 12","np":3,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.5,11.25]],"o":[[0,0],[0,0]],"v":[[-23,35.875],[-12,9.125]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-56,68.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 11","np":3,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[25.588,51.877],[0.253,0.286]],"o":[[-0.862,-0.039],[-12.167,-24.667],[0,0]],"v":[[83.122,95.5],[73.789,-41.833],[39.122,-75.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 10","np":3,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[37.69,-39.496],[0.227,-12.901],[0,-12.5],[0,0]],"o":[[0,0],[-22.167,23.229],[-0.229,12.998],[0,29.875],[0,0]],"v":[[18.047,-83.903],[-66.12,-59.632],[-88.229,0.347],[-84.703,39.347],[-95.703,89.597]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 9","np":3,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.346,-17.25]],"o":[[0,0],[0,0]],"v":[[108.577,39.125],[107.577,65.875]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 8","np":3,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-52.475,-34.419],[0,0],[0,0]],"o":[[0,0],[46.5,30.5],[0,0],[0,0]],"v":[[-44.5,-100.374],[58.25,-89.29],[106.75,6.46],[107.5,16.21]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2,18],[0,15.375],[-45.25,31.75]],"o":[[0,0],[-2,-18],[0,-15.375],[0,0]],"v":[[-111.125,71.625],[-106.125,41.625],[-110.125,3],[-64.875,-88.125]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[35.5,34.75],[0,0]],"o":[[0,0],[-34.746,-34.012],[0,0]],"v":[[126.531,-3.938],[89.281,-91.854],[17.531,-127.937]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[31.5,-19.5],[0,0]],"o":[[0,0],[-31.5,19.5],[0,0]],"v":[[-4.75,-129.937],[-71,-110.687],[-118.75,-56.937]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-22.25],[0,0]],"o":[[0,0],[0,22.25],[0,0]],"v":[[-128.25,-36.875],[-133.5,-0.125],[-126.5,40.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117647059,0.23137254902,0.658823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38,"s":[0],"e":[100]},{"t":96}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":20,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/imprint.json b/example/resource/imprint.json new file mode 100644 index 0000000000..cf7c2f41e0 --- /dev/null +++ b/example/resource/imprint.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":24,"ip":0,"op":72,"w":320,"h":320,"nm":"preloader","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"check","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20.5,20.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":48,"s":[{"i":[[0,0],[-2.667,-3.777],[-10.816,0],[0,18.02],[0,0]],"o":[[0,11.59],[5.826,8.251],[18.02,0],[0,0],[0,-3.948]],"v":[[-32.763,9.036],[-26.427,28.344],[0,41.799],[32.763,9.036],[32.763,-30.549]],"c":false}],"e":[{"i":[[0,0],[-3.336,-3.703],[-2.453,-8.306],[-11.95,19.02],[0,0]],"o":[[12.513,5.208],[6.552,7.274],[2.797,-12.556],[0,0],[0,-3.948]],"v":[[-32.763,-2.964],[-14.177,9.844],[-3.047,30.049],[12.451,-8.276],[37.388,-39.049]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":53,"s":[{"i":[[0,0],[-3.336,-3.703],[-2.453,-8.306],[-11.95,19.02],[0,0]],"o":[[12.513,5.208],[6.552,7.274],[2.797,-12.556],[0,0],[0,-3.948]],"v":[[-32.763,-2.964],[-14.177,9.844],[-3.047,30.049],[12.451,-8.276],[37.388,-39.049]],"c":false}],"e":[{"i":[[0,0],[-3.336,-3.703],[-5.953,-4.306],[-12.138,20.582],[-3.612,11.708]],"o":[[5.263,9.708],[6.552,7.274],[10.547,-8.556],[9.99,-16.941],[3.612,-11.708]],"v":[[-32.763,9.036],[-20.302,27.719],[-3.047,42.049],[23.138,8.161],[37.388,-27.049]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":58,"s":[{"i":[[0,0],[-3.336,-3.703],[-5.953,-4.306],[-12.138,20.582],[-3.612,11.708]],"o":[[5.263,9.708],[6.552,7.274],[10.547,-8.556],[9.99,-16.941],[3.612,-11.708]],"v":[[-32.763,9.036],[-20.302,27.719],[-3.047,42.049],[23.138,8.161],[37.388,-27.049]],"c":false}],"e":[{"i":[[0,0],[-3.336,-3.703],[-4.453,-5.306],[-9.638,15.832],[0,0]],"o":[[8.326,9.208],[6.552,7.274],[8.047,-13.056],[0,0],[0,-3.948]],"v":[[-32.763,-2.964],[-17.427,13.844],[-3.047,30.049],[18.263,-5.214],[37.388,-39.049]],"c":false}]},{"t":63}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":48,"s":[0.109999997008,0.109999997008,0.105999995213,1],"e":[0.713725507259,0.792156875134,0.282352954149,1]},{"t":53}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[4],"e":[8]},{"t":58}],"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[140,150.756],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"check ","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.307],"y":[1]},"o":{"x":[0.013],"y":[0.99]},"n":["0p307_1_0p013_0p99"],"t":0,"s":[100],"e":[0]},{"t":24}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.312],"y":[1]},"o":{"x":[0.294],"y":[0.878]},"n":["0p312_1_0p294_0p878"],"t":28,"s":[100],"e":[99.722]},{"i":{"x":[0.962],"y":[0.161]},"o":{"x":[0.75],"y":[0]},"n":["0p962_0p161_0p75_0"],"t":30,"s":[99.722],"e":[100]},{"t":48}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 2","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Обрезать контуры 3","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Кривые preloader","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,160,0],"ix":2},"a":{"a":0,"k":[140,140,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.442,0],[-1.701,-1.379]],"o":[[0,0],[0,-5.442],[2.347,0],[0,0]],"v":[[-8.053,8.917],[-8.053,0.979],[1.841,-8.916],[8.053,-6.709]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[138.158,129.583],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.442,0],[0,5.442]],"o":[[0,0],[0,5.442],[-5.442,0],[0,0]],"v":[[9.895,-14.386],[9.895,4.491],[0,14.386],[-9.895,4.491]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[140,144.947],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.088,0],[-1.541,-0.357]],"o":[[3.676,-3.002],[1.645,0],[0,0]],"v":[[-9.12,2.404],[4.331,-2.404],[9.12,-1.858]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[135.669,106.459],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.236],[0,0]],"o":[[1.304,2.754],[0,0],[0,0]],"v":[[-1.017,-9.027],[1.017,0.037],[1.017,9.027]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[160.312,125.348],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.72,-3.921]],"o":[[0,6.579],[0,0]],"v":[[3.869,-8.203],[-3.869,8.204]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[157.46,162.819],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.714,5.348]],"o":[[-5.895,-1.591],[0,0]],"v":[[6.757,5.505],[-6.757,-5.504]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[127.72,169.71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[118.671,144.313],[118.671,125.385]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[107.237,135.045],[107.237,147.876]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18.02,0],[-5.913,-8.655]],"o":[[0,-18.02],[11.213,0],[0,0]],"v":[[-29.916,16.382],[2.847,-16.382],[29.917,-2.018]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[137.153,103.826],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 10","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.519]],"o":[[-1.275,-4.114],[0,0]],"v":[[0.981,6.499],[-0.981,-6.499]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[96.784,171.468],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 11","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-12.185,7.891]],"o":[[0,0],[0,-15.517],[0,0]],"v":[[-10.145,29.214],[-10.145,7.911],[10.145,-29.214]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[105.947,107.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 12","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.212,0],[0,-24.309],[0,0]],"o":[[2.127,-0.318],[24.309,0],[0,0],[0,0]],"v":[[-25.356,-38.039],[-18.841,-38.521],[25.356,5.676],[25.356,38.521]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[158.841,109.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 13","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[24.308,0],[8.114,9.172]],"o":[[0,24.309],[-13.135,0],[0,0]],"v":[[38.645,-22.098],[-5.553,22.098],[-38.645,7.12]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[145.553,187.068],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 14","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.026,0.7]],"o":[[0,0],[0,-0.707],[0,0]],"v":[[-0.02,14.982],[-0.02,-12.871],[0.02,-14.982]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[84.388,122.726],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 15","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-16.128,0],[-9.757,-8.423]],"o":[[10.186,-11.06],[13.822,0],[0,0]],"v":[[-38.581,9.008],[2.315,-9.008],[38.581,4.524]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[137.684,63.23],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 16","np":2,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[28.867,-1.944]],"o":[[0,0],[0,29.338],[0,0]],"v":[[25.941,-57.899],[25.941,2.393],[-25.942,57.899]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[169.69,167.753],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 17","np":2,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,27.37],[0,0]],"o":[[-26.126,-4.53],[0,0],[0,0]],"v":[[23.079,38.774],[-23.079,-16.045],[-23.079,-38.774]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[107.447,186.191],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 18","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-36.886,0],[-4.666,-1.038]],"o":[[0,-36.886],[4.966,0],[0,0]],"v":[[-40.771,33.533],[26.294,-33.533],[40.771,-31.949]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[113.706,71.144],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 19","np":2,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-24.615],[0,0]],"o":[[19.903,11.667],[0,0],[0,0]],"v":[[-16.671,-53.46],[16.671,4.45],[16.671,53.46]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[190.395,100.228],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 20","np":2,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[36.886,0],[4.528,0.973]],"o":[[0,36.886],[-4.807,0],[0,0]],"v":[[40.547,-33.533],[-26.519,33.533],[-40.547,32.048]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[166.519,208.856],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 21","np":2,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,24.684],[0,0]],"o":[[-19.997,-11.643],[0,0],[0,0]],"v":[[16.757,53.666],[-16.757,-4.342],[-16.757,-53.666]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[89.69,179.665],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 22","np":2,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-7.026,11.748]],"o":[[0,0],[0,-14.611],[0,0]],"v":[[-5.536,32.629],[-5.536,7.442],[5.536,-32.629]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[67.035,92.059],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 23","np":2,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-15.423,4.252]],"o":[[10.099,-11.889],[0,0]],"v":[[-19.541,12.505],[19.541,-12.505]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.723,36.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 24","np":2,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-13.318,-10.399]],"o":[[0,0],[18.106,0],[0,0]],"v":[[-24.075,-8.306],[-24.075,-8.306],[24.075,8.306]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.075,29.306],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 25","np":2,"cix":2,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-18.945],[0,0]],"o":[[11.283,13.601],[0,0],[0,0]],"v":[[-9.042,-32.053],[9.042,17.928],[9.042,32.053]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[209.457,81.572],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 26","np":2,"cix":2,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[218.5,126.813],[218.5,173.139]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 27","np":2,"cix":2,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[12.315,-11.279]],"o":[[-3.194,17.022],[0,0]],"v":[[12.123,-21.717],[-12.122,21.716]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[205.041,216.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 28","np":2,"cix":2,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[13.521,0],[8.502,3.175]],"o":[[-11.138,6.085],[-9.574,0],[0,0]],"v":[[32.337,-4.775],[-5.073,4.775],[-32.337,-0.137]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[145.073,254.225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 29","np":2,"cix":2,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.827,13.957]],"o":[[-13.338,-7.843],[0,0]],"v":[[15.508,16.734],[-15.508,-16.733]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[84.928,231.495],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 30","np":2,"cix":2,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,4.795],[0,0]],"o":[[-0.833,-4.563],[0,0],[0,0]],"v":[[0.635,25.746],[-0.635,11.69],[-0.635,-25.746]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.109999997008,0.109999997008,0.105999995213,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[62.134,168.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Группа 31","np":2,"cix":2,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.03],"y":[0.978]},"n":["0p667_1_0p03_0p978"],"t":0,"s":[100],"e":[0]},{"t":16}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.986],"y":[0.477]},"o":{"x":[0.769],"y":[0]},"n":["0p986_0p477_0p769_0"],"t":31,"s":[100],"e":[0]},{"t":48}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":31,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":48,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/it's_lunch_time!.json b/example/resource/it's_lunch_time!.json new file mode 100644 index 0000000000..20e5dbb6e5 --- /dev/null +++ b/example/resource/it's_lunch_time!.json @@ -0,0 +1 @@ +{"v":"5.1.20","fr":25,"ip":0,"op":74,"w":512,"h":512,"nm":"Layers-estaPronto","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"dente 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[140.225,174.571,0],"ix":2},"a":{"a":0,"k":[2.5,34.346,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[2.5,2.5],[2.5,66.191]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.808000033509,0,0.344999994016,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"n":["0_1_1_0"],"t":18.85,"s":[0],"e":[100]},{"t":37}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"dente 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[152.553,174.571,0],"ix":2},"a":{"a":0,"k":[2.5,34.346,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[2.5,2.5],[2.5,66.191]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.808000033509,0,0.344999994016,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.016],"y":[0.993]},"o":{"x":[1],"y":[-0.014]},"n":["0p016_0p993_1_-0p014"],"t":18.85,"s":[100],"e":[0]},{"t":37}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"garfo","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[146.389,255.725,0],"ix":2},"a":{"a":0,"k":[30.991,125.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.585,-4.361],[0,-8.218],[2.054,-18.491],[0,-14.382],[-9.077,0],[0,9.077],[2.055,18.491],[0,0],[-4.109,6.163],[-0.109,5.068],[0,0]],"o":[[0,0],[0.109,5.068],[4.109,6.163],[0,0],[-2.055,18.491],[0,9.077],[9.077,0],[0,-14.382],[-2.054,-18.491],[0,-8.218],[2.585,-4.361],[0,0],[0,0]],"v":[[-18.491,-113],[-18.491,-49.309],[-14.382,-34.927],[-6.164,-18.491],[-8.218,26.709],[-16.436,96.564],[0,113],[16.436,96.564],[8.218,26.709],[6.164,-18.491],[14.382,-34.927],[18.491,-49.309],[18.491,-113]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.808000033509,0,0.344999994016,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[30.991,125.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.884],"y":[0.022]},"n":["0p667_1_0p884_0p022"],"t":19,"s":[100],"e":[0]},{"t":40}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"faca","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[282.826,255.753,0],"ix":2},"a":{"a":0,"k":[116.446,124.473,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[84.5,11.171],[84.5,236.171],[302.392,236.171],[302.392,11.171]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Máscara 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.788,0.039],[2.055,-18.491],[0,-14.381],[-9.077,0],[0,9.078],[2.054,18.491],[0,0],[0,0],[8.218,-22.6],[2.3,-13]],"o":[[2.654,0.856],[0,0],[-2.055,18.491],[0,9.078],[9.078,0],[0,-14.381],[-2.055,-18.491],[0,0],[0,0],[-4.738,12.322],[0,0]],"v":[[-9.091,-8.424],[-0.872,-7.191],[-2.928,38.009],[-11.146,95.536],[5.29,111.973],[21.727,95.536],[13.509,38.009],[11.454,-7.191],[11.454,-111.973],[-11.146,-89.373],[-21.727,-51.302]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.808000033509,0,0.344999994016,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[198.666,124.473],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[2.5,11.445],[2.5,75.137]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.808000033509,0,0.344999994016,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":19,"s":[100],"e":[0]},{"t":40}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"prato int","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[41],"e":[401]},{"t":40}],"ix":10},"p":{"a":0,"k":[257.28,260.671,0],"ix":2},"a":{"a":0,"k":[73.269,73.269,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40.327,0],[0,-40.327],[-40.327,0],[0,40.328]],"o":[[-40.327,0],[0,40.328],[40.327,0],[0,-40.327]],"v":[[0,-73.019],[-73.019,-0.001],[0,73.019],[73.019,-0.001]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.807843137255,0,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[73.269,73.269],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.833],"y":[0]},"n":["0p667_1_0p833_0"],"t":0,"s":[0],"e":[100]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"prato ext","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-23],"e":[401]},{"t":40}],"ix":10},"p":{"a":0,"k":[257.28,260.671,0],"ix":2},"a":{"a":0,"k":[73.269,73.269,0],"ix":1},"s":{"a":0,"k":[139,139,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40.327,0],[0,-40.327],[-40.327,0],[0,40.328]],"o":[[-40.327,0],[0,40.328],[40.327,0],[0,-40.327]],"v":[[0,-73.019],[-73.019,-0.001],[0,73.019],[73.019,-0.001]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.807843137255,0,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[73.269,73.269],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.829],"y":[0]},"n":["0p667_1_0p829_0"],"t":0,"s":[100],"e":[0]},{"t":20}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":75,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/maps.json b/example/resource/maps.json new file mode 100644 index 0000000000..7bb4d8ddb1 --- /dev/null +++ b/example/resource/maps.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":30,"ip":0,"op":132,"w":200,"h":85,"nm":"city 200x85","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[8.25,92.375,0],"e":[9,73.375,0],"to":[0.125,-3.16666674613953,0],"ti":[-1.29166662693024,5.75,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[9,73.375,0],"e":[16,57.875,0],"to":[1.29166662693024,-5.75,0],"ti":[-2.22916674613953,0.60416668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12.5,"s":[16,57.875,0],"e":[22.375,69.75,0],"to":[2.22916674613953,-0.60416668653488,0],"ti":[-2.75,-2.9375,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13.75,"s":[22.375,69.75,0],"e":[32.5,75.5,0],"to":[2.75,2.9375,0],"ti":[-3.20833325386047,-1.41666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[32.5,75.5,0],"e":[41.625,78.25,0],"to":[3.20833325386047,1.41666662693024,0],"ti":[-2.39583325386047,0.60416668653488,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16.25,"s":[41.625,78.25,0],"e":[46.875,71.875,0],"to":[2.39583325386047,-0.60416668653488,0],"ti":[-2.3125,0.10416666418314,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17.5,"s":[46.875,71.875,0],"e":[55.5,77.625,0],"to":[2.3125,-0.10416666418314,0],"ti":[-1.64583337306976,1.89583337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18.75,"s":[55.5,77.625,0],"e":[56.75,60.5,0],"to":[1.64583337306976,-1.89583337306976,0],"ti":[-0.20833332836628,5.29166650772095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[56.75,60.5,0],"e":[56.75,45.875,0],"to":[0.20833332836628,-5.29166650772095,0],"ti":[-0.20833332836628,4.41666650772095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21.25,"s":[56.75,45.875,0],"e":[58,34,0],"to":[0.20833332836628,-4.41666650772095,0],"ti":[-0.95833331346512,3.02083325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22.5,"s":[58,34,0],"e":[62.5,27.75,0],"to":[0.95833331346512,-3.02083325386047,0],"ti":[-1.66666662693024,1.52083337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23.75,"s":[62.5,27.75,0],"e":[68,24.875,0],"to":[1.66666662693024,-1.52083337306976,0],"ti":[-0.9375,2.79166674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27.5,"s":[68,24.875,0],"e":[68.125,11,0],"to":[0.9375,-2.79166674613953,0],"ti":[-0.33333334326744,3.14583325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28.75,"s":[68.125,11,0],"e":[70,6,0],"to":[0.33333334326744,-3.14583325386047,0],"ti":[-0.70833331346512,-2.25,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[70,6,0],"e":[72.375,24.5,0],"to":[0.70833331346512,2.25,0],"ti":[-0.39583334326744,-3.08333325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31.25,"s":[72.375,24.5,0],"e":[72.375,24.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[72.375,24.5,0],"e":[78.125,27,0],"to":[0.95833331346512,0.41666665673256,0],"ti":[-1.64583337306976,-1.60416662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36.25,"s":[78.125,27,0],"e":[82.25,34.125,0],"to":[1.64583337306976,1.60416662693024,0],"ti":[-0.6875,-4.79166650772095,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[82.25,34.125,0],"e":[82.25,55.75,0],"to":[0.6875,4.79166650772095,0],"ti":[-1.27083337306976,-3.60416674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":38.75,"s":[82.25,55.75,0],"e":[89.875,55.75,0],"to":[1.27083337306976,3.60416674613953,0],"ti":[-1.27083337306976,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":40,"s":[89.875,55.75,0],"e":[89.875,55.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":43.75,"s":[89.875,55.75,0],"e":[93.875,73,0],"to":[0.66666668653488,2.875,0],"ti":[-0.875,-4.39583349227905,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[93.875,73,0],"e":[95.125,82.125,0],"to":[0.875,4.39583349227905,0],"ti":[-0.20833332836628,2.89583325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46.25,"s":[95.125,82.125,0],"e":[95.162,83.291,0],"to":[0.08235409110785,-1.14472186565399,0],"ti":[0.03311010077596,4.17439985275269,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":47.5,"s":[95.162,83.291,0],"e":[95.125,55.625,0],"to":[-0.05064940080047,-6.38569068908691,0],"ti":[-0.113381318748,3.3510479927063,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50,"s":[95.125,55.625,0],"e":[96.25,48.875,0],"to":[0.1875,-5.54166650772095,0],"ti":[-2.8125,1.10416662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.25,"s":[96.25,48.875,0],"e":[112,49,0],"to":[2.8125,-1.10416662693024,0],"ti":[-2.625,-3.1875,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":62.5,"s":[112,49,0],"e":[112,68,0],"to":[2.625,3.1875,0],"ti":[0,-4.64583349227905,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":65,"s":[112,68,0],"e":[112,76.875,0],"to":[0,4.64583349227905,0],"ti":[-2.5625,-1.47916662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[112,76.875,0],"e":[127.375,76.875,0],"to":[2.5625,1.47916662693024,0],"ti":[-2.5625,6.52083349227905,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[127.375,76.875,0],"e":[127.375,37.75,0],"to":[2.5625,-6.52083349227905,0],"ti":[-2.20833325386047,7.75,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[127.375,37.75,0],"e":[140.625,30.375,0],"to":[2.20833325386047,-7.75,0],"ti":[-2.4375,4,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":82.5,"s":[140.625,30.375,0],"e":[142,13.75,0],"to":[2.4375,-4,0],"ti":[-2.77083325386047,-3.08333325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83.75,"s":[142,13.75,0],"e":[157.25,48.875,0],"to":[2.77083325386047,3.08333325386047,0],"ti":[-8.125,-6.14583349227905,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[157.25,48.875,0],"e":[190.75,50.625,0],"to":[8.125,6.14583349227905,0],"ti":[-5.58333349227905,-7.95833349227905,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":92.5,"s":[190.75,50.625,0],"e":[190.75,96.625,0],"to":[5.58333349227905,7.95833349227905,0],"ti":[0,-7.66666650772095,0]},{"t":97.5}],"ix":2},"a":{"a":0,"k":[-12,-6.5,0],"ix":1},"s":{"a":0,"k":[39.083,39.083,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[26.875,26.875],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176530427,0.466666696586,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12.393,-6.871],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"melbourne_orange Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[100.25,42.75,0],"e":[100,42.5,0],"to":[-0.04166666790843,-0.04166666790843,0],"ti":[0.04166666790843,0.04166666790843,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":97.5,"s":[100,42.5,0],"e":[100,42.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":195}],"ix":2},"a":{"a":0,"k":[92.5,42.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6,86],[-11,86],[-8,102],[6,102.5],[6,96.899],[6,96.152],[6,95.43],[6,95.335],[6,95.291],[6,95.253],[6,95.253],[6,95.253],[6,95.253],[6,95.243],[6,95.241],[6,95.189],[6,95.107],[6,94.9],[6,94.729],[6,93.699]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6,73.656],[-11,73.656],[-8,89.656],[6,90.156],[6,84.556],[6,83.808],[6,83.086],[6,82.991],[6,82.947],[6,82.909],[6,82.909],[6,82.909],[6,82.909],[6,82.899],[6,82.897],[6,82.845],[6,82.763],[6,82.556],[6,82.385],[6,81.355]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6,73.656],[-11,73.656],[-8,89.656],[6,90.156],[6,84.556],[6,83.808],[6,83.086],[6,82.991],[6,82.947],[6,82.909],[6,82.909],[6,82.909],[6,82.909],[6,82.899],[6,82.897],[6,82.845],[6,82.763],[6,82.556],[6,82.385],[6,81.355]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.5,41.5],[-13.5,41.5],[-8,89.5],[6,90],[5.151,73.537],[5.038,71.339],[4.929,69.217],[4.914,68.939],[4.908,68.809],[4.902,68.698],[4.902,68.698],[4.902,68.698],[4.902,68.697],[4.9,68.668],[4.9,68.663],[4.892,68.509],[4.88,68.269],[4.848,67.661],[4.823,67.158],[4.667,64.131]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12.5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.5,41.5],[-13.5,41.5],[-8,89.5],[6,90],[5.151,73.537],[5.038,71.339],[4.929,69.217],[4.914,68.939],[4.908,68.809],[4.902,68.698],[4.902,68.698],[4.902,68.698],[4.902,68.697],[4.9,68.668],[4.9,68.663],[4.892,68.509],[4.88,68.269],[4.848,67.661],[4.823,67.158],[4.667,64.131]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[46,51],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[46.486,83.156],[46.452,80.869],[46.447,80.569],[46.445,80.429],[46.443,80.309],[46.443,80.309],[46.443,80.309],[46.443,80.309],[46.443,80.278],[46.442,80.272],[46.44,80.106],[46.436,79.847],[46.426,79.192],[46.418,78.65],[46.369,75.388]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18.75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[46,51],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[46.486,83.156],[46.452,80.869],[46.447,80.569],[46.445,80.429],[46.443,80.309],[46.443,80.309],[46.443,80.309],[46.443,80.309],[46.443,80.278],[46.442,80.272],[46.44,80.106],[46.436,79.847],[46.426,79.192],[46.418,78.65],[46.369,75.388]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[59.396,48.603],[59.127,45.134],[59.002,43.519],[58.895,42.138],[58.895,42.135],[58.895,42.135],[58.895,42.13],[58.867,41.77],[58.862,41.702],[58.714,39.791],[58.483,36.802],[57.897,29.236],[57.413,22.983],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":26.25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[59.396,48.603],[59.127,45.134],[59.002,43.519],[58.895,42.138],[58.895,42.135],[58.895,42.135],[58.895,42.13],[58.867,41.77],[58.862,41.702],[58.714,39.791],[58.483,36.802],[57.897,29.236],[57.413,22.983],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[63.736,48.78],[64.038,45.335],[64.178,43.731],[64.298,42.359],[64.299,42.357],[64.299,42.356],[64.299,42.352],[64.33,41.994],[64.336,41.926],[64.503,40.028],[64.763,37.059],[65.421,29.545],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[63.736,48.78],[64.038,45.335],[64.178,43.731],[64.298,42.359],[64.299,42.357],[64.299,42.356],[64.299,42.352],[64.33,41.994],[64.336,41.926],[64.503,40.028],[64.763,37.059],[65.421,29.545],[64.827,-14.457],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[81.251,58.077],[81.371,51.622],[81.427,48.619],[81.475,46.048],[81.475,46.044],[81.475,46.043],[81.475,46.035],[81.488,45.365],[81.49,45.237],[81.556,41.682],[81.659,36.12],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[81.251,58.077],[81.371,51.622],[81.427,48.619],[81.475,46.048],[81.475,46.044],[81.475,46.043],[81.475,46.035],[81.488,45.365],[81.49,45.237],[81.556,41.682],[81.659,36.12],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.336,2.318],[0.38,2.831],[0,0],[0.002,0.016],[0.01,0.074],[0.147,1.172],[0.048,0.39],[-0.398,0.146],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.303,-2.09],[-0.005,-0.04],[0,0],[-0.01,-0.074],[-0.158,-1.185],[-0.05,-0.398],[-0.617,-5.064],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[90.865,81.643],[89.794,73.991],[89.778,73.87],[89.772,73.822],[89.742,73.599],[89.281,70.045],[89.135,68.862],[88.515,59.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.336,2.318],[0.38,2.831],[0,0],[0.002,0.016],[0.01,0.074],[0.147,1.172],[0.048,0.39],[-0.398,0.146],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.303,-2.09],[-0.005,-0.04],[0,0],[-0.01,-0.074],[-0.158,-1.185],[-0.05,-0.398],[-0.617,-5.064],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[90.865,81.643],[89.794,73.991],[89.778,73.87],[89.772,73.822],[89.742,73.599],[89.281,70.045],[89.135,68.862],[88.515,59.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.605,4.652],[0.707,5.67],[0.01,0.081],[0.004,0.032],[0.019,0.149],[0.282,2.343],[0.093,0.78],[-0.398,0.146],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.546,-4.194],[-0.01,-0.081],[-0.004,-0.032],[-0.019,-0.149],[-0.295,-2.373],[-0.096,-0.796],[-1.201,-10.121],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[90.417,77.766],[88.46,62.424],[88.43,62.183],[88.418,62.088],[88.362,61.641],[87.491,54.526],[87.208,52.161],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.605,4.652],[0.707,5.67],[0.01,0.081],[0.004,0.032],[0.019,0.149],[0.282,2.343],[0.093,0.78],[-0.398,0.146],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.546,-4.194],[-0.01,-0.081],[-0.004,-0.032],[-0.019,-0.149],[-0.295,-2.373],[-0.096,-0.796],[-1.201,-10.121],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[90.417,77.766],[88.46,62.424],[88.43,62.183],[88.418,62.088],[88.362,61.641],[87.491,54.526],[87.208,52.161],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[-0.02,0.137],[-0.007,0.052],[0.001,0.218],[1.949,-0.257],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.031,-0.146],[0.008,-0.054],[0.031,-0.246],[-0.016,-3.466],[-0.662,0.087],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[41,-15.5],[-3.5,41.5],[-6,90.5],[16,90],[56.522,85.525],[71.438,75.001],[81.251,96.577],[101.432,85.489],[105.72,51.786],[109.753,42.158],[111.33,42.983],[112.602,41.824],[109.895,40.878],[112.587,37.251],[111.48,37.442],[95.515,33.361],[89.814,42.439],[91.921,22.045],[74.827,-14.457],[64.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63.75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[-0.02,0.137],[-0.007,0.052],[0.001,0.218],[1.949,-0.257],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.031,-0.146],[0.008,-0.054],[0.031,-0.246],[-0.016,-3.466],[-0.662,0.087],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[41,-15.5],[-3.5,41.5],[-6,90.5],[16,90],[56.522,85.525],[71.438,75.001],[81.251,96.577],[101.432,85.489],[105.72,51.786],[109.753,42.158],[111.33,42.983],[112.602,41.824],[109.895,40.878],[112.587,37.251],[111.48,37.442],[95.515,33.361],[89.814,42.439],[91.921,22.045],[74.827,-14.457],[64.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[2.392,3.689],[1.083,1.699],[0.034,3.46],[0.009,12.741],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.049,-0.233],[-0.939,-1.449],[-5.086,-7.973],[-0.045,-4.534],[-0.003,-4.327],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[97.72,111.786],[122.753,116.658],[118.697,110.115],[115.63,105.354],[108.31,84.18],[108.237,41.212],[108.23,34.048],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":68.75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[2.392,3.689],[1.083,1.699],[0.034,3.46],[0.009,12.741],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.049,-0.233],[-0.939,-1.449],[-5.086,-7.973],[-0.045,-4.534],[-0.003,-4.327],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[97.72,111.786],[122.753,116.658],[118.697,110.115],[115.63,105.354],[108.31,84.18],[108.237,41.212],[108.23,34.048],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[0.347,3.557],[0.161,1.639],[0.034,3.46],[4.388,13.024],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.049,-0.233],[-0.136,-1.397],[-0.757,-7.694],[-0.045,-4.534],[-1.49,-4.423],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-35.5],[-13.5,21.5],[-7.818,96.275],[6.182,96.775],[46.704,92.299],[60.87,81.751],[70.683,103.327],[90.864,92.239],[97.095,91.786],[122.753,96.658],[122.222,90.342],[121.771,85.75],[120.06,65.074],[106.97,21.266],[104.48,13.942],[85.515,13.361],[79.814,22.439],[81.921,2.045],[64.827,-34.457],[54.499,-34.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[0.347,3.557],[0.161,1.639],[0.034,3.46],[4.388,13.024],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.049,-0.233],[-0.136,-1.397],[-0.757,-7.694],[-0.045,-4.534],[-1.49,-4.423],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-35.5],[-13.5,21.5],[-7.818,96.275],[6.182,96.775],[46.704,92.299],[60.87,81.751],[70.683,103.327],[90.864,92.239],[97.095,91.786],[122.753,96.658],[122.222,90.342],[121.771,85.75],[120.06,65.074],[106.97,21.266],[104.48,13.942],[85.515,13.361],[79.814,22.439],[81.921,2.045],[64.827,-34.457],[54.499,-34.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[0.545,11.145],[0.25,5.06],[0.034,3.46],[3.965,-3.222],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.049,-0.233],[-0.214,-4.377],[-1.176,-23.754],[-0.045,-4.534],[-1.346,1.094],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-25.5],[-13.5,31.5],[-8,89.5],[6,90],[47.522,84.275],[62.438,73.751],[71.183,100.327],[91.364,89.239],[97.72,101.786],[122.753,106.658],[121.881,87.265],[121.177,72.969],[118.56,17.574],[106.73,22.054],[104.48,23.942],[85.515,23.361],[79.814,32.439],[81.921,12.045],[64.827,-24.457],[54.499,-24.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[0.545,11.145],[0.25,5.06],[0.034,3.46],[3.965,-3.222],[0.001,0.004],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.049,-0.233],[-0.214,-4.377],[-1.176,-23.754],[-0.045,-4.534],[-1.346,1.094],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-25.5],[-13.5,31.5],[-8,89.5],[6,90],[47.522,84.275],[62.438,73.751],[71.183,100.327],[91.364,89.239],[97.72,101.786],[122.753,106.658],[121.881,87.265],[121.177,72.969],[118.56,17.574],[106.73,22.054],[104.48,23.942],[85.515,23.361],[79.814,32.439],[81.921,12.045],[64.827,-24.457],[54.499,-24.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[-19.442,26.716],[-2.668,8.81],[0.032,3.273],[-0.42,-3.904],[0.002,0.005],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.052,-0.25],[7.635,-10.492],[11.052,-36.494],[-0.04,-4.114],[0.42,3.904],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[97.72,111.786],[122.753,116.658],[170.518,62.793],[187.094,33.028],[164.06,-23.426],[106.08,-11.904],[104.48,33.942],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":92.5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[-19.442,26.716],[-2.668,8.81],[0.032,3.273],[-0.42,-3.904],[0.002,0.005],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.052,-0.25],[7.635,-10.492],[11.052,-36.494],[-0.04,-4.114],[0.42,3.904],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[97.72,111.786],[122.753,116.658],[170.518,62.793],[187.094,33.028],[164.06,-23.426],[106.08,-11.904],[104.48,33.942],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.677,11.764],[-1.163,5.562],[-19.414,27.8],[-2.375,7.842],[0.032,3.273],[-0.42,-3.904],[0.002,0.005],[-0.427,0.157],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.026,-7.611],[0.054,-0.261],[6.505,-9.315],[11.052,-36.494],[-0.04,-4.114],[0.42,3.904],[0.935,-0.532],[0.985,-0.361],[0,0],[0,0],[0,0],[0,0]],"v":[[31,-15.5],[-13.5,41.5],[-8,89.5],[6,90],[46.522,85.525],[61.438,75.001],[71.251,96.577],[91.432,85.489],[97.72,111.786],[122.753,116.658],[219.983,107.837],[187.094,33.028],[164.06,-23.426],[106.08,-11.904],[104.48,33.942],[85.515,33.361],[79.814,42.439],[81.921,22.045],[64.827,-14.457],[54.499,-14.678]],"c":true}]},{"t":103.75}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-92.43,41.943],[-92.43,29.503],[-89.412,29.503],[-89.412,19.37],[-86.393,19.37],[-86.393,16.331],[-85.89,16.331],[-85.265,9.743],[-82.75,9.743],[-83.375,16.331],[-82.369,16.331],[-82.369,15.824],[-80.86,15.824],[-80.86,16.331],[-79.854,16.331],[-79.854,24.943],[-72.811,24.943],[-72.811,30.01],[-70.296,30.01],[-70.296,31.023],[-69.793,31.023],[-69.793,30.516],[-64.763,30.516],[-64.763,33.049],[-56.211,33.049],[-56.211,27.984],[-54.199,27.984],[-54.199,25.958],[-50.678,25.958],[-50.678,25.451],[-48.665,25.451],[-48.665,25.958],[-47.156,25.958],[-47.156,28.49],[-45.647,28.49],[-45.647,35.077],[-43.635,35.077],[-43.01,-12.549],[-39.489,-12.549],[-39.489,-18.122],[-34.458,-18.122],[-34.458,-21.163],[-30.938,-21.163],[-30.938,-42.443],[-27.919,-42.443],[-27.919,-21.163],[-23.895,-21.163],[-23.895,-18.122],[-19.367,-18.122],[-19.367,-12.044],[-16.852,-12.044],[-16.852,10.251],[-6.288,10.251],[-6.913,40.65],[-5.908,40.65],[-5.908,23.93],[-5.404,23.93],[-4.779,3.663],[0.755,3.663],[0.755,-0.389],[3.774,-0.389],[3.774,2.144],[7.798,2.144],[7.798,3.663],[13.834,3.663],[13.834,33.049],[16.349,33.049],[16.349,31.023],[26.913,31.023],[26.913,-8.497],[31.441,-8.497],[31.441,-10.016],[34.458,-10.016],[34.458,-13.564],[39.489,-13.564],[39.489,-15.589],[40.997,-15.589],[40.997,-34.337],[44.017,-34.337],[44.017,-15.589],[45.525,-15.589],[45.525,-13.564],[50.557,-13.564],[50.557,-10.016],[53.574,-10.016],[53.574,-7.99],[57.599,-7.99],[57.599,3.663],[62.629,3.663],[62.629,0.118],[72.188,0.118],[72.188,1.131],[76.212,1.131],[76.212,4.171],[82.247,4.171],[82.247,3.157],[88.788,3.157],[88.788,5.691],[91.805,5.691],[91.805,42.443]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.941176474094,0.466666668653,0.184313729405,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[92.187,43.056],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":165,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"melbourne_purple Outlines Comp 1","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,42.5,0],"ix":2},"a":{"a":0,"k":[100,42.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":85,"ip":0,"op":165,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"melbourne_purple Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,42.5,0],"ix":2},"a":{"a":0,"k":[92.5,42.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-91.805,41.943],[-91.805,29.503],[-88.787,29.503],[-88.787,19.37],[-85.768,19.37],[-85.768,16.331],[-85.265,16.331],[-85.265,9.743],[-82.75,9.743],[-82.75,16.331],[-81.744,16.331],[-81.744,15.824],[-80.235,15.824],[-80.235,16.331],[-79.229,16.331],[-79.229,24.943],[-72.186,24.943],[-72.186,30.01],[-69.671,30.01],[-69.671,31.023],[-69.168,31.023],[-69.168,30.516],[-64.138,30.516],[-64.138,33.049],[-55.586,33.049],[-55.586,27.984],[-53.574,27.984],[-53.574,25.958],[-50.053,25.958],[-50.053,25.451],[-48.04,25.451],[-48.04,25.958],[-46.531,25.958],[-46.531,28.49],[-45.022,28.49],[-45.022,35.077],[-43.01,35.077],[-43.01,-12.549],[-39.489,-12.549],[-39.489,-18.122],[-34.458,-18.122],[-34.458,-21.163],[-30.938,-21.163],[-30.938,-42.443],[-27.919,-42.443],[-27.919,-21.163],[-23.895,-21.163],[-23.895,-18.122],[-19.367,-18.122],[-19.367,-12.044],[-16.852,-12.044],[-16.852,10.251],[-6.288,10.251],[-6.288,40.65],[-5.283,40.65],[-5.283,23.93],[-4.779,23.93],[-4.779,3.663],[0.755,3.663],[0.755,-0.389],[3.774,-0.389],[3.774,2.144],[7.798,2.144],[7.798,3.663],[13.834,3.663],[13.834,33.049],[16.35,33.049],[16.35,31.023],[26.913,31.023],[26.913,-8.497],[31.441,-8.497],[31.441,-10.016],[34.459,-10.016],[34.459,-13.564],[39.489,-13.564],[39.489,-15.589],[40.997,-15.589],[40.997,-34.337],[44.017,-34.337],[44.017,-15.589],[45.525,-15.589],[45.525,-13.564],[50.557,-13.564],[50.557,-10.016],[53.574,-10.016],[53.574,-7.99],[57.599,-7.99],[57.599,3.663],[62.629,3.663],[62.629,0.118],[72.188,0.118],[72.188,1.131],[76.212,1.131],[76.212,4.171],[82.247,4.171],[82.247,3.157],[88.788,3.157],[88.788,5.691],[91.805,5.691],[91.805,42.443]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.458999992819,0.372999991623,0.638999968884,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[92.187,43.056],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":165,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"melbourne","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,42.5,0],"ix":2},"a":{"a":0,"k":[100,42.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":85,"ip":0,"op":165,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/settings.json b/example/resource/settings.json new file mode 100644 index 0000000000..5dc781b559 --- /dev/null +++ b/example/resource/settings.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":29.9700012207031,"ip":0,"op":143.000005824509,"w":200,"h":100,"nm":"Composição 2","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"settings contornos","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[10,10,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-48.351],[48.351,0],[0,48.351],[-48.35,0]],"o":[[0,48.351],[-48.35,0],[0,-48.351],[48.351,0]],"v":[[87.547,0],[0,87.546],[-87.547,0],[0,-87.546]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[0.36862745098,0.486274509804,0.701960784314,1],"e":[1,1,1,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":120,"s":[1,1,1,1],"e":[0.368627458811,0.486274510622,0.701960802078,1]},{"t":135.000005498663}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[508.477,496.992],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-17.498,0],[-30.346,-22.349],[2.857,-40.794],[0,0],[-0.017,-0.034],[-21.335,-0.186],[0,0],[-1.049,1.032],[-0.068,1.267],[-46.372,32.628],[0,0],[-36.939,-23.297],[-7.963,-4.615],[-0.981,26.154],[0,0],[18.376,16.162],[-4.04,40.134],[-35.266,20.186],[-0.372,1.86],[32.273,42.197],[5.022,3.314],[2.586,-2.35],[35.671,22.401],[2.925,1.707],[-14.454,69.043],[27.641,0],[0,0],[0,0],[4.97,-6.83],[31.816,-28.79],[3.753,-3.483],[32.104,3.432],[7.016,7.489],[2.839,-0.034],[10.498,-12.594],[-59.694,-56.194],[0,0],[20.084,-76.532],[33.981,-17.261],[4.919,-2.587],[-28.655,-54.809],[-6.34,-1.826],[-18.512,10.905],[-4.328,2.349],[-1.809,1.049]],"o":[[21.03,0],[59.34,43.685],[0,0],[-0.355,10.583],[6.526,6.847],[0,0],[57.412,0.693],[-0.034,-0.085],[3.11,-66.592],[0,0],[65.358,-46.221],[6.323,3.973],[27.268,-12.088],[0,0],[-14.251,-11.936],[-26.897,-23.583],[4.581,-45.51],[33.338,-19.086],[0.812,-4.057],[-21.368,-27.946],[-1.403,1.015],[-70.734,64.157],[-2.958,-1.843],[-23.989,-14.066],[-10.397,-7.607],[0,0],[0,0],[-28.029,-1.521],[0.186,54.47],[-3.111,2.807],[-38.325,35.671],[-22.536,-2.299],[-24.547,-22.045],[-15.03,1.031],[-35.807,42.924],[0,0],[29.788,27.067],[-8.689,33.118],[-4.902,2.485],[-7.946,4.192],[23.398,44.8],[10.295,2.958],[4.751,-2.806],[1.961,-1.048],[16.162,-9.399]],"v":[[-202.259,227.105],[-127.215,258.229],[-53.506,368.472],[-53.708,371.852],[-52.035,385.766],[15.52,393.137],[18.445,393.154],[88.266,382.317],[88.452,380.306],[145.39,266.141],[149.887,262.963],[290.374,264.079],[311.625,277.079],[390,171.942],[367.176,152.788],[330.88,121.631],[297.795,2.513],[359.569,-99.378],[396.846,-130.552],[363.812,-190.787],[325.757,-231.784],[319.807,-226.864],[153.691,-222.638],[144.849,-227.929],[90.835,-337.107],[18.682,-351.865],[18.209,-351.865],[15.469,-351.95],[-49.195,-339.456],[-93.792,-239.104],[-104.054,-229.721],[-208.666,-181.574],[-252.182,-202.452],[-290.084,-225.41],[-347.581,-173.476],[-322.544,-73.293],[-314.209,-65.533],[-279.705,73.652],[-354.479,140.346],[-369.271,147.953],[-360.582,213.294],[-313.583,268.965],[-270.88,253.563],[-257.237,245.753],[-251.607,242.574]],"c":true},"ix":2},"nm":"Caminho 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[98.662,0],[1.351,0.017],[0,0],[31.833,33.186],[-1.048,31.985],[-0.153,2.147],[-0.018,0.321],[26.982,19.881],[2.739,0.897],[1.961,-1.133],[2.807,-1.522],[3.737,-2.214],[46.829,13.388],[29.027,55.553],[-43.887,23.16],[-5.292,2.687],[-6.712,4.903],[11.598,10.532],[0,0],[-88.011,105.525],[-47.962,3.263],[-23.601,-20.844],[-17.227,16.044],[-3.382,3.06],[0,20.946],[-18.004,16.922],[-17.244,-0.93],[-35.992,-44.733],[5.63,-25.342],[-0.017,-1.369],[-4.582,-2.688],[-3.72,-2.333],[-21.369,19.374],[-32.19,-2.723],[-28.519,-37.294],[8.707,-43.144],[32.171,-18.427],[3.939,-15.755],[-4.43,-8.892],[-12.916,-10.802],[0,0],[46.711,-68.062],[54.521,30.025],[9.45,5.968],[3.754,0.389],[14.1,-9.975],[0,0],[1.911,-2.248],[0.423,-9.095]],"o":[[-1.352,0],[0,0],[-47.911,-0.407],[-18.123,-18.866],[0.085,-2.266],[0.017,-0.321],[-2.79,-3.703],[-13.592,-10.009],[-1.69,0.846],[-2.603,1.521],[-3.431,1.825],[-25.324,14.894],[-38.207,-10.939],[-56.685,-108.433],[5.325,-2.806],[10.279,-5.224],[7.235,-30.853],[0,0],[-59.086,-55.637],[34.86,-41.791],[41.385,-2.874],[5.46,-2.163],[4.057,-3.787],[16.297,-14.742],[0,-24.953],[39.965,-37.548],[25.68,0.067],[15.638,19.424],[-1.015,4.53],[2.756,2.367],[3.651,2.147],[35.924,22.536],[14.962,-13.575],[39.931,3.634],[35.774,46.778],[-8.875,43.988],[-5.343,3.043],[-5.664,22.637],[15.333,13.441],[0,0],[39.357,33.151],[-40.151,58.494],[-12.798,-7.032],[-9.112,-5.732],[0.034,0],[0,0],[-7.371,5.189],[-1.217,3.702],[-2.959,63.312]],"v":[[21.758,479.728],[17.702,479.711],[14.777,479.678],[-114.501,445.663],[-140.232,369.013],[-139.86,362.419],[-139.792,361.473],[-178.541,327.915],[-202.006,313.984],[-208.143,317.416],[-216.224,321.998],[-226.976,328.168],[-337.387,352.175],[-437.3,253.377],[-409.676,71.404],[-393.683,63.171],[-361.883,45.521],[-372.416,-1.46],[-381.866,-10.251],[-414.055,-228.926],[-295.951,-311.765],[-196.714,-268.96],[-163.021,-293.084],[-151.863,-303.295],[-135.566,-338.983],[-108.044,-402.988],[19.307,-438.422],[160.216,-389.632],[175.736,-320.217],[174.603,-311.579],[188.619,-302.602],[199.709,-295.941],[261.651,-290.971],[332.233,-319.321],[432.584,-243.364],[481.696,-113.443],[402.578,-24.249],[385.756,0.433],[390.659,58.944],[422.729,86.399],[449.795,109.121],[438.045,270.773],[277.221,357.043],[244.221,337.298],[218.896,323.316],[199.843,333.663],[195.195,336.926],[177.545,350.247],[174.908,384.346]],"c":true},"ix":2},"nm":"Caminho 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"n":["0p667_1_1_0"],"t":15,"s":[0.36862745098,0.486274509804,0.701960784314,1],"e":[1,1,1,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.05],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p05_1_0p333_0"],"t":120,"s":[1,1,1,1],"e":[0.368627458811,0.486274510622,0.701960802078,1]},{"t":135.000005498663}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[490.403,479.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":137.000005580124,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"settings","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[56,56,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":0,"op":6.00000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"settings","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[56,56,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":-0.30272728505761,"op":0,"st":-12.00000048877,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"settings","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,50,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[56,56,100],"ix":6}},"ao":0,"w":100,"h":100,"ip":6.00000024438501,"op":143.000005824509,"st":6.00000024438501,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Camada de forma 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[103,51,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[97.826,93.75,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[185.893,83.764],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":489,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.36862745098,0.486274509804,0.701960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.947,-2.161],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143.000005824509,"st":-12.00000048877,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Camada de forma 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[103,51.12,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,93.447,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[185.893,83.764],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":489,"ix":4},"nm":"Caminho do retângulo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.36862745098,0.486274509804,0.701960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.486274509804,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.486274509804,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.947,-2.161],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Retângulo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143.000005824509,"st":-12.00000048877,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Camada de forma 3","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,50,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[0,0,100],"e":[569,569,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":33,"s":[569,569,100],"e":[569,569,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":127,"s":[569,569,100],"e":[0,0,100]},{"t":142.000005783779}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.12,0],[0,-15.12],[-15.12,0],[0,15.12]],"o":[[-15.12,0],[0,15.12],[15.12,0],[0,-15.12]],"v":[[0,-27.376],[-27.376,0],[0,27.376],[27.376,0]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.36862745098,0.486274509804,0.701960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.486274509804,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.955,1.286],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Elipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143.000005824509,"st":-12.00000048877,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/tile_grid_loading_animation.json b/example/resource/tile_grid_loading_animation.json new file mode 100644 index 0000000000..4530a779a4 --- /dev/null +++ b/example/resource/tile_grid_loading_animation.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":60,"ip":0,"op":120,"w":800,"h":800,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"e1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,337],[304,337],[304,305],[336,305]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,401],[240,401],[240,241],[400,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,401],[240,401],[240,241],[400,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,401],[240,401],[240,241],[400,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":85,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,401],[240,401],[240,241],[400,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,337],[304,337],[304,305],[336,305]],"c":true}]},{"t":115}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"e1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"d1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,337],[144,337],[144,305],[176,305]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,401],[80,401],[80,241],[240,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,401],[80,401],[80,241],[240,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,401],[80,401],[80,241],[240,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,401],[80,401],[80,241],[240,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,337],[144,337],[144,305],[176,305]],"c":true}]},{"t":110}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"d1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"c1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,337],[-16,337],[-16,305],[16,305]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,401],[-80,401],[-80,241],[80,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,401],[-80,401],[-80,241],[80,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,401],[-80,401],[-80,241],[80,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,401],[-80,401],[-80,241],[80,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,337],[-16,337],[-16,305],[16,305]],"c":true}]},{"t":105}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"c1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"b1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,337],[-176,337],[-176,305],[-144,305]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,401],[-240,401],[-240,241],[-80,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,401],[-240,401],[-240,241],[-80,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,401],[-240,401],[-240,241],[-80,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,401],[-240,401],[-240,241],[-80,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,337],[-176,337],[-176,305],[-144,305]],"c":true}]},{"t":100}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"a1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,337],[-336,337],[-336,305],[-304,305]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,401],[-400,401],[-400,241],[-240,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,401],[-400,401],[-400,241],[-240,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,401],[-400,401],[-400,241],[-240,241]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":65,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,401],[-400,401],[-400,241],[-240,241]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,337],[-336,337],[-336,305],[-304,305]],"c":true}]},{"t":95}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"a1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"e2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,177],[304,177],[304,145],[336,145]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,241],[240,241],[240,81],[400,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,241],[240,241],[240,81],[400,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,241],[240,241],[240,81],[400,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,241],[240,241],[240,81],[400,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,177],[304,177],[304,145],[336,145]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"e2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"d2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,177],[144,177],[144,145],[176,145]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,241],[80,241],[80,81],[240,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,241],[80,241],[80,81],[240,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,241],[80,241],[80,81],[240,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":85,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,241],[80,241],[80,81],[240,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,177],[144,177],[144,145],[176,145]],"c":true}]},{"t":115}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"d2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"c2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,177],[-16,177],[-16,145],[16,145]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,241],[-80,241],[-80,81],[80,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,241],[-80,241],[-80,81],[80,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,241],[-80,241],[-80,81],[80,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,241],[-80,241],[-80,81],[80,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,177],[-16,177],[-16,145],[16,145]],"c":true}]},{"t":110}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"c2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"b2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,177],[-176,177],[-176,145],[-144,145]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,241],[-240,241],[-240,81],[-80,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,241],[-240,241],[-240,81],[-80,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,241],[-240,241],[-240,81],[-80,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,241],[-240,241],[-240,81],[-80,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,177],[-176,177],[-176,145],[-144,145]],"c":true}]},{"t":105}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"a2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,177],[-336,177],[-336,145],[-304,145]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,241],[-400,241],[-400,81],[-240,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,241],[-400,241],[-400,81],[-240,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,241],[-400,241],[-400,81],[-240,81]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,241],[-400,241],[-400,81],[-240,81]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,177],[-336,177],[-336,145],[-304,145]],"c":true}]},{"t":100}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"a2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"e3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p833_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[344.976,25.976],[295.024,25.976],[295.024,-23.976],[344.976,-23.976]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,17],[304,17],[304,-15],[336,-15]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,17],[304,17],[304,-15],[336,-15]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,17],[304,17],[304,-15],[336,-15]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,17],[304,17],[304,-15],[336,-15]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,81],[240,81],[240,-79],[400,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":65,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,81],[240,81],[240,-79],[400,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,81],[240,81],[240,-79],[400,-79]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":95,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,81],[240,81],[240,-79],[400,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[344.976,25.976],[295.024,25.976],[295.024,-23.976],[344.976,-23.976]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"e3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"d3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,17],[144,17],[144,-15],[176,-15]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,81],[80,81],[80,-79],[240,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,81],[80,81],[80,-79],[240,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,81],[80,81],[80,-79],[240,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,81],[80,81],[80,-79],[240,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,17],[144,17],[144,-15],[176,-15]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"d3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"c3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,17],[-16,17],[-16,-15],[16,-15]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,81],[-80,81],[-80,-79],[80,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,81],[-80,81],[-80,-79],[80,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,81],[-80,81],[-80,-79],[80,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":85,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,81],[-80,81],[-80,-79],[80,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,17],[-16,17],[-16,-15],[16,-15]],"c":true}]},{"t":115}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"c3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"b3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,17],[-176,17],[-176,-15],[-144,-15]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,81],[-240,81],[-240,-79],[-80,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,81],[-240,81],[-240,-79],[-80,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,81],[-240,81],[-240,-79],[-80,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,81],[-240,81],[-240,-79],[-80,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,17],[-176,17],[-176,-15],[-144,-15]],"c":true}]},{"t":110}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"a3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,17],[-336,17],[-336,-15],[-304,-15]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,81],[-400,81],[-400,-79],[-240,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,81],[-400,81],[-400,-79],[-240,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,81],[-400,81],[-400,-79],[-240,-79]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,81],[-400,81],[-400,-79],[-240,-79]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,17],[-336,17],[-336,-15],[-304,-15]],"c":true}]},{"t":105}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"a3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"e4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[352.593,-126.407],[287.407,-126.407],[287.407,-191.593],[352.593,-191.593]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-143],[304,-143],[304,-175],[336,-175]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-143],[304,-143],[304,-175],[336,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-143],[304,-143],[304,-175],[336,-175]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-143],[304,-143],[304,-175],[336,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-79],[240,-79],[240,-239],[400,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-79],[240,-79],[240,-239],[400,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-79],[240,-79],[240,-239],[400,-239]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":100,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-79],[240,-79],[240,-239],[400,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[352.593,-126.407],[287.407,-126.407],[287.407,-191.593],[352.593,-191.593]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"e4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"d4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[180.741,-138.259],[139.259,-138.259],[139.259,-179.741],[180.741,-179.741]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-143],[144,-143],[144,-175],[176,-175]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-143],[144,-143],[144,-175],[176,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-143],[144,-143],[144,-175],[176,-175]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-143],[144,-143],[144,-175],[176,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-79],[80,-79],[80,-239],[240,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":65,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-79],[80,-79],[80,-239],[240,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-79],[80,-79],[80,-239],[240,-239]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":95,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-79],[80,-79],[80,-239],[240,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[180.741,-138.259],[139.259,-138.259],[139.259,-179.741],[180.741,-179.741]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"d4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"c4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,-143],[-16,-143],[-16,-175],[16,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-79],[-80,-79],[-80,-239],[80,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-79],[-80,-79],[-80,-239],[80,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-79],[-80,-79],[-80,-239],[80,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-79],[-80,-79],[-80,-239],[80,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,-143],[-16,-143],[-16,-175],[16,-175]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"c4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"b4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,-143],[-176,-143],[-176,-175],[-144,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-79],[-240,-79],[-240,-239],[-80,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-79],[-240,-79],[-240,-239],[-80,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-79],[-240,-79],[-240,-239],[-80,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":85,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-79],[-240,-79],[-240,-239],[-80,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,-143],[-176,-143],[-176,-175],[-144,-175]],"c":true}]},{"t":115}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"a4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,-143],[-336,-143],[-336,-175],[-304,-175]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-79],[-400,-79],[-400,-239],[-240,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-79],[-400,-79],[-400,-239],[-240,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-79],[-400,-79],[-400,-239],[-240,-239]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-79],[-400,-79],[-400,-239],[-240,-239]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,-143],[-336,-143],[-336,-175],[-304,-175]],"c":true}]},{"t":110}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"a4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"e5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[368,-271],[272,-271],[272,-367],[368,-367]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-303],[304,-303],[304,-335],[336,-335]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-303],[304,-303],[304,-335],[336,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-303],[304,-303],[304,-335],[336,-335]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[336,-303],[304,-303],[304,-335],[336,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-239],[240,-239],[240,-399],[400,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-239],[240,-239],[240,-399],[400,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-239],[240,-239],[240,-399],[400,-399]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":105,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[400,-239],[240,-239],[240,-399],[400,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[368,-271],[272,-271],[272,-367],[368,-367]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"e5","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"d5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[192.593,-286.407],[127.407,-286.407],[127.407,-351.593],[192.593,-351.593]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-303],[144,-303],[144,-335],[176,-335]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-303],[144,-303],[144,-335],[176,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-303],[144,-303],[144,-335],[176,-335]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[176,-303],[144,-303],[144,-335],[176,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-239],[80,-239],[80,-399],[240,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-239],[80,-239],[80,-399],[240,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-239],[80,-239],[80,-399],[240,-399]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":100,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[240,-239],[80,-239],[80,-399],[240,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[192.593,-286.407],[127.407,-286.407],[127.407,-351.593],[192.593,-351.593]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"d5","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"c5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.741,-298.259],[-20.741,-298.259],[-20.741,-339.741],[20.741,-339.741]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,-303],[-16,-303],[-16,-335],[16,-335]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":5,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,-303],[-16,-303],[-16,-335],[16,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,-303],[-16,-303],[-16,-335],[16,-335]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16,-303],[-16,-303],[-16,-335],[16,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-239],[-80,-239],[-80,-399],[80,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":65,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-239],[-80,-239],[-80,-399],[80,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-239],[-80,-239],[-80,-399],[80,-399]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":95,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80,-239],[-80,-239],[-80,-399],[80,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.741,-298.259],[-20.741,-298.259],[-20.741,-339.741],[20.741,-339.741]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"c5","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"b5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,-303],[-176,-303],[-176,-335],[-144,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-239],[-240,-239],[-240,-399],[-80,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-239],[-240,-239],[-240,-399],[-80,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-239],[-240,-239],[-240,-399],[-80,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80,-239],[-240,-239],[-240,-399],[-80,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-144,-303],[-176,-303],[-176,-335],[-144,-335]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"b5","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"a5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,-303],[-336,-303],[-336,-335],[-304,-335]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-239],[-400,-239],[-400,-399],[-240,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-239],[-400,-239],[-400,-399],[-240,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-239],[-400,-239],[-400,-399],[-240,-399]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":85,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-240,-239],[-400,-239],[-400,-399],[-240,-399]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-304,-303],[-336,-303],[-336,-335],[-304,-335]],"c":true}]},{"t":115}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"a5","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 829533e47c6e26d061493c44e4547ec40c42e65c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 14 Sep 2018 13:41:56 +0900 Subject: [PATCH 262/672] lottie/parser: fixed a crash when lottie resource has empty path data. Change-Id: I83d04fa6a1034f71e8cf9b6468b192b56a4c8185 --- example/resource/night_own.json | 1 + src/lottie/lottieparser.cpp | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 example/resource/night_own.json diff --git a/example/resource/night_own.json b/example/resource/night_own.json new file mode 100644 index 0000000000..8295bf0787 --- /dev/null +++ b/example/resource/night_own.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":60,"ip":0,"op":42,"w":800,"h":600,"nm":"both wing","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"left eye Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[388.739,339.119,0],"ix":2},"a":{"a":0,"k":[61.417,54.715,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.463,-1.546],[1.546,0.463],[-0.463,1.546],[-1.546,-0.464]],"o":[[-0.463,1.546],[-1.546,-0.463],[0.463,-1.546],[1.545,0.463]],"v":[[2.799,0.839],[-0.838,2.8],[-2.799,-0.838],[0.839,-2.798]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40800000359,0.40800000359,0.40800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.609,58.09],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-22.228,-35.258]],"o":[[0,0],[0,0]],"v":[[-26.416,-19.715],[26.416,19.715]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[61.416,54.715],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.344,2.108],[0.647,-0.815],[-5.527,-4.393],[-3.38,4.252],[-0.282,0.979],[3.273,2.601]],"o":[[-0.89,0.494],[-3.38,4.252],[5.528,4.394],[0.646,-0.813],[-2.809,-2.782],[-3.272,-2.601]],"v":[[-6.686,-11.062],[-9.011,-9.1],[-5.123,6.554],[11.006,6.809],[12.391,4.102],[3.262,-3.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.852,55.915],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.245,3.279],[1.78,-2.239],[-12.224,-9.717],[-6.421,8.079],[-0.147,2.978],[7.182,5.708]],"o":[[-2.869,0.815],[-6.422,8.079],[12.224,9.717],[1.781,-2.238],[-4.829,-6.319],[-7.182,-5.709]],"v":[[-13.249,-23.918],[-20.348,-19.349],[-9.84,12.873],[23.921,15.839],[26.77,7.894],[8.647,-10.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.745000023935,0.023999999551,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.543,60.603],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"nose Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[428.559,400.809,0],"ix":2},"a":{"a":0,"k":[16.853,34.516,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.412,9.474],[-1.702,7.37],[-2.586,-14.341],[-5.909,-9.193]],"o":[[-1.537,-10.304],[-5.545,2.582],[2.539,14.085],[-3.364,-6.396]],"v":[[0.637,1.503],[1.085,-25.788],[-4.037,-2.421],[6.623,25.788]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.246999987434,0.246999987434,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[10.345,35.584],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.544,-23.068],[13.188,-16.711],[0.673,20.085],[-11.076,-0.179]],"o":[[-0.426,18.067],[-12.416,-17.378],[-0.683,-20.378],[8.553,0.138]],"v":[[16.059,-8.318],[0.183,34.266],[-15.92,-8.318],[0.569,-34.087]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.853,34.516],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"right eye Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[467.347,339.161,0],"ix":2},"a":{"a":0,"k":[60.439,55.96,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.537,-1.521],[1.522,-0.538],[0.537,1.522],[-1.522,0.537]],"o":[[0.537,1.521],[-1.522,0.537],[-0.536,-1.522],[1.522,-0.536]],"v":[[2.756,-0.973],[0.971,2.756],[-2.757,0.971],[-0.973,-2.757]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40800000359,0.40800000359,0.40800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.246,58.697],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[],"o":[],"v":[],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.477999997606,0.477999997606,0.477999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.5,0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[20.509,-36.283]],"o":[[0,0],[0,0]],"v":[[25.44,-20.96],[-25.44,20.96]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[60.439,55.96],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.238,2.267],[-0.686,-0.782],[5.311,-4.654],[3.58,4.085],[0.328,0.964],[-3.143,2.756]],"o":[[0.912,0.451],[3.58,4.085],[-5.309,4.654],[-0.686,-0.782],[2.672,-2.913],[3.144,-2.755]],"v":[[6.165,-11.393],[8.582,-9.546],[5.449,6.277],[-10.647,7.308],[-12.162,4.669],[-3.433,-3.857]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.047,57.299],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.079,3.624],[-1.885,-2.152],[11.744,-10.292],[6.803,7.761],[0.291,2.968],[-6.898,6.047]],"o":[[2.905,0.677],[6.802,7.76],[-11.743,10.293],[-1.885,-2.151],[4.52,-6.544],[6.9,-6.046]],"v":[[12.167,-24.629],[19.477,-20.405],[10.529,12.283],[-23.052,16.868],[-26.279,9.068],[-9.056,-10.061]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.745000023935,0.023999999551,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.511,61.806],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"details Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[428.769,320.093,0],"ix":2},"a":{"a":0,"k":[114.641,80.52,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.14,4.372],[13.871,-15.765],[29.213,-18.407],[11.999,2.015],[5.112,6.926],[-7.275,16.968],[-17.085,2.144],[-8.485,-3.638],[-0.979,22.103],[-5.514,27.54]],"o":[[-2.202,4.518],[13.475,-15.473],[24.24,-17.783],[-8.484,-3.638],[-10.226,-13.855],[7.276,-16.969],[8.543,-1.073],[8.484,3.638],[4.38,29.362],[-5.355,28.812]],"v":[[47.884,20.297],[31.618,40.86],[7.995,50.305],[-17.964,46.624],[-38.527,30.359],[-44.291,-19.224],[-4.402,-49.232],[21.558,-45.551],[42.121,-29.285],[51.566,-5.662]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.736,110.484],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.936,-15.563],[7.839,-15.331],[7.78,-4.968],[-27.584,-15.946],[-18.864,-17.228],[0.009,0.015],[7.705,24.703],[0.461,37.074],[-7.943,6.36],[-8.604,0.33]],"o":[[9.936,15.562],[-3.92,7.666],[-8.571,4.707],[-33.006,-15.738],[-19.162,-17.381],[-0.01,-0.015],[7.692,24.374],[2.837,32.427],[7.781,-4.968],[17.206,-0.659]],"v":[[41.087,-26.655],[43.454,23.204],[25.806,42.595],[0.789,50.444],[-24.055,44.961],[-43.444,27.313],[-51.293,2.298],[-45.811,-22.547],[-28.163,-41.936],[-3.146,-49.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.119,110.342],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.757,1.756],[-30.411,-30.701],[4.379,-8.171],[10.237,3.834],[24.87,23.094]],"o":[[1.503,-3.489],[4.896,4.943],[-3.096,5.775],[-19.305,-7.232],[-13.969,-12.972]],"v":[[-47.559,-34.433],[27.438,1.567],[43.937,30.814],[17.584,34.088],[-23.56,-17.183]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925,0.709999952129,0.416000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[60.816,50.422],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.757,1.756],[-30.411,-30.701],[4.379,-8.171],[10.237,3.834],[24.87,23.094]],"o":[[1.503,-3.489],[4.896,4.943],[-3.096,5.775],[-19.305,-7.232],[-13.969,-12.972]],"v":[[-47.559,-34.433],[27.438,1.567],[43.937,30.814],[17.584,34.088],[-23.56,-17.183]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.816,50.422],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.757,1.756],[30.41,-30.7],[-4.379,-8.171],[-10.237,3.835],[-24.871,23.095]],"o":[[-1.503,-3.49],[-4.897,4.943],[3.096,5.775],[19.306,-7.231],[13.969,-12.971]],"v":[[47.559,-34.432],[-27.437,1.566],[-43.936,30.815],[-17.584,34.087],[23.561,-17.183]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925,0.709999952129,0.416000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":10,"ml2":{"a":0,"k":10,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[168.467,52.463],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.757,1.756],[30.41,-30.7],[-4.379,-8.171],[-10.237,3.835],[-24.871,23.095]],"o":[[-1.503,-3.49],[-4.897,4.943],[3.096,5.775],[19.306,-7.231],[13.969,-12.971]],"v":[[47.559,-34.432],[-27.437,1.566],[-43.936,30.815],[-17.584,34.087],[23.561,-17.183]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[168.467,52.463],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"legs Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[424.502,501.059,0],"ix":2},"a":{"a":0,"k":[107.717,38.642,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.823,0],[0,0],[0.132,-5.156],[-10.987,-1.283],[-1.236,-0.087],[-3.426,-1.329],[-0.28,-0.739],[0.764,-1.376],[0.704,-1.45],[0.695,-1.346],[-1.986,-5.54],[-3.604,-1.548],[-1.933,0],[-1.597,0.845],[-1.021,-1.242],[-4.078,0],[-1.3,0.431],[-1.512,1.707],[-0.609,-1.087],[-1.403,-0.382],[0,0],[-1.468,0],[-2.628,3.253],[1.236,2.264],[11.376,8.595],[14.032,2.425]],"o":[[0,0],[-12.095,0.001],[-0.116,4.464],[1.424,0.166],[3.119,0.219],[1.276,0.495],[0.002,0.56],[-0.621,1.119],[-0.66,1.356],[-3.458,6.696],[0.656,1.829],[2.061,0.884],[2.181,0],[0.404,1.39],[2.337,2.843],[1.445,0],[2.34,-0.776],[0.243,1.352],[2.018,3.599],[0,0],[1.607,0.449],[4.063,0],[7.164,-8.872],[-3.505,-6.415],[-5.749,-4.344],[-3.282,-0.566]],"v":[[-27.017,-37.788],[-27.018,-37.788],[-44.793,-27.428],[-31.753,-16.092],[-27.812,-15.749],[-18.803,-14.027],[-14.259,-11.635],[-16.068,-7.816],[-18.098,-3.979],[-20.173,0.118],[-24.911,18.678],[-19.113,24.56],[-13.095,25.893],[-7.456,24.532],[-5.365,28.508],[4.88,33.048],[9.016,32.398],[14.734,28.543],[16.013,32.191],[22.719,37.066],[22.887,37.112],[27.518,37.788],[37.746,32.814],[33.034,1.569],[11.587,-22.893],[-17.816,-36.934]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-8.908,0.001],[-3.174,-0.549],[-5.729,-4.328],[-2.111,-3.865],[4.266,-5.282],[2.577,0],[1.176,0.327],[-3.781,12.999],[1.242,0.141],[0.017,0],[8.163,-2.707],[0.885,0],[1.436,1.747],[2.122,1.312],[0.097,0],[8.278,0],[1.503,0.645],[-4.552,9.362],[1.264,3.353],[3.239,1.256],[4.954,0.58],[-0.061,2.367]],"o":[[2.404,0],[12.836,2.218],[12.063,9.116],[2.799,5.123],[-1.672,2.069],[-1.018,0],[-2.088,-0.583],[1.221,-4.199],[-0.017,-0.002],[-2.244,0],[-0.804,0.266],[-2.427,0],[-4.418,-5.373],[-0.1,-0.061],[-2.069,-0.001],[-1.201,0],[-7.38,-3.169],[2.54,-5.224],[-1.045,-2.774],[-5.614,-2.177],[-7.737,-0.903],[0.058,-2.28]],"v":[[-27.018,-32.788],[-18.667,-32.005],[8.574,-18.904],[28.645,3.967],[33.855,29.672],[27.518,32.786],[24.23,32.297],[20.862,17.776],[18.431,8.201],[18.379,8.198],[7.443,27.653],[4.88,28.048],[-1.501,25.332],[-0.85,7.577],[-1.145,7.486],[-13.095,20.893],[-17.139,19.965],[-13.6,-1.794],[-9.581,-13.398],[-16.996,-18.689],[-31.173,-21.059],[-39.796,-27.299]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925,0.709999952129,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.275,39.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.328,0],[1.388,0.387],[0,0],[1.506,2.684],[-1.851,6.366],[0.155,1.02],[6.482,-2.148],[1.177,0],[1.84,2.237],[-0.148,2.566],[3.343,0],[1.747,0.75],[0.71,1.98],[-3.34,6.466],[-0.678,1.394],[-0.607,1.092],[0.51,1.356],[3.107,1.206],[3.199,0.224],[1.367,0.159],[-0.128,4.976],[-10.357,0],[-3.141,-0.543],[-5.928,-4.479],[-3.387,-6.201],[6.248,-7.736]],"o":[[-1.24,0],[0,0],[-1.193,-0.325],[-1.672,-2.982],[0.292,-1.004],[-1.54,5.594],[-1.044,0.347],[-3.288,0],[-1.718,-2.09],[-1.85,2.099],[-1.592,0],[-2.23,-0.958],[-1.618,-4.517],[0.706,-1.368],[0.674,-1.388],[1.64,-2.953],[-0.625,-1.656],[-3.778,-1.465],[-1.207,-0.085],[-7.316,-0.855],[0.097,-3.818],[2.682,0],[13.433,2.322],[11.022,8.328],[0.113,0.207],[-2.168,2.684]],"v":[[27.706,35.287],[23.745,34.704],[23.563,34.654],[18.382,30.969],[18.648,17.077],[18.779,13.953],[8.415,30.025],[5.067,30.548],[-3.247,26.92],[-5.262,19.734],[-12.908,23.392],[-17.941,22.262],[-22.372,17.834],[-17.765,1.266],[-15.662,-2.886],[-13.695,-6.603],[-11.732,-12.516],[-17.713,-16.359],[-27.452,-18.242],[-31.275,-18.574],[-42.107,-27.362],[-26.831,-35.287],[-18.055,-34.47],[10.266,-20.9],[31.027,2.767],[35.988,31.242]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.088,39.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.095,0],[3.283,-0.567],[5.749,-4.345],[3.504,-6.416],[-7.164,-8.871],[-4.062,0],[-1.605,0.448],[0,0],[-2.018,3.598],[-0.244,1.351],[-2.341,-0.777],[-1.445,0],[-2.337,2.844],[-0.403,1.391],[-2.181,0],[-2.059,0.884],[-0.656,1.829],[3.458,6.696],[0.66,1.357],[0.622,1.119],[-0.005,0.595],[-1.277,0.495],[-3.119,0.22],[-1.425,0.166],[0.115,4.463]],"o":[[-2.824,0],[-14.032,2.425],[-11.376,8.594],[-1.237,2.264],[2.628,3.254],[1.467,0],[0,0],[1.403,-0.382],[0.609,-1.087],[1.512,1.707],[1.299,0.43],[4.078,0],[1.022,-1.242],[1.597,0.845],[1.933,0],[3.605,-1.548],[1.986,-5.541],[-0.696,-1.347],[-0.704,-1.45],[-0.763,-1.375],[0.275,-0.705],[3.426,-1.328],[1.237,-0.087],[10.987,-1.283],[-0.132,-5.156]],"v":[[27.019,-37.787],[17.816,-36.933],[-11.587,-22.892],[-33.033,1.569],[-37.745,32.813],[-27.518,37.787],[-22.887,37.112],[-22.718,37.066],[-16.013,32.191],[-14.734,28.543],[-9.015,32.399],[-4.88,33.048],[5.365,28.507],[7.456,24.531],[13.096,25.893],[19.113,24.56],[24.912,18.678],[20.173,0.118],[18.098,-3.979],[16.067,-7.816],[14.263,-11.669],[18.804,-14.028],[27.813,-15.749],[31.753,-16.092],[44.794,-27.428]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-2.404,0],[-0.059,-2.281],[7.736,-0.904],[5.615,-2.178],[1.045,-2.773],[-2.541,-5.225],[7.38,-3.169],[1.201,0],[2.069,0],[0.099,-0.061],[4.417,-5.373],[2.428,0],[0.803,0.267],[2.244,0],[0.017,-0.002],[-1.221,-4.2],[2.088,-0.582],[1.018,0],[1.671,2.069],[-2.798,5.123],[-12.065,9.115],[-12.837,2.219]],"o":[[8.908,0],[0.061,2.367],[-4.954,0.579],[-3.238,1.256],[-1.264,3.354],[4.551,9.361],[-1.503,0.646],[-8.278,0],[-0.097,0],[-2.123,1.312],[-1.437,1.747],[-0.885,0],[-8.164,-2.706],[-0.018,0],[-1.242,0.14],[3.781,12.999],[-1.176,0.328],[-2.577,0],[-4.266,-5.282],[2.112,-3.865],[5.728,-4.329],[3.173,-0.548]],"v":[[27.019,-32.787],[39.796,-27.299],[31.173,-21.058],[16.996,-18.689],[9.581,-13.398],[13.602,-1.793],[17.14,19.965],[13.096,20.893],[1.145,7.485],[0.851,7.577],[1.503,25.332],[-4.88,28.048],[-7.441,27.652],[-18.378,8.198],[-18.43,8.201],[-20.862,17.776],[-24.23,32.296],[-27.518,32.787],[-33.855,29.671],[-28.646,3.966],[-8.573,-18.903],[18.668,-32.006]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925,0.709999952129,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.159,38.037],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":6,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.241,0],[2.168,2.685],[-0.113,0.207],[-11.021,8.329],[-13.439,2.323],[-2.682,0],[-0.098,-3.817],[7.315,-0.856],[1.208,-0.085],[3.779,-1.465],[0.624,-1.656],[-1.64,-2.953],[-0.675,-1.389],[-0.707,-1.368],[1.619,-4.517],[2.23,-0.958],[1.591,0],[0,0],[1.851,2.099],[1.718,-2.09],[3.288,0],[1.045,0.347],[1.54,5.593],[-0.292,-1.004],[1.672,-2.983],[1.193,-0.325],[0,0]],"o":[[-3.327,0],[-6.248,-7.736],[3.386,-6.2],[5.927,-4.478],[3.142,-0.543],[10.354,0],[0.127,4.976],[-1.367,0.159],[-3.199,0.224],[-3.107,1.206],[-0.511,1.357],[0.606,1.092],[0.677,1.393],[3.34,6.466],[-0.71,1.98],[-1.747,0.75],[0,0],[-3.344,-0.001],[0.149,2.566],[-1.84,2.237],[-1.177,0],[-6.481,-2.148],[-0.155,1.02],[1.852,6.365],[-1.505,2.684],[0,0],[-1.387,0.387]],"v":[[-27.705,35.287],[-35.986,31.241],[-31.025,2.767],[-10.268,-20.899],[18.055,-34.47],[26.833,-35.287],[42.107,-27.363],[31.277,-18.574],[27.452,-18.242],[17.713,-16.359],[11.734,-12.517],[13.695,-6.604],[15.663,-2.886],[17.765,1.265],[22.372,17.834],[17.941,22.262],[12.911,23.392],[12.908,23.392],[5.262,19.733],[3.247,26.92],[-5.067,30.548],[-8.416,30.025],[-18.779,13.952],[-18.649,17.077],[-18.382,30.969],[-23.563,34.654],[-23.745,34.704]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.346,38.037],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"bg Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[428.705,418.648,0],"ix":2},"a":{"a":0,"k":[119.86,141.181,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.594,-28.634],[36.568,-22.904],[22.556,1.736],[6.701,6.605],[2.471,7.033],[6.359,-4.66],[27.431,-11.288],[32.634,16.235],[18.177,23.216],[0.133,23.646],[-8.826,14.793],[-9.401,4.669],[-6.785,1.084],[-8.177,0],[0,0],[1.1,2.061],[-5.126,6.82],[-10.278,10.969],[-20.154,9.286],[-27.504,-2.564],[-21.046,-21.835],[0.526,-13.595],[0,0],[8.952,-7.169],[2.141,-2.85]],"o":[[-28.346,-18.252],[14.862,-23.125],[11.392,-6.975],[-0.876,-5.469],[-2.47,-7.034],[3.102,-19.355],[24.907,-25.239],[32.414,6.973],[23.192,16.38],[8.736,17.83],[1.892,11.581],[-3.365,4.669],[4.662,1.084],[0,0],[11.038,0],[7.891,2.061],[6.68,10.837],[-1.326,18.137],[-15.139,18.741],[-27.504,2.875],[-25.618,-4.153],[-4.046,4.086],[0,10.876],[-4.475,3.584],[-9.666,1.168]],"v":[[30.502,82.407],[-29.512,82.407],[-63.566,42.684],[-63.442,40.188],[-69.8,20.978],[-80.56,11.243],[-106.215,-4.156],[-115.139,-52.248],[-99.21,-71.659],[-72.472,-82.407],[-49.985,-81.703],[-32.9,-75.67],[-25.8,-72.085],[-5.192,-71.001],[18.931,-71.001],[37.148,-73.062],[56.648,-76.709],[78.93,-73.936],[101.385,-60.82],[115.139,-34.324],[106.966,-2.985],[77.963,17.508],[72.202,28.224],[57.694,39.706],[45.754,49.044]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925000011921,0.709999978542,0.416000008583,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.656,199.704],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-9.397],[-31.333,-7.409],[-72.132,21.274],[-39.988,-6.643],[0.016,-23.711],[28.355,-11.054],[55.729,14.667],[42.977,8.342],[0,11.204],[-8.071,12.991],[-14.963,-4.621],[-81.894,14.471],[-9.973,-25.147]],"o":[[0,12.474],[-35.081,10.819],[-72.132,21.274],[-39.988,-6.643],[0.016,-23.711],[28.355,-11.054],[55.729,14.667],[28,-33.334],[0,-7.967],[16.143,-25.984],[57.498,17.762],[20.315,-3.589],[4.986,12.574]],"v":[[119.61,-7.859],[96.099,62.382],[72.295,33.698],[45.955,78.687],[-0.031,94.975],[-41.066,78.687],[-55.705,40.308],[-96.705,62.382],[-119.61,-7.859],[-106.109,-41.409],[-48.296,-90.354],[63.098,-88.692],[111.73,-42.542]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925,0.709999952129,0.416000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.86,95.225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,248,0],"ix":2},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":176,"ix":10},"p":{"a":0,"k":[384,250,0],"ix":2},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[130,-130,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":176,"ix":10},"p":{"a":0,"k":[384,250,0],"ix":2},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[155,-155,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,248,0],"ix":2},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":3,"ix":10},"p":{"a":0,"k":[416,248,0],"ix":2},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Comp 1","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":3,"ix":10},"p":{"a":0,"k":[416,248,0],"ix":2},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[155,155,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-20],"e":[-20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[-20],"e":[-20]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":23}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":0,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":23,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":33}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":0,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":23,"s":[81.911],"e":[0]},{"t":33}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":1,"s":[-25],"e":[-18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[-18],"e":[-25]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[48,48,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":1,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":24}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":1,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":24,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":34}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":1,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":24,"s":[81.911],"e":[0]},{"t":34}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":124,"st":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2,"s":[-30],"e":[-16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":26,"s":[-16],"e":[-30]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[46,46,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":2,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":25}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":2,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":25,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":35}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":2,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":25,"s":[81.911],"e":[0]},{"t":35}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":125,"st":2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[-35],"e":[-14]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27,"s":[-14],"e":[-35]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[44,44,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":3,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":26}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":3,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":26,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":36}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":3,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":26,"s":[81.911],"e":[0]},{"t":36}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":126,"st":3,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":4,"s":[-40],"e":[-12]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[-12],"e":[-40]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[42,42,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":4,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":27}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":4,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":27,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":37}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":4,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":27,"s":[81.911],"e":[0]},{"t":37}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":127,"st":4,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[-45],"e":[-8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":29,"s":[-8],"e":[-45]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[40,40,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":28}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":5,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":28,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":38}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":5,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":28,"s":[81.911],"e":[0]},{"t":38}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":128,"st":5,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[-50],"e":[-8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[-8],"e":[-50]},{"t":41}],"ix":10},"p":{"a":0,"k":[344.75,261.25,0],"ix":2},"a":{"a":0,"k":[165.747,-4.779,0],"ix":1},"s":{"a":0,"k":[38,38,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"n":"0p4_1_0p333_0","t":6,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170,-8],[172,-8]],"c":false}]},{"t":29}],"ix":2,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').content('Path 1').path;"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":6,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.104,-4.784],"ix":2},"a":{"a":0,"k":[164.104,-4.784],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\n$bm_rt = content('Shape 1').transform.rotation;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.485,"y":1},"o":{"x":0.333,"y":0},"n":"0p485_1_0p333_0","t":6,"s":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}],"e":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}]},{"i":{"x":0.576,"y":1},"o":{"x":0.333,"y":0},"n":"0p576_1_0p333_0","t":29,"s":[{"i":[[-73.658,-118.409],[-147.395,-96.641]],"o":[[143.69,161.306],[147.395,96.641]],"v":[[-180,10],[164.321,-4.825]],"c":false}],"e":[{"i":[[-150,250],[0,0]],"o":[[150,-250],[0,0]],"v":[[-180,10],[172,-8]],"c":false}]},{"t":39}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490260124,0.709803938866,0.415686309338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[164.186,-4.838],"ix":2},"a":{"a":0,"k":[164.186,-4.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.563],"y":[0.97]},"o":{"x":[0.349],"y":[0.017]},"n":["0p563_0p97_0p349_0p017"],"t":6,"s":[0],"e":[81.911]},{"i":{"x":[0.687],"y":[1.011]},"o":{"x":[0.389],"y":[-0.009]},"n":["0p687_1p011_0p389_-0p009"],"t":29,"s":[81.911],"e":[0]},{"t":39}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":129,"st":6,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"newOwl","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[396,290,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('Null 1').transform.position;"},"a":{"a":0,"k":[426,412,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":792,"h":612,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Comp 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[634,420,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('Null 1').transform.position;"},"a":{"a":0,"k":[400,248,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":800,"h":496,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.745,"y":1},"o":{"x":0.248,"y":0},"n":"0p745_1_0p248_0","t":0,"s":[397,293,0],"e":[398,308,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.328,"y":1},"o":{"x":0.333,"y":0},"n":"0p328_1_0p333_0","t":24,"s":[398,308,0],"e":[398,293,0],"to":[0,0,0],"ti":[0,2.5,0]},{"t":42}],"ix":2},"a":{"a":0,"k":[49,48,0],"ix":1},"s":{"a":0,"k":[52.471,78,100],"ix":6}},"ao":0,"ip":0,"op":123,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,300,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,121.324,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[870.727,558.906],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.929412004059,0.705881993911,0.450980003207,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.11796875,0.114369283938,0.07841090782,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.363,7.453],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":123,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 5f2909322e..5902659988 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1602,6 +1602,9 @@ void LottieParserImpl::getValue(LottieShapeData &obj) // exit properly from the array if (arrayWrapper) NextArrayValue(); + // shape data could be empty. + if (inPoint.empty() || outPoint.empty() || vertices.empty()) return; + /* * Convert the AE shape format to * list of bazier curves From b5d4b0d5e9eadf1a65858a15eb472d5841887d12 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 14 Sep 2018 13:53:47 +0900 Subject: [PATCH 263/672] lottie: add more test resources. Change-Id: I778b7fe0d062043d97cc87d0ec581f2d35451f2b --- example/resource/a_cup_of_coffee.json | 1 + example/resource/abstract_circle.json | 1 + example/resource/birth_stone_logo.json | 1 + example/resource/cooking.json | 1 + example/resource/happy.json | 1 + example/resource/loading_.json | 1 + example/resource/looping_landscape_+_plane_+_clouds.json | 1 + example/resource/ondas.json | 1 + example/resource/pumped_up.json | 1 + example/resource/red_box.json | 1 + example/resource/spin,_lil_loader_v2.json | 1 + example/resource/tigerobo_demo.json | 1 + example/resource/tractor.json | 1 + example/resource/you're_in!.json | 1 + 14 files changed, 14 insertions(+) create mode 100644 example/resource/a_cup_of_coffee.json create mode 100644 example/resource/abstract_circle.json create mode 100644 example/resource/birth_stone_logo.json create mode 100644 example/resource/cooking.json create mode 100644 example/resource/happy.json create mode 100644 example/resource/loading_.json create mode 100644 example/resource/looping_landscape_+_plane_+_clouds.json create mode 100644 example/resource/ondas.json create mode 100644 example/resource/pumped_up.json create mode 100644 example/resource/red_box.json create mode 100644 example/resource/spin,_lil_loader_v2.json create mode 100644 example/resource/tigerobo_demo.json create mode 100644 example/resource/tractor.json create mode 100644 example/resource/you're_in!.json diff --git a/example/resource/a_cup_of_coffee.json b/example/resource/a_cup_of_coffee.json new file mode 100644 index 0000000000..9d6b2e521a --- /dev/null +++ b/example/resource/a_cup_of_coffee.json @@ -0,0 +1 @@ +{"v":"5.1.9","fr":60,"ip":0,"op":72,"w":600,"h":600,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"1-Hello Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2},"a":{"a":0,"k":[300,300,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-20.4,189.08],[0,0],[0,-44.148],[44.147,0],[2.388,0.215]],"o":[[20.4,189.08],[0,0],[0,0],[0,0],[44.147,0],[0,44.147],[-2.443,0],[0,0]],"v":[[135.532,-154.949],[68.843,154.949],[-128.378,154.949],[-195.068,-154.949],[135.532,-154.949],[215.468,-75.013],[135.532,4.922],[128.284,4.598]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[0]},{"t":35}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[100]},{"t":35}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[291.348,370.49],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.78,8.259],[-5.781,8.258],[5.78,8.259],[0,0]],"o":[[0,0],[5.78,-8.259],[-5.781,-8.258],[5.78,-8.259],[0,0],[0,0]],"v":[[-7.704,55.018],[1.924,41.264],[1.924,13.754],[1.924,-13.754],[1.924,-41.264],[-7.704,-55.018]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[-13.53]},"o":{"x":[0.333],"y":[0]},"n":["0p667_-13p53_0p333_0"],"t":23,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0.156]},"n":["0p667_1_0p333_0p156"],"t":36,"s":[0],"e":[100]},{"t":50}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":23,"s":[0],"e":[100]},{"t":50}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[330.898,129.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.781,8.259],[-5.781,8.258],[5.781,8.259],[0,0]],"o":[[0,0],[5.781,-8.259],[-5.781,-8.258],[5.781,-8.259],[0,0],[0,0]],"v":[[-7.704,55.018],[1.923,41.264],[1.923,13.754],[1.923,-13.754],[1.923,-41.264],[-7.704,-55.018]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[0.763]},"o":{"x":[0.333],"y":[0]},"n":["0p667_0p763_0p333_0"],"t":10,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[25.626]},"n":["0p667_1_0p333_25p626"],"t":22,"s":[100],"e":[100]},{"t":35}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":10,"s":[0],"e":[100]},{"t":35}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[262.303,129.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.781,8.259],[-5.781,8.258],[5.781,8.259],[0,0]],"o":[[0,0],[5.781,-8.259],[-5.781,-8.258],[5.781,-8.259],[0,0],[0,0]],"v":[[-7.704,55.018],[1.923,41.264],[1.923,13.754],[1.923,-13.754],[1.923,-41.264],[-7.704,-55.018]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":16,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":27,"s":[100],"e":[100]},{"t":39}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":16,"s":[0],"e":[100]},{"t":39}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[193.707,129.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.78,8.259],[-5.781,8.258],[5.78,8.259],[0,0]],"o":[[0,0],[5.78,-8.259],[-5.781,-8.258],[5.78,-8.259],[0,0],[0,0]],"v":[[-7.704,55.018],[1.924,41.264],[1.924,13.754],[1.924,-13.754],[1.924,-41.264],[-7.704,-55.018]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":45,"s":[0],"e":[0]},{"t":72}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":45,"s":[0],"e":[100]},{"t":72}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[330.898,129.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.781,8.259],[-5.781,8.258],[5.781,8.259],[0,0]],"o":[[0,0],[5.781,-8.259],[-5.781,-8.258],[5.781,-8.259],[0,0],[0,0]],"v":[[-7.704,55.018],[1.923,41.264],[1.923,13.754],[1.923,-13.754],[1.923,-41.264],[-7.704,-55.018]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":32,"s":[0],"e":[0]},{"t":57}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":32,"s":[0],"e":[100]},{"t":57}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[262.303,129.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[5.781,8.259],[-5.781,8.258],[5.781,8.259],[0,0]],"o":[[0,0],[5.781,-8.259],[-5.781,-8.258],[5.781,-8.259],[0,0],[0,0]],"v":[[-7.704,55.018],[1.923,41.264],[1.923,13.754],[1.923,-13.754],[1.923,-41.264],[-7.704,-55.018]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":38,"s":[0],"e":[0]},{"t":61}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":38,"s":[0],"e":[100]},{"t":61}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.722000002394,0.741000007181,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[193.707,129.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/abstract_circle.json b/example/resource/abstract_circle.json new file mode 100644 index 0000000000..8b10f9ae25 --- /dev/null +++ b/example/resource/abstract_circle.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":15,"ip":0,"op":51,"w":500,"h":500,"nm":"El 28","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Circle Abstract","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[100],"e":[0]},{"t":51}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.316,250.684,0],"ix":2},"a":{"a":0,"k":[280,0,0],"ix":1},"s":{"a":0,"k":[225,225,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[145,145],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.190695878571,0.889764404297,0.972549019608,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.583]},"o":{"x":[0.01],"y":[0.006]},"n":["0p833_0p583_0p01_0p006"],"t":22.2,"s":[3],"e":[0]},{"t":49.2001953125}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[236,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.99,0.99],"y":[0.997,0.997]},"o":{"x":[1,1],"y":[1,1]},"n":["0p99_0p997_1_1","0p99_0p997_1_1"],"t":0,"s":[0,0],"e":[50,50]},{"i":{"x":[0.833,0.833],"y":[0.676,0.676]},"o":{"x":[0.01,0.01],"y":[0.043,0.043]},"n":["0p833_0p676_0p01_0p043","0p833_0p676_0p01_0p043"],"t":6,"s":[50,50],"e":[75,75]},{"t":49.2001953125}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"rp","c":{"a":1,"k":[{"i":{"x":[0.99],"y":[0.985]},"o":{"x":[1],"y":[2.692]},"n":["0p99_0p985_1_2p692"],"t":0,"s":[0],"e":[18]},{"i":{"x":[0.833],"y":[0.288]},"o":{"x":[0.01],"y":[-0.02]},"n":["0p833_0p288_0p01_-0p02"],"t":21,"s":[18],"e":[0]},{"t":49.2001953125}],"ix":1},"o":{"a":0,"k":5,"ix":2},"m":1,"ix":2,"tr":{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[280,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":20,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false}],"ip":0,"op":51,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/birth_stone_logo.json b/example/resource/birth_stone_logo.json new file mode 100644 index 0000000000..f52bcc2a77 --- /dev/null +++ b/example/resource/birth_stone_logo.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":29.9700012207031,"ip":0,"op":120.0000048877,"w":150,"h":120,"nm":"logo 2","ddd":1,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[98,45.5,0],"ix":2},"a":{"a":0,"k":[-23,-14.5,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[19.25,-19.25],[0,0],[0,0]],"o":[[0,0],[0,0],[-20.25,20.25],[0,0],[0,0]],"v":[[19.5,-14],[-12.5,-45.25],[-51.25,-42.25],[-55.75,-5.25],[-23,28.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":8,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.584,0.894,0.929,0.5,0.692,0.733,0.965,1,0.8,0.573,1],"ix":8}},"s":{"a":0,"k":[-64.303,-9.492],"ix":4},"e":{"a":0,"k":[23.721,-13.33],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30,"s":[100],"e":[0]},{"t":60.0000024438501}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120.0000048877,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,60,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[22.75,-19.25],[0,0],[0,0]],"o":[[0,0],[0,0],[-19.75,19.75],[0,0],[0,0]],"v":[[19.5,-14],[-12.5,-45.25],[-51.25,-42.25],[-55.75,-5.25],[-23,28.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":8,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,0.788,0.6,0.5,0.902,0.682,0.798,1,0.804,0.576,0.996],"ix":8}},"s":{"a":0,"k":[-64.303,-9.492],"ix":4},"e":{"a":0,"k":[23.721,-13.33],"ix":5},"t":1,"lc":2,"lj":2,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[100],"e":[0]},{"t":30.0000012219251}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120.0000048877,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.5,103,0],"ix":2},"a":{"a":0,"k":[0,42.5,0],"ix":1},"s":{"a":0,"k":[91.956,91.956,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18.648,18.648],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.8,0.572549019608,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,42.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":100,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":60,"s":[100],"e":[0]},{"t":89.0000036250443}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120.0000048877,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/cooking.json b/example/resource/cooking.json new file mode 100644 index 0000000000..d14ac8f736 --- /dev/null +++ b/example/resource/cooking.json @@ -0,0 +1 @@ +{"v":"5.1.20","fr":30,"ip":0,"op":90,"w":300,"h":300,"nm":"Layers-Panelinha","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"fum3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118,140,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14.645,21.967],[0,0]],"o":[[0,0],[-10,-15],[0,0]],"v":[[103.5,-40.5],[102.5,-73],[105,-104]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.23137254902,0.647058823529,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":52,"s":[0],"e":[100]},{"t":61}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":38,"s":[1],"e":[100]},{"t":48}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"fum2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[146.5,146.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14.645,21.967],[0,0]],"o":[[0,0],[-10,-15],[0,0]],"v":[[103.5,-40.5],[102.5,-73],[105,-104]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.23137254902,0.647058823529,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":48,"s":[0],"e":[100]},{"t":57}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":34,"s":[0],"e":[100]},{"t":44}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"fum1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[172.5,156,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14.645,21.967],[0,0]],"o":[[0,0],[-10,-15],[0,0]],"v":[[103.5,-40.5],[102.5,-73],[105,-104]],"c":false},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.23137254902,0.647058823529,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":44,"s":[0],"e":[100]},{"t":53}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30,"s":[0],"e":[100]},{"t":40}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"tampa","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":21,"s":[3],"e":[-1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p667_1_0p167_0"],"t":30,"s":[-1],"e":[-1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":60,"s":[-1],"e":[3]},{"t":69}],"ix":10},"p":{"a":0,"k":[45.545,146.5,0],"ix":2},"a":{"a":0,"k":[6.582,51.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.057,-13.526],[-8.536,81.451],[234.078,78.965],[232.557,-16.012]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Máscara 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.181,-0.003]],"o":[[0,0]],"v":[[-0.22,-21.078]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.101,1.25],[4.773,0.893],[13.723,0.898],[6.051,0],[9.651,0],[0.205,3.94],[-2.76,0.691],[-1.947,1.145],[1.654,1.108],[3.862,0.587],[0,0],[3.533,-3.061],[0.933,-1.926],[-2.019,-0.218],[-0.671,0],[-2.685,0.154],[0,0],[4.667,-0.497],[21.998,-8.59],[4.733,-3.077],[1.514,-2.149],[0,0],[-62.874,3.606],[-0.255,0.592]],"o":[[-4.282,-2.547],[-13.548,-2.532],[-5.987,-0.393],[-9.334,0],[-0.192,-3.681],[3.294,-0.218],[2.102,-0.527],[-1.199,-1.786],[-2.849,-1.909],[0,0],[-5.411,0.808],[-1.487,1.289],[1.947,0.89],[0.659,0.072],[2.366,0],[0,0],[-4.912,0.467],[-23.337,2.485],[-5.247,2.049],[-2.046,1.33],[0,0],[62.874,-3.606],[0.254,-0.591],[-1.644,-2.017]],"v":[[105.32,8.989],[91.723,2.741],[50.79,-3.165],[32.749,-3.677],[4.32,-3.394],[3.742,-14.488],[12.777,-15.21],[18.647,-18.522],[14.986,-23.785],[4.674,-27.5],[-6.408,-27.5],[-20.437,-21.662],[-23.316,-15.976],[-17.462,-13.435],[-15.468,-13.334],[-7.956,-13.851],[-7.956,-2.777],[-22.213,-1.412],[-90.667,13.278],[-105.657,21.258],[-110.332,27.5],[-79.052,27.5],[109.569,16.681],[110.332,14.907]],"c":true},"ix":2},"nm":"Caminho 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Mesclar caminhos 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-255.545,289.5],[256.455,289.5],[256.455,-222.5],[-255.545,-222.5]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-255.545,-222.5],[256.455,-222.5],[256.455,289.5],[-255.545,289.5]],"c":true},"ix":2},"nm":"Caminho 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Mesclar caminhos 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[110.582,27.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":6,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":4,"s":[100],"e":[0]},{"t":14}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":-3,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.23137254902,0.647058823529,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"panela 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[100]},{"t":9}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.925,197.5,0],"ix":2},"a":{"a":0,"k":[143.235,47.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.854,0.559],[0,0],[0.197,-2.328],[-5.896,-0.369],[-6.169,-0.264],[-0.728,-2.833],[-3.983,-13.859],[-3.697,-8.321],[-7.952,-1.308],[-6.447,-0.036],[-14.887,0],[-15.552,0.02],[-8.777,0.258],[-4.491,11.132],[-0.586,2.192],[-4.853,18.555],[-3.728,0.187],[-6.651,0.375],[-0.172,3.214]],"o":[[0,0],[-1.855,0.449],[-0.294,3.472],[6.161,0.386],[4.003,0.171],[3.58,13.924],[2.471,8.597],[2.569,5.782],[6.307,1.038],[14.886,0.083],[15.552,0],[8.786,-0.012],[15.381,-0.451],[0.862,-2.136],[4.955,-18.539],[0.713,-2.723],[6.654,-0.332],[4.02,-0.227],[0.131,-2.44]],"v":[[139.143,-47.5],[-139.292,-47.5],[-142.691,-43.703],[-134.774,-38.372],[-116.302,-37.118],[-109.899,-32.57],[-98.867,9.16],[-89.946,34.679],[-73.248,45.708],[-53.949,47.392],[-9.29,47.5],[37.366,47.453],[63.72,47.118],[93.278,29.351],[95.421,22.838],[110.176,-32.797],[116.329,-37.095],[136.264,-38.412],[142.854,-43.204]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-255.925,208.5],[256.075,208.5],[256.075,-303.5],[-255.925,-303.5]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-255.925,-303.5],[256.075,-303.5],[256.075,208.5],[-255.925,208.5]],"c":true},"ix":2},"nm":"Caminho 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Mesclar caminhos 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[143.235,47.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23137255013,0.647058844566,0.345098048449,1],"ix":4},"o":{"a":0,"k":32,"ix":5},"r":1,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"panela","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[149.925,197.5,0],"ix":2},"a":{"a":0,"k":[143.235,47.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.854,0.559],[0,0],[0.197,-2.328],[-5.896,-0.369],[-6.169,-0.264],[-0.728,-2.833],[-3.983,-13.859],[-3.697,-8.321],[-7.952,-1.308],[-6.447,-0.036],[-14.887,0],[-15.552,0.02],[-8.777,0.258],[-4.491,11.132],[-0.586,2.192],[-4.853,18.555],[-3.728,0.187],[-6.651,0.375],[-0.172,3.214]],"o":[[0,0],[-1.855,0.449],[-0.294,3.472],[6.161,0.386],[4.003,0.171],[3.58,13.924],[2.471,8.597],[2.569,5.782],[6.307,1.038],[14.886,0.083],[15.552,0],[8.786,-0.012],[15.381,-0.451],[0.862,-2.136],[4.955,-18.539],[0.713,-2.723],[6.654,-0.332],[4.02,-0.227],[0.131,-2.44]],"v":[[139.143,-47.5],[-139.292,-47.5],[-142.691,-43.703],[-134.774,-38.372],[-116.302,-37.118],[-109.899,-32.57],[-98.867,9.16],[-89.946,34.679],[-73.248,45.708],[-53.949,47.392],[-9.29,47.5],[37.366,47.453],[63.72,47.118],[93.278,29.351],[95.421,22.838],[110.176,-32.797],[116.329,-37.095],[136.264,-38.412],[142.854,-43.204]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-255.925,208.5],[256.075,208.5],[256.075,-303.5],[-255.925,-303.5]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-255.925,-303.5],[256.075,-303.5],[256.075,208.5],[-255.925,208.5]],"c":true},"ix":2},"nm":"Caminho 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Mesclar caminhos 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[143.235,47.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[100],"e":[0]},{"t":9}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":95,"ix":3},"m":1,"ix":2,"nm":"Aparar caminhos 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.23137254902,0.647058823529,0.345098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Traçado 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/happy.json b/example/resource/happy.json new file mode 100644 index 0000000000..2558e31b52 --- /dev/null +++ b/example/resource/happy.json @@ -0,0 +1 @@ +{"v":"5.1.17","fr":25,"ip":0,"op":79,"w":1100,"h":1072,"nm":"feliz","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"emoticon feliz","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[561,549,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[300,300,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Degradado de 4 colores","np":16,"mn":"ADBE 4ColorGradient","ix":1,"en":1,"ef":[{"ty":6,"nm":"Posiciones y colores","mn":"ADBE 4ColorGradient-0011","ix":1,"v":0},{"ty":3,"nm":"Punto 1","mn":"ADBE 4ColorGradient-0001","ix":2,"v":{"a":0,"k":[70.469,58.563],"ix":2}},{"ty":2,"nm":"Color 1","mn":"ADBE 4ColorGradient-0002","ix":3,"v":{"a":0,"k":[0.937254905701,0.937254905701,0.623529434204,1],"ix":3}},{"ty":3,"nm":"Punto 2","mn":"ADBE 4ColorGradient-0003","ix":4,"v":{"a":0,"k":[970.521,70.474],"ix":4}},{"ty":2,"nm":"Color 2","mn":"ADBE 4ColorGradient-0004","ix":5,"v":{"a":0,"k":[0.937254905701,0.937254905701,0.623529434204,1],"ix":5}},{"ty":3,"nm":"Punto 3","mn":"ADBE 4ColorGradient-0005","ix":6,"v":{"a":0,"k":[110,964.8],"ix":6}},{"ty":2,"nm":"Color 3","mn":"ADBE 4ColorGradient-0006","ix":7,"v":{"a":0,"k":[0.937254905701,0.937254905701,0.623529434204,1],"ix":7}},{"ty":3,"nm":"Punto 4","mn":"ADBE 4ColorGradient-0007","ix":8,"v":{"a":0,"k":[990,964.8],"ix":8}},{"ty":2,"nm":"Color 4","mn":"ADBE 4ColorGradient-0008","ix":9,"v":{"a":0,"k":[1,0.78823530674,0.278431385756,1],"ix":9}},{"ty":6,"nm":"Color 4","mn":"ADBE 4ColorGradient-0012","ix":10,"v":0},{"ty":0,"nm":"Fusionar","mn":"ADBE 4ColorGradient-0009","ix":11,"v":{"a":0,"k":100,"ix":11}},{"ty":0,"nm":"Variación","mn":"ADBE 4ColorGradient-0010","ix":12,"v":{"a":0,"k":0,"ix":12}},{"ty":0,"nm":"Opacidad","mn":"ADBE 4ColorGradient-0013","ix":13,"v":{"a":0,"k":100,"ix":13}},{"ty":7,"nm":"Modo de fusión","mn":"ADBE 4ColorGradient-0014","ix":14,"v":{"a":0,"k":5,"ix":14}}]}],"shapes":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0,0.894117474556,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"d":1,"ty":"el","s":{"a":0,"k":[115,115],"ix":2},"p":{"a":0,"k":[39,-37],"ix":3},"nm":"Trazado elíptico 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":32,"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":-187,"ix":3},"m":1,"ix":3,"nm":"Recortar trazados 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.011764706112,0.010841984302,0.010841984302,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[6,99],"e":[63,88],"to":[9.5,-1.83333337306976],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31.699,"s":[63,88],"e":[6,99],"to":[0,0],"ti":[9.5,3]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45.88,"s":[6,99],"e":[6,70],"to":[-9.5,-3],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.884,"s":[6,70],"e":[6,99],"to":[0,0],"ti":[7.83333349227905,-2.83333325386047]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55.055,"s":[6,99],"e":[-41,87],"to":[-7.83333349227905,2.83333325386047],"ti":[7.83333349227905,2]},{"t":65.8990478108317}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100],"e":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":45.88,"s":[100,100],"e":[146,146]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":50.884,"s":[146,146],"e":[100,100]},{"t":55.0552978108317}],"ix":3},"r":{"a":0,"k":-51.614,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"boca 2","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":45.88,"s":[54.7,80.409],"e":[54.7,0]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":50.884,"s":[54.7,0],"e":[54.7,76]},{"t":55.0552978108317}],"ix":2},"p":{"a":0,"k":[-51,0],"ix":3},"nm":"Trazado elíptico 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":45.88,"s":[54.7,80.409],"e":[54.7,0]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":50.884,"s":[54.7,0],"e":[54.7,76]},{"t":55.0552978108317}],"ix":2},"p":{"a":0,"k":[51,0],"ix":3},"nm":"Trazado elíptico 2","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027450980619,0.026697425172,0.026697425172,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"fl","c":{"a":0,"k":[0.007843137255,0.00719723234,0.00719723234,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.171},"n":"0p667_1_0p167_0p171","t":5.005,"s":[0,-26],"e":[71,-26],"to":[11.8333330154419,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":28.362,"s":[71,-26],"e":[0,-26],"to":[0,0],"ti":[22.1666660308838,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50.884,"s":[0,-26],"e":[-62,-26],"to":[-22.1666660308838,0],"ti":[10.3333330154419,0]},{"t":74.2408446858317}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0]},"n":["0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":5.005,"s":[100,100],"e":[74,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":28.362,"s":[74,100],"e":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":50.884,"s":[100,100],"e":[87,100]},{"t":74.2408446858317}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"ojos","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Trazado elíptico 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":15,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Recortar trazados 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.011764706112,0.010841984302,0.010841984302,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[52,-36],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-8,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"ceja2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Trazado elíptico 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":15,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Recortar trazados 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.011764706112,0.010841984302,0.010841984302,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-52,-36],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-45,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"ceja1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.171},"n":"0p667_1_0p167_0p171","t":5.005,"s":[0,0],"e":[73,0],"to":[12.1666669845581,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":28.362,"s":[73,0],"e":[0,0],"to":[0,0],"ti":[23.3333339691162,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50.884,"s":[0,0],"e":[-67,0],"to":[-23.3333339691162,0],"ti":[11.1666669845581,0]},{"t":74.2408446858317}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45.88,"s":[0,0],"e":[0,-15],"to":[0,-2.5],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.884,"s":[0,-15],"e":[0,0],"to":[0,0],"ti":[0,-2.5]},{"t":55.0552978108317}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0]},"n":["0p667_1_0p167_0p167","0p667_1_0p167_0"],"t":5.005,"s":[100,100],"e":[70,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":28.362,"s":[70,100],"e":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":50.884,"s":[100,100],"e":[77,100]},{"t":74.2408446858317}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"cejas","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Trazado elíptico 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784313725,0.847058823529,0.505882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"cara","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":-1.66833500166833,"op":248.581915248582,"st":-1.66833500166833,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/loading_.json b/example/resource/loading_.json new file mode 100644 index 0000000000..106bb56111 --- /dev/null +++ b/example/resource/loading_.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":29.9700012207031,"ip":0,"op":61.0000024845809,"w":400,"h":400,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.372,"y":0.995},"o":{"x":0.333,"y":0},"n":"0p372_0p995_0p333_0","t":-1,"s":[-63.707,132,0],"e":[508.793,132,0],"to":[95.4166641235352,0,0],"ti":[-95.4166641235352,0,0]},{"t":65.0000026475043}],"ix":2},"a":{"a":0,"k":[200,200,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":400,"h":400,"ip":-1.00000004073083,"op":899.000036617021,"st":-1.00000004073083,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Pre-comp 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.663,"y":0.994},"o":{"x":0.333,"y":0},"n":"0p663_0p994_0p333_0","t":47,"s":[-120.707,132,0],"e":[480.293,132,0],"to":[100.166664123535,0,0],"ti":[-100.166664123535,0,0]},{"t":120.0000048877}],"ix":2},"a":{"a":0,"k":[200,200,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":400,"h":400,"ip":47.0000019143492,"op":947.000038572101,"st":47.0000019143492,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Master","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[198,192,0],"ix":2},"a":{"a":0,"k":[146.5,5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.858,0],[0,0],[0,-2.858],[2.859,0],[0,0],[0,2.858]],"o":[[0,0],[2.859,0],[0,2.858],[0,0],[-2.858,0],[0,-2.858]],"v":[[-140.825,-5.175],[140.825,-5.175],[146,0.001],[140.825,5.175],[-140.825,5.175],[-146,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.913725490196,0.325490196078,0.129411764706,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.25,5.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 5/progressbar-final Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296,260,0],"ix":2},"a":{"a":0,"k":[76.5,5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.858,0],[0,0],[0,-2.859],[2.859,0],[0,0],[0,2.857]],"o":[[0,0],[2.859,0],[0,2.857],[0,0],[-2.858,0],[0,-2.859]],"v":[[-70.825,-5.175],[70.825,-5.175],[76,0],[70.825,5.175],[-70.825,5.175],[-76,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.329411764706,0.709803921569,0.776470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.25,5.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 3/progressbar-final Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164,260,0],"ix":2},"a":{"a":0,"k":[40,5.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.858,0],[0,0],[0,-2.859],[2.858,0],[0,0],[0,2.857]],"o":[[0,0],[2.858,0],[0,2.857],[0,0],[-2.858,0],[0,-2.859]],"v":[[-34.325,-5.175],[34.325,-5.175],[39.5,0],[34.325,5.175],[-34.325,5.175],[-39.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.705882370472,0.243137255311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.75,5.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900.000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[202.032,208.014,0],"ix":2},"a":{"a":0,"k":[200,200,0],"ix":1},"s":{"a":0,"k":[99.979,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[4.821,0],[0,0],[0,-4.821],[-4.821,0],[0,0],[0,2.771]],"o":[[0,0],[-4.821,0],[0,4.821],[0,0],[4.821,0],[0,-2.417]],"v":[[337.122,186.522],[59.625,186.49],[52.02,192.229],[59.708,197.449],[337.205,197.481],[343.914,191.917]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"w":400,"h":400,"ip":0,"op":900.000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/looping_landscape_+_plane_+_clouds.json b/example/resource/looping_landscape_+_plane_+_clouds.json new file mode 100644 index 0000000000..69667d5ee0 --- /dev/null +++ b/example/resource/looping_landscape_+_plane_+_clouds.json @@ -0,0 +1 @@ +{"v":"5.1.15","fr":29.9700012207031,"ip":0,"op":181.000007372281,"w":500,"h":500,"nm":"Comp 3","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"airplane Outlines Comp 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":250,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.522],"y":[0]},"n":["0p483_1_0p522_0"],"t":0,"s":[286],"e":[247]},{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.522],"y":[0]},"n":["0p483_1_0p522_0"],"t":45,"s":[247],"e":[286]},{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.522],"y":[0]},"n":["0p483_1_0p522_0"],"t":90,"s":[286],"e":[247]},{"i":{"x":[0.483],"y":[1]},"o":{"x":[0.522],"y":[0]},"n":["0p483_1_0p522_0"],"t":135,"s":[247],"e":[286]},{"t":180.00000733155}],"ix":4}},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":500,"h":500,"ip":0,"op":181.000007372281,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"airplane Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":171,"ix":3},"y":{"a":0,"k":156,"ix":4}},"a":{"a":0,"k":[308,162,0],"ix":1},"s":{"a":0,"k":[33,33,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.598,1.031],[0.598,1.926],[1.367,2.859],[1.463,3.714],[3.834,9.806],[1.497,3.899],[-1.59,1.074],[-2.369,0.222]],"o":[[-2.597,-1.031],[-0.943,-3.036],[-1.723,-3.603],[-3.859,-9.796],[-1.521,-3.891],[-0.562,-1.466],[2.121,-1.434],[5.039,-0.471]],"v":[[14.439,35.096],[9.947,33.409],[5.171,22.045],[0.63,10.96],[-10.921,-18.438],[-15.535,-30.092],[-15.447,-34.507],[-10.602,-35.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.925,110.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.926,-2.258],[5.937,-0.916],[3.381,-0.041],[0.462,1.437],[0.228,1.682],[-0.76,0.55],[-0.841,-0.027],[-3.235,0.843],[-1.475,0.757],[-1.577,-0.747]],"o":[[-4.423,4.373],[-3.344,0.516],[-1.515,0.019],[-0.517,-1.606],[-0.113,-0.838],[0.675,-0.488],[3.344,0.11],[1.6,-0.418],[1.538,-0.789],[2.697,1.278]],"v":[[15.802,-0.585],[-1.706,6.298],[-11.804,7.074],[-14.306,5.769],[-14.953,0.346],[-15.042,-3.188],[-10.771,-2.931],[-0.857,-4.084],[3.778,-5.748],[7.276,-6.459]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[420.578,125.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.37,-2.974],[3.221,0.231],[-0.021,2.561],[-3.424,-0.271]],"o":[[-0.138,2.891],[-3.424,-0.246],[0.028,-3.477],[3.599,0.285]],"v":[[3.543,1.655],[-0.827,5.514],[-3.583,-1.527],[0.652,-5.475]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[246.836,143.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.219,-2.11],[0.935,-0.653],[0.791,0.21],[0.147,2.178],[-1.083,0.816],[-0.98,-0.109]],"o":[[-0.056,1.165],[-0.742,0.519],[-2.676,-0.711],[-0.077,-1.146],[0.8,-0.602],[2.792,0.308]],"v":[[3.586,2.477],[2.769,5.208],[-1.883,5.585],[-3.608,-1.783],[-2.914,-5.193],[1.768,-5.628]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[233.43,143.281],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.305,-1.54],[1.409,-0.465],[0.62,0.345],[-0.007,1.447],[-0.196,1.413],[-0.959,0.446],[-0.998,-0.352],[0.005,-1.349]],"o":[[-0.069,1.452],[-0.695,0.229],[-1.574,-0.881],[0.008,-1.423],[0.153,-1.107],[1.008,-0.467],[1.355,0.478],[-0.005,1.658]],"v":[[3.754,2.898],[2.365,5.494],[-2.484,5.459],[-3.348,0.791],[-3.503,-3.577],[-2.383,-5.202],[2.234,-5.453],[3.695,-2.683]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.185,143.344],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.342,-2.738],[4.203,0.301],[-0.02,2.559],[-3.424,-0.271]],"o":[[-0.161,3.412],[-3.425,-0.246],[0.029,-3.479],[3.149,0.249]],"v":[[3.726,0.217],[-0.643,5.48],[-3.4,-1.56],[0.836,-5.51]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[284.039,142.455],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.219,-2.11],[0.934,-0.653],[0.791,0.21],[0.147,2.178],[-1.083,0.816],[-0.98,-0.109]],"o":[[-0.056,1.165],[-0.743,0.519],[-2.675,-0.711],[-0.077,-1.145],[0.8,-0.602],[2.793,0.308]],"v":[[3.585,2.477],[2.769,5.208],[-1.884,5.585],[-3.609,-1.783],[-2.915,-5.193],[1.767,-5.628]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[271.62,142.483],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.305,-1.541],[1.41,-0.464],[0.619,0.346],[-0.007,1.447],[-0.196,1.414],[-0.959,0.446],[-0.998,-0.352],[0.005,-1.349]],"o":[[-0.068,1.451],[-0.695,0.229],[-1.575,-0.881],[0.008,-1.423],[0.154,-1.107],[1.008,-0.467],[1.355,0.478],[-0.005,1.658]],"v":[[3.754,2.899],[2.365,5.494],[-2.484,5.459],[-3.348,0.791],[-3.503,-3.577],[-2.384,-5.202],[2.234,-5.453],[3.695,-2.683]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[259.376,142.545],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.21,-2.737],[3.975,-0.155],[0.173,2.595],[-3.625,-0.115]],"o":[[0,3.365],[-3.587,0.141],[-0.239,-3.581],[3.095,0.099]],"v":[[3.628,0.036],[-0.231,5.519],[-3.598,-1.002],[0.403,-5.545]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[323.248,140.229],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.317,-2.093],[0.905,-0.698],[0.8,0.173],[0.275,2.164],[-1.039,0.862],[-0.983,-0.061]],"o":[[0,1.167],[-0.715,0.552],[-2.67,-0.576],[-0.146,-1.137],[0.771,-0.639],[2.762,0.174]],"v":[[3.745,2.267],[3.058,5.035],[-1.57,5.63],[-3.705,-1.646],[-3.177,-5.085],[1.478,-5.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[309.891,140.916],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.234,-1.572],[1.385,-0.53],[0.634,0.316],[0.082,1.448],[-0.128,1.428],[-0.936,0.49],[-1.014,-0.304],[-0.067,-1.348]],"o":[[0,1.453],[-0.684,0.262],[-1.618,-0.807],[-0.081,-1.423],[0.1,-1.112],[0.985,-0.514],[1.379,0.415],[0.083,1.671]],"v":[[3.758,2.702],[2.494,5.36],[-2.351,5.555],[-3.448,0.933],[-3.863,-3.421],[-2.823,-5.097],[1.779,-5.567],[3.369,-2.869]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.841,141.537],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.211,-2.737],[3.975,-0.155],[0.174,2.595],[-3.624,-0.115]],"o":[[0,3.365],[-3.588,0.141],[-0.239,-3.581],[3.095,0.099]],"v":[[3.627,0.036],[-0.231,5.519],[-3.599,-1.002],[0.402,-5.545]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[361.356,137.621],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.317,-2.093],[0.904,-0.698],[0.799,0.173],[0.276,2.164],[-1.038,0.862],[-0.984,-0.061]],"o":[[0,1.167],[-0.716,0.552],[-2.67,-0.576],[-0.145,-1.137],[0.771,-0.639],[2.762,0.174]],"v":[[3.745,2.267],[3.058,5.035],[-1.57,5.63],[-3.706,-1.646],[-3.178,-5.085],[1.478,-5.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[347.999,138.309],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.099,-0.661],[1.385,-0.53],[0.634,0.316],[0.082,1.448],[-0.128,1.428],[-0.936,0.49],[-1.013,-0.303],[-0.077,-1.349],[-0.149,-1.144]],"o":[[0,1.453],[-0.683,0.263],[-1.617,-0.807],[-0.081,-1.423],[0.099,-1.112],[0.984,-0.514],[1.387,0.417],[0.067,1.147],[0.087,0.669]],"v":[[3.814,2.701],[2.549,5.359],[-2.296,5.555],[-3.392,0.932],[-3.807,-3.421],[-2.767,-5.098],[1.835,-5.568],[3.424,-2.87],[3.426,0.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[335.893,138.93],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.016,-1.26],[1.398,0.369],[2.542,0.926],[-1.355,1.046],[-1.081,-0.434]],"o":[[-0.473,1.62],[-2.612,-0.69],[0.826,-1.505],[0.93,-0.718],[-0.422,3.717]],"v":[[7.381,4.512],[0.405,3.532],[-7.38,1.283],[-2.685,-2.435],[2.368,-5.699]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[313.406,184.939],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.015,-1.26],[1.398,0.369],[2.542,0.927],[-1.355,1.045],[-1.081,-0.433]],"o":[[-0.472,1.621],[-2.612,-0.69],[0.826,-1.504],[0.93,-0.719],[-0.422,3.717]],"v":[[7.38,4.512],[0.405,3.532],[-7.38,1.283],[-2.685,-2.434],[2.368,-5.699]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[282.919,207.202],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.715,2.756]],"o":[[3.531,-2.62],[0,0]],"v":[[-5.388,3.997],[5.388,-3.997]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[309.889,183.041],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.492,1.688],[0.272,5.355],[1.081,-4.537],[2.1,-1.118]],"o":[[2.645,-4.72],[5.573,0.263],[-0.518,2.175],[-1.106,0.589]],"v":[[-4.549,7.195],[-1.272,-8.883],[3.961,1.907],[0.149,8.017]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[294.848,204.518],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.25,1.554],[0.077,4.041],[-2.095,0.215],[-0.541,-0.995],[1.77,-3.279],[1.349,-0.473]],"o":[[1.688,-3.707],[-0.024,-1.321],[1.348,-0.138],[1.825,3.365],[-0.654,1.212],[-1.244,0.434]],"v":[[-4.272,7.354],[-2.189,-4.542],[-0.702,-8.771],[2.697,-6.206],[2.419,5.562],[-0.419,8.404]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[324.796,181.514],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.791,-0.918],[1.427,0.118],[3.156,0.231],[6.602,0.452],[6.331,0.306],[3.053,0.088],[3.261,-0.433],[1.073,-0.072],[0.704,0.026],[1.62,0.091],[3.378,0.207],[6.39,0.592],[-1.025,1.446],[-1.367,-0.009],[-12.747,-0.079],[-13.231,0.001],[-13.377,-0.04],[-13.226,0.316],[-26.896,9.966],[3.97,-2.176],[4.464,-1.808],[10.053,-1.864],[10.403,0.282],[4.954,0.336]],"o":[[-0.766,-1.438],[-3.155,-0.261],[-6.6,-0.482],[-6.323,-0.433],[-3.051,-0.147],[-3.293,-0.095],[-0.732,0.098],[-0.695,0.046],[-1.621,-0.056],[-3.379,-0.189],[-6.406,-0.391],[-5.173,-0.48],[0.836,-1.179],[12.75,0.088],[13.219,0.083],[13.37,-0.001],[13.227,0.039],[28.623,-0.682],[-3.092,3.403],[-4.216,2.312],[-9.484,3.844],[-10.249,1.898],[-4.963,-0.134],[-4.907,-0.332]],"v":[[10.172,11.387],[2.9,10.612],[-6.57,9.959],[-26.37,8.534],[-45.341,7.383],[-54.492,6.915],[-64.758,6.786],[-66.46,7.219],[-68.623,7.159],[-73.485,6.923],[-83.623,6.372],[-102.811,4.641],[-124.922,1.099],[-116.123,0.665],[-77.897,2.227],[-38.229,3.641],[1.883,3.145],[41.568,2.997],[125.948,-12.505],[113.624,-4.824],[100.776,1.626],[71.219,10.064],[40.289,12.224],[25.409,11.583]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[318.804,156.823],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.871,-1.481]],"o":[[-2.036,1.259],[0,0]],"v":[[2.89,-2.113],[-2.89,2.113]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.515,203.92],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.528,-5.601],[9.285,-2.444],[8.841,3.684],[-0.52,1.706],[-1.297,1.673],[-3.319,4.226],[-12.027,16.478],[-2.711,-0.042],[-2.578,-0.099],[-4.976,-0.27],[-10.094,-0.758],[-5.453,-0.195],[0.618,-1.37],[0.129,-1.813],[1.251,-1.933],[1.034,0.874],[0.503,0.884],[0.815,2.194],[4.162,-3.059],[2.24,-1.633],[0.098,-2.946],[0.553,-2.388],[1.286,-0.043],[0.538,1.071],[-0.249,2.195],[0.239,-0.262]],"o":[[-7.299,5.776],[-7.567,5.63],[-9.264,2.44],[-1.454,-0.606],[0.614,-2.018],[3.294,-4.246],[12.602,-16.045],[1.643,-2.252],[2.579,0.039],[4.979,0.192],[10.108,0.548],[5.448,0.409],[5.477,0.196],[-0.727,1.611],[-0.157,2.227],[-0.703,1.087],[-0.78,-0.659],[-1.2,-2.109],[-4.148,3.077],[-2.233,1.644],[-2.402,1.751],[-0.083,2.45],[-0.291,1.258],[-1.47,0.049],[-0.994,-1.982],[-0.35,-0.06],[0,0]],"v":[[12.576,4.679],[-10.116,21.414],[-34.467,35.704],[-62.215,33.783],[-65.924,31.119],[-61.282,25.09],[-51.357,12.387],[-13.544,-35.892],[-8.37,-37.708],[-0.631,-37.58],[14.31,-36.812],[44.615,-34.69],[60.967,-33.742],[56.585,-27.424],[56.454,-20.777],[54.854,-13.374],[52.959,-13.334],[51.033,-15.81],[49.228,-22.31],[36.776,-13.086],[30.07,-8.165],[27.54,-3.215],[26.585,4.09],[23.951,10.245],[20.323,6.638],[19.237,0.15],[18.355,0.454]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[266.049,201.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.84,0.511],[7.063,1.032],[3.913,0.507],[1.482,2.51],[-10.394,2.32],[-2.203,1.462],[0.599,1.927],[1.367,2.858],[1.464,3.714],[3.834,9.807],[1.497,3.899],[-1.589,1.074],[-2.368,0.222],[-5.06,0.224],[-3.236,-2.538],[-2.264,-2.834],[-5.829,-7.099],[-7.289,0.926],[-4.326,0.434],[-5.253,0.419],[-21.223,1.596],[-21.192,1.79],[-10.319,-1.167],[-8.513,-2.913],[-2.975,-1.362],[-0.881,-2.233],[0,0],[-1.664,-4.53],[3.777,-2.334],[3.878,-0.953],[6.169,-1.391],[27.984,0.029],[28.318,1.106],[13.616,-0.203],[2.667,-0.879]],"o":[[-7.719,1.461],[-7.146,-0.466],[-3.903,-0.57],[-2.455,-0.317],[10.38,-2.385],[2.549,-0.57],[2.039,-1.354],[-0.942,-3.035],[-1.723,-3.604],[-3.859,-9.796],[-1.521,-3.89],[-0.563,-1.466],[2.122,-1.434],[5.04,-0.47],[4.009,-0.177],[2.875,2.255],[5.738,7.185],[3.94,4.798],[4.264,-0.542],[5.243,-0.527],[21.214,-1.694],[21.21,-1.595],[10.319,-0.873],[8.987,1.016],[3.094,1.059],[1.955,0.895],[0.394,0.997],[0,0],[1.563,4.255],[-3.454,2.135],[-6.137,1.51],[-27.392,6.18],[-28.338,-0.03],[-13.606,-0.531],[-2.788,0.042],[0,0]],"v":[[-105.346,43.51],[-128.865,44.958],[-150.003,41.878],[-161.777,40.638],[-171.746,37.675],[-140.602,30.525],[-131.998,28.917],[-131.476,22.615],[-135.249,13.86],[-139.79,2.775],[-151.341,-26.624],[-155.954,-38.278],[-155.867,-42.693],[-147.011,-43.842],[-131.896,-45.292],[-121.455,-42.588],[-114.079,-34.524],[-95.625,-14.056],[-79.528,-1.36],[-66.934,-3.816],[-51.172,-5.102],[12.498,-9.857],[76.074,-15.094],[107.163,-15.325],[133.099,-8.749],[142.261,-5.24],[149.265,-0.516],[159.633,6.553],[170.183,15.666],[166.337,26.531],[154.813,30.252],[136.442,34.908],[53.146,42.067],[-31.845,41.102],[-72.761,39.135],[-81.873,39.739]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.746,118.45],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"ix":23,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181.000007372281,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"clouds","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[1033.524,248,0],"e":[187.524,248,0],"to":[-141,0,0],"ti":[141,0,0]},{"t":180.00000733155}],"ix":2},"a":{"a":0,"k":[2196,540,0],"ix":1},"s":{"a":0,"k":[47,47,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.064,4.762],[30.951,0],[8.265,-4.207],[21.629,0],[7.059,-25.76],[2.464,0],[0,-17.171],[-17.171,0],[-5.25,4.052],[-16.434,-1.579],[-7.154,0],[-5.251,4.051],[-18.832,0],[-10,7.225],[-4.433,0],[0,17.172]],"o":[[-3.807,-29.917],[-9.909,0],[-10.776,-17.013],[-28,0],[-2.298,-0.542],[-17.171,0],[0,17.172],[7.145,0],[9.976,12.028],[5.254,4.061],[7.145,0],[11.151,13.445],[13.28,0],[3.816,1.672],[17.171,0],[0,-12.809]],"v":[[-47.811,16.25],[-108.117,-36.795],[-135.641,-30.208],[-187.025,-58.523],[-245.66,-13.833],[-252.817,-14.663],[-283.909,16.429],[-252.817,47.521],[-233.841,41.057],[-192.903,62.765],[-173.909,69.249],[-154.932,62.786],[-108.117,84.795],[-72.555,73.31],[-60.091,75.912],[-29,44.82]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.786,2.49],[16.188,0],[3.692,-13.473],[1.289,0],[0,-8.98],[-8.98,0],[-2.746,2.118],[-9.849,0],[-5.23,3.778],[-2.318,0],[0,8.98]],"o":[[-1.991,-15.646],[-14.643,0],[-1.201,-0.284],[-8.98,0],[0,8.981],[3.737,0],[5.832,7.031],[6.945,0],[1.996,0.874],[8.981,0],[0,-6.7]],"v":[[-360.792,-57.053],[-392.332,-84.795],[-422.997,-61.422],[-426.74,-61.856],[-443,-45.596],[-426.74,-29.335],[-416.815,-32.715],[-392.332,-21.205],[-373.733,-27.211],[-367.215,-25.851],[-350.954,-42.111]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[11.064,4.762],[30.951,0],[7.059,-25.76],[2.464,0],[0,-17.172],[-17.171,0],[-5.251,4.051],[-18.832,0],[-10,7.225],[-4.433,0],[0,17.172]],"o":[[-3.807,-29.917],[-28,0],[-2.298,-0.542],[-17.171,0],[0,17.171],[7.145,0],[11.151,13.445],[13.28,0],[3.816,1.672],[17.171,0],[0,-12.809]],"v":[[-608.811,4.25],[-669.117,-48.795],[-727.751,-4.104],[-734.909,-4.934],[-766,26.158],[-734.909,57.249],[-715.932,50.786],[-669.117,72.795],[-633.555,61.31],[-621.091,63.912],[-590,32.82]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1825,154.205],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181.000007372281,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"airplane Outlines Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,210,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":500,"h":500,"ip":0,"op":181.000007372281,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"mtns","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[1030,248,0],"e":[-188.5,248,0],"to":[-143.601577758789,0,0],"ti":[59.4817504882812,0,0]},{"t":180.00000733155}],"ix":2},"a":{"a":0,"k":[2196,540,0],"ix":1},"s":{"a":0,"k":[47,47,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.61,14.489],[0.21,0.149],[0,0],[0.211,0.009],[9.57,1.577],[0.341,0.064],[0.657,0.125],[13.041,3.439],[0.002,0],[1.507,0.41],[0.854,0.238],[0.611,0.172],[14.896,5.526],[60.277,62.679],[0.714,0.751],[1.274,1.366],[2.05,2.269],[0.018,0.02],[60.958,35.551],[7.491,3.977],[17.887,2.208],[5.46,0.026],[0.208,0],[1.066,-0.038],[0.349,-0.016],[0.929,-0.072],[0.396,-0.036],[0.915,-0.111],[0.366,-0.049],[1.25,-0.223],[0,0],[26.206,-14.118],[32.43,-30.952],[26.356,-29.184],[9.457,-9.595],[0.547,-0.552],[1.679,-1.67],[0.768,-0.76],[1.883,-1.831],[0.056,-0.054],[64.854,-35.334],[0.999,-0.538],[0.527,-0.283],[54.805,-3.732],[50.327,10.812],[4.412,1.089],[54.866,50.32],[0.912,1.21],[92.009,21.187],[1.955,0.414],[65.354,-60.475],[93.453,-26.693],[0.767,-0.215],[0.815,-0.225],[28.373,-0.015],[21.028,3.594],[1.666,0.301],[65.797,36.602],[0.66,0.371],[1.298,0.742],[7.052,4.451],[0.002,0.002],[71.948,65.843],[1.275,1.159],[0.007,0.006],[0.001,0.001],[49.021,-8.766],[0,0],[22.944,-11.286],[69.483,-69.397],[89.857,-48.282],[109.69,27.082],[189.604,40.129],[65.837,-56.311],[96.237,-27.193],[115.625,46.105],[75.301,78.995],[46.655,30.06],[18.918,-20.976],[0,-11.732],[0,-59.755],[0,-65.086],[-8.345,-44.467],[-10.661,-7.061],[-11.985,-0.023],[-454.578,-0.86],[-317.816,0],[-68.671,0.146],[0,0],[0,0],[0,0],[-402.384,0],[-248.062,0.554],[0,0],[0,0],[0,0],[0,39.129]],"o":[[-0.146,-0.156],[0,0],[-0.208,-0.009],[-7.431,-4.979],[-0.339,-0.063],[-0.657,-0.123],[-11.479,-2.209],[-0.001,0],[-1.488,-0.393],[-0.854,-0.234],[-0.608,-0.169],[-15.296,-4.32],[-81.578,-30.265],[-0.715,-0.745],[-1.287,-1.353],[-2.064,-2.216],[-0.018,-0.02],[-46.922,-51.959],[-7.749,-5.085],[-15.299,-9.572],[-5.639,-0.932],[-0.209,-0.001],[-1.073,0.002],[-0.35,0.012],[-0.935,0.044],[-0.397,0.031],[-0.92,0.083],[-0.367,0.045],[-1.26,0.17],[0,0],[-22.062,2.882],[-39.957,20.896],[-23.477,21.714],[-9.209,10.197],[-0.547,0.553],[-1.673,1.689],[-0.765,0.762],[-1.876,1.854],[-0.056,0.054],[-81.074,78.801],[-0.997,0.541],[-0.53,0.286],[-52.262,27.962],[-37.521,1.141],[-4.387,-0.981],[-78.168,-19.3],[-0.925,-1.189],[-61.212,-81.228],[-1.931,-0.447],[-87.139,-18.567],[-71.182,60.954],[-0.769,0.219],[-0.812,0.228],[-78.988,21.739],[-21.497,-0.675],[-1.668,-0.285],[-47.385,-8.71],[-0.661,-0.369],[-1.296,-0.728],[-7.251,-4.154],[-0.002,-0.001],[-83.553,-52.732],[-1.281,-1.178],[-0.007,-0.006],[-0.001,-0.001],[-64.051,-58.195],[0,0],[-20.423,1.711],[-90.114,44.325],[-72.161,72.071],[-98.652,53.009],[-183.691,-45.353],[-83.528,-17.678],[-73.713,63.046],[-119.458,33.754],[-102.983,-41.064],[-38.102,-39.971],[-15.687,-10.107],[-8.21,9.104],[0,59.755],[0,65.086],[0,45.114],[3.437,18.313],[10.202,6.756],[454.579,0.86],[317.816,0.601],[68.879,0],[0,0],[0,0],[0,0],[402.383,0.761],[250.056,0],[0,0],[0,0],[0,0],[0,-39.129],[0,-19.006]],"v":[[3636.482,83.226],[3635.941,82.768],[3636.482,82.727],[3635.839,82.696],[3576.718,75.489],[3575.705,75.301],[3573.735,74.924],[3536.878,66.517],[3536.874,66.516],[3532.373,65.303],[3529.81,64.599],[3527.977,64.084],[3482.667,49.281],[3266.653,-92.077],[3264.513,-94.331],[3260.663,-98.402],[3254.489,-105.125],[3254.437,-105.184],[3093.159,-255.292],[3070.293,-268.923],[3020.618,-286.821],[3003.969,-288.272],[3003.344,-288.268],[3000.134,-288.21],[2999.087,-288.166],[2996.292,-287.992],[2995.102,-287.897],[2992.351,-287.6],[2991.249,-287.469],[2987.482,-286.886],[2987.482,-286.556],[2915.225,-261.374],[2808.165,-181.338],[2733.476,-105.125],[2705.453,-75.439],[2703.811,-73.785],[2698.784,-68.744],[2696.48,-66.465],[2690.845,-60.928],[2690.679,-60.767],[2458.021,110.474],[2455.03,112.1],[2453.452,112.948],[2293.164,159.492],[2156.967,147.841],[2143.77,144.742],[1953.247,28.472],[1950.49,24.875],[1706.802,-135.827],[1700.978,-137.125],[1460.493,-80.263],[1236.844,59.061],[1234.537,59.719],[1232.095,60.394],[1055.004,82.945],[991.105,76.639],[986.104,75.75],[809.755,12.112],[807.772,11.005],[803.88,8.791],[782.416,-4.11],[782.408,-4.115],[569.203,-200.89],[565.37,-204.393],[565.349,-204.412],[565.347,-204.414],[395.483,-286.886],[395.483,-284.227],[330.668,-265.165],[107.855,-69.803],[-137.804,112.554],[-448.23,144.742],[-891.023,-137.125],[-1127.019,-84.104],[-1356.307,59.4],[-1714.042,44.391],[-1965.898,-144.477],[-2090.674,-255.062],[-2196.518,-286.886],[-2196.518,-212.645],[-2196.518,-33.379],[-2196.518,161.879],[-2196.518,305.79],[-2189.578,330.091],[-2128.795,330.206],[-765.061,332.786],[188.39,332.993],[394.672,332.747],[391.483,332.993],[1935.942,332.993],[1149.726,331.505],[2356.871,332.993],[3103.482,330.909],[3103.482,332.993],[3636.482,332.993],[3636.482,331.306],[3636.482,213.918]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.573000021542,0.423999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2196,747.209],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181.000007372281,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"landscape Outlines 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[1030,248,0],"e":[-188.5,248,0],"to":[-203.08332824707,0,0],"ti":[203.08332824707,0,0]},{"t":180.00000733155}],"ix":2},"a":{"a":0,"k":[2196,540,0],"ix":1},"s":{"a":0,"k":[47,47,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.751,2.675],[-1.086,0.713],[-1.737,-2.684],[1.215,-0.768],[0.896,1.36]],"o":[[1.087,-0.713],[1.748,2.679],[0.897,1.386],[-1.133,0.716],[-1.761,-2.669]],"v":[[-4.698,-3.733],[-1.438,-5.872],[3.801,2.164],[3.342,5.155],[0.559,4.292]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2439.327,541.702],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.283,-0.337],[-0.653,-1.408],[-1.484,-2.785],[-2.939,-4.867],[-2.639,-4.691],[-2.361,-5.025],[-1.359,-2.146],[-3.768,-5.981],[-2.447,-4.186],[-2.471,-3.836],[-0.651,-0.763],[3.766,-2.518],[0.367,0.847],[3.237,7.443],[5.035,11.603],[5.232,12.05],[2.95,6.762],[0.025,0.696]],"o":[[0.177,1.625],[1.335,2.876],[2.677,5.023],[2.783,4.609],[2.709,4.817],[1.076,2.292],[3.782,5.969],[2.576,4.09],[2.3,3.937],[0.527,0.818],[-3.785,2.492],[-0.807,0.54],[-3.216,-7.453],[-5.046,-11.599],[-5.229,-12.051],[-2.94,-6.767],[-0.233,-0.536],[0.285,0.338]],"v":[[-30.485,-57.183],[-28.527,-52.954],[-23.667,-44.802],[-15.093,-30.067],[-7.061,-16.047],[1.13,-1.623],[5.057,4.933],[15.762,23.21],[22.986,35.822],[29.979,47.575],[31.336,50.171],[19.99,57.656],[18.502,57.158],[8.784,34.83],[-6.335,0.027],[-22.013,-36.132],[-30.866,-56.418],[-31.336,-58.196]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2399.309,490.258],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.177,1.625],[-5.21,-5.619],[-8.72,-9.418],[-12.031,-12.99],[-2.042,-2.197],[1.604,-1.051],[4.902,-3.215],[1.087,-0.713],[1.327,-0.82],[0.527,0.818],[2.3,3.937],[2.576,4.09],[3.782,5.969],[1.076,2.292],[2.709,4.817],[2.783,4.609],[2.677,5.023],[1.335,2.876]],"o":[[5.229,5.602],[8.727,9.411],[12.028,12.993],[2.038,2.2],[1.328,1.429],[-4.902,3.213],[-1.085,0.713],[-1.328,0.819],[-0.651,-0.763],[-2.471,-3.836],[-2.447,-4.186],[-3.768,-5.981],[-1.359,-2.146],[-2.361,-5.025],[-2.639,-4.691],[-2.939,-4.867],[-1.484,-2.785],[-0.653,-1.408]],"v":[[-42.686,-53.677],[-27.003,-36.868],[-0.854,-8.606],[35.24,30.364],[41.355,36.963],[41.081,39.434],[26.378,49.079],[23.119,51.218],[19.135,53.677],[17.778,51.081],[10.785,39.328],[3.561,26.716],[-7.144,8.439],[-11.071,1.883],[-19.262,-12.541],[-27.294,-26.561],[-35.868,-41.296],[-40.728,-49.448]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2411.51,486.752],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[2410.901,490.14],"ix":2},"a":{"a":0,"k":[2410.901,490.14],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"tree","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.11,1.983],[-0.806,0.046],[-0.1,-1.984],[0.893,-0.036],[0.06,1.01]],"o":[[0.807,-0.046],[0.108,1.986],[0.052,1.025],[-0.832,0.033],[-0.117,-1.983]],"v":[[-1.396,-3.589],[1.023,-3.727],[1.343,2.227],[0.166,3.694],[-1.063,2.363]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1212.631,600.389],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.047,-0.27],[0.086,-0.96],[0.067,-1.959],[-0.068,-3.532],[0.039,-3.344],[0.293,-3.437],[-0.065,-1.578],[-0.167,-4.39],[-0.015,-3.013],[-0.137,-2.833],[-0.113,-0.614],[2.81,-0.184],[-0.066,0.57],[-0.573,5.013],[-0.9,7.81],[-0.932,8.112],[-0.516,4.557],[-0.203,0.383]],"o":[[-0.411,0.93],[-0.176,1.963],[-0.122,3.536],[0.063,3.346],[-0.041,3.434],[-0.133,1.568],[0.178,4.388],[0.115,3.003],[0.013,2.833],[0.028,0.604],[-2.811,0.164],[-0.602,0.039],[0.588,-5.011],[0.893,-7.809],[0.934,-8.11],[0.523,-4.555],[0.041,-0.361],[0.048,0.27]],"v":[[4.623,-38.36],[4.36,-35.476],[4.441,-29.578],[4.472,-18.983],[4.432,-8.94],[4.354,1.368],[4.428,6.118],[4.504,19.281],[4.469,28.315],[4.577,36.814],[4.499,38.633],[-3.934,39.132],[-4.58,38.401],[-2.865,23.363],[-0.176,-0.066],[2.634,-24.398],[4.179,-38.067],[4.479,-39.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1203.828,558.252],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.411,0.93],[-1.056,-4.644],[-1.762,-7.779],[-2.434,-10.732],[-0.416,-1.817],[1.19,-0.068],[3.637,-0.205],[0.806,-0.046],[0.97,-0.029],[0.028,0.604],[0.013,2.833],[0.115,3.003],[0.178,4.388],[-0.133,1.568],[-0.041,3.434],[0.063,3.346],[-0.122,3.536],[-0.176,1.963]],"o":[[1.071,4.641],[1.769,7.779],[2.431,10.733],[0.413,1.817],[0.27,1.182],[-3.637,0.204],[-0.807,0.046],[-0.97,0.027],[-0.113,-0.614],[-0.137,-2.833],[-0.015,-3.013],[-0.167,-4.39],[-0.065,-1.578],[0.293,-3.437],[0.039,-3.344],[-0.068,-3.532],[0.067,-1.959],[0.086,-0.96]],"v":[[-8.433,-38.497],[-5.223,-24.574],[0.058,-1.234],[7.359,30.961],[8.598,36.414],[7.682,37.659],[-3.229,38.274],[-5.648,38.412],[-8.557,38.497],[-8.479,36.677],[-8.587,28.179],[-8.552,19.144],[-8.627,5.982],[-8.702,1.232],[-8.623,-9.076],[-8.584,-19.12],[-8.615,-29.714],[-8.695,-35.612]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1216.884,558.388],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1212.43,561.583],"ix":2},"a":{"a":0,"k":[1212.43,561.583],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"tree","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.774,2.661],[-1.082,-0.72],[1.787,-2.652],[1.183,0.816],[-0.899,1.358]],"o":[[1.082,0.721],[-1.778,2.658],[-0.923,1.368],[-1.103,-0.761],[1.764,-2.666]],"v":[[1.486,-5.849],[4.732,-3.69],[-0.605,4.282],[-3.536,5.034],[-3.833,2.133]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1451.969,669.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.199,-0.394],[1.039,-1.153],[1.979,-2.457],[3.324,-4.611],[3.28,-4.268],[3.696,-4.144],[1.441,-2.092],[4.024,-5.81],[2.891,-3.892],[2.56,-3.777],[0.446,-0.898],[3.794,2.477],[-0.636,0.669],[-5.577,5.897],[-8.699,9.183],[-9.031,9.541],[-5.064,5.366],[-0.631,0.295]],"o":[[-1.426,0.799],[-2.122,2.356],[-3.571,4.433],[-3.149,4.368],[-3.368,4.381],[-1.686,1.89],[-4.008,5.82],[-2.751,3.975],[-2.718,3.661],[-0.545,0.806],[-3.776,-2.504],[-0.813,-0.531],[5.594,-5.882],[8.69,-9.191],[9.034,-9.537],[5.072,-5.358],[0.401,-0.425],[-0.2,0.393]],"v":[[43.026,-48.898],[39.904,-45.439],[34.312,-37.771],[24.121,-24.105],[14.374,-11.216],[4.32,1.976],[-0.171,8.16],[-12.784,25.175],[-21.552,36.768],[-29.62,47.811],[-31.475,50.078],[-42.811,42.577],[-42.936,41.013],[-26.21,23.315],[-0.126,-4.244],[26.984,-32.849],[42.173,-48.949],[43.624,-50.078]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1481.105,610.484],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.426,0.799],[3.125,-6.998],[5.243,-11.715],[7.229,-16.163],[1.22,-2.74],[1.597,1.063],[4.88,3.247],[1.082,0.721],[1.274,0.9],[-0.545,0.806],[-2.718,3.661],[-2.751,3.975],[-4.008,5.82],[-1.686,1.89],[-3.368,4.381],[-3.149,4.368],[-3.571,4.433],[-2.122,2.356]],"o":[[-3.102,7.007],[-5.233,11.718],[-7.233,16.16],[-1.224,2.738],[-0.793,1.784],[-4.877,-3.249],[-1.082,-0.72],[-1.275,-0.9],[0.446,-0.898],[2.56,-3.777],[2.891,-3.892],[4.024,-5.81],[1.441,-2.092],[3.696,-4.144],[3.28,-4.268],[3.324,-4.611],[1.979,-2.457],[1.039,-1.153]],"v":[[37.25,-57.321],[27.939,-36.302],[12.199,-1.163],[-9.489,47.324],[-13.161,55.537],[-15.542,56.255],[-30.18,46.514],[-33.426,44.354],[-37.251,41.655],[-35.396,39.388],[-27.328,28.345],[-18.56,16.752],[-5.947,-0.263],[-1.456,-6.447],[8.598,-19.639],[18.345,-32.528],[28.536,-46.194],[34.128,-53.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1486.881,618.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1481.209,618.147],"ix":2},"a":{"a":0,"k":[1481.209,618.147],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"tree","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.808,2.126],[-0.864,-0.328],[0.82,-2.122],[0.95,0.379],[-0.408,1.084]],"o":[[0.865,0.328],[-0.811,2.125],[-0.422,1.096],[-0.885,-0.353],[0.801,-2.129]],"v":[[0.119,-4.361],[2.712,-3.378],[0.275,2.996],[-1.638,3.982],[-2.304,2.018]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1394.337,637.817],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.076,-0.304],[0.537,-0.964],[0.983,-2.018],[1.574,-3.724],[1.599,-3.479],[1.905,-3.459],[0.668,-1.68],[1.869,-4.667],[1.387,-3.158],[1.176,-3.025],[0.168,-0.693],[3.023,1.116],[-0.335,0.564],[-2.931,4.973],[-4.575,7.746],[-4.75,8.048],[-2.661,4.523],[-0.391,0.305]],"o":[[-0.862,0.78],[-1.098,1.97],[-1.773,3.639],[-1.49,3.529],[-1.64,3.572],[-0.87,1.577],[-1.856,4.671],[-1.277,3.192],[-1.305,2.969],[-0.251,0.645],[-3.015,-1.137],[-0.648,-0.239],[2.947,-4.966],[4.569,-7.751],[4.753,-8.046],[2.667,-4.519],[0.211,-0.359],[-0.076,0.304]],"v":[[22.729,-39.765],[21.113,-36.87],[18.451,-30.667],[13.551,-19.576],[8.836,-9.094],[3.957,1.648],[1.823,6.648],[-4.225,20.446],[-8.466,29.875],[-12.31,38.812],[-13.238,40.677],[-22.287,37.273],[-22.622,36.209],[-13.83,21.286],[-0.113,-1.958],[14.151,-26.092],[22.13,-39.664],[22.957,-40.677]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1404.613,591.514],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.862,0.78],[1.057,-5.347],[1.778,-8.954],[2.45,-12.354],[0.411,-2.093],[1.275,0.484],[3.898,1.478],[0.865,0.328],[0,0],[-0.251,0.645],[-1.305,2.969],[-1.277,3.192],[-1.856,4.671],[-0.87,1.577],[-1.64,3.572],[-1.49,3.529],[-1.773,3.639],[-1.098,1.97]],"o":[[-1.04,5.351],[-1.771,8.956],[-2.453,12.353],[-0.415,2.091],[-0.268,1.362],[-3.898,-1.479],[-0.864,-0.328],[0,0],[0.168,-0.693],[1.176,-3.025],[1.387,-3.158],[1.869,-4.667],[0.668,-1.68],[1.905,-3.459],[1.599,-3.479],[1.574,-3.724],[0.983,-2.018],[0.537,-0.964]],"v":[[17.984,-43.805],[14.86,-27.754],[9.517,-0.893],[2.167,36.167],[0.922,42.443],[-0.615,43.318],[-12.31,38.885],[-14.903,37.902],[-17.984,36.636],[-17.056,34.771],[-13.212,25.835],[-8.971,16.406],[-2.922,2.608],[-0.789,-2.392],[4.09,-13.134],[8.805,-23.616],[13.705,-34.707],[16.367,-40.911]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1409.359,595.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1404.674,596.399],"ix":2},"a":{"a":0,"k":[1404.674,596.399],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"tree","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.242,3.188],[-1.296,-0.097],[0.258,-3.187],[1.431,0.132],[-0.117,1.623]],"o":[[1.296,0.098],[-0.247,3.188],[-0.133,1.645],[-1.335,-0.122],[0.231,-3.189]],"v":[[-1.523,-6.039],[2.365,-5.747],[1.62,3.817],[-0.567,5.908],[-2.248,3.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.388000009574,0.109999997008,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1340.408,615.814],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.019,-0.44],[0.339,-1.513],[0.521,-3.112],[0.638,-5.649],[0.768,-5.327],[1.191,-5.422],[0.231,-2.53],[0.659,-7.038],[0.611,-4.809],[0.379,-4.547],[-0.051,-1.002],[4.521,0.299],[-0.227,0.894],[-1.97,7.875],[-3.08,12.267],[-3.196,12.742],[-1.784,7.159],[-0.405,0.567]],"o":[[-0.851,1.396],[-0.695,3.094],[-0.939,5.614],[-0.603,5.352],[-0.788,5.469],[-0.543,2.474],[-0.64,7.037],[-0.45,4.813],[-0.576,4.523],[-0.081,0.97],[-4.518,-0.332],[-0.969,-0.065],[1.993,-7.869],[3.07,-12.27],[3.201,-12.741],[1.795,-7.156],[0.141,-0.567],[0.019,0.441]],"v":[[15.542,-60.733],[14.517,-56.188],[13.4,-46.763],[11.216,-29.856],[9.038,-13.844],[6.74,2.582],[5.857,10.174],[3.204,31.188],[1.244,45.59],[-0.376,59.169],[-0.883,62.055],[-14.44,61.074],[-15.315,59.772],[-9.411,36.146],[-0.184,-0.659],[9.426,-38.881],[14.774,-60.359],[15.485,-62.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.995999983245,0.313999998803,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1335.109,547.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.851,1.396],[-0.706,-7.63],[-1.172,-12.782],[-1.621,-17.632],[-0.28,-2.985],[1.912,0.145],[5.845,0.438],[1.296,0.097],[1.553,0.159],[-0.081,0.97],[-0.576,4.523],[-0.45,4.813],[-0.64,7.037],[-0.543,2.474],[-0.788,5.469],[-0.603,5.352],[-0.939,5.614],[-0.695,3.094]],"o":[[0.73,7.628],[1.183,12.78],[1.616,17.63],[0.274,2.986],[0.183,1.943],[-5.844,-0.441],[-1.296,-0.097],[-1.553,-0.16],[-0.051,-1.002],[0.379,-4.547],[0.611,-4.809],[0.659,-7.038],[0.231,-2.53],[1.191,-5.422],[0.768,-5.327],[0.638,-5.649],[0.521,-3.112],[0.339,-1.513]],"v":[[2.455,-62.511],[4.641,-39.627],[8.146,-1.282],[13.008,51.611],[13.833,60.569],[12.109,62.362],[-5.424,61.047],[-9.312,60.755],[-13.97,60.277],[-13.464,57.391],[-11.844,43.812],[-9.883,29.41],[-7.23,8.396],[-6.347,0.804],[-4.049,-15.622],[-1.871,-31.634],[0.312,-48.541],[1.43,-57.966]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.736999990426,0.630999995213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1348.197,549.02],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[1340.902,553.463],"ix":2},"a":{"a":0,"k":[1340.902,553.463],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"tree","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181.000007372281,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"landscape Outlines 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[1030,248,0],"e":[-188.5,248,0],"to":[-203.08332824707,0,0],"ti":[203.08332824707,0,0]},{"t":180.00000733155}],"ix":2},"a":{"a":0,"k":[2196,540,0],"ix":1},"s":{"a":0,"k":[47,47,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[433.5,98.5],[-433.5,98.5],[-433.5,-98.5],[433.5,-98.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.788000009574,0.204000001795,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1928.5,867.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"water","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181.000007372281,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[637.372,248,0],"ix":2},"a":{"a":0,"k":[2196,540,0],"ix":1},"s":{"a":0,"k":[47,47,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2195.5,539],[2195.5,539],[2195.5,-539],[-2195.5,-539]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.75117534399,0.894179105759,0.96685051918,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2195.5,541],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"bg","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181.000007372281,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/ondas.json b/example/resource/ondas.json new file mode 100644 index 0000000000..4818f1418d --- /dev/null +++ b/example/resource/ondas.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":25,"ip":0,"op":175,"w":600,"h":200,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Capa de formas 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,88,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-604,-284]],"c":false},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[39.5,2.75],[35.924,-1.559],[36.995,-1.156],[44.829,-1.288],[51.088,1.559]],"o":[[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-36.664,-2.553],[-32.262,1.4],[-32,1],[-38.162,1.096],[-56.889,-1.736]],"v":[[-330,7],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[161,-42],[62.576,25.059],[-18,-10],[-113.838,26.904],[-213.111,-43.264]],"c":true}],"e":[{"i":[[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[28.993,-0.63],[28.406,-1.166],[20.727,-0.691],[43.266,1.9],[29.686,1.497]],"o":[[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-11.26,0.245],[-33.207,1.363],[-35.994,1.2],[-43.642,-1.917],[-25.352,-1.279]],"v":[[-315,-21],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[345,28.5],[309,0],[178,33],[71.844,-20.084],[-7,30],[-128.266,-46.9],[-227.648,31.279]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[28.993,-0.63],[28.406,-1.166],[20.727,-0.691],[43.266,1.9],[29.686,1.497]],"o":[[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-11.26,0.245],[-33.207,1.363],[-35.994,1.2],[-43.642,-1.917],[-25.352,-1.279]],"v":[[-315,-21],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[345,28.5],[309,0],[178,33],[71.844,-20.084],[-7,30],[-128.266,-46.9],[-227.648,31.279]],"c":true}],"e":[{"i":[[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[22.099,-6.451],[0.25,0.009],[25.563,-0.691],[41.486,0.99],[60.663,-1.035]],"o":[[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-80.5,23.5],[-28.945,-0.993],[-62.01,1.676],[-71.668,-1.711],[-42.39,0.724]],"v":[[-347,1],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[344,-5.5],[305,18],[187,-34],[44.945,-10.257],[-34,-42],[-137.486,10.01],[-263.61,-34.724]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50,"s":[{"i":[[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[22.099,-6.451],[0.25,0.009],[25.563,-0.691],[41.486,0.99],[60.663,-1.035]],"o":[[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-80.5,23.5],[-28.945,-0.993],[-62.01,1.676],[-71.668,-1.711],[-42.39,0.724]],"v":[[-347,1],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[344,-5.5],[305,18],[187,-34],[44.945,-10.257],[-34,-42],[-137.486,10.01],[-263.61,-34.724]],"c":true}],"e":[{"i":[[23,-1],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[36.275,-2.267],[46.011,0],[0.306,-0.016],[21.403,-0.856],[43.848,-0.253],[34.576,1.765]],"o":[[-6.319,0.275],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-32,2],[-42,0],[-41.73,2.135],[-50,2],[-30.74,0.178],[-20.412,-1.042]],"v":[[-301,-20],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[309,15.5],[301,-24],[211,15],[53.73,-16.135],[-30,2],[-152.848,-68.747],[-258.576,5.235]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[23,-1],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[36.275,-2.267],[46.011,0],[0.306,-0.016],[21.403,-0.856],[43.848,-0.253],[34.576,1.765]],"o":[[-6.319,0.275],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-32,2],[-42,0],[-41.73,2.135],[-50,2],[-30.74,0.178],[-20.412,-1.042]],"v":[[-301,-20],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[309,15.5],[301,-24],[211,15],[53.73,-16.135],[-30,2],[-152.848,-68.747],[-258.576,5.235]],"c":true}],"e":[{"i":[[-9,-75],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.489,1.067],[28,0],[0.312,0.208],[34.572,0],[33.942,-0.219],[31.15,-0.014]],"o":[[0.754,6.279],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-37,-1],[-29.709,0],[-24.059,-16.072],[-44,0],[-64.06,0.413],[-2.443,0.001]],"v":[[-310,52],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[319,19.5],[221,-17],[88.5,12],[29.175,-2.414],[-53,-43],[-140.94,14.587],[-269.15,-23.986]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":100,"s":[{"i":[[-9,-75],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.489,1.067],[28,0],[0.312,0.208],[34.572,0],[33.942,-0.219],[31.15,-0.014]],"o":[[0.754,6.279],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-37,-1],[-29.709,0],[-24.059,-16.072],[-44,0],[-64.06,0.413],[-2.443,0.001]],"v":[[-310,52],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[319,19.5],[221,-17],[88.5,12],[29.175,-2.414],[-53,-43],[-140.94,14.587],[-269.15,-23.986]],"c":true}],"e":[{"i":[[9,8],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[28.994,0.624],[0.305,0.008],[34.798,0],[42.507,-1.345],[32.057,0.226]],"o":[[-4.727,-4.202],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-45.446,-0.977],[-53.635,-1.448],[-88.006,0],[-41.477,1.313],[-2.79,-0.02]],"v":[[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[356,-16],[300,17],[106.635,-21.552],[-6,36],[-171.523,-5.313],[-276.057,15.774]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":125,"s":[{"i":[[9,8],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[28.994,0.624],[0.305,0.008],[34.798,0],[42.507,-1.345],[32.057,0.226]],"o":[[-4.727,-4.202],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-45.446,-0.977],[-53.635,-1.448],[-88.006,0],[-41.477,1.313],[-2.79,-0.02]],"v":[[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[356,-16],[300,17],[106.635,-21.552],[-6,36],[-171.523,-5.313],[-276.057,15.774]],"c":true}],"e":[{"i":[[20,-8],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[47,-8],[0.236,0.002],[29.708,0],[48.429,1.52],[49.864,-0.786]],"o":[[-5.872,2.349],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-11.65,1.983],[-39.206,-0.383],[-67,0],[-45.549,-1.43],[-59.216,0.933]],"v":[[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[325,-29],[228,3],[106.206,-10.617],[7,22],[-112.451,-29.57],[-222.784,28.067]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":150,"s":[{"i":[[20,-8],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[47,-8],[0.236,0.002],[29.708,0],[48.429,1.52],[49.864,-0.786]],"o":[[-5.872,2.349],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-11.65,1.983],[-39.206,-0.383],[-67,0],[-45.549,-1.43],[-59.216,0.933]],"v":[[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[325,-29],[228,3],[106.206,-10.617],[7,22],[-112.451,-29.57],[-222.784,28.067]],"c":true}],"e":[{"i":[[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[39.5,2.75],[35.924,-1.559],[36.995,-1.156],[44.829,-1.288],[51.088,1.559]],"o":[[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-36.664,-2.553],[-32.262,1.4],[-32,1],[-38.162,1.096],[-56.889,-1.736]],"v":[[-330,7],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[161,-42],[62.576,25.059],[-18,-10],[-113.838,26.904],[-213.111,-43.264]],"c":true}]},{"t":174}],"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[32.5,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[40.5,-0.5],[31,-0.484],[40,0]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.51,0.475],[-32,0.5],[-39.513,0]],"v":[[-213,-10],[-300,14],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[181,-11],[91,21],[-30,-27],[-119.5,21]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":true}],"ip":0,"op":182,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Capa de formas 7","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[383,69,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[145.483,118.069,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[22,0],[21.482,1.006],[20.41,-1.327],[21.5,0.5],[17.059,0.867],[63.749,1.868],[23,0],[20,1],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-68.647,-3.214],[-19.465,1.266],[-19.521,-0.454],[-36.595,-1.859],[-18.992,-0.557],[-19.026,0],[-20.998,-1.05],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,-20],[180,21],[110.189,-28.317],[71.685,22.194],[26.245,-17.806],[-61,21],[-139.559,-0.52],[-183.124,52.185],[-261.621,-20.847],[-300,20.25],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,21]],"c":true}],"e":[{"i":[[22,0],[21.5,0.5],[20.5,0.5],[13.632,-0.169],[20.516,0.334],[24.57,-0.327],[23,0],[19.965,1.547],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-19.501,-0.476],[-13.947,0.173],[-62.676,-1.02],[-18.998,0.253],[-19.026,0],[-15.15,-1.174],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,20],[166.253,-43.715],[117.063,32.011],[81.996,-6.949],[48.928,28.97],[-61,-20],[-117.563,36.939],[-161.503,-28.47],[-207.694,36.092],[-299,-19.75],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":37,"s":[{"i":[[22,0],[21.5,0.5],[20.5,0.5],[13.632,-0.169],[20.516,0.334],[24.57,-0.327],[23,0],[19.965,1.547],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-19.501,-0.476],[-13.947,0.173],[-62.676,-1.02],[-18.998,0.253],[-19.026,0],[-15.15,-1.174],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,20],[166.253,-43.715],[117.063,32.011],[81.996,-6.949],[48.928,28.97],[-61,-20],[-117.563,36.939],[-161.503,-28.47],[-207.694,36.092],[-299,-19.75],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,-20]],"c":true}],"e":[{"i":[[22,0],[21.5,0.5],[20.474,1.15],[21.5,0.5],[22.558,-0.334],[23,0],[33.017,0.52],[20,1],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-38.703,-2.174],[-19.52,-0.454],[-18.7,0.277],[-19,0],[-19.024,-0.299],[-20.998,-1.05],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,-20],[180,21],[120.5,-19],[55.188,38.279],[1.5,-42.368],[-61.687,36.245],[-119.625,-11.53],[-179,70.818],[-241,-20],[-269.069,87.16],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,21]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":77,"s":[{"i":[[22,0],[21.5,0.5],[20.474,1.15],[21.5,0.5],[22.558,-0.334],[23,0],[33.017,0.52],[20,1],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-38.703,-2.174],[-19.52,-0.454],[-18.7,0.277],[-19,0],[-19.024,-0.299],[-20.998,-1.05],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,-20],[180,21],[120.5,-19],[55.188,38.279],[1.5,-42.368],[-61.687,36.245],[-119.625,-11.53],[-179,70.818],[-241,-20],[-269.069,87.16],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,21]],"c":true}],"e":[{"i":[[22,0],[21.5,0.5],[20.5,0.5],[21.797,0.045],[20.512,0.493],[29.381,-2.453],[40.578,-1.211],[20,1],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-19.501,-0.476],[-21.508,-0.045],[-30.369,-0.729],[-24.835,2.073],[-19.018,0.568],[-20.998,-1.05],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,20],[179.313,-8.989],[119.813,37.092],[60.687,-15.418],[4.249,35.745],[-61,-6.941],[-121,20],[-177.313,10.491],[-247.561,33.551],[-299,-19.75],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":112,"s":[{"i":[[22,0],[21.5,0.5],[20.5,0.5],[21.797,0.045],[20.512,0.493],[29.381,-2.453],[40.578,-1.211],[20,1],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-19.501,-0.476],[-21.508,-0.045],[-30.369,-0.729],[-24.835,2.073],[-19.018,0.568],[-20.998,-1.05],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,20],[179.313,-8.989],[119.813,37.092],[60.687,-15.418],[4.249,35.745],[-61,-6.941],[-121,20],[-177.313,10.491],[-247.561,33.551],[-299,-19.75],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,-20]],"c":true}],"e":[{"i":[[22,0],[21.5,0.5],[20.5,0.5],[21.5,0.5],[19.121,-5.062],[22.966,1.25],[26.143,-0.695],[26.405,-1.112],[29.291,-0.497],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-19.501,-0.476],[-19.52,-0.454],[-21.756,5.76],[-24.921,-1.357],[-24.714,0.657],[-18.952,0.798],[-64.182,1.089],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,-20],[180,21],[123.249,7.256],[69.623,-13.379],[13.873,1.674],[-61,21],[-124.437,-43.715],[-179.687,31.858],[-241,-20],[-300,20.25],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,21]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":149,"s":[{"i":[[22,0],[21.5,0.5],[20.5,0.5],[21.5,0.5],[19.121,-5.062],[22.966,1.25],[26.143,-0.695],[26.405,-1.112],[29.291,-0.497],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-20.001,-0.465],[-19.501,-0.476],[-19.52,-0.454],[-21.756,5.76],[-24.921,-1.357],[-24.714,0.657],[-18.952,0.798],[-64.182,1.089],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,-20],[180,21],[123.249,7.256],[69.623,-13.379],[13.873,1.674],[-61,21],[-124.437,-43.715],[-179.687,31.858],[-241,-20],[-300,20.25],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,21]],"c":true}],"e":[{"i":[[22,0],[21.482,1.006],[20.41,-1.327],[21.5,0.5],[17.059,0.867],[63.749,1.868],[23,0],[20,1],[22.004,0.917],[0,0],[0,0],[0,-6],[-3,0],[3,2],[3.073,2.561]],"o":[[-22.006,0],[-68.647,-3.214],[-19.465,1.266],[-19.521,-0.454],[-36.595,-1.859],[-18.992,-0.557],[-19.026,0],[-20.998,-1.05],[-24,-1],[0,0],[0,0],[0,6],[3,0],[-3,-2],[-6,-5]],"v":[[240,-20],[180,21],[110.189,-28.317],[71.685,22.194],[26.245,-17.806],[-61,21],[-139.559,-0.52],[-183.124,52.185],[-261.621,-20.847],[-300,20.25],[-320.25,38.25],[-321,137],[319,142],[317,37],[300,21]],"c":true}]},{"t":174}],"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,99.171],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":178,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Capa de formas 9","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,88,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[165.038,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[40.5,-0.5],[31,-0.484],[40,0],[5.609,1.379]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.51,0.475],[-32,0.5],[-6.441,0],[-28.799,-7.08]],"v":[[-213,-10],[-300,14],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[181,-11],[91,21],[-30,-27],[-119.5,21],[-137.512,18.797]],"c":true}],"e":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[30,-2],[31,-0.484],[40,0],[5.431,-1.868]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.428,2.562],[-32,0.5],[-6.441,0],[-27.885,9.593]],"v":[[-210,11],[-315,-21],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[345,28.5],[309,0],[154,18],[84,-12],[-6,20],[-120.5,-31],[-138.228,-28.016]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":25,"s":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[30,-2],[31,-0.484],[40,0],[5.431,-1.868]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.428,2.562],[-32,0.5],[-6.441,0],[-27.885,9.593]],"v":[[-210,11],[-315,-21],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[345,28.5],[309,0],[154,18],[84,-12],[-6,20],[-120.5,-31],[-138.228,-28.016]],"c":true}],"e":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[32.996,-0.509],[40.5,-0.5],[26.102,-1.054],[40,0],[8.011,1.557]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-129.59,2],[-38.51,0.475],[-24.774,1],[-6.441,0],[-41.132,-7.994]],"v":[[-272,-20],[-347,1],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[344,-5.5],[305,18],[192,-24],[38,18],[-57.631,-55],[-124.5,15],[-146.349,12.513]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":50,"s":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[32.996,-0.509],[40.5,-0.5],[26.102,-1.054],[40,0],[8.011,1.557]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-129.59,2],[-38.51,0.475],[-24.774,1],[-6.441,0],[-41.132,-7.994]],"v":[[-272,-20],[-347,1],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[344,-5.5],[305,18],[192,-24],[38,18],[-57.631,-55],[-124.5,15],[-146.349,12.513]],"c":true}],"e":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[34.781,-18.728],[28.998,-0.31],[37.553,-2],[31.004,0],[30.01,0],[6.81,-2.891]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-13,7],[-93.451,1],[-36.936,1.967],[-62.706,0],[-6.441,0],[-34.965,14.846]],"v":[[-262,9],[-301,-20],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[309,15.5],[276,-25],[211,15],[61.212,-50],[-30,2],[-141.5,-56],[-161.431,-51.381]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":75,"s":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[34.781,-18.728],[28.998,-0.31],[37.553,-2],[31.004,0],[30.01,0],[6.81,-2.891]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-13,7],[-93.451,1],[-36.936,1.967],[-62.706,0],[-6.441,0],[-34.965,14.846]],"v":[[-262,9],[-301,-20],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[309,15.5],[276,-25],[211,15],[61.212,-50],[-30,2],[-141.5,-56],[-161.431,-51.381]],"c":true}],"e":[{"i":[[17.342,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[22.776,0],[69.184,3],[24.31,-1],[69.272,-2],[3.83,2.046]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-32.362,0],[-96.933,-4.203],[-18.117,0.745],[-6.439,0.186],[-19.663,-10.506]],"v":[[-187,-27],[-310,52],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[315,-54.5],[225,16],[156.576,-27],[52,14],[-52.788,-71],[-133.5,19],[-148.67,15.731]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":100,"s":[{"i":[[17.342,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[22.776,0],[69.184,3],[24.31,-1],[69.272,-2],[3.83,2.046]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-32.362,0],[-96.933,-4.203],[-18.117,0.745],[-6.439,0.186],[-19.663,-10.506]],"v":[[-187,-27],[-310,52],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[315,-54.5],[225,16],[156.576,-27],[52,14],[-52.788,-71],[-133.5,19],[-148.67,15.731]],"c":true}],"e":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[32.603,17],[51.656,3.506],[23.532,0],[24.687,-2.99]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-58.529,-30.518],[-117.884,-8],[-23.73,0],[-27.739,3.359]],"v":[[-250,20],[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[356,-16],[290,9],[111,-45],[7,22],[-129.568,-63],[-181.015,-6.01]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":125,"s":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[32.603,17],[51.656,3.506],[23.532,0],[24.687,-2.99]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-58.529,-30.518],[-117.884,-8],[-23.73,0],[-27.739,3.359]],"v":[[-250,20],[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[356,-16],[290,9],[111,-45],[7,22],[-129.568,-63],[-181.015,-6.01]],"c":true}],"e":[{"i":[[59,0],[28,-9],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[98.917,4.172],[26.603,1],[79.612,-3.1],[20.518,-1],[7.066,-9.166]],"o":[[-34.5,0],[-6.021,1.935],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-71.121,-3],[-29.189,-1.097],[-102.736,4],[-9.766,0.476],[-19.913,25.833]],"v":[[-231,31],[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[356,-16],[202,12],[117,-55],[7,22],[-116.254,-55],[-143.398,-9.834]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":150,"s":[{"i":[[59,0],[28,-9],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[98.917,4.172],[26.603,1],[79.612,-3.1],[20.518,-1],[7.066,-9.166]],"o":[[-34.5,0],[-6.021,1.935],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-71.121,-3],[-29.189,-1.097],[-102.736,4],[-9.766,0.476],[-19.913,25.833]],"v":[[-231,31],[-305,1],[-322,36],[-323,118.5],[314.5,112],[356.5,54],[342,13.5],[356,-16],[202,12],[117,-55],[7,22],[-116.254,-55],[-143.398,-9.834]],"c":true}],"e":[{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[40.5,-0.5],[31,-0.484],[40,0],[5.609,1.379]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.51,0.475],[-32,0.5],[-6.441,0],[-28.799,-7.08]],"v":[[-213,-10],[-300,14],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[181,-11],[91,21],[-30,-27],[-119.5,21],[-137.512,18.797]],"c":true}]},{"t":174}],"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[32.5,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[40.5,-0.5],[31,-0.484],[40,0]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.51,0.475],[-32,0.5],[-39.513,0]],"v":[[-213,-10],[-300,14],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[181,-11],[91,21],[-30,-27],[-119.5,21]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":true},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[27.202,0],[15.5,-7],[8,-3],[-0.5,-1.5],[0,0],[1.5,4.5],[6,0],[39.5,-0.5],[29,0],[40.5,-0.5],[31,-0.484],[40,0],[5.609,1.379]],"o":[[-34.5,0],[-5.764,2.603],[-8,3],[0.5,1.5],[0,0],[-1.5,-4.5],[-6,0],[-39.997,0.506],[-30.5,0],[-38.51,0.475],[-32,0.5],[-6.441,0],[-28.799,-7.08]],"v":[[-213,-10],[-300,14],[-322,36],[-323,118.5],[314.5,112],[316.5,10],[313,-8.5],[283,19],[181,-11],[91,21],[-30,-27],[-119.5,21],[-137.512,18.797]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":182,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Capa de formas 6","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,83,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[41.129,-12.788],[26.96,-0.808],[1.399,-0.957],[19.256,-0.204],[26.627,-0.522],[21,0],[38,-1],[47.027,-1.206],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.061,0],[-30.705,9.547],[-31.026,0.93],[-19,13],[-37.752,0.4],[-18.418,0.361],[-25.08,0],[-52.991,1.395],[-39,1],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[333,-52],[273.705,21.453],[196.04,-2.192],[148,15],[96.752,88.6],[17.418,-14.361],[-35,30],[-104,-42],[-222,47],[-309,-23]],"c":true}],"e":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[6.641,18.354],[14.109,0.193],[27,1],[39.165,0.801],[19.535,-1.188],[31,0],[44,1],[39,-2],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.603,0],[-5.132,-14.182],[-21.95,-0.3],[-36.975,-1.369],[-36.893,-0.755],[-28.506,1.734],[-26.476,0],[-78.986,-1.795],[-33.017,1.693],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[326,60],[314.139,25.326],[293.95,-4.7],[230,33],[161.835,-31.801],[59.506,9.266],[-13,-19],[-100,62],[-220,-28],[-298,84]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":32,"s":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[6.641,18.354],[14.109,0.193],[27,1],[39.165,0.801],[19.535,-1.188],[31,0],[44,1],[39,-2],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.603,0],[-5.132,-14.182],[-21.95,-0.3],[-36.975,-1.369],[-36.893,-0.755],[-28.506,1.734],[-26.476,0],[-78.986,-1.795],[-33.017,1.693],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[326,60],[314.139,25.326],[293.95,-4.7],[230,33],[161.835,-31.801],[59.506,9.266],[-13,-19],[-100,62],[-220,-28],[-298,84]],"c":true}],"e":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[7.65,-6.414],[7.247,-5.107],[4.918,0.164],[12.569,8.758],[22.573,-8.821],[17.943,0.427],[41,0],[25.988,0.619],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.603,0],[-5.911,4.956],[-7.332,5.167],[-14.474,-0.482],[-24.151,-16.829],[-5.86,2.29],[-39.04,-0.93],[-46,0],[-38.989,-0.928],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[299,-19],[276.739,-7.642],[257.287,8.255],[218,21],[180.151,0.829],[78.519,-2.331],[0,19],[-89,-30],[-220,20],[-305,-18]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":66,"s":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[7.65,-6.414],[7.247,-5.107],[4.918,0.164],[12.569,8.758],[22.573,-8.821],[17.943,0.427],[41,0],[25.988,0.619],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.603,0],[-5.911,4.956],[-7.332,5.167],[-14.474,-0.482],[-24.151,-16.829],[-5.86,2.29],[-39.04,-0.93],[-46,0],[-38.989,-0.928],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[299,-19],[276.739,-7.642],[257.287,8.255],[218,21],[180.151,0.829],[78.519,-2.331],[0,19],[-89,-30],[-220,20],[-305,-18]],"c":true}],"e":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[2.174,-0.262],[4.752,3.855],[26,0],[7.165,-7.199],[23.02,-0.207],[36,0],[45.011,0],[23,-1],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-9.088,0],[-1.05,0.127],[-6.536,-5.303],[-16,0],[-12.471,12.53],[-38.545,0.347],[-43.012,0],[-33,0],[-33.983,1.478],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[318,29],[308.787,35.235],[300.95,30.3],[216,-41],[173.835,-10.801],[97.545,33.653],[12,-52],[-91,21],[-219,-19],[-308,21]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":104,"s":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[2.174,-0.262],[4.752,3.855],[26,0],[7.165,-7.199],[23.02,-0.207],[36,0],[45.011,0],[23,-1],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-9.088,0],[-1.05,0.127],[-6.536,-5.303],[-16,0],[-12.471,12.53],[-38.545,0.347],[-43.012,0],[-33,0],[-33.983,1.478],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[318,29],[308.787,35.235],[300.95,30.3],[216,-41],[173.835,-10.801],[97.545,33.653],[12,-52],[-91,21],[-219,-19],[-308,21]],"c":true}],"e":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[7.65,-6.414],[7.247,-5.107],[31.981,3.198],[31.084,18.789],[26.175,-15.755],[17.906,1.226],[26,0],[34,1],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.603,0],[-5.911,4.956],[-7.332,5.167],[-20,-2],[-31.151,-18.829],[-10.519,6.331],[-73,-5],[-58.009,0],[-38.983,-1.147],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[328,-28],[311.739,-15.642],[303.287,2.255],[243,46],[182.151,-23.171],[75.519,-5.331],[0,19],[-107,-20],[-220,20],[-305,-51]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":140,"s":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[7.65,-6.414],[7.247,-5.107],[31.981,3.198],[31.084,18.789],[26.175,-15.755],[17.906,1.226],[26,0],[34,1],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.603,0],[-5.911,4.956],[-7.332,5.167],[-20,-2],[-31.151,-18.829],[-10.519,6.331],[-73,-5],[-58.009,0],[-38.983,-1.147],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[328,-28],[311.739,-15.642],[303.287,2.255],[243,46],[182.151,-23.171],[75.519,-5.331],[0,19],[-107,-20],[-220,20],[-305,-51]],"c":true}],"e":[{"i":[[1,5],[-2,-6],[-7,0],[0,4],[14.036,0],[41.129,-12.788],[26.96,-0.808],[1.399,-0.957],[19.256,-0.204],[26.627,-0.522],[21,0],[38,-1],[47.027,-1.206],[2,3]],"o":[[-1,-5],[2,6],[7,0],[0,-4],[-7.061,0],[-30.705,9.547],[-31.026,0.93],[-19,13],[-37.752,0.4],[-18.418,0.361],[-25.08,0],[-52.991,1.395],[-39,1],[-2,-3]],"v":[[-328,-31],[-338,120],[336,139],[326,-6],[333,-52],[273.705,21.453],[196.04,-2.192],[148,15],[96.752,88.6],[17.418,-14.361],[-35,30],[-104,-42],[-222,47],[-309,-23]],"c":true}]},{"t":174}],"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Trazo 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.105882352941,0.376470588235,0.576470588235,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Forma 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/pumped_up.json b/example/resource/pumped_up.json new file mode 100644 index 0000000000..81a3265354 --- /dev/null +++ b/example/resource/pumped_up.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":29.9700012207031,"ip":0,"op":37.0000015070409,"w":1000,"h":1000,"nm":"Weight Lifter","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"BODY CONTROL","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.206,"y":0},"n":"0p833_0p833_0p206_0","t":0,"s":[-178.625,485.375,0],"e":[-94.353,536.037,0],"to":[0,0.30916449427605,0],"ti":[-36.4811401367188,18.4873828887939,0]},{"i":{"x":0.618,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p618_1_0p167_0p167","t":4,"s":[-94.353,536.037,0],"e":[-53.625,422.375,0],"to":[22.5184211730957,-11.4115581512451,0],"ti":[0,0,0]},{"i":{"x":0.79,"y":1},"o":{"x":0.167,"y":0},"n":"0p79_1_0p167_0","t":8,"s":[-53.625,422.375,0],"e":[-47.625,464.375,0],"to":[0,0,0],"ti":[5.375,-12.625,0]},{"i":{"x":0.79,"y":1},"o":{"x":0.96,"y":0},"n":"0p79_1_0p96_0","t":14,"s":[-47.625,464.375,0],"e":[-109.625,533.375,0],"to":[-5.375,12.625,0],"ti":[77.375,3.375,0]},{"i":{"x":0.36,"y":1},"o":{"x":0.96,"y":0},"n":"0p36_1_0p96_0","t":24,"s":[-109.625,533.375,0],"e":[-169.625,422.375,0],"to":[-77.375,-3.375,0],"ti":[0,0.5,0]},{"i":{"x":0.36,"y":1},"o":{"x":0.167,"y":0},"n":"0p36_1_0p167_0","t":29,"s":[-169.625,422.375,0],"e":[-178.625,485.375,0],"to":[0,-0.5,0],"ti":[0,-0.5,0]},{"t":34.0000013848484}],"ix":2},"a":{"a":0,"k":[-599.625,40.375,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[96.75,96.75],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":19,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[-599.625,40.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":1,"nm":"Face Rig","parent":3,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.224,"y":0},"n":"0p833_0p833_0p224_0","t":0,"s":[-78,-57,0],"e":[-22.954,97.206,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.598,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p598_1_0p167_0p167","t":5,"s":[-22.954,97.206,0],"e":[36,-69,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":11,"s":[36,-69,0],"e":[36,-54,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.592,"y":0.413},"o":{"x":0.258,"y":0},"n":"0p592_0p413_0p258_0","t":18,"s":[36,-54,0],"e":[36,-50.936,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.268,"y":0.016},"n":"0p833_0p833_0p268_0p016","t":20.668,"s":[36,-50.936,0],"e":[-5.418,87.869,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.626,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p626_1_0p167_0p167","t":26,"s":[-5.418,87.869,0],"e":[-78,-99,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.626,"y":1},"o":{"x":0.167,"y":0},"n":"0p626_1_0p167_0","t":30,"s":[-78,-99,0],"e":[-78,-57,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35.0000014255792}],"ix":2},"a":{"a":0,"k":[37.5,37.5,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"joystickLimit","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":86,"ix":1}}]},{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":2,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.235294118524,0.784313738346,0.721568644047,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"sw":75,"sh":75,"sc":"#ffffff","ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Face Rig Origin","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-108,272,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[251.383,200],"ix":2,"x":"var $bm_rt;\nvar temp;\ntemp = mul(thisComp.layer('Face Rig')('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001'), 2);\n$bm_rt = [\n temp,\n temp\n];"},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117629528,0.310726553202,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"d":[{"n":"d","nm":"dash","v":{"a":0,"k":14,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Left foot","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2,"s":[0],"e":[-36]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":5,"s":[-36],"e":[-9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[-9],"e":[-9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":21,"s":[-9],"e":[0]},{"t":25.0000010182709}],"ix":10},"p":{"a":0,"k":[4.453,6.875,0],"ix":2},"a":{"a":0,"k":[148.453,332.875,0],"ix":1},"s":{"a":0,"k":[100,132.877,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[86.906,18.25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":142,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.227873439415,0.678431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.568626972273,0.866666965859,0.776471007104,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.453,332.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Right foot","parent":17,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[21],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[0],"e":[45]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":31,"s":[45],"e":[12]},{"t":35.0000014255792}],"ix":10},"p":{"a":0,"k":[-12.547,6.875,0],"ix":2},"a":{"a":0,"k":[88.453,332.875,0],"ix":1},"s":{"a":0,"k":[100,132.877,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[86.906,18.25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":136,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.227873439415,0.678431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.568626972273,0.866666965859,0.776471007104,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.453,332.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Head","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-47.758,-107.962,0],"ix":2},"a":{"a":0,"k":[42.637,-115.363,0],"ix":1},"s":{"a":0,"k":[125,125,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[7.869,15.146],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 7.869140625,\n 15.146484375\n ];\n var key2 = [\n 7.869140625,\n 15.146484375\n ];\n var key3 = [\n 7.869140625,\n 15.146484375\n ];\n var key4 = [\n 7.869140625,\n 15.146484375\n ];\n var key5 = [\n 7.869140625,\n 15.146484375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"p":{"a":0,"k":[0,34],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 0,\n 34\n ];\n var key2 = [\n 0,\n 34\n ];\n var key3 = [\n 0,\n 34\n ];\n var key4 = [\n 0,\n 8\n ];\n var key5 = [\n 0,\n 8\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.733333333333,0.380392156863,0.188235294118,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.538,-130.608],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 43.5380859375,\n -130.6083984375\n ];\n var key2 = [\n 63.5380859375,\n -130.6083984375\n ];\n var key3 = [\n 21.5380859375,\n -130.6083984375\n ];\n var key4 = [\n 43.5380859375,\n -146.2333984375\n ];\n var key5 = [\n 43.5380859375,\n -88.7333984375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[0.217,8.715],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"nose","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.25,-0.25],[0,0],[0,0]],"o":[[-14.25,0.25],[0,0],[0,0]],"v":[[73.637,-102.75],[55.137,-93.75],[93.637,-93.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14,-92.5],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 14,\n -92.5\n ];\n var key2 = [\n 34,\n -92.5\n ];\n var key3 = [\n -3,\n -92.5\n ];\n var key4 = [\n 12.15234375,\n -126.50390625\n ];\n var key5 = [\n 12.15234375,\n -82.75390625\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[73.152,-93.629],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 100,\n 100\n ];\n var key2 = [\n 100,\n 100\n ];\n var key3 = [\n 53,\n 100\n ];\n var key4 = [\n 100,\n 134\n ];\n var key5 = [\n 100,\n 59\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"lid right","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.25,-0.25],[0,0],[0,0]],"o":[[-14.25,0.25],[0,0],[0,0]],"v":[[73.637,-102.75],[55.137,-93.75],[93.637,-93.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75,-92.5],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 75,\n -92.5\n ];\n var key2 = [\n 84,\n -92.5\n ];\n var key3 = [\n 55,\n -92.5\n ];\n var key4 = [\n 73.875,\n -125.546875\n ];\n var key5 = [\n 73.875,\n -81.796875\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[73.875,-93.047],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 100,\n 100\n ];\n var key2 = [\n 65,\n 100\n ];\n var key3 = [\n 100,\n 100\n ];\n var key4 = [\n 100,\n 132\n ];\n var key5 = [\n 100,\n 73\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"lid left","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-41.598,-0.006]],"o":[[0,0],[0,0],[41.598,0.006]],"v":[[87.137,-91.5],[-1.863,-91],[42.637,-62]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.146,-80.344],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 43.146484375,\n -80.34375\n ];\n var key2 = [\n 64.146484375,\n -80.34375\n ];\n var key3 = [\n 21.646484375,\n -80.34375\n ];\n var key4 = [\n 43.146484375,\n -119.84375\n ];\n var key5 = [\n 43.146484375,\n -69.84375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[43.591,-78.546],"ix":1},"s":{"a":0,"k":[67.022,67.022],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 67.0221619132623,\n 67.0221619132623\n ];\n var key2 = [\n 51.0221633911133,\n 67.0221633911133\n ];\n var key3 = [\n 45.0221633911133,\n 67.0221633911133\n ];\n var key4 = [\n 67.0221619132623,\n 42.0221619132623\n ];\n var key5 = [\n 67.0221619132623,\n 42.0221619132623\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"mouth","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16.676,16.676],"ix":2},"p":{"a":0,"k":[58,-10],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219607843137,0.678431372549,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.975,-104.662],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 12.974609375,\n -104.662109375\n ];\n var key2 = [\n 57.974609375,\n -104.662109375\n ];\n var key3 = [\n 3.974609375,\n -104.662109375\n ];\n var key4 = [\n 12.974609375,\n -139.662109375\n ];\n var key5 = [\n 12.974609375,\n -85.912109375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 100,\n 100\n ];\n var key2 = [\n 54,\n 100\n ];\n var key3 = [\n 76,\n 100\n ];\n var key4 = [\n 100,\n 80\n ];\n var key5 = [\n 100,\n 80\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"pupil right","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16.676,16.676],"ix":2},"p":{"a":0,"k":[1,-10],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219607843137,0.678431372549,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.975,-104.662],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 12.974609375,\n -104.662109375\n ];\n var key2 = [\n 39.974609375,\n -104.662109375\n ];\n var key3 = [\n -5.025390625,\n -104.662109375\n ];\n var key4 = [\n 12.974609375,\n -139.662109375\n ];\n var key5 = [\n 12.974609375,\n -85.912109375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 100,\n 100\n ];\n var key2 = [\n 67,\n 100\n ];\n var key3 = [\n 57,\n 100\n ];\n var key4 = [\n 100,\n 80\n ];\n var key5 = [\n 100,\n 80\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"pupil left","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[37.258,37.258],"ix":2},"p":{"a":0,"k":[53,-27],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.266,-88.371],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 19.265625,\n -88.37109375\n ];\n var key2 = [\n 52.265625,\n -88.37109375\n ];\n var key3 = [\n 12.265625,\n -88.37109375\n ];\n var key4 = [\n 19.265625,\n -120.87109375\n ];\n var key5 = [\n 19.265625,\n -77.12109375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 100,\n 100\n ];\n var key2 = [\n 63,\n 100\n ];\n var key3 = [\n 75,\n 100\n ];\n var key4 = [\n 100,\n 80\n ];\n var key5 = [\n 100,\n 80\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"eye ball right","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[37.258,37.258],"ix":2},"p":{"a":0,"k":[-5,-27],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.266,-88.371],"ix":2,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 19.265625,\n -88.37109375\n ];\n var key2 = [\n 39.265625,\n -88.37109375\n ];\n var key3 = [\n 2.265625,\n -88.37109375\n ];\n var key4 = [\n 19.265625,\n -120.87109375\n ];\n var key5 = [\n 19.265625,\n -77.12109375\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\n$bm_rt = joystick(value);\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Face Rig');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 100,\n 100\n ];\n var key2 = [\n 82,\n 100\n ];\n var key3 = [\n 61,\n 100\n ];\n var key4 = [\n 100,\n 80\n ];\n var key5 = [\n 100,\n 80\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return sum(sum(resultVal, resultAdd), sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var myCos2 = sum(sum(mul($bm_neg(c), Math.cos(mul(mapVal, div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp(div(val, sub(max1, min1)), 0, 1);\n var c = sub(input2, input1);\n var mySin2 = sum(mul(c, Math.sin(mul(mapVal, div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}"},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"eye ball left","np":3,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[117.273,117.273],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[42.637,-115.363],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":3,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Body","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[18,84,0],"ix":2},"a":{"a":0,"k":[-47.758,106.242,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-46.758,233.242],[-47.258,1.242]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.678431372549,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-47.721,117.488],"ix":2},"a":{"a":0,"k":[-47.721,117.488],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[17.505,-0.028]],"o":[[0,0],[0,0],[0,0],[-17.505,0.028]],"v":[[-72.258,-19.758],[-47.258,1.492],[-19.758,-18.758],[-47.253,-22.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-0.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.758,76.242],[-116.758,76.242],[-116.758,101.242],[-92.758,116.242],[-69.758,101.242]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219604716581,0.678232230392,0.62581763174,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-95.807,47.773],"ix":2},"a":{"a":0,"k":[-91.96,91.668],"ix":1},"s":{"a":0,"k":[83.641,83.641],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256.484,256.484],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.074509998396,0.141176006841,0.168626987233,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.78431372549,0.721568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-47.758,106.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Left arm 2::Wrist","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[595.189,372.865,0],"e":[681.676,159.27,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9,"s":[681.676,159.27,0],"e":[681.676,210.27,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[681.676,210.27,0],"e":[681.676,210.27,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21.429,"s":[681.676,210.27,0],"e":[643.622,455.892,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":26,"s":[643.622,455.892,0],"e":[595.189,320.973,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[595.189,320.973,0],"e":[595.189,372.865,0],"to":[0,0,0],"ti":[0,0,0]},{"t":33.0000013441176}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"RubberHose 2","np":18,"mn":"Pseudo/3bf5uID/RubberHose_2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Hose Length","mn":"Pseudo/3bf5uID/RubberHose_2-0001","ix":1,"v":{"a":0,"k":280,"ix":1}},{"ty":0,"nm":"Bend Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0002","ix":2,"v":{"a":0,"k":40,"ix":2}},{"ty":0,"nm":"Realism","mn":"Pseudo/3bf5uID/RubberHose_2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Bend Direction","mn":"Pseudo/3bf5uID/RubberHose_2-0004","ix":4,"v":{"a":0,"k":-100,"ix":4}},{"ty":7,"nm":"Auto Rotate Start","mn":"Pseudo/3bf5uID/RubberHose_2-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Auto Rotate End","mn":"Pseudo/3bf5uID/RubberHose_2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":6,"nm":"Math Stuff","mn":"Pseudo/3bf5uID/RubberHose_2-0007","ix":7,"v":0},{"ty":3,"nm":"A","mn":"Pseudo/3bf5uID/RubberHose_2-0008","ix":8,"v":{"a":0,"k":[0,0],"ix":8,"x":"var $bm_rt;\n$bm_rt = thisLayer.toComp([\n 0,\n 0,\n 0\n]);"}},{"ty":3,"nm":"B","mn":"Pseudo/3bf5uID/RubberHose_2-0009","ix":9,"v":{"a":0,"k":[0,0],"ix":9,"x":"var $bm_rt;\ntry {\n var b = thisLayer(2)('Admin')(2)('B')(2)(1)._name;\n $bm_rt = thisComp.layer(b).toComp([\n 0,\n 0,\n 0\n ]);\n} catch (err) {\n $bm_rt = value;\n}"}},{"ty":0,"nm":"Outer Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0010","ix":10,"v":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\nvar s = length(a, b);\n$bm_rt = mul(Math.sin(0.78539816339), s);"}},{"ty":0,"nm":"Inner Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0011","ix":11,"v":{"a":0,"k":0,"ix":11,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar bendRad = eff('Bend Radius');\nvar hoseLength = div(eff('Hose Length'), 2);\nvar realism = eff('Realism');\nvar bendDir = div(eff('Bend Direction'), 100);\nvar sFac = eff('Parent Scale');\nvar straight = eff('Straight');\nvar autoFlop = eff('AutoFlop');\nvar roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\nvar innerRad;\nif (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n} else {\n innerRad = straight;\n}\ninnerRad *= Math.abs(sFac);\ninnerRad = linear(Math.abs(autoFlop), mul(straight, Math.max(Math.abs(sFac), 0.001)), innerRad);\n$bm_rt = innerRad;"}},{"ty":0,"nm":"Straight","mn":"Pseudo/3bf5uID/RubberHose_2-0012","ix":12,"v":{"a":0,"k":0,"ix":12,"x":"var $bm_rt;\nvar sFac = thisLayer(4)('RubberHose 2')('Parent Scale');\nvar outerRad = div(thisLayer(4)('RubberHose 2')('Outer Radius'), Math.max(Math.abs(sFac), 0.001));\n;\n$bm_rt = div(mul(1.4142135623731, outerRad), 2);"}},{"ty":0,"nm":"Base Rotation","mn":"Pseudo/3bf5uID/RubberHose_2-0013","ix":13,"v":{"a":0,"k":0,"ix":13,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\n$bm_rt = radiansToDegrees(Math.atan2(sub(a[1], b[1]), sub(a[0], b[0])));"}},{"ty":0,"nm":"AutoFlop","mn":"Pseudo/3bf5uID/RubberHose_2-0014","ix":14,"v":{"a":0,"k":0,"ix":14,"x":"var $bm_rt;\nvar hasAF = false, isEnabled = false, output;\ntry {\n var lyrAF = thisComp.layer(sum(thisLayer._name.split('::')[0], '::AutoFlop'));\n isEnabled = lyrAF(4)('Enable')(1);\n var falloffAngle = lyrAF(4)('Falloff')(1);\n hasAF = true;\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer(4)('RubberHose 2')('B');\n} catch (e) {\n}\nif (hasAF && isEnabled == 1) {\n var threshRot = lyrAF('ADBE Transform Group')('ADBE Rotate Z');\n threshRot %= 360;\n var ctrlAngle = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var offsetAngle = sub(threshRot, ctrlAngle);\n offsetAngle %= 360;\n var sign = offsetAngle > 0 && offsetAngle < 180 || offsetAngle < -180 ? -1 : 1;\n var absAngle = Math.abs(offsetAngle);\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n output = linear(absAngle, 0, falloffAngle, 0, 1);\n output *= sign;\n} else {\n output = 1;\n}\n$bm_rt = output;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"}},{"ty":0,"nm":"Parent Scale","mn":"Pseudo/3bf5uID/RubberHose_2-0015","ix":15,"v":{"a":0,"k":0,"ix":15,"x":"var $bm_rt;\nvar sFactor = 1;\nvar scaleNorm = 0;\nvar layerChain = 'thisLayer';\nwhile (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = div(eval(layerChain)('ADBE Transform Group')('ADBE Scale')[0], 100);\n sFactor = mul(sFactor, scaleNorm);\n}\n$bm_rt = sFactor;"}},{"ty":6,"nm":"","mn":"Pseudo/3bf5uID/RubberHose_2-0016","ix":16,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm 2::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm 2::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar autoRotate = eff('Auto Rotate End');\nif (autoRotate == 1) {\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sub(sum(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n} else {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\nif (thisLayer.active) {\n try {\n var eff = thisLayer(4)('RubberHose 2');\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var straight = eff('Straight');\n var hoseLength = div(eff('Hose Length'), 2);\n if (straight > hoseLength) {\n $bm_rt = [\n 0.51,\n 0.83,\n 0.98,\n 1\n ];\n } else {\n $bm_rt = value;\n }\n } catch (err) {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Left arm 2::Shoulder","parent":7,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[9.742,3.742,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm 2::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm 2::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var autoRotate = eff('Auto Rotate Start');\n if (autoRotate == 1) {\n var a = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name).toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (straight <= hoseLength) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sum(sub(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n } else {\n $bm_rt = 0;\n }\n ;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name);\n $bm_rt = ctrl(2)('Control Point')(2)('Stroke 1')('Color');\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Left arm 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar r = 0;\nif (thisLayer.hasParent) {\n r = $bm_neg(parentTotal());\n}\n$bm_rt = r;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[820,500,0],"ix":2,"x":"var $bm_rt;\nvar p = [\n 0,\n 0\n ];\ntry {\n if (thisLayer.hasParent) {\n p = parent.fromComp([\n 0,\n 0,\n 0\n ]);\n }\n $bm_rt = p;\n} catch (err) {\n $bm_rt = p;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\nvar s = [\n 100,\n 100\n ];\nif (hasParent) {\n var sFactor = parentTotal();\n s = [\n s[0] * sFactor[0],\n s[1] * sFactor[1]\n ];\n}\n$bm_rt = s;\nfunction parentTotal() {\n var sFactor = [\n 1,\n 1\n ];\n var scaleNorm = [\n 0,\n 0\n ];\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = eval([layerChain][0]).scale;\n if (scaleNorm[0] != 0 && scaleNorm[1] != 0) {\n scaleNorm = [\n 100 / scaleNorm[0],\n 100 / scaleNorm[1]\n ];\n }\n sFactor = [\n sFactor[0] * scaleNorm[0],\n sFactor[1] * scaleNorm[1]\n ];\n }\n return sFactor;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":67,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":28,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hand","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294117647,0.78431372549,0.721568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":28,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"BaseHose","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Style","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm 2::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[200,200],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm 2::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":200,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Inner Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"is":{"a":0,"k":100,"ix":8,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Bend Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"or":{"a":0,"k":200,"ix":7,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Outer Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0.01,"ix":1},"e":{"a":0,"k":24.99,"ix":2},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\n$bm_rt = -90;"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar s = thisProperty.propertyGroup(2)(2)(1)(7);\n$bm_rt = [\n -s,\n 0\n];"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar flop;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var bendDir = eff('Bend Direction');\n var autoFlop = eff('AutoFlop');\n flop = bendDir > 0 ? 1 : -1;\n autoFlop > 0 ? 0 : flop *= -1;\n var s = flop == 1 ? [\n -100,\n 100\n ] : [\n 100,\n 100\n ];\n if (eff('Parent Scale') < 0) {\n s = [\n -s[0],\n s[1]\n ];\n }\n $bm_rt = s;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var baseRot = ctrl('Base Rotation');\n var flop = content('Admin').content('ArcMath').transform.scale[0];\n var rotOffset = flop < 0 ? -45 : 225;\n $bm_rt = sum(baseRot, rotOffset);\n} catch (err) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ArcMath","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Left arm::Wrist","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":0,"s":[289.865,231.541,0],"e":[383.73,370.27,0],"to":[0,0,0],"ti":[-34.270263671875,-2.729736328125,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.138},"n":"0p5_1_0p167_0p138","t":7,"s":[383.73,370.27,0],"e":[410.73,340.27,0],"to":[34.270263671875,2.729736328125,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":12,"s":[410.73,340.27,0],"e":[419.73,352.27,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":0.5},"o":{"x":0.167,"y":0.167},"n":"0p5_0p5_0p167_0p167","t":17,"s":[419.73,352.27,0],"e":[419.73,352.27,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":20.273,"s":[419.73,352.27,0],"e":[357.459,456.054,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":26,"s":[357.459,456.054,0],"e":[324.459,145.054,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":31,"s":[324.459,145.054,0],"e":[289.865,231.541,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35.0000014255792}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"RubberHose 2","np":18,"mn":"Pseudo/3bf5uID/RubberHose_2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Hose Length","mn":"Pseudo/3bf5uID/RubberHose_2-0001","ix":1,"v":{"a":0,"k":280,"ix":1}},{"ty":0,"nm":"Bend Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0002","ix":2,"v":{"a":0,"k":40,"ix":2}},{"ty":0,"nm":"Realism","mn":"Pseudo/3bf5uID/RubberHose_2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Bend Direction","mn":"Pseudo/3bf5uID/RubberHose_2-0004","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":7,"nm":"Auto Rotate Start","mn":"Pseudo/3bf5uID/RubberHose_2-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Auto Rotate End","mn":"Pseudo/3bf5uID/RubberHose_2-0006","ix":6,"v":{"a":0,"k":1,"ix":6}},{"ty":6,"nm":"Math Stuff","mn":"Pseudo/3bf5uID/RubberHose_2-0007","ix":7,"v":0},{"ty":3,"nm":"A","mn":"Pseudo/3bf5uID/RubberHose_2-0008","ix":8,"v":{"a":0,"k":[0,0],"ix":8,"x":"var $bm_rt;\n$bm_rt = thisLayer.toComp([\n 0,\n 0,\n 0\n]);"}},{"ty":3,"nm":"B","mn":"Pseudo/3bf5uID/RubberHose_2-0009","ix":9,"v":{"a":0,"k":[0,0],"ix":9,"x":"var $bm_rt;\ntry {\n var b = thisLayer(2)('Admin')(2)('B')(2)(1)._name;\n $bm_rt = thisComp.layer(b).toComp([\n 0,\n 0,\n 0\n ]);\n} catch (err) {\n $bm_rt = value;\n}"}},{"ty":0,"nm":"Outer Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0010","ix":10,"v":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\nvar s = length(a, b);\n$bm_rt = mul(Math.sin(0.78539816339), s);"}},{"ty":0,"nm":"Inner Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0011","ix":11,"v":{"a":0,"k":0,"ix":11,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar bendRad = eff('Bend Radius');\nvar hoseLength = div(eff('Hose Length'), 2);\nvar realism = eff('Realism');\nvar bendDir = div(eff('Bend Direction'), 100);\nvar sFac = eff('Parent Scale');\nvar straight = eff('Straight');\nvar autoFlop = eff('AutoFlop');\nvar roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\nvar innerRad;\nif (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n} else {\n innerRad = straight;\n}\ninnerRad *= Math.abs(sFac);\ninnerRad = linear(Math.abs(autoFlop), mul(straight, Math.max(Math.abs(sFac), 0.001)), innerRad);\n$bm_rt = innerRad;"}},{"ty":0,"nm":"Straight","mn":"Pseudo/3bf5uID/RubberHose_2-0012","ix":12,"v":{"a":0,"k":0,"ix":12,"x":"var $bm_rt;\nvar sFac = thisLayer(4)('RubberHose 2')('Parent Scale');\nvar outerRad = div(thisLayer(4)('RubberHose 2')('Outer Radius'), Math.max(Math.abs(sFac), 0.001));\n;\n$bm_rt = div(mul(1.4142135623731, outerRad), 2);"}},{"ty":0,"nm":"Base Rotation","mn":"Pseudo/3bf5uID/RubberHose_2-0013","ix":13,"v":{"a":0,"k":0,"ix":13,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\n$bm_rt = radiansToDegrees(Math.atan2(sub(a[1], b[1]), sub(a[0], b[0])));"}},{"ty":0,"nm":"AutoFlop","mn":"Pseudo/3bf5uID/RubberHose_2-0014","ix":14,"v":{"a":0,"k":0,"ix":14,"x":"var $bm_rt;\nvar hasAF = false, isEnabled = false, output;\ntry {\n var lyrAF = thisComp.layer(sum(thisLayer._name.split('::')[0], '::AutoFlop'));\n isEnabled = lyrAF(4)('Enable')(1);\n var falloffAngle = lyrAF(4)('Falloff')(1);\n hasAF = true;\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer(4)('RubberHose 2')('B');\n} catch (e) {\n}\nif (hasAF && isEnabled == 1) {\n var threshRot = lyrAF('ADBE Transform Group')('ADBE Rotate Z');\n threshRot %= 360;\n var ctrlAngle = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var offsetAngle = sub(threshRot, ctrlAngle);\n offsetAngle %= 360;\n var sign = offsetAngle > 0 && offsetAngle < 180 || offsetAngle < -180 ? -1 : 1;\n var absAngle = Math.abs(offsetAngle);\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n output = linear(absAngle, 0, falloffAngle, 0, 1);\n output *= sign;\n} else {\n output = 1;\n}\n$bm_rt = output;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"}},{"ty":0,"nm":"Parent Scale","mn":"Pseudo/3bf5uID/RubberHose_2-0015","ix":15,"v":{"a":0,"k":0,"ix":15,"x":"var $bm_rt;\nvar sFactor = 1;\nvar scaleNorm = 0;\nvar layerChain = 'thisLayer';\nwhile (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = div(eval(layerChain)('ADBE Transform Group')('ADBE Scale')[0], 100);\n sFactor = mul(sFactor, scaleNorm);\n}\n$bm_rt = sFactor;"}},{"ty":6,"nm":"","mn":"Pseudo/3bf5uID/RubberHose_2-0016","ix":16,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar autoRotate = eff('Auto Rotate End');\nif (autoRotate == 1) {\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sub(sum(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n} else {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\nif (thisLayer.active) {\n try {\n var eff = thisLayer(4)('RubberHose 2');\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var straight = eff('Straight');\n var hoseLength = div(eff('Hose Length'), 2);\n if (straight > hoseLength) {\n $bm_rt = [\n 0.51,\n 0.83,\n 0.98,\n 1\n ];\n } else {\n $bm_rt = value;\n }\n } catch (err) {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Left arm::Shoulder","parent":7,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[-107.758,1.242,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var autoRotate = eff('Auto Rotate Start');\n if (autoRotate == 1) {\n var a = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name).toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (straight <= hoseLength) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sum(sub(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n } else {\n $bm_rt = 0;\n }\n ;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name);\n $bm_rt = ctrl(2)('Control Point')(2)('Stroke 1')('Color');\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Left arm","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar r = 0;\nif (thisLayer.hasParent) {\n r = $bm_neg(parentTotal());\n}\n$bm_rt = r;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[425,500,0],"ix":2,"x":"var $bm_rt;\nvar p = [\n 0,\n 0\n ];\ntry {\n if (thisLayer.hasParent) {\n p = parent.fromComp([\n 0,\n 0,\n 0\n ]);\n }\n $bm_rt = p;\n} catch (err) {\n $bm_rt = p;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\nvar s = [\n 100,\n 100\n ];\nif (hasParent) {\n var sFactor = parentTotal();\n s = [\n s[0] * sFactor[0],\n s[1] * sFactor[1]\n ];\n}\n$bm_rt = s;\nfunction parentTotal() {\n var sFactor = [\n 1,\n 1\n ];\n var scaleNorm = [\n 0,\n 0\n ];\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = eval([layerChain][0]).scale;\n if (scaleNorm[0] != 0 && scaleNorm[1] != 0) {\n scaleNorm = [\n 100 / scaleNorm[0],\n 100 / scaleNorm[1]\n ];\n }\n sFactor = [\n sFactor[0] * scaleNorm[0],\n sFactor[1] * scaleNorm[1]\n ];\n }\n return sFactor;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":67,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.498039215686,0.235294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":28,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hand","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294117647,0.78431372549,0.721568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":28,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"BaseHose","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Style","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm::Wrist","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[200,200],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left arm::Shoulder","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":200,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Inner Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"is":{"a":0,"k":100,"ix":8,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Bend Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"or":{"a":0,"k":200,"ix":7,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Outer Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0.01,"ix":1},"e":{"a":0,"k":24.99,"ix":2},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\n$bm_rt = -90;"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar s = thisProperty.propertyGroup(2)(2)(1)(7);\n$bm_rt = [\n -s,\n 0\n];"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar flop;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var bendDir = eff('Bend Direction');\n var autoFlop = eff('AutoFlop');\n flop = bendDir > 0 ? 1 : -1;\n autoFlop > 0 ? 0 : flop *= -1;\n var s = flop == 1 ? [\n -100,\n 100\n ] : [\n 100,\n 100\n ];\n if (eff('Parent Scale') < 0) {\n s = [\n -s[0],\n s[1]\n ];\n }\n $bm_rt = s;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var baseRot = ctrl('Base Rotation');\n var flop = content('Admin').content('ArcMath').transform.scale[0];\n var rotOffset = flop < 0 ? -45 : 225;\n $bm_rt = sum(baseRot, rotOffset);\n} catch (err) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ArcMath","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Left Leg::Ankle","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p5_1_0p167_0p167","t":2,"s":[419,830,0],"e":[425,643,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"n":"0p5_1_0p167_0","t":8,"s":[425,643,0],"e":[413,685,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":0.5},"o":{"x":0.167,"y":0.167},"n":"0p5_0p5_0p167_0p167","t":13,"s":[413,685,0],"e":[413,685,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":21,"s":[413,685,0],"e":[419,830,0],"to":[0,0,0],"ti":[0,0,0]},{"t":25.0000010182709}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"RubberHose 2","np":18,"mn":"Pseudo/3bf5uID/RubberHose_2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Hose Length","mn":"Pseudo/3bf5uID/RubberHose_2-0001","ix":1,"v":{"a":0,"k":280,"ix":1}},{"ty":0,"nm":"Bend Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0002","ix":2,"v":{"a":0,"k":40,"ix":2}},{"ty":0,"nm":"Realism","mn":"Pseudo/3bf5uID/RubberHose_2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Bend Direction","mn":"Pseudo/3bf5uID/RubberHose_2-0004","ix":4,"v":{"a":0,"k":-100,"ix":4}},{"ty":7,"nm":"Auto Rotate Start","mn":"Pseudo/3bf5uID/RubberHose_2-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Auto Rotate End","mn":"Pseudo/3bf5uID/RubberHose_2-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":6,"nm":"Math Stuff","mn":"Pseudo/3bf5uID/RubberHose_2-0007","ix":7,"v":0},{"ty":3,"nm":"A","mn":"Pseudo/3bf5uID/RubberHose_2-0008","ix":8,"v":{"a":0,"k":[0,0],"ix":8,"x":"var $bm_rt;\n$bm_rt = thisLayer.toComp([\n 0,\n 0,\n 0\n]);"}},{"ty":3,"nm":"B","mn":"Pseudo/3bf5uID/RubberHose_2-0009","ix":9,"v":{"a":0,"k":[0,0],"ix":9,"x":"var $bm_rt;\ntry {\n var b = thisLayer(2)('Admin')(2)('B')(2)(1)._name;\n $bm_rt = thisComp.layer(b).toComp([\n 0,\n 0,\n 0\n ]);\n} catch (err) {\n $bm_rt = value;\n}"}},{"ty":0,"nm":"Outer Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0010","ix":10,"v":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\nvar s = length(a, b);\n$bm_rt = mul(Math.sin(0.78539816339), s);"}},{"ty":0,"nm":"Inner Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0011","ix":11,"v":{"a":0,"k":0,"ix":11,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar bendRad = eff('Bend Radius');\nvar hoseLength = div(eff('Hose Length'), 2);\nvar realism = eff('Realism');\nvar bendDir = div(eff('Bend Direction'), 100);\nvar sFac = eff('Parent Scale');\nvar straight = eff('Straight');\nvar autoFlop = eff('AutoFlop');\nvar roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\nvar innerRad;\nif (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n} else {\n innerRad = straight;\n}\ninnerRad *= Math.abs(sFac);\ninnerRad = linear(Math.abs(autoFlop), mul(straight, Math.max(Math.abs(sFac), 0.001)), innerRad);\n$bm_rt = innerRad;"}},{"ty":0,"nm":"Straight","mn":"Pseudo/3bf5uID/RubberHose_2-0012","ix":12,"v":{"a":0,"k":0,"ix":12,"x":"var $bm_rt;\nvar sFac = thisLayer(4)('RubberHose 2')('Parent Scale');\nvar outerRad = div(thisLayer(4)('RubberHose 2')('Outer Radius'), Math.max(Math.abs(sFac), 0.001));\n;\n$bm_rt = div(mul(1.4142135623731, outerRad), 2);"}},{"ty":0,"nm":"Base Rotation","mn":"Pseudo/3bf5uID/RubberHose_2-0013","ix":13,"v":{"a":0,"k":0,"ix":13,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\n$bm_rt = radiansToDegrees(Math.atan2(sub(a[1], b[1]), sub(a[0], b[0])));"}},{"ty":0,"nm":"AutoFlop","mn":"Pseudo/3bf5uID/RubberHose_2-0014","ix":14,"v":{"a":0,"k":0,"ix":14,"x":"var $bm_rt;\nvar hasAF = false, isEnabled = false, output;\ntry {\n var lyrAF = thisComp.layer(sum(thisLayer._name.split('::')[0], '::AutoFlop'));\n isEnabled = lyrAF(4)('Enable')(1);\n var falloffAngle = lyrAF(4)('Falloff')(1);\n hasAF = true;\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer(4)('RubberHose 2')('B');\n} catch (e) {\n}\nif (hasAF && isEnabled == 1) {\n var threshRot = lyrAF('ADBE Transform Group')('ADBE Rotate Z');\n threshRot %= 360;\n var ctrlAngle = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var offsetAngle = sub(threshRot, ctrlAngle);\n offsetAngle %= 360;\n var sign = offsetAngle > 0 && offsetAngle < 180 || offsetAngle < -180 ? -1 : 1;\n var absAngle = Math.abs(offsetAngle);\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n output = linear(absAngle, 0, falloffAngle, 0, 1);\n output *= sign;\n} else {\n output = 1;\n}\n$bm_rt = output;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"}},{"ty":0,"nm":"Parent Scale","mn":"Pseudo/3bf5uID/RubberHose_2-0015","ix":15,"v":{"a":0,"k":0,"ix":15,"x":"var $bm_rt;\nvar sFactor = 1;\nvar scaleNorm = 0;\nvar layerChain = 'thisLayer';\nwhile (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = div(eval(layerChain)('ADBE Transform Group')('ADBE Scale')[0], 100);\n sFactor = mul(sFactor, scaleNorm);\n}\n$bm_rt = sFactor;"}},{"ty":6,"nm":"","mn":"Pseudo/3bf5uID/RubberHose_2-0016","ix":16,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left Leg::Ankle","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left Leg::Hip","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar autoRotate = eff('Auto Rotate End');\nif (autoRotate == 1) {\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sub(sum(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n} else {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\nif (thisLayer.active) {\n try {\n var eff = thisLayer(4)('RubberHose 2');\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var straight = eff('Straight');\n var hoseLength = div(eff('Hose Length'), 2);\n if (straight > hoseLength) {\n $bm_rt = [\n 0.51,\n 0.83,\n 0.98,\n 1\n ];\n } else {\n $bm_rt = value;\n }\n } catch (err) {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Left Leg::Hip","parent":7,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[-87.758,188.742,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left Leg::Ankle","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left Leg::Hip","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var autoRotate = eff('Auto Rotate Start');\n if (autoRotate == 1) {\n var a = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name).toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (straight <= hoseLength) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sum(sub(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n } else {\n $bm_rt = 0;\n }\n ;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name);\n $bm_rt = ctrl(2)('Control Point')(2)('Stroke 1')('Color');\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Left Leg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar r = 0;\nif (thisLayer.hasParent) {\n r = $bm_neg(parentTotal());\n}\n$bm_rt = r;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[425,500,0],"ix":2,"x":"var $bm_rt;\nvar p = [\n 0,\n 0\n ];\ntry {\n if (thisLayer.hasParent) {\n p = parent.fromComp([\n 0,\n 0,\n 0\n ]);\n }\n $bm_rt = p;\n} catch (err) {\n $bm_rt = p;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\nvar s = [\n 100,\n 100\n ];\nif (hasParent) {\n var sFactor = parentTotal();\n s = [\n s[0] * sFactor[0],\n s[1] * sFactor[1]\n ];\n}\n$bm_rt = s;\nfunction parentTotal() {\n var sFactor = [\n 1,\n 1\n ];\n var scaleNorm = [\n 0,\n 0\n ];\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = eval([layerChain][0]).scale;\n if (scaleNorm[0] != 0 && scaleNorm[1] != 0) {\n scaleNorm = [\n 100 / scaleNorm[0],\n 100 / scaleNorm[1]\n ];\n }\n sFactor = [\n sFactor[0] * scaleNorm[0],\n sFactor[1] * scaleNorm[1]\n ];\n }\n return sFactor;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.227873439415,0.678431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":36,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"BaseHose","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Style","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left Leg::Ankle","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[200,200],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Left Leg::Hip","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":200,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Inner Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"is":{"a":0,"k":100,"ix":8,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Bend Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"or":{"a":0,"k":200,"ix":7,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Outer Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0.01,"ix":1},"e":{"a":0,"k":24.99,"ix":2},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\n$bm_rt = -90;"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar s = thisProperty.propertyGroup(2)(2)(1)(7);\n$bm_rt = [\n -s,\n 0\n];"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar flop;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var bendDir = eff('Bend Direction');\n var autoFlop = eff('AutoFlop');\n flop = bendDir > 0 ? 1 : -1;\n autoFlop > 0 ? 0 : flop *= -1;\n var s = flop == 1 ? [\n -100,\n 100\n ] : [\n 100,\n 100\n ];\n if (eff('Parent Scale') < 0) {\n s = [\n -s[0],\n s[1]\n ];\n }\n $bm_rt = s;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var baseRot = ctrl('Base Rotation');\n var flop = content('Admin').content('ArcMath').transform.scale[0];\n var rotOffset = flop < 0 ? -45 : 225;\n $bm_rt = sum(baseRot, rotOffset);\n} catch (err) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ArcMath","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Right Leg::Ankle","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[584.541,716.568,0],"e":[588,830,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[588,830,0],"e":[588,830,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.36,"y":1},"o":{"x":0.167,"y":0.321},"n":"0p36_1_0p167_0p321","t":26.334,"s":[588,830,0],"e":[584.541,683.568,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.36,"y":1},"o":{"x":0.167,"y":0.152},"n":"0p36_1_0p167_0p152","t":33,"s":[584.541,683.568,0],"e":[584.541,716.568,0],"to":[0,0,0],"ti":[0,0,0]},{"t":36.333751479904}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"RubberHose 2","np":18,"mn":"Pseudo/3bf5uID/RubberHose_2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Hose Length","mn":"Pseudo/3bf5uID/RubberHose_2-0001","ix":1,"v":{"a":0,"k":280,"ix":1}},{"ty":0,"nm":"Bend Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0002","ix":2,"v":{"a":0,"k":40,"ix":2}},{"ty":0,"nm":"Realism","mn":"Pseudo/3bf5uID/RubberHose_2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Bend Direction","mn":"Pseudo/3bf5uID/RubberHose_2-0004","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":7,"nm":"Auto Rotate Start","mn":"Pseudo/3bf5uID/RubberHose_2-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":7,"nm":"Auto Rotate End","mn":"Pseudo/3bf5uID/RubberHose_2-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":6,"nm":"Math Stuff","mn":"Pseudo/3bf5uID/RubberHose_2-0007","ix":7,"v":0},{"ty":3,"nm":"A","mn":"Pseudo/3bf5uID/RubberHose_2-0008","ix":8,"v":{"a":0,"k":[0,0],"ix":8,"x":"var $bm_rt;\n$bm_rt = thisLayer.toComp([\n 0,\n 0,\n 0\n]);"}},{"ty":3,"nm":"B","mn":"Pseudo/3bf5uID/RubberHose_2-0009","ix":9,"v":{"a":0,"k":[0,0],"ix":9,"x":"var $bm_rt;\ntry {\n var b = thisLayer(2)('Admin')(2)('B')(2)(1)._name;\n $bm_rt = thisComp.layer(b).toComp([\n 0,\n 0,\n 0\n ]);\n} catch (err) {\n $bm_rt = value;\n}"}},{"ty":0,"nm":"Outer Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0010","ix":10,"v":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\nvar s = length(a, b);\n$bm_rt = mul(Math.sin(0.78539816339), s);"}},{"ty":0,"nm":"Inner Radius","mn":"Pseudo/3bf5uID/RubberHose_2-0011","ix":11,"v":{"a":0,"k":0,"ix":11,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar bendRad = eff('Bend Radius');\nvar hoseLength = div(eff('Hose Length'), 2);\nvar realism = eff('Realism');\nvar bendDir = div(eff('Bend Direction'), 100);\nvar sFac = eff('Parent Scale');\nvar straight = eff('Straight');\nvar autoFlop = eff('AutoFlop');\nvar roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\nvar innerRad;\nif (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n} else {\n innerRad = straight;\n}\ninnerRad *= Math.abs(sFac);\ninnerRad = linear(Math.abs(autoFlop), mul(straight, Math.max(Math.abs(sFac), 0.001)), innerRad);\n$bm_rt = innerRad;"}},{"ty":0,"nm":"Straight","mn":"Pseudo/3bf5uID/RubberHose_2-0012","ix":12,"v":{"a":0,"k":0,"ix":12,"x":"var $bm_rt;\nvar sFac = thisLayer(4)('RubberHose 2')('Parent Scale');\nvar outerRad = div(thisLayer(4)('RubberHose 2')('Outer Radius'), Math.max(Math.abs(sFac), 0.001));\n;\n$bm_rt = div(mul(1.4142135623731, outerRad), 2);"}},{"ty":0,"nm":"Base Rotation","mn":"Pseudo/3bf5uID/RubberHose_2-0013","ix":13,"v":{"a":0,"k":0,"ix":13,"x":"var $bm_rt;\nvar a = thisLayer(4)('RubberHose 2')('A');\nvar b = thisLayer(4)('RubberHose 2')('B');\n$bm_rt = radiansToDegrees(Math.atan2(sub(a[1], b[1]), sub(a[0], b[0])));"}},{"ty":0,"nm":"AutoFlop","mn":"Pseudo/3bf5uID/RubberHose_2-0014","ix":14,"v":{"a":0,"k":0,"ix":14,"x":"var $bm_rt;\nvar hasAF = false, isEnabled = false, output;\ntry {\n var lyrAF = thisComp.layer(sum(thisLayer._name.split('::')[0], '::AutoFlop'));\n isEnabled = lyrAF(4)('Enable')(1);\n var falloffAngle = lyrAF(4)('Falloff')(1);\n hasAF = true;\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer(4)('RubberHose 2')('B');\n} catch (e) {\n}\nif (hasAF && isEnabled == 1) {\n var threshRot = lyrAF('ADBE Transform Group')('ADBE Rotate Z');\n threshRot %= 360;\n var ctrlAngle = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var offsetAngle = sub(threshRot, ctrlAngle);\n offsetAngle %= 360;\n var sign = offsetAngle > 0 && offsetAngle < 180 || offsetAngle < -180 ? -1 : 1;\n var absAngle = Math.abs(offsetAngle);\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n if (absAngle > 90) {\n absAngle = Math.abs(sub(absAngle, 180));\n }\n output = linear(absAngle, 0, falloffAngle, 0, 1);\n output *= sign;\n} else {\n output = 1;\n}\n$bm_rt = output;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"}},{"ty":0,"nm":"Parent Scale","mn":"Pseudo/3bf5uID/RubberHose_2-0015","ix":15,"v":{"a":0,"k":0,"ix":15,"x":"var $bm_rt;\nvar sFactor = 1;\nvar scaleNorm = 0;\nvar layerChain = 'thisLayer';\nwhile (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = div(eval(layerChain)('ADBE Transform Group')('ADBE Scale')[0], 100);\n sFactor = mul(sFactor, scaleNorm);\n}\n$bm_rt = sFactor;"}},{"ty":6,"nm":"","mn":"Pseudo/3bf5uID/RubberHose_2-0016","ix":16,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Right Leg::Ankle","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Right Leg::Hip","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\nvar eff = thisLayer(4)('RubberHose 2');\nvar autoRotate = eff('Auto Rotate End');\nif (autoRotate == 1) {\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (hoseLength > straight) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sub(sum(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n} else {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\nif (thisLayer.active) {\n try {\n var eff = thisLayer(4)('RubberHose 2');\n var a = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var b = eff('B');\n var straight = eff('Straight');\n var hoseLength = div(eff('Hose Length'), 2);\n if (straight > hoseLength) {\n $bm_rt = [\n 0.51,\n 0.83,\n 0.98,\n 1\n ];\n } else {\n $bm_rt = value;\n }\n } catch (err) {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Right Leg::Hip","parent":7,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\ntry {\n var parentRot = hasParent ? parentTotal() : 0;\n var rotCalc = sub(thisLayer('ADBE Root Vectors Group')('Admin')('Transform')('Rotation'), parentRot);\n $bm_rt = sum(rotCalc, value);\n} catch (err) {\n $bm_rt = value;\n}\n;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[-12.758,188.742,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Right Leg::Ankle","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[20,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Right Leg::Hip","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6,"x":"var $bm_rt;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var autoRotate = eff('Auto Rotate Start');\n if (autoRotate == 1) {\n var a = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name).toComp([\n 0,\n 0,\n 0\n ]);\n var b = thisLayer.toComp([\n 0,\n 0,\n 0\n ]);\n var s = length(a, b);\n var sFac = eff('Parent Scale');\n var autoFlop = 1;\n var realism = eff('Realism');\n var bendDir = div(eff('Bend Direction'), 100);\n var hoseLength = div(eff('Hose Length'), 2);\n var bendRad = eff('Bend Radius');\n var autoFlop = eff('AutoFlop');\n var baseRot = $bm_neg(radiansToDegrees(Math.atan2(sub(b[0], a[0]), sub(b[1], a[1]))));\n var outerRad = mul(Math.sin(0.78539816339), s);\n var straight = div(mul(1.4142135623731, outerRad), 2);\n straight /= Math.max(Math.abs(sFac), 0.001);\n var roundShrink = linear(Math.abs(bendRad), 0, 100, 1, 0.87);\n var innerRad;\n if (straight <= hoseLength) {\n innerRad = sum(straight, mul(Math.sqrt(sub(Math.pow(hoseLength, 2), Math.pow(straight, 2))), roundShrink));\n innerRad = linear(realism, 0, 100, hoseLength, innerRad);\n innerRad = linear(Math.abs(bendDir), straight, innerRad);\n } else {\n innerRad = straight;\n }\n innerRad = linear(Math.abs(autoFlop), straight, innerRad);\n var flopDir = 1;\n if (bendDir < 0) {\n flopDir = -1;\n }\n flopDir *= autoFlop;\n var opp = mul(sub(innerRad, straight), flopDir);\n var theta = Math.atan(div(opp, Math.max(straight, 0.001)));\n var bendAngle = radiansToDegrees(theta);\n if (sFac < 0) {\n baseRot *= -1;\n }\n bendRad *= div(div(theta, $bm_neg(Math.PI)), linear(s, hoseLength, 0, 2, 0.9));\n var rotCalc = sum(sub(baseRot, bendAngle), bendRad);\n $bm_rt = rotCalc;\n } else {\n $bm_rt = 0;\n }\n ;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Circle","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-75,0],[75,0]],"c":false},"ix":2},"nm":"01","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-30],[0,30]],"c":false},"ix":2},"nm":"02","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[15,15],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ControlShape","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.560000002384,0,1],"ix":3,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name);\n $bm_rt = ctrl(2)('Control Point')(2)('Stroke 1')('Color');\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Control Point","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Right Leg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar r = 0;\nif (thisLayer.hasParent) {\n r = $bm_neg(parentTotal());\n}\n$bm_rt = r;\nfunction parentTotal() {\n var parentVal = 0;\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n parentVal = sum(parentVal, eval([layerChain][0]).rotation);\n }\n return parentVal;\n}"},"p":{"a":0,"k":[500,500,0],"ix":2,"x":"var $bm_rt;\nvar p = [\n 0,\n 0\n ];\ntry {\n if (thisLayer.hasParent) {\n p = parent.fromComp([\n 0,\n 0,\n 0\n ]);\n }\n $bm_rt = p;\n} catch (err) {\n $bm_rt = p;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6,"x":"var $bm_rt;\nvar s = [\n 100,\n 100\n ];\nif (hasParent) {\n var sFactor = parentTotal();\n s = [\n s[0] * sFactor[0],\n s[1] * sFactor[1]\n ];\n}\n$bm_rt = s;\nfunction parentTotal() {\n var sFactor = [\n 1,\n 1\n ];\n var scaleNorm = [\n 0,\n 0\n ];\n var layerChain = 'thisLayer';\n while (eval([layerChain][0]).hasParent) {\n layerChain = sum(layerChain, '.parent');\n scaleNorm = eval([layerChain][0]).scale;\n if (scaleNorm[0] != 0 && scaleNorm[1] != 0) {\n scaleNorm = [\n 100 / scaleNorm[0],\n 100 / scaleNorm[1]\n ];\n }\n sFactor = [\n sFactor[0] * scaleNorm[0],\n sFactor[1] * scaleNorm[1]\n ];\n }\n return sFactor;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":500,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"is":{"a":0,"k":0,"ix":8,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"or":{"a":0,"k":113,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"os":{"a":0,"k":0,"ix":9,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"e":{"a":0,"k":0,"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(1).propertyIndex;\n$bm_rt = thisLayer(2)('Admin')(2)('ArcMath')(2)(grp)(p);"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"o":{"a":0,"k":100,"ix":7,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sk":{"a":0,"k":0,"ix":4,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"sa":{"a":0,"k":0,"ix":5,"x":"var $bm_rt;\nvar p = thisProperty.propertyIndex;\nvar grp = thisProperty.propertyGroup(2).propertyIndex;\n$bm_rt = content('Admin').content('ArcMath')('ADBE Vector Transform Group')(p);"},"nm":"Transform"}],"nm":"Arc","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.219607843137,0.227873439415,0.678431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":36,"ix":5,"x":"var $bm_rt;\nvar sFac = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2')('Parent Scale');\n$bm_rt = mul(value, sFac);"},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"BaseHose","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Style","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Right Leg::Ankle","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[135,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[200,200],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Right Leg::Hip","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":1,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"2.04","np":0,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"04"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Version","np":1,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":200,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Inner Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"is":{"a":0,"k":100,"ix":8,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Bend Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"or":{"a":0,"k":200,"ix":7,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('Outer Radius');\n} catch (err) {\n $bm_rt = value;\n}"},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"LineForCurve","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"tm","s":{"a":0,"k":0.01,"ix":1},"e":{"a":0,"k":24.99,"ix":2},"o":{"a":0,"k":-90,"ix":3,"x":"var $bm_rt;\n$bm_rt = -90;"},"m":1,"ix":2,"nm":"Line Halfer","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1,"x":"var $bm_rt;\nvar s = thisProperty.propertyGroup(2)(2)(1)(7);\n$bm_rt = [\n -s,\n 0\n];"},"s":{"a":0,"k":[100,100],"ix":3,"x":"var $bm_rt;\nvar flop;\ntry {\n var eff = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var bendDir = eff('Bend Direction');\n var autoFlop = eff('AutoFlop');\n flop = bendDir > 0 ? 1 : -1;\n autoFlop > 0 ? 0 : flop *= -1;\n var s = flop == 1 ? [\n -100,\n 100\n ] : [\n 100,\n 100\n ];\n if (eff('Parent Scale') < 0) {\n s = [\n -s[0],\n s[1]\n ];\n }\n $bm_rt = s;\n} catch (err) {\n $bm_rt = value;\n}\n;"},"r":{"a":0,"k":45,"ix":6,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n var baseRot = ctrl('Base Rotation');\n var flop = content('Admin').content('ArcMath').transform.scale[0];\n var rotOffset = flop < 0 ? -45 : 225;\n $bm_rt = sum(baseRot, rotOffset);\n} catch (err) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ArcMath","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\ntry {\n var ctrl = thisComp.layer(thisLayer(2)('Admin')(2)('A')(2)(1)._name)(4)('RubberHose 2');\n $bm_rt = ctrl('A');\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Admin","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/red_box.json b/example/resource/red_box.json new file mode 100644 index 0000000000..65bb77ce13 --- /dev/null +++ b/example/resource/red_box.json @@ -0,0 +1 @@ +{"v":"4.5.6","fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":612,"h":792,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Line Box Outlines","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[306,396,0]},"a":{"a":0,"k":[306,396,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[194.5,441.875],[503.125,441.875]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.979]},"o":{"x":[0.333],"y":[0]},"n":["0_0p979_0p333_0"],"t":0,"s":[50],"e":[0]},{"t":30.0000012219251}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.919]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p919_0p333_0"],"t":0,"s":[50],"e":[100]},{"t":30.0000012219251}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Back bot","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[194.5,144.5],[500.25,144.5]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.979]},"o":{"x":[0.333],"y":[0]},"n":["0_0p979_0p333_0"],"t":0,"s":[50],"e":[0]},{"t":30.0000012219251}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.919]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p919_0p333_0"],"t":0,"s":[50],"e":[100]},{"t":30.0000012219251}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Back top","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[405,238],[101,238]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.979]},"o":{"x":[0.333],"y":[0]},"n":["0_0p979_0p333_0"],"t":0,"s":[50],"e":[0]},{"t":30.0000012219251}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.919]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p919_0p333_0"],"t":0,"s":[50],"e":[100]},{"t":30.0000012219251}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Front top","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[101,540],[405,540]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.979]},"o":{"x":[0.333],"y":[0]},"n":["0_0p979_0p333_0"],"t":0,"s":[50],"e":[0]},{"t":30.0000012219251}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.919]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p919_0p333_0"],"t":0,"s":[50],"e":[100]},{"t":30.0000012219251}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Front bot","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[47.906,-47.906],[-47.907,47.906]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[146.594,489.781],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Bot left","np":4,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[194.5,144.5],[194.5,441.875]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 2","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 3","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Back left","np":4,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[500.25,144.5],[500.25,441.875]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Back right","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-49.063,49.063],[49.063,-49.063]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[454.063,490.938],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Bot right","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-47.625,47.625],[47.625,-47.625]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[452.625,190.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Top right","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-46.75,46.75],[46.75,-46.75]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[147.75,191.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Top left","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[405,542],[405,238]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Front right","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[101,236],[101,540]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.23,0.23,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.985]},"o":{"x":[0.333],"y":[0]},"n":["0_0p985_0p333_0"],"t":23,"s":[50],"e":[0]},{"t":45.0000018328876}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.004],"y":[0.941]},"o":{"x":[0.333],"y":[0]},"n":["0p004_0p941_0p333_0"],"t":23,"s":[50],"e":[100]},{"t":45.0000018328876}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Front left","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":241.000009816131,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/example/resource/spin,_lil_loader_v2.json b/example/resource/spin,_lil_loader_v2.json new file mode 100644 index 0000000000..64b71e8ced --- /dev/null +++ b/example/resource/spin,_lil_loader_v2.json @@ -0,0 +1 @@ +{"v":"5.1.16","fr":30,"ip":0,"op":50,"w":90,"h":90,"nm":"stick 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"stick 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":21,"s":[100],"e":[0]},{"t":36}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":186,"st":6,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"stick 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":3,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[100],"e":[0]},{"t":33}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":183,"st":3,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"stick 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":21,"s":[100],"e":[0]},{"t":36}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":186,"st":6,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"stick 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[100],"e":[0]},{"t":39}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9,"op":189,"st":9,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"stick 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27,"s":[100],"e":[0]},{"t":42}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":192,"st":12,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"stick 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[100],"e":[0]},{"t":45}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":195,"st":15,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"stick 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32,"s":[100],"e":[0]},{"t":47}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17,"op":197,"st":17,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"stick 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[100],"e":[0]},{"t":50}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,1.1],[0,0],[-1.1,0],[0,-1.1],[0,0]],"o":[[0,0],[-1.1,0],[0,0],[0,-1.1],[1.1,0],[0,0],[0,1.1]],"v":[[0,7.5],[0,7.5],[-2,5.5],[-2,-5.5],[0,-7.5],[2,-5.5],[2,5.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941191196,0.874509811401,0.086274512112,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,20],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":200,"st":20,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/tigerobo_demo.json b/example/resource/tigerobo_demo.json new file mode 100644 index 0000000000..396f958205 --- /dev/null +++ b/example/resource/tigerobo_demo.json @@ -0,0 +1 @@ +{"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"humo 30","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[523,264.5,0],"e":[525,246.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":1,"ty":4,"nm":"humo 29","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[225,202.5,0],"e":[227,184.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":2,"ty":4,"nm":"humo 28","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[231,284.5,0],"e":[233,266.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":3,"ty":4,"nm":"humo 27","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[451,324.5,0],"e":[453,306.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":4,"ty":4,"nm":"humo 26","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[265,262.5,0],"e":[267,244.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":5,"ty":4,"nm":"humo 25","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[345,186.5,0],"e":[341,182.5,0],"to":[-0.66666668653488,-0.66666668653488,0],"ti":[0.66666668653488,0.66666668653488,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":6,"ty":4,"nm":"humo 24","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[425,548.5,0],"e":[427,530.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":7,"ty":4,"nm":"humo 23","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[239,486.5,0],"e":[241,468.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":8,"ty":4,"nm":"humo 22","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[427,256.5,0],"e":[429,238.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":9,"ty":4,"nm":"humo 21","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[529,472.5,0],"e":[531,454.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":10,"ty":4,"nm":"humo 20","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[329,528.5,0],"e":[331,510.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":11,"ty":4,"nm":"humo 19","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[183,536.5,0],"e":[185,518.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[90.698,85.965,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":12,"ty":4,"nm":"humo 18","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[429,438.5,0],"e":[431,420.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":13,"ty":4,"nm":"humo 17","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[217,418.5,0],"e":[219,400.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":14,"ty":4,"nm":"humo 16","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[351,424.5,0],"e":[353,406.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":15,"ty":4,"nm":"humo 15","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[457,348.5,0],"e":[459,330.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":16,"ty":4,"nm":"humo 14","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[341,342.5,0],"e":[343,324.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":17,"ty":4,"nm":"humo 13","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[199,384.5,0],"e":[201,366.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":18,"ty":4,"nm":"humo 12","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[429,774.5,0],"e":[431,756.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":19,"ty":4,"nm":"humo 11","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[243,712.5,0],"e":[245,694.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":20,"ty":4,"nm":"humo 10","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[523,812.5,0],"e":[525,794.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":21,"ty":4,"nm":"humo 9","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[527,716.5,0],"e":[529,698.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":22,"ty":4,"nm":"humo 8","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[333,754.5,0],"e":[335,736.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":23,"ty":4,"nm":"humo 7","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[187,762.5,0],"e":[189,744.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[90.698,85.965,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":24,"ty":4,"nm":"humo 4","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[433,664.5,0],"e":[435,646.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":25,"ty":4,"nm":"humo 2","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[221,644.5,0],"e":[223,626.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":26,"ty":4,"nm":"humo 6","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[605,640.5,0],"e":[607,622.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":27,"ty":4,"nm":"humo 5","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[527,610.5,0],"e":[529,592.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":28,"ty":4,"nm":"humo 3","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[335,610.5,0],"e":[337,592.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":29,"ty":4,"nm":"humo","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[127,628.5,0],"e":[129,610.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0}]}],"v":"4.0.0","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Shape Layer 2","parent":2,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[347.285,1375.72,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-349,-456.5],[351,-456.5]]}},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,228,100,255]},"o":{"k":100},"w":{"k":12},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-355,"t":-463,"b":-450,"r":357},"ip":339,"op":392,"st":0},{"ddd":0,"ind":1,"ty":0,"nm":"Humo","refId":"comp_0","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[345,456.5,0]},"a":{"k":[345,456.5,0]},"s":{"k":[100,100,100]}},"w":690,"h":913,"ip":95,"op":133,"st":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 2 Outlines","parent":3,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":339,"s":[35.965,-1024.97,0],"e":[35.965,-104.97,0],"to":[0,153.33332824707,0],"ti":[0,-153.33332824707,0]},{"t":359}]},"a":{"k":[345.25,456.75,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-345,456.5],[345,456.5],[345,-456.5],[-345,-456.5]]}},"nm":"Path 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[118,196,181,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[345.25,456.75]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":914,"r":691},"ip":332,"op":392,"st":332},{"ddd":0,"ind":3,"ty":3,"nm":"Null 1","ks":{"o":{"k":0},"r":{"k":0},"p":{"k":[{"i":{"x":0.043,"y":1},"o":{"x":0.333,"y":0},"n":"0p043_1_0p333_0","t":32,"s":[361,-177.5,0],"e":[361,662.5,0],"to":[0,140,0],"ti":[0,-140,0]},{"i":{"x":0.043,"y":0.043},"o":{"x":0.167,"y":0.167},"n":"0p043_0p043_0p167_0p167","t":46.526,"s":[361,662.5,0],"e":[361,662.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.043,"y":1},"o":{"x":0.167,"y":0},"n":"0p043_1_0p167_0","t":328,"s":[361,662.5,0],"e":[355,612.5,0],"to":[-1,-8.33333301544189,0],"ti":[1,8.33333301544189,0]},{"i":{"x":0.043,"y":0.043},"o":{"x":0.167,"y":0.167},"n":"0p043_0p043_0p167_0p167","t":338,"s":[355,612.5,0],"e":[355,612.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.043,"y":1},"o":{"x":0.167,"y":0},"n":"0p043_1_0p167_0","t":339,"s":[355,612.5,0],"e":[361,662.5,0],"to":[1,8.33333301544189,0],"ti":[-1,-8.33333301544189,0]},{"t":348}]},"a":{"k":[50,46,0]},"s":{"k":[100,100,100]}},"ip":0,"op":392,"st":0},{"ddd":0,"ind":4,"ty":4,"nm":"BrazoAdelante 2","parent":27,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[5],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[5],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":328,"s":[5],"e":[-163]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":338,"s":[-163],"e":[-163]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":339,"s":[-163],"e":[-163.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":341,"s":[-163.5],"e":[-202]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":344,"s":[-202],"e":[-202]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":345,"s":[-202],"e":[-346]},{"t":350}]},"p":{"k":[235.426,251.527,0]},"a":{"k":[-94,-12,0]},"s":{"k":[-100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[2.088,-42.839],[-20.814,11.559]],"o":[[0,0],[-1.849,37.935],[2.623,-1.457]],"v":[[-93,-10.5],[-167.825,45.886],[-28.313,60.039]]}],"e":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":47.368,"s":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}],"e":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":52.421,"s":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}],"e":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":59.158,"s":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}],"e":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}],"e":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":97,"s":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}],"e":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":169,"s":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}],"e":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":175,"s":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}],"e":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}],"e":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}],"e":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":339,"s":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}],"e":[{"i":[[0,0],[11.432,1.897],[18.052,-11.681]],"o":[[-8.408,-1.194],[-17.12,-2.841],[-15.226,9.852]],"v":[[-93,-10.5],[-116.02,-64.757],[-183.276,0.183]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":344,"s":[{"i":[[0,0],[11.432,1.897],[18.052,-11.681]],"o":[[-8.408,-1.194],[-17.12,-2.841],[-15.226,9.852]],"v":[[-93,-10.5],[-116.02,-64.757],[-183.276,0.183]]}],"e":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}]},{"t":350}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"w":{"k":18},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-247,"t":-74,"b":167,"r":-19},"ip":0,"op":392,"st":0},{"ddd":0,"ind":5,"ty":4,"nm":"BrazoAdelante","parent":27,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34.072,"s":[-11],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[-11],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":328,"s":[-11],"e":[173]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":338,"s":[173],"e":[173]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":339,"s":[173],"e":[179.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":341,"s":[179.5],"e":[218]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":344,"s":[218],"e":[218]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":345,"s":[218],"e":[362]},{"t":350}]},"p":{"k":[53.426,251.527,0]},"a":{"k":[-94,-12,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[2.088,-42.839],[-20.814,11.559]],"o":[[0,0],[-1.849,37.935],[2.623,-1.457]],"v":[[-93,-10.5],[-167.825,45.886],[-28.313,60.039]]}],"e":[{"i":[[0,0],[22.386,-50.058],[9.396,-23.317]],"o":[[0,0],[-14.653,32.765],[-1.121,2.783]],"v":[[-93,-10.5],[-163.19,32.525],[-193.548,113.492]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":47.368,"s":[{"i":[[0,0],[22.386,-50.058],[9.396,-23.317]],"o":[[0,0],[-14.653,32.765],[-1.121,2.783]],"v":[[-93,-10.5],[-163.19,32.525],[-193.548,113.492]]}],"e":[{"i":[[0,0],[28.408,-60.074],[5.656,-25.043]],"o":[[0,0],[-12.798,27.065],[-0.286,0.288]],"v":[[-93,-10.5],[-158.827,41.523],[-186.077,116.982]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":52.421,"s":[{"i":[[0,0],[28.408,-60.074],[5.656,-25.043]],"o":[[0,0],[-12.798,27.065],[-0.286,0.288]],"v":[[-93,-10.5],[-158.827,41.523],[-186.077,116.982]]}],"e":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":59.158,"s":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}],"e":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}],"e":[{"i":[[0,0],[11.914,6.454],[4.094,11.817]],"o":[[0,0],[-21.73,-11.772],[-3.379,-9.752]],"v":[[-93,-10.5],[-174.944,-1.34],[-230.056,-73.408]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":97,"s":[{"i":[[0,0],[11.914,6.454],[4.094,11.817]],"o":[[0,0],[-21.73,-11.772],[-3.379,-9.752]],"v":[[-93,-10.5],[-174.944,-1.34],[-230.056,-73.408]]}],"e":[{"i":[[0,0],[7.545,-12.008],[3.492,-27.011]],"o":[[0,0],[-11.176,17.785],[-2.106,16.292]],"v":[[-93,-10.5],[-153.946,37.378],[-185.435,126.785]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":104,"s":[{"i":[[0,0],[7.545,-12.008],[3.492,-27.011]],"o":[[0,0],[-11.176,17.785],[-2.106,16.292]],"v":[[-93,-10.5],[-153.946,37.378],[-185.435,126.785]]}],"e":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":107,"s":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}],"e":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":169,"s":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":175,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":339,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}],"e":[{"i":[[0,0],[11.405,-17.818],[9.026,-19.807]],"o":[[0,0],[-9.622,15.031],[-6.812,14.949]],"v":[[-93,-10.5],[-143.839,-36.861],[-163.562,33.076]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":344,"s":[{"i":[[0,0],[11.405,-17.818],[9.026,-19.807]],"o":[[0,0],[-9.622,15.031],[-6.812,14.949]],"v":[[-93,-10.5],[-143.839,-36.861],[-163.562,33.076]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}]},{"t":350}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"w":{"k":18},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-240,"t":-84,"b":180,"r":-19},"ip":0,"op":392,"st":0},{"ddd":0,"ind":6,"ty":4,"nm":"pierna2","parent":3,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[21],"e":[21]},{"t":320}]},"p":{"k":[104,36,0]},"a":{"k":[-54,200,0]},"s":{"k":[-100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[0.557,-14.911],[0,0],[0.492,-6.629]],"o":[[0,0],[-0.552,14.762],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-38.513,351.227],[-31.492,382.129]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":44,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[5.152,-10.933],[0,0],[3.901,1.373]],"o":[[0,0],[-5.975,12.679],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-99.78,262.123],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":49.895,"s":[{"i":[[0,0],[5.152,-10.933],[0,0],[3.901,1.373]],"o":[[0,0],[-5.975,12.679],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-99.78,262.123],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":58.315,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-88.86,272.741],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":95,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-88.86,272.741],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":98,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":180,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":320,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":327,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":345,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":349,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"t":353}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"w":{"k":24},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[2,2]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-130,"t":200,"b":397,"r":-17},"ip":0,"op":392,"st":0},{"ddd":0,"ind":7,"ty":4,"nm":"pierna1","parent":3,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[-22],"e":[-22]},{"t":320}]},"p":{"k":[-36,36,0]},"a":{"k":[-54,200,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[0.557,-14.911],[0,0],[0.492,-6.629]],"o":[[0,0],[-0.552,14.762],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-38.513,351.227],[-31.492,382.129]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":44,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-100.81,263.421],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":49.895,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-100.81,263.421],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":58.315,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-91.538,267.167],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":95,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-91.538,267.167],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":98,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":180,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":320,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":327,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":345,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":349,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"t":353}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"w":{"k":24},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[2,2]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-142,"t":200,"b":397,"r":-17},"ip":0,"op":392,"st":0},{"ddd":0,"ind":8,"ty":4,"nm":"soga2","ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.192]},"n":["0p833_1_0p167_0p192"],"t":195,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.771]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p771_0p167_0"],"t":207,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.333]},"n":["0p833_1_0p167_-0p333"],"t":218,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.646]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p646_0p167_0"],"t":234,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.479]},"n":["0p833_1_0p167_-0p479"],"t":251,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.521]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p521_0p167_0"],"t":274,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.604]},"n":["0p833_1_0p167_-0p604"],"t":297,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.396]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p396_0p167_0"],"t":326,"s":[4],"e":[0]},{"t":355}]},"p":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":339,"s":[349,-9.5,0],"e":[349,1020.5,0],"to":[0,171.66667175293,0],"ti":[0,-171.66667175293,0]},{"t":359}]},"a":{"k":[4,-470,0]},"s":{"k":[{"i":{"x":[0.71,0.667,0.667],"y":[2.818,0.683,0.667]},"o":{"x":[0.327,0.333,0.333],"y":[0,0,0.333]},"n":["0p71_2p818_0p327_0","0p667_0p683_0p333_0","0p667_0p667_0p333_0p333"],"t":178,"s":[100,100,100],"e":[100,103.032,100]},{"i":{"x":[0.684,0.667,0.667],"y":[0.571,1,0.667]},"o":{"x":[0.35,0.333,0.333],"y":[0.244,0.037,0.333]},"n":["0p684_0p571_0p35_0p244","0p667_1_0p333_0p037","0p667_0p667_0p333_0p333"],"t":187,"s":[100,103.032,100],"e":[100,105.926,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.667,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0.333,-0.011,0.333]},"n":["0p667_0p667_0p333_0p333","0p667_1_0p333_-0p011","0p667_0p667_0p333_0p333"],"t":188,"s":[100,105.926,100],"e":[100,100,100]},{"t":195}]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":0.907},"o":{"x":0.167,"y":0.093},"n":"0p833_0p907_0p167_0p093","t":178,"s":[{"i":[[-66,-112],[-2.006,-3.838]],"o":[[30.057,51.005],[0.404,-27.052]],"v":[[27.056,-684.284],[-128.296,-591.5]]}],"e":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}]},{"i":{"x":0.833,"y":0.907},"o":{"x":0.167,"y":0.093},"n":"0p833_0p907_0p167_0p093","t":181.6,"s":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}],"e":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.093},"n":"0p667_1_0p167_0p093","t":185.2,"s":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}],"e":[{"i":[[-66,-112],[-24.911,-56.32]],"o":[[30.258,51.347],[41.26,93.283]],"v":[[31.287,-883.879],[45.12,-247.626]]}]},{"t":196}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,228,100,255]},"o":{"k":100},"w":{"k":12},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[-2,-468]},"a":{"k":[38,-468]},"s":{"k":[100,100]},"r":{"k":-0.315},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-175,"t":-901,"b":-199,"r":22},"ip":178,"op":392,"st":178},{"ddd":0,"ind":9,"ty":4,"nm":"soga1","ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.192]},"n":["0p833_1_0p167_0p192"],"t":17,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.771]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p771_0p167_0"],"t":29,"s":[4],"e":[0]},{"t":40}]},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":43,"s":[349,-9.5,0],"e":[349,-669.5,0],"to":[0,-110,0],"ti":[0,110,0]},{"t":48}]},"a":{"k":[4,-470,0]},"s":{"k":[{"i":{"x":[0.71,0.667,0.667],"y":[2.818,0.683,0.667]},"o":{"x":[0.327,0.333,0.333],"y":[0,0,0.333]},"n":["0p71_2p818_0p327_0","0p667_0p683_0p333_0","0p667_0p667_0p333_0p333"],"t":0,"s":[100,100,100],"e":[100,103.032,100]},{"i":{"x":[0.684,0.667,0.667],"y":[0.571,1,0.667]},"o":{"x":[0.35,0.333,0.333],"y":[0.244,0.037,0.333]},"n":["0p684_0p571_0p35_0p244","0p667_1_0p333_0p037","0p667_0p667_0p333_0p333"],"t":9,"s":[100,103.032,100],"e":[100,105.926,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.667,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0.333,-0.011,0.333]},"n":["0p667_0p667_0p333_0p333","0p667_1_0p333_-0p011","0p667_0p667_0p333_0p333"],"t":10,"s":[100,105.926,100],"e":[100,100,100]},{"t":17}]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-66,-112],[-2.006,-3.838]],"o":[[30.057,51.005],[0.404,-27.052]],"v":[[27.056,-684.284],[-128.296,-591.5]]}],"e":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}],"e":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":4,"s":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}],"e":[{"i":[[-66,-112],[-24.911,-56.32]],"o":[[30.258,51.347],[41.26,93.283]],"v":[[29,-468.5],[42.834,167.753]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":10,"s":[{"i":[[-66,-112],[-24.911,-56.32]],"o":[[30.258,51.347],[41.26,93.283]],"v":[[29,-468.5],[42.834,167.753]]}],"e":[{"i":[[-66,-112],[25.688,-48.885]],"o":[[30.051,50.995],[-47.447,90.293]],"v":[[29,-468.5],[30.901,155.478]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":17,"s":[{"i":[[-66,-112],[25.688,-48.885]],"o":[[30.051,50.995],[-47.447,90.293]],"v":[[29,-468.5],[30.901,155.478]]}],"e":[{"i":[[-6.865,-129.819],[-5.015,-61.4]],"o":[[3.001,56.753],[6.182,104.767]],"v":[[29,-468.5],[61.711,168.533]]}]},{"t":26}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,228,100,255]},"o":{"k":100},"w":{"k":12},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[-2,-468]},"a":{"k":[38,-468]},"s":{"k":[100,100]},"r":{"k":-0.315},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-175,"t":-727,"b":184,"r":32},"ip":0,"op":392,"st":0},{"ddd":0,"ind":10,"ty":4,"nm":"cinturon Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[154.614,381.64,0],"e":[148.614,381.64,0],"to":[-1,0,0],"ti":[1,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[148.614,381.64,0],"e":[148.614,381.64,0],"to":[0,0,0],"ti":[0,0,0]},{"t":203}]},"a":{"k":[135.816,27.219,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[4.458,8.019],[0.102,0.508],[3.178,-0.133],[9.962,-2.038],[4.699,-0.091],[6.772,-0.032],[0.677,2.124],[-2.913,6.244],[0.065,0.573],[0.251,0.011],[0.084,-0.093],[-2.252,-8.338],[-7.826,0],[-7.885,0.457]],"o":[[-0.292,-0.526],[-3.07,0.221],[13.784,3.005],[-4.635,0.948],[-6.77,0.131],[-2.291,0.01],[-2.119,-6.64],[-0.095,-0.563],[-0.251,-0.011],[-0.076,0.095],[-5.833,6.396],[7.184,0.206],[8.919,0],[2.335,-8.201]],"v":[[24.428,-12.627],[23.844,-14.182],[14.462,-13.655],[16.284,10.388],[2.053,10.882],[-18.254,11.35],[-23.076,7.679],[-21.827,-12.163],[-22.06,-13.868],[-22.82,-13.898],[-23.052,-13.615],[-24.426,13.862],[-1.922,14.182],[23.272,13.47]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[151.502,36.84]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-4.833,5.006],[1.889,7.582],[34.937,-5.227],[-7.975,2.094],[0,0],[2.817,-4.753],[16.837,-2.105],[1,1.5],[-0.227,1.042],[1.21,-0.129],[2.468,-9.213]],"o":[[-0.976,-9.147],[-8.65,4.552],[0.229,0.429],[3.165,-0.831],[0.704,4.996],[-3.149,5.313],[-8,1],[-2.819,-4.229],[-1.189,0.14],[3.754,8.906],[54.014,-4.622]],"v":[[43.011,0.704],[38.654,-24.579],[-29.598,-4.914],[0.877,-7.783],[36.877,-18.283],[37.86,0.24],[-18.123,17.217],[-35.623,17.217],[-38.985,-3.654],[-42.58,-3.249],[-43.011,24.579]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[228.371,24.973]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[26.523,6.306],[3.97,6.178],[-1.151,7.37],[-0.038,0.157],[1.094,0.417],[0.322,-6.619],[-70.153,-3.009],[0.09,4.544]],"o":[[-6.778,-1.612],[-4.227,-6.578],[0.026,-0.169],[-1.23,-0.443],[-1.302,4.488],[9.167,2.953],[-0.964,-4.231],[-1.201,17.219]],"v":[[-29.223,8.969],[-49.223,-1.031],[-50.044,-25.192],[-49.944,-25.676],[-53.436,-26.969],[-58.22,5.169],[58.22,23.114],[56.478,9.751]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[58.469,27.219]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-0.069,0.392],[20.132,6.372],[0.081,-2.018],[-4.347,1.326]],"o":[[-41.001,-3.228],[-0.252,1.618],[33.803,7.328],[0.049,-0.398]],"v":[[46.578,7.281],[-45.964,-9.792],[-46.578,-4.19],[46.399,8.466]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[64.022,14.551]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":0,"t":0,"b":52,"r":272},"ip":0,"op":392,"st":0},{"ddd":0,"ind":11,"ty":4,"nm":"sombra2 Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[226.199,246.234,0],"e":[226.199,246.234,0],"to":[0,0,0],"ti":[0,0,0]},{"t":203}]},"a":{"k":[67.207,242.402,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[11.581,37.177],[7.499,22.499],[-14.999,47.998],[111.021,5.799],[-21.635,-29.988],[1.671,-20.697],[4.63,-12.66],[6.476,-13.375],[0,-7.762],[-7.046,-10.276],[-4.879,-13.197],[-2.096,-15.063],[5.352,-25.547],[11.103,-14.442],[-1.791,2.641]],"o":[[-11.463,-36.799],[-8.527,-25.58],[15.435,-49.389],[34.592,12.743],[11.975,16.597],[-1.09,13.497],[-5.106,13.961],[-3.427,7.08],[0,12.5],[7.933,11.572],[5.269,14.255],[3.624,26.035],[-3.629,17.319],[7.561,-1.883],[29.499,-43.499]],"v":[[55.26,85.7],[13.845,-13.113],[48.343,-91.109],[-66.957,-242.152],[21.136,-180.517],[38.974,-122.972],[29.083,-83.669],[8.727,-43.706],[-7.773,-10.706],[18.382,33.065],[38.028,69.576],[49.306,113.537],[44.09,191.066],[22.97,242.152],[37.458,235.373]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[67.207,242.402]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":485,"r":130},"ip":0,"op":392,"st":0},{"ddd":0,"ind":12,"ty":4,"nm":"sombra1 Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[53.95,252.823,0],"e":[45.95,252.823,0],"to":[-1.33333337306976,0,0],"ti":[1.33333337306976,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[45.95,252.823,0],"e":[45.95,252.823,0],"to":[0,0,0],"ti":[0,0,0]},{"t":203}]},"a":{"k":[43.227,239.454,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[7.54,7.922],[2.986,8.339],[0.489,12.039],[-10.286,25.557],[-2.708,6.188],[-0.303,0.908],[3.837,23.364],[5.189,-35.029],[-20.452,-33.608],[-29.116,-2.506],[4.179,1.251]],"o":[[-6.143,-6.454],[-4.047,-11.306],[-1.131,-27.837],[2.523,-6.269],[-0.148,-0.737],[7.694,-23.107],[-7.57,34.982],[-5.548,37.452],[3.686,6.057],[-4.266,-1.02],[-10.283,-3.078]],"v":[[-2.251,107.236],[-15.458,84.581],[-22.895,49.483],[-5.434,-31.254],[2.443,-49.926],[2.639,-52.4],[6.436,-124.928],[-36.413,-14.484],[-16.217,113.112],[41.96,124.928],[26.044,122.628]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[44.243,353.729]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-6.857,-9.273],[-4.454,46.763],[-28.129,22.408],[-15.079,-39.2]],"o":[[-0.273,-6.831],[4,-42],[-65.14,28.707],[10.583,27.511]],"v":[[12.412,103.204],[-15.338,-4.796],[41.791,-103.204],[-26.712,44.802]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[42.041,103.454]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"}],"bounds":{"l":5,"t":0,"b":479,"r":87},"ip":0,"op":392,"st":0},{"ddd":0,"ind":13,"ty":4,"nm":"nariz Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[171.093,181.694,0],"e":[155.093,181.694,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[155.093,181.694,0],"e":[155.093,181.694,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":203,"s":[155.093,181.694,0],"e":[155.093,165.694,0],"to":[0,-2.66666674613953,0],"ti":[0,2.66666674613953,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[155.093,165.694,0],"e":[155.093,165.694,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.762},"o":{"x":0.333,"y":0},"n":"0p833_0p762_0p333_0","t":245,"s":[155.093,165.694,0],"e":[155.093,181.694,0],"to":[0,2.66666674613953,0],"ti":[0,-2.66666674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":251,"s":[155.093,181.694,0],"e":[155.093,181.694,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":300,"s":[155.093,181.694,0],"e":[155.093,165.694,0],"to":[0,-2.66666674613953,0],"ti":[0,2.66666674613953,0]},{"t":306}]},"a":{"k":[12.25,20.917,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.333,-20.667],[-12,20.667],[12,20.084],[8.397,0.917],[4.667,-18.92]]}},"nm":"Path 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[12.25,20.917]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":42,"r":25},"ip":0,"op":392,"st":0},{"ddd":0,"ind":15,"ty":4,"nm":"boca 2 Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":180},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[171.791,213.118,0],"e":[155.791,213.118,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[155.791,213.118,0],"e":[155.791,213.118,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":203,"s":[155.791,213.118,0],"e":[155.791,196.618,0],"to":[0,-2.75,0],"ti":[0,2.75,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[155.791,196.618,0],"e":[155.791,196.618,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.77},"o":{"x":0.333,"y":0},"n":"0p833_0p77_0p333_0","t":245,"s":[155.791,196.618,0],"e":[155.791,213.118,0],"to":[0,2.75,0],"ti":[0,-2.75,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":251,"s":[155.791,213.118,0],"e":[155.791,213.118,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":300,"s":[155.791,213.118,0],"e":[155.791,196.618,0],"to":[0,-2.75,0],"ti":[0,2.75,0]},{"t":306}]},"a":{"k":[9.584,2.955,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-1.821,-0.618],[-4.666,1.712],[1.82,-0.668],[4.255,1.445]],"o":[[4.712,1.6],[1.8,-0.66],[-4.209,1.544],[-1.838,-0.624]],"v":[[-7.513,1.105],[7.534,0.855],[6.737,-2.037],[-6.716,-1.787]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[188,188,166,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[9.584,2.956]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":1,"t":0,"b":6,"r":19},"ip":170,"op":392,"st":0},{"ddd":0,"ind":16,"ty":4,"nm":"boca Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[171.791,213.118,0],"e":[155.791,213.118,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"t":56.6318359375}]},"a":{"k":[9.584,2.955,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-1.821,-0.618],[-4.666,1.712],[1.82,-0.668],[4.255,1.445]],"o":[[4.712,1.6],[1.8,-0.66],[-4.209,1.544],[-1.838,-0.624]],"v":[[-7.513,1.105],[7.534,0.855],[6.737,-2.037],[-6.716,-1.787]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[188,188,166,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[9.584,2.956]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":1,"t":0,"b":6,"r":19},"ip":0,"op":169,"st":0},{"ddd":0,"ind":17,"ty":4,"nm":"lineas Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[167.676,176.027,0],"e":[159.676,176.027,0],"to":[-1.33333337306976,0,0],"ti":[1.33333337306976,0,0]},{"t":56.6318359375}]},"a":{"k":[56.5,168.25,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[-0.178,-0.379],[-0.277,-0.737],[-0.329,-1.044],[-0.315,-1.306],[-0.269,-1.515],[-0.209,-1.663],[-0.137,-1.754],[-0.089,-1.784],[-0.015,-1.759],[0.072,-1.675],[0.153,-1.532],[0.238,-1.328],[0.281,-1.064],[0.299,-0.734],[0.229,-0.353],[0,0],[-0.163,0.383],[-0.145,0.749],[-0.097,1.063],[-0.047,1.316],[-0.022,1.508],[0.012,1.648],[0.04,1.73],[0.095,1.756],[0.101,1.727],[0.102,1.645],[0.14,1.505],[0.125,1.314],[0.143,1.065],[0.138,0.755],[0.087,0.409]],"o":[[0,0],[0.179,0.378],[0.299,0.733],[0.334,1.041],[0.325,1.304],[0.288,1.51],[0.214,1.663],[0.138,1.753],[0.069,1.785],[0.018,1.759],[-0.059,1.676],[-0.153,1.533],[-0.215,1.33],[-0.273,1.065],[-0.3,0.738],[-0.257,0.334],[0,0],[0.137,-0.391],[0.136,-0.754],[0.083,-1.065],[0.046,-1.315],[-0.011,-1.509],[-0.038,-1.647],[-0.047,-1.729],[-0.053,-1.757],[-0.107,-1.728],[-0.135,-1.642],[-0.143,-1.505],[-0.151,-1.311],[-0.155,-1.062],[-0.128,-0.761],[-0.078,-0.411]],"v":[[-2.857,-28],[-2.584,-27.419],[-1.855,-25.754],[-0.903,-23.085],[0.097,-19.553],[1.022,-15.314],[1.797,-10.542],[2.377,-5.407],[2.733,-0.088],[2.839,5.243],[2.702,10.409],[2.331,15.235],[1.735,19.541],[0.955,23.146],[0.059,25.856],[-0.797,27.487],[-1.19,28],[-0.941,27.413],[-0.514,25.687],[-0.175,22.945],[0.021,19.362],[0.095,15.111],[0.06,10.362],[-0.058,5.283],[-0.262,0.041],[-0.509,-5.199],[-0.824,-10.271],[-1.189,-15.011],[-1.591,-19.252],[-2.017,-22.833],[-2.425,-25.589],[-2.737,-27.369]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[65.107,308.25]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[-0.768,-1.855],[-0.504,-1.302],[-0.286,-0.728],[-0.272,-0.819],[-0.564,-1.903],[-0.496,-2.102],[-0.252,-1.082],[-0.127,-0.548],[-0.098,-0.558],[-0.374,-2.274],[-0.111,-1.143],[-0.108,-1.13],[-0.082,-1.109],[-0.034,-1.08],[-0.013,-1.978],[0.13,-1.723],[0.286,-1.385],[0.179,-0.989],[0,0],[-0.023,2.004],[-0.049,1.385],[0.037,1.704],[0.031,1.946],[0.131,2.119],[0.122,1.086],[0.117,1.11],[0.123,1.123],[0.206,1.116],[0.328,2.208],[0.365,2.098],[0.468,1.887],[0.341,1.674],[0.343,1.354],[0.226,0.977]],"o":[[0,0],[0.38,0.929],[0.256,0.649],[0.28,0.732],[0.526,1.644],[0.62,1.892],[0.245,1.052],[0.126,0.542],[0.119,0.549],[0.368,2.239],[0.199,1.135],[0.109,1.143],[0.113,1.13],[0.072,1.109],[0.06,2.162],[-0.099,1.983],[-0.128,1.723],[-0.224,1.389],[-0.367,1.978],[0,0],[0.017,-1.002],[0.09,-1.381],[-0.061,-1.706],[-0.162,-1.946],[-0.083,-1.06],[-0.143,-1.086],[-0.122,-1.109],[-0.126,-1.121],[-0.334,-2.243],[-0.306,-2.213],[-0.419,-2.084],[-0.431,-1.899],[-0.321,-1.675],[-0.34,-1.354],[-0.442,-1.959]],"v":[[-5.551,-36],[-4.317,-33.094],[-2.963,-29.738],[-2.149,-27.669],[-1.376,-25.32],[0.285,-19.988],[1.841,-13.96],[2.586,-10.757],[2.966,-9.123],[3.254,-7.455],[4.369,-0.668],[4.762,2.762],[5.087,6.174],[5.379,9.534],[5.475,12.827],[5.551,19.058],[5.179,24.636],[4.681,29.322],[4.053,32.904],[3.449,36],[3.459,32.839],[3.536,29.239],[3.458,24.582],[3.311,19.088],[2.837,12.973],[2.594,9.748],[2.203,6.453],[1.834,3.104],[1.399,-0.262],[0.404,-6.957],[-0.738,-13.417],[-1.879,-19.447],[-3.019,-24.829],[-4.051,-29.392],[-4.882,-32.914]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[49.801,36.25]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[1.538,7.677],[29.495,3.814],[-31.333,-2],[-20.77,5.833]],"o":[[-25.462,12.677],[8.322,3.066],[19.959,1.273],[2,-5]],"v":[[53.75,-9.417],[-56.25,-5.583],[-0.25,7.751],[54.25,3.583]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[56.5,234.833]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"}],"bounds":{"l":0,"t":0,"b":337,"r":112},"ip":0,"op":392,"st":0},{"ddd":0,"ind":18,"ty":4,"nm":"ceja2 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[0],"e":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[21],"e":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":169,"s":[21],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":172,"s":[4],"e":[4]},{"t":203}]},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.947,"s":[36.186,48.205,0],"e":[31.186,38.205,0],"to":[-0.83333331346512,-1.66666662693024,0],"ti":[0.83333331346512,1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.315,"s":[31.186,38.205,0],"e":[31.186,38.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[31.186,38.205,0],"e":[43.686,45.205,0],"to":[2.08333325386047,1.16666662693024,0],"ti":[-2.08333325386047,-1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[43.686,45.205,0],"e":[43.686,45.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":169,"s":[43.686,45.205,0],"e":[42.186,55.205,0],"to":[-0.25,1.66666662693024,0],"ti":[0.25,-1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":172,"s":[42.186,55.205,0],"e":[42.186,55.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":203,"s":[42.186,55.205,0],"e":[37.186,36.205,0],"to":[-0.83333331346512,-3.16666674613953,0],"ti":[0.83333331346512,3.16666674613953,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[37.186,36.205,0],"e":[37.186,36.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":245,"s":[37.186,36.205,0],"e":[37.186,40.205,0],"to":[0,0.66666668653488,0],"ti":[0,-0.66666668653488,0]},{"t":252}]},"a":{"k":[10.864,3.231,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-1.926,0.183],[-5.777,1.019],[1.892,-0.334],[5.577,-0.529]],"o":[[5.843,-0.554],[1.903,-0.335],[-5.513,0.971],[-1.909,0.181]],"v":[[-8.688,2.798],[8.711,0.245],[7.913,-2.648],[-8.688,-0.202]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[10.864,3.232]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":7,"r":21},"ip":0,"op":392,"st":0},{"ddd":0,"ind":19,"ty":4,"nm":"ceja1 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[0],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[-23],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":169,"s":[-23],"e":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":172,"s":[-3],"e":[-3]},{"t":203}]},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.947,"s":[157.81,49.205,0],"e":[156.31,56.205,0],"to":[-0.25,1.16666662693024,0],"ti":[0.25,-1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.315,"s":[156.31,56.205,0],"e":[156.31,56.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[156.31,56.205,0],"e":[147.31,44.705,0],"to":[-1.5,-1.91666662693024,0],"ti":[1.5,1.91666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[147.31,44.705,0],"e":[147.31,44.705,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":169,"s":[147.31,44.705,0],"e":[150.31,53.205,0],"to":[0.5,1.41666662693024,0],"ti":[-0.5,-1.41666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":172,"s":[150.31,53.205,0],"e":[150.31,53.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":203,"s":[150.31,53.205,0],"e":[153.31,34.705,0],"to":[0.5,-3.08333325386047,0],"ti":[-0.5,3.08333325386047,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[153.31,34.705,0],"e":[153.31,34.705,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":245,"s":[153.31,34.705,0],"e":[153.31,38.705,0],"to":[0,0.66666668653488,0],"ti":[0,-0.66666668653488,0]},{"t":252}]},"a":{"k":[10.864,3.231,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[1.909,0.181],[5.513,0.971],[-1.903,-0.335],[-5.843,-0.554]],"o":[[-5.577,-0.529],[-1.892,-0.334],[5.777,1.019],[1.926,0.183]],"v":[[8.688,-0.202],[-7.913,-2.648],[-8.711,0.245],[8.688,2.798]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[10.864,3.232]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":1,"t":0,"b":7,"r":21},"ip":0,"op":392,"st":0},{"ddd":0,"ind":20,"ty":4,"nm":"ppdos 5 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":350,"s":[98.363,52.265,0],"e":[98.363,53.265,0],"to":[0,0.16666667163372,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":351,"s":[98.363,53.265,0],"e":[98.363,45.265,0],"to":[0,-1.16666662693024,0],"ti":[0,1.08333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":353,"s":[98.363,45.265,0],"e":[98.363,46.765,0],"to":[0,-1.08333337306976,0],"ti":[0,-0.25,0]},{"t":354}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":350,"op":354,"st":134},{"ddd":0,"ind":21,"ty":4,"nm":"ppdos 4 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":300,"s":[98.363,52.265,0],"e":[98.363,53.265,0],"to":[0,0.16666667163372,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":301,"s":[98.363,53.265,0],"e":[98.363,45.265,0],"to":[0,-1.16666662693024,0],"ti":[0,1.08333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":303,"s":[98.363,45.265,0],"e":[98.363,46.765,0],"to":[0,-1.08333337306976,0],"ti":[0,-0.25,0]},{"t":304}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":300,"op":304,"st":84},{"ddd":0,"ind":22,"ty":4,"nm":"ppdos 3 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":245,"s":[98.363,52.265,0],"e":[98.363,53.265,0],"to":[0,0.16666667163372,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":246,"s":[98.363,53.265,0],"e":[98.363,45.265,0],"to":[0,-1.16666662693024,0],"ti":[0,1.08333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":248,"s":[98.363,45.265,0],"e":[98.363,46.765,0],"to":[0,-1.08333337306976,0],"ti":[0,-0.25,0]},{"t":249}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":245,"op":249,"st":29},{"ddd":0,"ind":23,"ty":4,"nm":"ppdos Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.544,"s":[98.363,53.265,0],"e":[98.363,67.265,0],"to":[0,2.33333325386047,0],"ti":[0,-2.33333325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.947,"s":[98.363,67.265,0],"e":[98.363,67.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.913,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,-1.33333337306976,0],"ti":[0,1.33333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.315,"s":[98.363,59.265,0],"e":[98.363,59.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[98.363,59.265,0],"e":[98.363,49.265,0],"to":[0,-1.66666662693024,0],"ti":[0,1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[98.363,49.265,0],"e":[98.363,49.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":129,"s":[98.363,49.265,0],"e":[98.363,67.265,0],"to":[0,3,0],"ti":[0,-1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":130.403,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,1.66666662693024,0],"ti":[0,3,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":134,"s":[98.363,59.265,0],"e":[98.363,49.265,0],"to":[0,-3,0],"ti":[0,1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[98.363,49.265,0],"e":[98.363,49.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":165,"s":[98.363,49.265,0],"e":[98.363,67.265,0],"to":[0,3,0],"ti":[0,-1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":166.403,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,1.66666662693024,0],"ti":[0,2.16666674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":170,"s":[98.363,59.265,0],"e":[98.363,54.265,0],"to":[0,-2.16666674613953,0],"ti":[0,0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":172,"s":[98.363,54.265,0],"e":[98.363,54.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":198,"s":[98.363,54.265,0],"e":[98.363,67.265,0],"to":[0,2.16666674613953,0],"ti":[0,-0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":199.403,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,0.83333331346512,0],"ti":[0,3.41666674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":203,"s":[98.363,59.265,0],"e":[98.363,46.765,0],"to":[0,-3.41666674613953,0],"ti":[0,2.08333325386047,0]},{"t":205}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":0,"op":208,"st":0},{"ddd":0,"ind":24,"ty":4,"nm":"ojos Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":203,"s":[96.998,69.17,0],"e":[96.998,50.67,0],"to":[0,-3.08333325386047,0],"ti":[0,3.08333325386047,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[96.998,50.67,0],"e":[96.998,50.67,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":245,"s":[96.998,50.67,0],"e":[96.998,56.67,0],"to":[0,1,0],"ti":[0,-1,0]},{"t":251}]},"a":{"k":[54.75,7.583,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,-4.05],[2.255,0],[0,4.05],[-2.255,0]],"o":[[0,4.05],[-2.255,0],[0,-4.05],[2.255,0]],"v":[[4.084,0],[0.001,7.333],[-4.084,0],[0.001,-7.333]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[105.166,7.583]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,-4.05],[2.347,0],[0,4.05],[-2.347,0]],"o":[[0,4.05],[-2.347,0],[0,-4.05],[2.347,0]],"v":[[4.25,0],[0,7.333],[-4.25,0],[0,-7.333]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[4.5,7.583]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"}],"bounds":{"l":0,"t":0,"b":15,"r":110},"ip":0,"op":392,"st":0},{"ddd":0,"ind":25,"ty":4,"nm":"cara Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[170.301,131.511,0],"e":[154.301,131.511,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[154.301,131.511,0],"e":[154.301,131.511,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":203,"s":[154.301,131.511,0],"e":[154.301,113.011,0],"to":[0,-3.08333325386047,0],"ti":[0,3.08333325386047,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[154.301,113.011,0],"e":[154.301,113.011,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.795},"o":{"x":0.167,"y":0},"n":"0p833_0p795_0p167_0","t":245,"s":[154.301,113.011,0],"e":[154.301,131.511,0],"to":[0,3.08333325386047,0],"ti":[0,-3.08333325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":251,"s":[154.301,131.511,0],"e":[154.301,131.511,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":300,"s":[154.301,131.511,0],"e":[154.301,113.011,0],"to":[0,-3.08333325386047,0],"ti":[0,3.08333325386047,0]},{"t":306}]},"a":{"k":[96.872,47.987,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[4.26,23.649],[27.288,-4.915],[7.148,-11.997],[-0.901,-1.213],[-21.667,-2.667],[0.859,-17.168],[11.413,-6.272],[14.407,3.502],[4.936,3.643],[0.478,-0.363],[-18.438,3.321]],"o":[[-4.259,-23.65],[-16.14,2.907],[0.997,1.131],[15.294,-12.521],[16.012,1.971],[-0.673,13.46],[-12.872,7.074],[-6.406,-1.558],[-0.455,0.399],[10.827,11.445],[27.289,-4.915]],"v":[[46.587,-8.899],[-10.535,-42.821],[-46.943,-18.628],[-46.943,-18.628],[10.684,-35.816],[41.024,-1.479],[21.017,31.517],[-22.983,37.517],[-42.02,28.833],[-42.02,28.833],[4.891,42.822]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[214,185,127,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[142.647,47.986]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[13.484,5.205],[5.549,11.207],[-22.328,-4.021],[-10.734,7.643]],"o":[[-9.166,-3.537],[2.948,18.724],[15.124,2.724],[-18.322,3.073]],"v":[[-8.854,7.057],[-41.135,-19.952],[0.688,19.028],[41.135,10.651]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[214,185,127,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[45.518,71.78]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.793,-5.121],[-0.311,0.291],[17.302,3.116],[7.033,-20.317],[-10.618,2.939],[-14.023,-8.9]],"o":[[0.303,-0.296],[-6.721,-13.26],[-25.017,-4.506],[7.104,-9.639],[15.537,-4.3],[5.266,3.341]],"v":[[45.805,14.068],[46.729,13.189],[8.884,-13.641],[-46.73,14.565],[-15.112,-3.503],[32.056,1.171]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[214,185,127,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[52.748,18.806]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-4.26,-23.649],[-27.289,4.915],[4.261,23.65],[27.288,-4.915]],"o":[[4.26,23.649],[27.288,-4.915],[-4.259,-23.65],[-27.288,4.915]],"v":[[-49.409,8.899],[7.714,42.822],[49.409,-8.899],[-7.714,-42.821]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[139.825,47.987]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[4.26,-23.649],[27.289,4.915],[-4.261,23.65],[-27.288,-4.915]],"o":[[-4.26,23.649],[-27.288,-4.915],[4.259,-23.65],[27.288,4.915]],"v":[[49.41,8.899],[-7.714,42.822],[-49.409,-8.899],[7.714,-42.821]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[53.919,47.987]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 5"}],"bounds":{"l":3,"t":4,"b":92,"r":190},"ip":0,"op":392,"st":0},{"ddd":0,"ind":26,"ty":3,"nm":"Null 2","parent":3,"ks":{"o":{"k":0},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":320,"s":[28,14,0],"e":[28,24,0],"to":[0,1.66666662693024,0],"ti":[0,-1.66666662693024,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":327,"s":[28,24,0],"e":[28,24,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":328,"s":[28,24,0],"e":[28,10,0],"to":[0,-2.33333325386047,0],"ti":[0,0.66666668653488,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":338,"s":[28,10,0],"e":[28,20,0],"to":[0,-0.66666668653488,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":349,"s":[28,20,0],"e":[28,10,0],"to":[0,0,0],"ti":[0,1.66666662693024,0]},{"t":352}]},"a":{"k":[47.458,43.75,0]},"s":{"k":[118,96,100]}},"ip":0,"op":392,"st":0},{"ddd":0,"ind":27,"ty":4,"nm":"cuerpo Outlines","parent":26,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":170,"s":[0],"e":[0]},{"t":185}]},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":44,"s":[47.855,-150.191,0],"e":[47.855,-127.274,0],"to":[0,3.81944441795349,0],"ti":[0,-3.81944441795349,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":48.211,"s":[47.855,-127.274,0],"e":[47.855,-127.274,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":51.579,"s":[47.855,-127.274,0],"e":[47.855,-152.274,0],"to":[0,-4.16666650772095,0],"ti":[0,3.81944441795349,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.38},"n":"0p667_1_0p167_0p38","t":56.632,"s":[47.855,-152.274,0],"e":[47.855,-150.191,0],"to":[0,-3.81944441795349,0],"ti":[0,-0.34722220897675,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":60,"s":[47.855,-150.191,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":90,"s":[47.855,-150.191,0],"e":[47.855,-138.733,0],"to":[0,1.90972220897675,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":95,"s":[47.855,-138.733,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,1.90972220897675,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":99,"s":[47.855,-150.191,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":170,"s":[47.855,-150.191,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,0,0]},{"t":185}]},"a":{"k":[143.895,251.344,0]},"s":{"k":[84.746,104.167,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,39.257],[17.501,45.498],[-110.998,-2.883],[15.67,-50.146],[-8.527,-25.58],[-11.463,-36.799],[29.499,-43.499],[11.804,19.397],[-5.548,37.452]],"o":[[0,-22.499],[-18.803,-48.88],[115.494,3],[-14.999,47.997],[7.5,22.499],[11.581,37.177],[-13.447,19.83],[-20.451,-33.609],[6,-40.498]],"v":[[-89.342,-21.722],[-124.842,-89.719],[0.654,-248.211],[123.648,-95.218],[89.149,-17.222],[130.564,81.591],[114.146,231.264],[-112.147,229.866],[-132.342,102.27]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[143.895,251.344]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":9,"t":3,"b":497,"r":283},"ip":0,"op":392,"st":0},{"ddd":0,"ind":28,"ty":1,"nm":"Medium Gray-Cyan Solid 1","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[21],"e":[100]},{"t":49}]},"r":{"k":0},"p":{"k":[339,808.5,0]},"a":{"k":[327,796.5,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":32,"s":[69,69,100],"e":[53,53,100]},{"t":49}]}},"hasMask":true,"masksProperties":[{"cl":true,"inv":false,"mode":"a","pt":{"k":{"i":[[125.369,0],[0,-28.719],[-125.369,0],[0,28.719]],"o":[[-125.369,0],[0,28.719],[125.369,0],[0,-28.719]],"v":[[331,748],[104,800],[331,852],[558,800]]}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"sw":690,"sh":913,"sc":"#5eac9d","ip":0,"op":392,"st":0},{"ddd":0,"ind":29,"ty":4,"nm":"Layer 1 Outlines","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[345,456.5,0]},"a":{"k":[345.25,456.75,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-345,456.5],[345,456.5],[345,-456.5],[-345,-456.5]]}},"nm":"Path 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[118,196,181,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[345.25,456.75]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":914,"r":691},"ip":0,"op":1801,"st":0}],"ip":0,"op":392,"fr":30,"w":690,"h":913} \ No newline at end of file diff --git a/example/resource/tractor.json b/example/resource/tractor.json new file mode 100644 index 0000000000..4c094702ec --- /dev/null +++ b/example/resource/tractor.json @@ -0,0 +1 @@ +{"v":"5.1.10","fr":24,"ip":0,"op":427,"w":400,"h":310,"nm":"Tractor","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Tractor Master Ctrl","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[184.028,155,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Dark 4 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.53,14.503,0],"ix":2},"a":{"a":0,"k":[1.973,2.877,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.973,1.877],[1.049,1.877],[1.049,-2.877],[1.973,-2.877],[1.973,2.877],[-1.973,2.877]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936999990426,0.169000004787,0.149000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.972,2.877],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Light 4 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.53,14.474,0],"ix":2},"a":{"a":0,"k":[2.223,3.156,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-0.571],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.571,0]],"v":[[-1.973,-1.872],[-1.973,2.906],[1.973,2.906],[1.973,-2.906],[-0.939,-2.906]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936999990426,0.169000004787,0.149000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.222,3.156],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Seat Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[11.031,12.997,0],"ix":2},"a":{"a":0,"k":[3.729,2.891,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.076,-0.343],[0,0],[-1.082,-3.101],[0,0],[0,0],[1.244,1.246],[0.753,0.226]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.935,-1.469],[-0.551,-0.552],[-0.25,-0.075]],"v":[[-3.728,-2.69],[-3.238,-0.466],[1.48,2.214],[1.716,2.892],[3.73,2.795],[0.786,-1.544],[-1.154,-2.773]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.463000009574,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.729,2.891],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Steering Outlines","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.577,-0.554,0],"ix":2},"a":{"a":0,"k":[6.578,4.658,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.146,-0.95],[0.194,0.437],[-2.146,0.951],[-0.193,-0.437]],"o":[[-2.146,0.951],[-0.194,-0.438],[2.145,-0.95],[0.195,0.437]],"v":[[0.351,0.791],[-3.885,1.721],[-0.351,-0.792],[3.883,-1.721]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.368999974868,0.356999984442,0.356999984442,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[6.578,4.658],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Steering Pipe Light Outlines","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.217,3.754,0],"ix":2},"a":{"a":0,"k":[2.101,3.505,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.101,-3.378],[1.622,3.504],[2.102,3.365],[-1.731,-3.504]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301999978458,0.301999978458,0.301999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.102,3.505],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Steering Pipe Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.047,12.53,0],"ix":2},"a":{"a":0,"k":[2.785,3.9,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.535,-3.229],[-1.299,-3.651],[2.535,3.22],[1.045,3.651]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501999978458,0.501999978458,0.501999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.784,3.901],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Hood Pipe Outlines","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.907,-2.469,0],"ix":2},"a":{"a":0,"k":[1.613,3.172,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.051,0.373],[-0.021,-0.14],[0,0],[0.117,-0.038],[-0.07,-0.698],[0.019,-0.684],[0.145,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.151,-0.027],[0,0],[0.016,0.114],[-0.385,0.128],[0.076,0.751],[-0.004,0.133],[0,0],[0,0]],"v":[[-1.363,2.922],[-1.093,2.826],[-1.093,-1.217],[0.958,-2.895],[1.275,-2.682],[1.347,-2.167],[1.177,-1.906],[0.061,-0.727],[0.069,2.685],[-0.199,2.922],[-1.151,2.922]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.8,0.8,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.613,3.172],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Hood Pipe Base Light Outlines","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.34,2.435,0],"ix":2},"a":{"a":0,"k":[1.336,2.435,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.209,0],[0,0],[0.196,0],[0,0],[0,-0.197],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.017,-0.182],[0,0],[-0.209,0],[0,0],[0,0],[0,0],[0,-0.196]],"v":[[-0.328,-1.859],[1.087,-1.859],[0.717,-2.185],[-0.71,-2.185],[-1.087,-1.829],[-1.087,2.185],[-0.706,2.185],[-0.706,-1.503]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.8,0.8,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.336,2.435],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Hood Pipe Base Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[47.012,10.26,0],"ix":2},"a":{"a":0,"k":[1.34,4.62,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.208,0],[0,0],[0,-0.197],[0,0]],"o":[[0,0],[0,-0.197],[0,0],[0.208,0],[0,0],[0,0]],"v":[[-1.09,2.185],[-1.09,-1.828],[-0.713,-2.185],[0.713,-2.185],[1.09,-1.828],[1.09,2.185]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501999978458,0.501999978458,0.501999978458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.34,2.435],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Light 3 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[34.404,22.26,0],"ix":2},"a":{"a":0,"k":[4.204,1.828,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.085,-0.014],[-0.019,-0.459],[0.041,-0.614],[0.461,0.004],[1.33,0],[0.801,0.003],[0.002,0.563],[-0.002,0.539],[-0.545,0],[-1.048,0]],"o":[[1.085,0],[0.468,0.007],[0.026,0.616],[-0.025,0.376],[-1.331,-0.011],[-0.803,0],[-0.56,-0.002],[-0.002,-0.538],[0.001,-0.538],[1.047,-0.001],[0,0]],"v":[[-0.037,-1.556],[3.218,-1.552],[3.909,-0.889],[3.913,0.96],[3.207,1.574],[-0.785,1.57],[-3.192,1.57],[-3.951,0.801],[-3.952,-0.814],[-3.179,-1.577],[-0.037,-1.577]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.463000009574,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.204,1.828],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Light 2 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49,23.93,0],"ix":2},"a":{"a":0,"k":[1.966,2.095,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.519],[-0.002,0.528],[0.182,0.003],[0.643,-0.303],[-0.946,-0.689],[-0.808,0.022],[0.001,0.138]],"o":[[0,-0.528],[0,-0.142],[-0.701,-0.015],[-1.058,0.498],[0.696,0.507],[0.185,-0.005],[-0.004,-0.518]],"v":[[1.714,0.003],[1.715,-1.581],[1.514,-1.831],[-0.518,-1.477],[-0.771,1.322],[1.531,1.824],[1.716,1.559]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.541000007181,0.528999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.966,2.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Light 1 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[42.524,22.557,0],"ix":2},"a":{"a":0,"k":[3.128,1.472,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.715,-0.001],[-0.006,-0.522],[0.009,-0.361],[0.421,-0.002],[1.489,0.006],[0.002,0.435],[-0.01,0.371],[-0.428,0.004],[-0.744,0]],"o":[[0.715,0],[0.517,0.001],[0.004,0.363],[-0.008,0.419],[-1.488,0.007],[-0.425,-0.001],[-0.001,-0.372],[0.012,-0.428],[0.744,-0.007],[0,0]],"v":[[0.014,-1.221],[2.158,-1.221],[2.87,-0.509],[2.868,0.577],[2.23,1.215],[-2.236,1.215],[-2.877,0.549],[-2.854,-0.566],[-2.219,-1.203],[0.014,-1.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.463000009574,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.128,1.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Dark 3 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.849,17.379,0],"ix":2},"a":{"a":0,"k":[2.196,1.873,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.138,-0.1],[-0.055,0.001],[-0.518,-0.01],[0.003,0.214],[0.011,0.734],[-0.238,-0.009],[-0.411,0],[-0.001,0.231],[0.161,0],[0.872,0.012],[-0.004,-0.209],[-0.002,-0.597],[0.251,-0.24]],"o":[[0.112,0.02],[0.518,-0.003],[0.225,0.005],[-0.01,-0.734],[-0.003,-0.225],[0.411,0.017],[0.147,0],[0.002,-0.216],[-0.872,0.002],[-0.228,-0.002],[0.012,0.598],[0.001,0.355],[-0.08,0.077]],"v":[[-1.945,1.585],[-1.725,1.622],[-0.17,1.611],[0.113,1.323],[0.104,-0.878],[0.406,-1.186],[1.639,-1.181],[1.943,-1.388],[1.652,-1.618],[-0.964,-1.621],[-1.24,-1.327],[-1.234,0.465],[-1.629,1.351]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936999990426,0.169000004787,0.149000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.195,1.873],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Dark 2 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.961,15.21,0],"ix":2},"a":{"a":0,"k":[4.607,1.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.011,0.075],[0.846,0.001],[2.016,0.004],[-0.003,-0.249],[-0.166,0.001],[-0.891,-0.011],[-0.033,-0.792],[-0.209,0.001],[-1.284,0]],"o":[[-0.014,-0.119],[-0.151,-0.969],[-2.016,-0.003],[-0.191,-0.001],[0.003,0.244],[0.89,-0.002],[0.797,0.009],[0.009,0.251],[1.282,-0.006],[0,0]],"v":[[4.357,0.987],[4.326,0.719],[2.004,-0.988],[-4.045,-0.991],[-4.354,-0.732],[-4.051,-0.497],[-1.378,-0.495],[-0.127,0.707],[0.197,0.99],[4.045,0.987]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936999990426,0.169000004787,0.149000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.607,1.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Dark 1 Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[44.06,18.414,0],"ix":2},"a":{"a":0,"k":[2.565,1.488,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.646,0],[0,0],[0.567,-0.005],[-0.001,-0.653],[-0.025,-0.506],[-0.226,0.002],[-1.283,-0.007],[0.004,0.211],[-0.013,0.616],[0.219,-0.003]],"o":[[0,0],[-0.567,0],[-0.67,0.006],[0,0.508],[0.011,0.205],[1.282,-0.008],[0.196,0.001],[-0.01,-0.617],[0.006,-0.241],[-0.645,0.01]],"v":[[0.058,-1.168],[0.058,-1.169],[-1.645,-1.168],[-2.213,-0.585],[-2.165,0.937],[-1.816,1.236],[2.031,1.236],[2.309,0.972],[2.309,-0.878],[1.995,-1.172]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936999990426,0.169000004787,0.149000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.565,1.488],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Back Nut 4 Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.805,6.221,0],"ix":2},"a":{"a":0,"k":[3.063,1.81,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.074,0.157],[-0.131,0.127],[-1.789,0.124],[-0.015,-0.29],[0.345,-0.026],[0.884,-0.566],[0.385,-0.314],[0.223,0.252]],"o":[[0.108,-0.158],[1.3,-1.262],[0.342,-0.024],[0.014,0.283],[-1.041,0.077],[-0.417,0.267],[-0.285,0.233],[-0.078,-0.088]],"v":[[-2.814,0.934],[-2.491,0.472],[2.178,-1.536],[2.799,-1.056],[2.234,-0.495],[-0.683,0.397],[-1.857,1.316],[-2.631,1.308]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,1.81],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Back Nut 3 Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6.191,15.057,0],"ix":2},"a":{"a":0,"k":[1.842,3.074,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.026,0.006],[-0.274,0.019],[-0.028,-0.302],[-0.37,-0.791],[-0.472,-0.498],[0.202,-0.206],[0.249,0.232],[0.326,0.963],[0.192,0.773]],"o":[[0,-0.292],[0.273,-0.019],[0.082,0.862],[0.294,0.629],[0.222,0.234],[-0.22,0.224],[-0.749,-0.699],[-0.255,-0.753],[0.026,-0.007]],"v":[[-1.513,-2.246],[-1.019,-2.805],[-0.47,-2.31],[0.16,0.178],[1.346,1.837],[1.39,2.593],[0.635,2.592],[-1.002,0.093],[-1.592,-2.226]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.842,3.074],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Back Nut 2 Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15.068,18.658,0],"ix":2},"a":{"a":0,"k":[3.064,1.834,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.019,0.312],[-0.323,0.03],[-0.658,0.249],[-0.607,0.577],[-0.197,-0.197],[0.242,-0.246],[0.996,-0.312],[0.727,-0.179]],"o":[[-0.356,0.008],[-0.017,-0.291],[0.695,-0.062],[0.793,-0.301],[0.249,-0.236],[0.208,0.209],[-0.729,0.745],[-0.714,0.224],[0,0]],"v":[[-2.21,1.501],[-2.797,1.026],[-2.28,0.459],[-0.25,0.027],[1.823,-1.321],[2.606,-1.387],[2.565,-0.596],[-0.009,1.039],[-2.189,1.584]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.064,1.834],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Back Nut 1 Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[18.641,9.799,0],"ix":2},"a":{"a":0,"k":[1.816,3.073,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.087,-0.47],[0.292,-0.034],[0.077,0.388],[0.191,0.621],[0.633,0.629],[-0.15,0.237],[-0.251,-0.082],[-0.062,-0.06],[-0.297,-1.3]],"o":[[-0.032,0.38],[-0.32,0.038],[-0.127,-0.64],[-0.264,-0.853],[-0.2,-0.201],[0.143,-0.229],[0.078,0.026],[0.958,0.928],[0.108,0.465]],"v":[[1.566,2.154],[1.091,2.785],[0.497,2.242],[0.08,0.329],[-1.329,-1.871],[-1.416,-2.533],[-0.802,-2.741],[-0.589,-2.596],[1.3,0.747]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.816,3.073],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Back Center Light Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12.438,12.414,0],"ix":2},"a":{"a":0,"k":[2.336,2.343,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.011,1.149],[1.123,0.012],[0.004,-1.145],[-1.12,-0.001]],"o":[[0.009,-1.123],[-1.142,-0.012],[-0.004,1.137],[1.153,0.001]],"v":[[2.077,0.014],[0.02,-2.081],[-2.082,-0.004],[-0.027,2.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.336,2.343],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Back Center Dark Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12.443,12.418,0],"ix":2},"a":{"a":0,"k":[4.432,4.441,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.321,-0.046],[0.019,-2.297],[2.345,0.03],[-0.009,2.302]],"o":[[2.309,-0.045],[-0.019,2.285],[-2.288,-0.03],[0.009,-2.285]],"v":[[-0.005,-4.146],[4.163,0.027],[-0.057,4.161],[-4.173,-0.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.431,4.441],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Back Wheel Inner Outlines","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12.438,12.427,0],"ix":2},"a":{"a":0,"k":[9.201,9.201,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,4.944],[4.943,0],[0,-4.943],[-4.945,0]],"o":[[0,-4.943],[-4.945,0],[0,4.944],[4.943,0]],"v":[[8.952,-0.001],[0.001,-8.952],[-8.952,-0.001],[0.001,8.952]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.201,9.202],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Back Wheel Body Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[720]},{"t":142}],"ix":10},"p":{"s":true,"x":{"a":0,"k":1.969,"ix":3},"y":{"a":0,"k":17.435,"ix":4}},"a":{"a":0,"k":[12.411,12.481,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.004,0.008],[0.011,0.198],[0.134,0.191],[0.399,0.578],[0.09,0.03],[0.213,0.853],[-0.494,0.223],[0.023,0.194],[0.086,0.835],[0.072,0.082],[-0.206,0.794],[-0.081,0.253],[-0.18,-0.026],[-0.063,0.144],[-0.363,0.82],[0.018,0.105],[-0.521,0.554],[-0.168,0.216],[-0.033,-0.034],[-0.008,-0.004],[-0.19,0.009],[-0.189,0.134],[-0.597,0.423],[-0.037,0.089],[-0.748,0.181],[-0.193,0.068],[-0.084,-0.185],[-0.529,0.073],[-0.758,0.076],[-0.094,0.077],[-0.761,-0.205],[-0.056,-0.018],[0.053,-0.53],[-0.153,-0.066],[-0.793,-0.346],[-0.113,0.017],[-0.597,-0.665],[0.3,-0.417],[-0.114,-0.154],[-0.517,-0.709],[-0.081,-0.03],[-0.19,-0.794],[-0.018,-0.076],[0.494,-0.222],[-0.023,-0.172],[-0.106,-0.834],[-0.108,-0.155],[0.104,-0.596],[0.061,-0.277],[0.2,0.022],[0.184,-0.434],[0.309,-0.695],[-0.019,-0.139],[0.636,-0.566],[0.014,-0.013],[0.467,0.306],[0.052,-0.057],[0.682,-0.399],[0.123,-0.316],[0.684,-0.136],[0.191,-0.071],[0.067,0.144],[0.608,-0.087],[0.71,-0.071],[0.123,-0.1],[0.905,0.305],[-0.002,0.078],[0.518,0.222],[0.675,0.307],[0.113,-0.016],[0.57,0.635],[0.168,0.148]],"o":[[0,-0.01],[0.123,-0.206],[-0.01,-0.187],[-0.401,-0.576],[-0.059,-0.085],[-0.889,-0.297],[-0.13,-0.515],[0.199,-0.09],[-0.099,-0.834],[-0.012,-0.121],[-0.568,-0.643],[0.059,-0.227],[0.178,0.017],[0.154,0.023],[0.359,-0.822],[0.045,-0.1],[-0.128,-0.768],[0.187,-0.198],[0.033,0.034],[0.009,0.001],[0.196,0.126],[0.186,-0.009],[0.597,-0.423],[0.081,-0.057],[0.29,-0.691],[0.199,-0.048],[0.182,-0.065],[0.223,0.491],[0.754,-0.104],[0.13,-0.014],[0.636,-0.517],[0.056,0.015],[0.513,0.162],[-0.017,0.168],[0.796,0.341],[0.112,0.049],[0.911,-0.14],[0.348,0.389],[-0.113,0.156],[0.526,0.703],[0.054,0.075],[0.762,0.29],[0.018,0.076],[0.13,0.533],[-0.15,0.068],[0.109,0.834],[0.024,0.192],[0.348,0.503],[-0.048,0.279],[-0.046,0.207],[-0.468,-0.052],[-0.297,0.701],[-0.062,0.137],[0.123,0.865],[-0.015,0.013],[-0.4,0.372],[-0.081,-0.052],[-0.543,0.592],[-0.268,0.157],[-0.251,0.645],[-0.199,0.04],[-0.156,0.058],[-0.247,-0.527],[-0.705,0.102],[-0.164,0.017],[-0.845,0.677],[-0.054,-0.019],[0.015,-0.559],[-0.68,-0.292],[-0.11,-0.051],[-0.841,0.119],[-0.149,-0.166],[0,0]],"v":[[-8.696,8.471],[-8.694,8.443],[-8.356,7.827],[-8.775,7.285],[-9.964,5.545],[-10.188,5.327],[-11.701,3.495],[-11.35,2.743],[-11.166,2.367],[-11.421,-0.141],[-11.512,-0.492],[-11.955,-2.665],[-11.732,-3.365],[-11.191,-3.313],[-10.911,-3.492],[-9.812,-5.949],[-9.757,-6.281],[-9.111,-8.236],[-8.604,-8.88],[-8.505,-8.779],[-8.477,-8.774],[-7.89,-8.426],[-7.347,-8.833],[-5.548,-10.09],[-5.355,-10.324],[-3.847,-11.678],[-3.257,-11.85],[-2.893,-11.688],[-2.136,-11.311],[0.141,-11.533],[0.519,-11.646],[2.624,-12.026],[2.793,-11.977],[3.26,-11.283],[3.45,-10.982],[5.827,-9.936],[6.186,-9.85],[8.401,-8.982],[8.469,-8.182],[8.484,-7.776],[10.032,-5.647],[10.238,-5.46],[11.67,-3.841],[11.732,-3.615],[11.37,-2.855],[11.21,-2.544],[11.5,-0.038],[11.685,0.521],[12.058,2.163],[11.863,2.99],[11.498,3.219],[10.87,3.62],[9.928,5.7],[9.818,6.139],[9.001,8.258],[8.957,8.299],[8.095,8.357],[7.766,8.359],[5.868,9.764],[5.271,10.406],[3.827,11.557],[3.243,11.738],[2.957,11.6],[2.101,11.201],[-0.031,11.391],[-0.507,11.554],[-3.153,11.738],[-3.25,11.507],[-3.758,10.747],[-5.777,9.816],[-6.134,9.728],[-8.245,8.967],[-8.747,8.521]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.411,12.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Nut 4 Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.16,5.586,0],"ix":2},"a":{"a":0,"k":[0.723,0.73,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.004,-0.262],[-0.271,-0.001],[0.003,0.281],[0.281,-0.005]],"o":[[-0.005,0.275],[0.276,0.001],[-0.002,-0.285],[-0.257,0.005]],"v":[[-0.468,-0.006],[-0.001,0.479],[0.47,-0.003],[-0.009,-0.475]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.723,0.731],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Nut 3 Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[5.621,4.868,0],"ix":2},"a":{"a":0,"k":[0.743,0.744,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.008,0.258],[0.249,0.002],[0.018,-0.246],[-0.245,-0.012]],"o":[[0.009,-0.251],[-0.239,-0.002],[-0.018,0.245],[0.253,0.012]],"v":[[0.485,0.008],[0.01,-0.492],[-0.475,-0.032],[-0.018,0.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.743,0.744],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Nut 2 Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.904,9.394,0],"ix":2},"a":{"a":0,"k":[0.739,0.746,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.219,-0.01],[-0.004,-0.262],[-0.265,0.002],[0.005,0.25]],"o":[[-0.262,0.012],[0.004,0.265],[0.25,-0.002],[-0.003,-0.229]],"v":[[-0.013,-0.486],[-0.485,0.017],[0.004,0.494],[0.484,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.739,0.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Nut 1 Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.434,10.125,0],"ix":2},"a":{"a":0,"k":[0.741,0.729,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.281,0.005],[0.004,-0.263],[-0.272,-0.005],[-0.006,0.282]],"o":[[-0.272,-0.004],[-0.004,0.265],[0.287,0.005],[0.005,-0.276]],"v":[[0.012,-0.475],[-0.486,-0.009],[-0.006,0.474],[0.486,0.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.74,0.729],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"Front Center Light Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7.54,7.509,0],"ix":2},"a":{"a":0,"k":[1.142,1.137,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.441,-0.001],[-0.009,0.483],[-0.509,-0.002],[0.003,-0.475]],"o":[[-0.474,0.002],[0.009,-0.504],[0.487,0.002],[-0.002,0.446]],"v":[[0.001,0.884],[-0.883,-0.029],[0.003,-0.885],[0.889,-0.012]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.142,1.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Front Center Dark Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7.546,7.513,0],"ix":2},"a":{"a":0,"k":[2.188,2.185,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.084,0.003],[0.004,-1.083],[-1.081,-0.013],[-0.006,1.034]],"o":[[-1.089,-0.003],[-0.004,1.084],[1.027,0.013],[0.007,-1.067]],"v":[[-0.012,-1.932],[-1.934,-0.033],[-0.016,1.922],[1.931,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.188,2.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"Front Wheel Inner Outlines","parent":32,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7.508,7.508,0],"ix":2},"a":{"a":0,"k":[4.693,4.692,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,2.454],[2.454,0],[0,-2.453],[-2.453,0]],"o":[[0,-2.453],[-2.453,0],[0,2.454],[2.454,0]],"v":[[4.443,0],[0,-4.442],[-4.443,0],[0,4.442]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6,0.6,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.693,4.692],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"Front Wheel Body Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[1440]},{"t":142}],"ix":10},"p":{"s":true,"x":{"a":0,"k":38.472,"ix":3},"y":{"a":0,"k":22.138,"ix":4}},"a":{"a":0,"k":[7.508,7.508,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.009,0],[0,-4.008],[-4.008,0],[0,4.009]],"o":[[-4.008,0],[0,4.009],[4.009,0],[0,-4.008]],"v":[[0,-7.258],[-7.258,0],[0,7.258],[7.258,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2,0.2,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.508,7.508],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"Body Top Back Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[51.891,12.164,0],"ix":2},"a":{"a":0,"k":[4.035,2.441,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.267,0.002],[-1.524,-0.002],[0.001,-1.02],[0.012,-0.274],[-0.089,-0.038],[0,0],[-0.058,0.003],[0.003,0.351],[0.457,0.012],[0.009,-0.002],[-0.009,0.207],[0,0.274],[1.021,0.002],[1.523,-0.012],[0.005,0.222],[0.004,-0.44]],"o":[[1.523,-0.012],[1.021,0.002],[0,0.274],[-0.006,0.141],[0,0],[0.097,-0.008],[0.433,-0.018],[-0.004,-0.355],[-0.01,-0.001],[-0.23,0.032],[0.012,-0.274],[0.001,-1.021],[-1.524,-0.002],[-0.252,0.001],[0,0.44],[-0.002,0.252]],"v":[[-3.454,-0.532],[1.118,-0.537],[2.74,1.094],[2.738,1.917],[2.852,2.191],[2.852,2.076],[3.064,2.058],[3.783,1.442],[3.046,0.853],[3.016,0.853],[2.738,0.561],[2.74,-0.261],[1.118,-1.893],[-3.454,-1.887],[-3.781,-2.191],[-3.784,-0.87]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.463000009574,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.035,2.441],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"Body Top Front Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[36.774,12.109,0],"ix":2},"a":{"a":0,"k":[9.459,2.378,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.938,0],[-5.172,-0.009],[0.004,0.301],[0,0.427],[0.267,0],[5.172,-0.002],[0.005,-0.933],[0,-0.403],[0.106,-0.008],[0.009,-0.328],[-0.345,-0.036],[-0.11,-0.012],[-0.002,0.342]],"o":[[5.172,-0.002],[0.297,0.001],[-0.007,-0.427],[-0.014,0.23],[-5.172,-0.01],[-0.938,0.001],[-0.003,0.379],[-0.139,0.008],[-0.351,0.028],[-0.009,0.326],[0.11,0.011],[0,-0.359],[0.005,-0.932]],"v":[[-6.691,-0.481],[8.826,-0.476],[9.205,-0.847],[9.199,-2.128],[8.826,-1.831],[-6.691,-1.837],[-8.265,-0.273],[-8.266,0.889],[-8.616,0.91],[-9.2,1.489],[-8.619,2.112],[-8.266,2.128],[-8.265,1.082]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.463000009574,0.451000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.459,2.378],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"Body Main Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":17.757,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.465]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p465_0p167_0p167"],"t":0,"s":[8.208],"e":[8.174]},{"i":{"x":[0.833],"y":[0.83]},"o":{"x":[0.167],"y":[0.099]},"n":["0p833_0p83_0p167_0p099"],"t":1,"s":[8.174],"e":[7.99]},{"i":{"x":[0.833],"y":[0.903]},"o":{"x":[0.167],"y":[0.163]},"n":["0p833_0p903_0p167_0p163"],"t":2,"s":[7.99],"e":[7.799]},{"i":{"x":[0.833],"y":[1.228]},"o":{"x":[0.167],"y":[0.584]},"n":["0p833_1p228_0p167_0p584"],"t":3,"s":[7.799],"e":[7.767]},{"i":{"x":[0.833],"y":[0.739]},"o":{"x":[0.167],"y":[0.061]},"n":["0p833_0p739_0p167_0p061"],"t":4,"s":[7.767],"e":[7.886]},{"i":{"x":[0.833],"y":[0.804]},"o":{"x":[0.167],"y":[0.122]},"n":["0p833_0p804_0p167_0p122"],"t":5,"s":[7.886],"e":[8.141]},{"i":{"x":[0.833],"y":[0.831]},"o":{"x":[0.167],"y":[0.145]},"n":["0p833_0p831_0p167_0p145"],"t":6,"s":[8.141],"e":[8.483]},{"i":{"x":[0.833],"y":[0.859]},"o":{"x":[0.167],"y":[0.165]},"n":["0p833_0p859_0p167_0p165"],"t":7,"s":[8.483],"e":[8.834]},{"i":{"x":[0.833],"y":[0.921]},"o":{"x":[0.167],"y":[0.203]},"n":["0p833_0p921_0p167_0p203"],"t":8,"s":[8.834],"e":[9.078]},{"i":{"x":[0.833],"y":[-1.176]},"o":{"x":[0.167],"y":[-1.612]},"n":["0p833_-1p176_0p167_-1p612"],"t":9,"s":[9.078],"e":[9.066]},{"i":{"x":[0.833],"y":[0.781]},"o":{"x":[0.167],"y":[0.087]},"n":["0p833_0p781_0p167_0p087"],"t":10,"s":[9.066],"e":[8.765]},{"i":{"x":[0.833],"y":[0.822]},"o":{"x":[0.167],"y":[0.134]},"n":["0p833_0p822_0p167_0p134"],"t":11,"s":[8.765],"e":[8.275]},{"i":{"x":[0.833],"y":[0.844]},"o":{"x":[0.167],"y":[0.156]},"n":["0p833_0p844_0p167_0p156"],"t":12,"s":[8.275],"e":[7.715]},{"i":{"x":[0.833],"y":[0.872]},"o":{"x":[0.167],"y":[0.178]},"n":["0p833_0p872_0p167_0p178"],"t":13,"s":[7.715],"e":[7.225]},{"i":{"x":[0.833],"y":[0.953]},"o":{"x":[0.167],"y":[0.238]},"n":["0p833_0p953_0p167_0p238"],"t":14,"s":[7.225],"e":[6.961]},{"i":{"x":[0.833],"y":[0.66]},"o":{"x":[0.167],"y":[-0.107]},"n":["0p833_0p66_0p167_-0p107"],"t":15,"s":[6.961],"e":[7.077]},{"i":{"x":[0.833],"y":[0.84]},"o":{"x":[0.167],"y":[0.11]},"n":["0p833_0p84_0p167_0p11"],"t":16,"s":[7.077],"e":[7.433]},{"i":{"x":[0.833],"y":[0.883]},"o":{"x":[0.167],"y":[0.174]},"n":["0p833_0p883_0p167_0p174"],"t":17,"s":[7.433],"e":[7.76]},{"i":{"x":[0.833],"y":[1.002]},"o":{"x":[0.167],"y":[0.293]},"n":["0p833_1p002_0p167_0p293"],"t":18,"s":[7.76],"e":[7.891]},{"i":{"x":[0.833],"y":[0.69]},"o":{"x":[0.167],"y":[0.002]},"n":["0p833_0p69_0p167_0p002"],"t":19,"s":[7.891],"e":[7.757]},{"i":{"x":[0.833],"y":[0.784]},"o":{"x":[0.167],"y":[0.114]},"n":["0p833_0p784_0p167_0p114"],"t":20,"s":[7.757],"e":[7.393]},{"i":{"x":[0.833],"y":[0.819]},"o":{"x":[0.167],"y":[0.135]},"n":["0p833_0p819_0p167_0p135"],"t":21,"s":[7.393],"e":[6.812]},{"i":{"x":[0.833],"y":[0.87]},"o":{"x":[0.167],"y":[0.154]},"n":["0p833_0p87_0p167_0p154"],"t":22,"s":[6.812],"e":[6.129]},{"i":{"x":[0.833],"y":[0.94]},"o":{"x":[0.167],"y":[0.233]},"n":["0p833_0p94_0p167_0p233"],"t":23,"s":[6.129],"e":[5.748]},{"i":{"x":[0.833],"y":[0.488]},"o":{"x":[0.167],"y":[-0.212]},"n":["0p833_0p488_0p167_-0p212"],"t":24,"s":[5.748],"e":[5.855]},{"i":{"x":[0.833],"y":[0.807]},"o":{"x":[0.167],"y":[0.1]},"n":["0p833_0p807_0p167_0p1"],"t":25,"s":[5.855],"e":[6.408]},{"i":{"x":[0.833],"y":[0.863]},"o":{"x":[0.167],"y":[0.147]},"n":["0p833_0p863_0p167_0p147"],"t":26,"s":[6.408],"e":[7.134]},{"i":{"x":[0.833],"y":[0.897]},"o":{"x":[0.167],"y":[0.212]},"n":["0p833_0p897_0p167_0p212"],"t":27,"s":[7.134],"e":[7.603]},{"i":{"x":[0.833],"y":[1.043]},"o":{"x":[0.167],"y":[0.443]},"n":["0p833_1p043_0p167_0p443"],"t":28,"s":[7.603],"e":[7.711]},{"i":{"x":[0.833],"y":[0.763]},"o":{"x":[0.167],"y":[0.028]},"n":["0p833_0p763_0p167_0p028"],"t":29,"s":[7.711],"e":[7.547]},{"i":{"x":[0.833],"y":[0.845]},"o":{"x":[0.167],"y":[0.129]},"n":["0p833_0p845_0p167_0p129"],"t":30,"s":[7.547],"e":[7.243]},{"i":{"x":[0.833],"y":[0.92]},"o":{"x":[0.167],"y":[0.18]},"n":["0p833_0p92_0p167_0p18"],"t":31,"s":[7.243],"e":[6.982]},{"i":{"x":[0.833],"y":[-0.784]},"o":{"x":[0.167],"y":[-1.91]},"n":["0p833_-0p784_0p167_-1p91"],"t":32,"s":[6.982],"e":[6.993]},{"i":{"x":[0.833],"y":[0.964]},"o":{"x":[0.167],"y":[0.087]},"n":["0p833_0p964_0p167_0p087"],"t":33,"s":[6.993],"e":[7.215]},{"i":{"x":[0.833],"y":[0.656]},"o":{"x":[0.167],"y":[-0.062]},"n":["0p833_0p656_0p167_-0p062"],"t":34,"s":[7.215],"e":[7.088]},{"i":{"x":[0.833],"y":[0.807]},"o":{"x":[0.167],"y":[0.11]},"n":["0p833_0p807_0p167_0p11"],"t":35,"s":[7.088],"e":[6.689]},{"i":{"x":[0.833],"y":[0.843]},"o":{"x":[0.167],"y":[0.147]},"n":["0p833_0p843_0p167_0p147"],"t":36,"s":[6.689],"e":[6.164]},{"i":{"x":[0.833],"y":[0.885]},"o":{"x":[0.167],"y":[0.177]},"n":["0p833_0p885_0p167_0p177"],"t":37,"s":[6.164],"e":[5.698]},{"i":{"x":[0.833],"y":[1.009]},"o":{"x":[0.167],"y":[0.3]},"n":["0p833_1p009_0p167_0p3"],"t":38,"s":[5.698],"e":[5.518]},{"i":{"x":[0.833],"y":[0.789]},"o":{"x":[0.167],"y":[0.008]},"n":["0p833_0p789_0p167_0p008"],"t":39,"s":[5.518],"e":[5.717]},{"i":{"x":[0.833],"y":[0.818]},"o":{"x":[0.167],"y":[0.138]},"n":["0p833_0p818_0p167_0p138"],"t":40,"s":[5.717],"e":[6.021]},{"i":{"x":[0.833],"y":[0.83]},"o":{"x":[0.167],"y":[0.153]},"n":["0p833_0p83_0p167_0p153"],"t":41,"s":[6.021],"e":[6.383]},{"i":{"x":[0.833],"y":[0.839]},"o":{"x":[0.167],"y":[0.163]},"n":["0p833_0p839_0p167_0p163"],"t":42,"s":[6.383],"e":[6.761]},{"i":{"x":[0.833],"y":[0.851]},"o":{"x":[0.167],"y":[0.173]},"n":["0p833_0p851_0p167_0p173"],"t":43,"s":[6.761],"e":[7.112]},{"i":{"x":[0.833],"y":[0.907]},"o":{"x":[0.167],"y":[0.189]},"n":["0p833_0p907_0p167_0p189"],"t":44,"s":[7.112],"e":[7.388]},{"i":{"x":[0.833],"y":[1.9]},"o":{"x":[0.167],"y":[0.792]},"n":["0p833_1p9_0p167_0p792"],"t":45,"s":[7.388],"e":[7.42]},{"i":{"x":[0.833],"y":[0.786]},"o":{"x":[0.167],"y":[0.076]},"n":["0p833_0p786_0p167_0p076"],"t":46,"s":[7.42],"e":[7.037]},{"i":{"x":[0.833],"y":[0.831]},"o":{"x":[0.167],"y":[0.137]},"n":["0p833_0p831_0p167_0p137"],"t":47,"s":[7.037],"e":[6.438]},{"i":{"x":[0.833],"y":[0.857]},"o":{"x":[0.167],"y":[0.164]},"n":["0p833_0p857_0p167_0p164"],"t":48,"s":[6.438],"e":[5.823]},{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.199]},"n":["0p833_0p898_0p167_0p199"],"t":49,"s":[5.823],"e":[5.379]},{"i":{"x":[0.833],"y":[1.272]},"o":{"x":[0.167],"y":[0.463]},"n":["0p833_1p272_0p167_0p463"],"t":50,"s":[5.379],"e":[5.282]},{"i":{"x":[0.833],"y":[0.765]},"o":{"x":[0.167],"y":[0.064]},"n":["0p833_0p765_0p167_0p064"],"t":51,"s":[5.282],"e":[5.697]},{"i":{"x":[0.833],"y":[0.838]},"o":{"x":[0.167],"y":[0.129]},"n":["0p833_0p838_0p167_0p129"],"t":52,"s":[5.697],"e":[6.453]},{"i":{"x":[0.833],"y":[0.866]},"o":{"x":[0.167],"y":[0.171]},"n":["0p833_0p866_0p167_0p171"],"t":53,"s":[6.453],"e":[7.169]},{"i":{"x":[0.833],"y":[0.906]},"o":{"x":[0.167],"y":[0.221]},"n":["0p833_0p906_0p167_0p221"],"t":54,"s":[7.169],"e":[7.603]},{"i":{"x":[0.833],"y":[1.307]},"o":{"x":[0.167],"y":[0.712]},"n":["0p833_1p307_0p167_0p712"],"t":55,"s":[7.603],"e":[7.661]},{"i":{"x":[0.833],"y":[0.818]},"o":{"x":[0.167],"y":[0.066]},"n":["0p833_0p818_0p167_0p066"],"t":56,"s":[7.661],"e":[7.391]},{"i":{"x":[0.833],"y":[0.904]},"o":{"x":[0.167],"y":[0.154]},"n":["0p833_0p904_0p167_0p154"],"t":57,"s":[7.391],"e":[7.072]},{"i":{"x":[0.833],"y":[1.255]},"o":{"x":[0.167],"y":[0.627]},"n":["0p833_1p255_0p167_0p627"],"t":58,"s":[7.072],"e":[7.023]},{"i":{"x":[0.833],"y":[0.768]},"o":{"x":[0.167],"y":[0.063]},"n":["0p833_0p768_0p167_0p063"],"t":59,"s":[7.023],"e":[7.221]},{"i":{"x":[0.833],"y":[0.832]},"o":{"x":[0.167],"y":[0.13]},"n":["0p833_0p832_0p167_0p13"],"t":60,"s":[7.221],"e":[7.576]},{"i":{"x":[0.833],"y":[0.88]},"o":{"x":[0.167],"y":[0.165]},"n":["0p833_0p88_0p167_0p165"],"t":61,"s":[7.576],"e":[7.936]},{"i":{"x":[0.833],"y":[1.009]},"o":{"x":[0.167],"y":[0.275]},"n":["0p833_1p009_0p167_0p275"],"t":62,"s":[7.936],"e":[8.093]},{"i":{"x":[0.833],"y":[0.821]},"o":{"x":[0.167],"y":[0.008]},"n":["0p833_0p821_0p167_0p008"],"t":63,"s":[8.093],"e":[7.919]},{"i":{"x":[0.833],"y":[0.902]},"o":{"x":[0.167],"y":[0.156]},"n":["0p833_0p902_0p167_0p156"],"t":64,"s":[7.919],"e":[7.721]},{"i":{"x":[0.833],"y":[1.417]},"o":{"x":[0.167],"y":[0.571]},"n":["0p833_1p417_0p167_0p571"],"t":65,"s":[7.721],"e":[7.687]},{"i":{"x":[0.833],"y":[0.751]},"o":{"x":[0.167],"y":[0.069]},"n":["0p833_0p751_0p167_0p069"],"t":66,"s":[7.687],"e":[7.891]},{"i":{"x":[0.833],"y":[0.822]},"o":{"x":[0.167],"y":[0.125]},"n":["0p833_0p822_0p167_0p125"],"t":67,"s":[7.891],"e":[8.296]},{"i":{"x":[0.833],"y":[0.869]},"o":{"x":[0.167],"y":[0.157]},"n":["0p833_0p869_0p167_0p157"],"t":68,"s":[8.296],"e":[8.754]},{"i":{"x":[0.833],"y":[0.95]},"o":{"x":[0.167],"y":[0.229]},"n":["0p833_0p95_0p167_0p229"],"t":69,"s":[8.754],"e":[9.017]},{"i":{"x":[0.833],"y":[0.534]},"o":{"x":[0.167],"y":[-0.128]},"n":["0p833_0p534_0p167_-0p128"],"t":70,"s":[9.017],"e":[8.913]},{"i":{"x":[0.833],"y":[0.786]},"o":{"x":[0.167],"y":[0.101]},"n":["0p833_0p786_0p167_0p101"],"t":71,"s":[8.913],"e":[8.436]},{"i":{"x":[0.833],"y":[0.827]},"o":{"x":[0.167],"y":[0.136]},"n":["0p833_0p827_0p167_0p136"],"t":72,"s":[8.436],"e":[7.688]},{"i":{"x":[0.833],"y":[0.86]},"o":{"x":[0.167],"y":[0.16]},"n":["0p833_0p86_0p167_0p16"],"t":73,"s":[7.688],"e":[6.88]},{"i":{"x":[0.833],"y":[0.894]},"o":{"x":[0.167],"y":[0.206]},"n":["0p833_0p894_0p167_0p206"],"t":74,"s":[6.88],"e":[6.329]},{"i":{"x":[0.833],"y":[0.855]},"o":{"x":[0.167],"y":[0.384]},"n":["0p833_0p855_0p167_0p384"],"t":75,"s":[6.329],"e":[6.176]},{"i":{"x":[0.833],"y":[0.887]},"o":{"x":[0.167],"y":[0.195]},"n":["0p833_0p887_0p167_0p195"],"t":76,"s":[6.176],"e":[6.062]},{"i":{"x":[0.833],"y":[1.012]},"o":{"x":[0.167],"y":[0.316]},"n":["0p833_1p012_0p167_0p316"],"t":77,"s":[6.062],"e":[6.021]},{"i":{"x":[0.833],"y":[0.722]},"o":{"x":[0.167],"y":[0.01]},"n":["0p833_0p722_0p167_0p01"],"t":78,"s":[6.021],"e":[6.068]},{"i":{"x":[0.833],"y":[0.835]},"o":{"x":[0.167],"y":[0.119]},"n":["0p833_0p835_0p167_0p119"],"t":79,"s":[6.068],"e":[6.177]},{"i":{"x":[0.833],"y":[0.83]},"o":{"x":[0.167],"y":[0.168]},"n":["0p833_0p83_0p167_0p168"],"t":80,"s":[6.177],"e":[6.285]},{"i":{"x":[0.833],"y":[0.733]},"o":{"x":[0.167],"y":[0.163]},"n":["0p833_0p733_0p167_0p163"],"t":81,"s":[6.285],"e":[6.397]},{"i":{"x":[0.833],"y":[0.816]},"o":{"x":[0.167],"y":[0.121]},"n":["0p833_0p816_0p167_0p121"],"t":82,"s":[6.397],"e":[6.644]},{"i":{"x":[0.833],"y":[0.84]},"o":{"x":[0.167],"y":[0.152]},"n":["0p833_0p84_0p167_0p152"],"t":83,"s":[6.644],"e":[6.942]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.174]},"n":["0p833_0p858_0p167_0p174"],"t":84,"s":[6.942],"e":[7.218]},{"i":{"x":[0.833],"y":[0.885]},"o":{"x":[0.167],"y":[0.201]},"n":["0p833_0p885_0p167_0p201"],"t":85,"s":[7.218],"e":[7.413]},{"i":{"x":[0.833],"y":[0.967]},"o":{"x":[0.167],"y":[0.303]},"n":["0p833_0p967_0p167_0p303"],"t":86,"s":[7.413],"e":[7.487]},{"i":{"x":[0.833],"y":[0.777]},"o":{"x":[0.167],"y":[-0.056]},"n":["0p833_0p777_0p167_-0p056"],"t":87,"s":[7.487],"e":[7.442]},{"i":{"x":[0.833],"y":[0.861]},"o":{"x":[0.167],"y":[0.133]},"n":["0p833_0p861_0p167_0p133"],"t":88,"s":[7.442],"e":[7.368]},{"i":{"x":[0.833],"y":[0.921]},"o":{"x":[0.167],"y":[0.207]},"n":["0p833_0p921_0p167_0p207"],"t":89,"s":[7.368],"e":[7.318]},{"i":{"x":[0.833],"y":[-1.111]},"o":{"x":[0.167],"y":[-1.691]},"n":["0p833_-1p111_0p167_-1p691"],"t":90,"s":[7.318],"e":[7.321]},{"i":{"x":[0.833],"y":[0.787]},"o":{"x":[0.167],"y":[0.087]},"n":["0p833_0p787_0p167_0p087"],"t":91,"s":[7.321],"e":[7.378]},{"i":{"x":[0.833],"y":[0.781]},"o":{"x":[0.167],"y":[0.137]},"n":["0p833_0p781_0p167_0p137"],"t":92,"s":[7.378],"e":[7.466]},{"i":{"x":[0.833],"y":[0.796]},"o":{"x":[0.167],"y":[0.135]},"n":["0p833_0p796_0p167_0p135"],"t":93,"s":[7.466],"e":[7.61]},{"i":{"x":[0.833],"y":[0.872]},"o":{"x":[0.167],"y":[0.141]},"n":["0p833_0p872_0p167_0p141"],"t":94,"s":[7.61],"e":[7.819]},{"i":{"x":[0.833],"y":[0.969]},"o":{"x":[0.167],"y":[0.24]},"n":["0p833_0p969_0p167_0p24"],"t":95,"s":[7.819],"e":[7.931]},{"i":{"x":[0.833],"y":[0.622]},"o":{"x":[0.167],"y":[-0.048]},"n":["0p833_0p622_0p167_-0p048"],"t":96,"s":[7.931],"e":[7.86]},{"i":{"x":[0.833],"y":[0.804]},"o":{"x":[0.167],"y":[0.107]},"n":["0p833_0p804_0p167_0p107"],"t":97,"s":[7.86],"e":[7.611]},{"i":{"x":[0.833],"y":[0.84]},"o":{"x":[0.167],"y":[0.145]},"n":["0p833_0p84_0p167_0p145"],"t":98,"s":[7.611],"e":[7.275]},{"i":{"x":[0.833],"y":[0.849]},"o":{"x":[0.167],"y":[0.174]},"n":["0p833_0p849_0p167_0p174"],"t":99,"s":[7.275],"e":[6.964]},{"i":{"x":[0.833],"y":[0.877]},"o":{"x":[0.167],"y":[0.186]},"n":["0p833_0p877_0p167_0p186"],"t":100,"s":[6.964],"e":[6.712]},{"i":{"x":[0.833],"y":[0.935]},"o":{"x":[0.167],"y":[0.259]},"n":["0p833_0p935_0p167_0p259"],"t":101,"s":[6.712],"e":[6.592]},{"i":{"x":[0.833],"y":[0.535]},"o":{"x":[0.167],"y":[-0.293]},"n":["0p833_0p535_0p167_-0p293"],"t":102,"s":[6.592],"e":[6.619]},{"i":{"x":[0.833],"y":[0.848]},"o":{"x":[0.167],"y":[0.102]},"n":["0p833_0p848_0p167_0p102"],"t":103,"s":[6.619],"e":[6.74]},{"i":{"x":[0.833],"y":[0.892]},"o":{"x":[0.167],"y":[0.184]},"n":["0p833_0p892_0p167_0p184"],"t":104,"s":[6.74],"e":[6.841]},{"i":{"x":[0.833],"y":[0.656]},"o":{"x":[0.167],"y":[0.36]},"n":["0p833_0p656_0p167_0p36"],"t":105,"s":[6.841],"e":[6.871]},{"i":{"x":[0.833],"y":[0.84]},"o":{"x":[0.167],"y":[0.11]},"n":["0p833_0p84_0p167_0p11"],"t":106,"s":[6.871],"e":[6.966]},{"i":{"x":[0.833],"y":[0.89]},"o":{"x":[0.167],"y":[0.174]},"n":["0p833_0p89_0p167_0p174"],"t":107,"s":[6.966],"e":[7.052]},{"i":{"x":[0.833],"y":[1.075]},"o":{"x":[0.167],"y":[0.346]},"n":["0p833_1p075_0p167_0p346"],"t":108,"s":[7.052],"e":[7.08]},{"i":{"x":[0.833],"y":[0.722]},"o":{"x":[0.167],"y":[0.039]},"n":["0p833_0p722_0p167_0p039"],"t":109,"s":[7.08],"e":[7.028]},{"i":{"x":[0.833],"y":[0.817]},"o":{"x":[0.167],"y":[0.119]},"n":["0p833_0p817_0p167_0p119"],"t":110,"s":[7.028],"e":[6.905]},{"i":{"x":[0.833],"y":[0.891]},"o":{"x":[0.167],"y":[0.153]},"n":["0p833_0p891_0p167_0p153"],"t":111,"s":[6.905],"e":[6.759]},{"i":{"x":[0.833],"y":[1.212]},"o":{"x":[0.167],"y":[0.355]},"n":["0p833_1p212_0p167_0p355"],"t":112,"s":[6.759],"e":[6.715]},{"i":{"x":[0.833],"y":[0.722]},"o":{"x":[0.167],"y":[0.06]},"n":["0p833_0p722_0p167_0p06"],"t":113,"s":[6.715],"e":[6.873]},{"i":{"x":[0.833],"y":[0.804]},"o":{"x":[0.167],"y":[0.119]},"n":["0p833_0p804_0p167_0p119"],"t":114,"s":[6.873],"e":[7.244]},{"i":{"x":[0.833],"y":[0.841]},"o":{"x":[0.167],"y":[0.145]},"n":["0p833_0p841_0p167_0p145"],"t":115,"s":[7.244],"e":[7.744]},{"i":{"x":[0.833],"y":[0.885]},"o":{"x":[0.167],"y":[0.176]},"n":["0p833_0p885_0p167_0p176"],"t":116,"s":[7.744],"e":[8.195]},{"i":{"x":[0.833],"y":[0.959]},"o":{"x":[0.167],"y":[0.3]},"n":["0p833_0p959_0p167_0p3"],"t":117,"s":[8.195],"e":[8.369]},{"i":{"x":[0.833],"y":[0.72]},"o":{"x":[0.167],"y":[-0.082]},"n":["0p833_0p72_0p167_-0p082"],"t":118,"s":[8.369],"e":[8.281]},{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.119]},"n":["0p833_0p836_0p167_0p119"],"t":119,"s":[8.281],"e":[8.074]},{"i":{"x":[0.833],"y":[0.883]},"o":{"x":[0.167],"y":[0.17]},"n":["0p833_0p883_0p167_0p17"],"t":120,"s":[8.074],"e":[7.875]},{"i":{"x":[0.833],"y":[1.056]},"o":{"x":[0.167],"y":[0.29]},"n":["0p833_1p056_0p167_0p29"],"t":121,"s":[7.875],"e":[7.795]},{"i":{"x":[0.833],"y":[0.643]},"o":{"x":[0.167],"y":[0.033]},"n":["0p833_0p643_0p167_0p033"],"t":122,"s":[7.795],"e":[7.929]},{"i":{"x":[0.833],"y":[0.811]},"o":{"x":[0.167],"y":[0.109]},"n":["0p833_0p811_0p167_0p109"],"t":123,"s":[7.929],"e":[8.371]},{"i":{"x":[0.833],"y":[0.868]},"o":{"x":[0.167],"y":[0.149]},"n":["0p833_0p868_0p167_0p149"],"t":124,"s":[8.371],"e":[8.93]},{"i":{"x":[0.833],"y":[0.934]},"o":{"x":[0.167],"y":[0.225]},"n":["0p833_0p934_0p167_0p225"],"t":125,"s":[8.93],"e":[9.259]},{"i":{"x":[0.833],"y":[0.375]},"o":{"x":[0.167],"y":[-0.319]},"n":["0p833_0p375_0p167_-0p319"],"t":126,"s":[9.259],"e":[9.191]},{"i":{"x":[0.833],"y":[0.802]},"o":{"x":[0.167],"y":[0.096]},"n":["0p833_0p802_0p167_0p096"],"t":127,"s":[9.191],"e":[8.749]},{"i":{"x":[0.833],"y":[0.841]},"o":{"x":[0.167],"y":[0.144]},"n":["0p833_0p841_0p167_0p144"],"t":128,"s":[8.749],"e":[8.142]},{"i":{"x":[0.833],"y":[0.844]},"o":{"x":[0.167],"y":[0.175]},"n":["0p833_0p844_0p167_0p175"],"t":129,"s":[8.142],"e":[7.59]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.167],"y":[0.179]},"n":["0p833_0p882_0p167_0p179"],"t":130,"s":[7.59],"e":[7.108]},{"i":{"x":[0.833],"y":[0.979]},"o":{"x":[0.167],"y":[0.284]},"n":["0p833_0p979_0p167_0p284"],"t":131,"s":[7.108],"e":[6.908]},{"i":{"x":[0.833],"y":[0.689]},"o":{"x":[0.167],"y":[-0.028]},"n":["0p833_0p689_0p167_-0p028"],"t":132,"s":[6.908],"e":[7.057]},{"i":{"x":[0.833],"y":[0.831]},"o":{"x":[0.167],"y":[0.114]},"n":["0p833_0p831_0p167_0p114"],"t":133,"s":[7.057],"e":[7.465]},{"i":{"x":[0.833],"y":[0.899]},"o":{"x":[0.167],"y":[0.165]},"n":["0p833_0p899_0p167_0p165"],"t":134,"s":[7.465],"e":[7.883]},{"i":{"x":[0.833],"y":[1.108]},"o":{"x":[0.167],"y":[0.476]},"n":["0p833_1p108_0p167_0p476"],"t":135,"s":[7.883],"e":[7.972]},{"i":{"x":[0.833],"y":[0.796]},"o":{"x":[0.167],"y":[0.047]},"n":["0p833_0p796_0p167_0p047"],"t":136,"s":[7.972],"e":[7.768]},{"i":{"x":[0.833],"y":[0.852]},"o":{"x":[0.167],"y":[0.141]},"n":["0p833_0p852_0p167_0p141"],"t":137,"s":[7.768],"e":[7.473]},{"i":{"x":[0.833],"y":[0.899]},"o":{"x":[0.167],"y":[0.191]},"n":["0p833_0p899_0p167_0p191"],"t":138,"s":[7.473],"e":[7.245]},{"i":{"x":[0.833],"y":[1.278]},"o":{"x":[0.167],"y":[0.488]},"n":["0p833_1p278_0p167_0p488"],"t":139,"s":[7.245],"e":[7.198]},{"i":{"x":[0.833],"y":[0.785]},"o":{"x":[0.167],"y":[0.064]},"n":["0p833_0p785_0p167_0p064"],"t":140,"s":[7.198],"e":[7.402]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.136]},"n":["0p833_0p833_0p167_0p136"],"t":141,"s":[7.402],"e":[7.723]},{"t":142}],"ix":4}},"a":{"a":0,"k":[28.441,21.711,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.745,0.472],[0.129,0.165],[0.024,0.263],[-0.243,-0.001],[-1.293,-0.012],[0.002,0.24],[-0.01,1.272],[0.239,-0.005],[0.744,0.004],[-0.007,0.291],[-0.336,0.003],[-0.657,0.005],[-0.021,0.646],[0.223,-0.003],[0.735,0.005],[0.1,0.048],[-0.043,0.221],[-0.246,0.001],[-0.676,0.005],[-0.026,0.629],[0.227,-0.003],[0.735,0.005],[-0.01,0.279],[-0.362,0.01],[-0.059,0],[-0.676,-0.012],[0.041,0.257],[-0.009,0.057],[0.3,-0.008],[0.725,0.008],[-0.139,0.326],[-0.227,-0.001],[-0.686,0.001],[-0.029,0.54],[0.297,-0.009],[0.734,0.009],[-0.223,0.299],[-0.172,0.007],[-0.685,-0.001],[-0.001,0.465],[0,0],[-0.057,0.003],[0.003,0.351],[0.455,0.012],[0.01,-0.002],[-0.01,0.208],[0,0.275],[1.017,0.001],[1.518,-0.012],[-0.002,0.251],[-0.005,1.214],[0.263,-0.019],[0.001,0.07],[-0.007,1.175],[-0.335,0.147],[-0.09,0.155],[0.025,0.233],[-0.001,0.02],[0.153,-0.032],[-0.005,-1.331],[-0.008,-1.078],[0.241,0.036],[-0.003,-0.245],[-0.018,-1.204],[0.296,0],[5.152,-0.001],[0.005,-0.933],[0,-0.403],[0.104,-0.008],[0.008,-0.328],[-0.344,-0.036],[-0.085,-0.1],[-0.006,-0.185],[-0.004,-0.049],[0.164,-0.027],[0.97,-0.181],[0,0],[0.369,-0.231],[0.371,-0.281],[-0.024,-0.014],[-0.804,-0.805],[-0.642,-1.238],[-0.19,0.005],[-0.588,-0.013],[-0.002,0.213],[-0.007,0.627],[0,0.753],[0,0],[0.013,-0.662],[-0.278,0.006],[-1.136,0],[-1.184,-0.016],[0.003,0.206],[0.023,0.713],[-0.242,-0.003],[0.008,-0.336],[-0.038,-0.596],[-0.89,0.001],[-1.245,0.013],[0.003,-0.268],[0,-1.058],[0.42,0],[6.181,-0.028],[0.21,0.448],[1.071,1.103],[1.514,0.737],[1.612,0.228],[0.062,0.094],[0.63,0.942],[0.369,0.48],[1.249,-0.024],[0.463,-0.063],[-0.221,-0.992],[-0.2,-0.877],[0.237,-0.061],[0.323,-0.11],[1.135,-0.883],[0.335,-0.266],[-0.006,0.075],[0.42,0.306],[0.759,-0.034],[-0.009,-0.978],[-0.05,0.003],[-0.377,0.04],[-0.167,0.032],[0.209,-0.26],[-0.554,-0.433],[-0.904,0.64],[-1.694,0.332],[-2.888,-1.396],[-1.017,-1.094],[-0.566,-2.211],[0.014,-1.23],[-0.241,0.007],[-0.499,-0.018],[0.016,0.237],[0.069,0.652],[0.108,0.691],[0,0],[-6.25,-0.002],[-0.127,-0.141],[-0.03,-0.278],[0.243,-0.048]],"o":[[-0.252,-0.069],[-0.13,-0.167],[-0.022,-0.246],[1.293,0.011],[0.247,0.002],[-0.01,-1.273],[0.002,-0.228],[-0.744,0.014],[-0.364,-0.003],[0.006,-0.264],[0.656,-0.005],[0.643,-0.005],[0.007,-0.216],[-0.734,0.011],[-0.115,-0.001],[-0.195,-0.094],[0.054,-0.271],[0.677,-0.004],[0.632,-0.005],[0.011,-0.262],[-0.734,0.009],[-0.349,-0.003],[0.01,-0.277],[0.058,-0.002],[0.675,0],[0.233,0.005],[-0.008,-0.057],[0.05,-0.298],[-0.723,0.02],[-0.402,-0.005],[0.091,-0.214],[0.686,0.003],[0.545,-0.001],[0.017,-0.303],[-0.733,0.021],[-0.413,-0.005],[0.097,-0.13],[0.684,-0.025],[0.451,0],[0,0],[0.097,-0.008],[0.432,-0.018],[-0.003,-0.355],[-0.01,-0.001],[-0.228,0.032],[0.013,-0.273],[0.002,-1.02],[-1.518,-0.002],[-0.266,0.001],[0.011,-1.215],[0.001,-0.202],[-0.065,0.005],[-0.01,-1.175],[0.003,-0.368],[0.21,-0.091],[0.094,-0.163],[-0.003,-0.019],[0.001,-0.178],[-1.11,0.238],[0.003,1.078],[0.001,0.22],[-0.245,-0.037],[0.012,1.204],[0.005,0.302],[-5.152,-0.009],[-0.936,0.001],[-0.001,0.379],[-0.138,0.009],[-0.351,0.028],[-0.009,0.326],[0.18,0.019],[0.094,0.111],[0.002,0.049],[0.016,0.178],[-0.972,0.163],[0,0],[-0.439,0.224],[-0.364,0.227],[0.092,0.073],[1.006,0.542],[0.991,0.993],[0.079,0.153],[0.587,-0.013],[0.221,0.005],[0.006,-0.626],[0.008,-0.722],[0,0],[0.665,-0.001],[-0.005,0.264],[1.135,-0.022],[1.183,0],[0.231,0.004],[-0.009,-0.714],[-0.011,-0.327],[0.233,0.004],[-0.014,0.596],[0.057,0.891],[1.244,-0.001],[0.273,-0.003],[-0.013,1.058],[0,0.411],[-6.179,0],[-0.554,0.003],[-0.653,-1.394],[-1.177,-1.212],[-1.462,-0.712],[-0.122,-0.017],[-0.624,-0.945],[-0.336,-0.502],[-0.799,-1.04],[-0.45,0.008],[0.232,1.049],[0.196,0.878],[0.041,0.179],[-0.33,0.085],[-1.363,0.466],[-0.278,0.215],[0.023,-0.166],[0.035,-0.494],[-0.618,-0.451],[0,1.008],[0.001,0.053],[0.378,-0.023],[0.087,-0.01],[-0.251,0.311],[0.559,0.437],[0.686,-0.918],[1.407,-0.998],[3.172,-0.622],[1.339,0.647],[1.571,1.688],[0.304,1.186],[-0.002,0.221],[0.499,-0.014],[0.228,0.009],[-0.046,-0.655],[-0.07,-0.657],[0,0],[6.249,0],[0.272,0],[0.146,0.163],[0.024,0.242],[-1.106,0.22]],"v":[[22.506,7.187],[21.773,6.964],[21.719,6.195],[22.032,5.88],[25.911,5.891],[26.223,5.573],[26.224,1.754],[25.929,1.451],[23.696,1.455],[23.144,0.993],[23.694,0.553],[25.664,0.549],[26.223,-0.018],[25.942,-0.308],[23.738,-0.308],[23.395,-0.358],[23.156,-0.845],[23.652,-1.208],[25.68,-1.21],[26.224,-1.757],[25.896,-2.063],[23.692,-2.062],[23.141,-2.535],[23.699,-2.966],[23.876,-2.966],[25.903,-2.962],[26.22,-3.271],[26.22,-3.447],[25.85,-3.826],[23.676,-3.824],[23.181,-4.455],[23.677,-4.748],[25.734,-4.747],[26.227,-5.236],[25.851,-5.609],[23.648,-5.605],[23.216,-6.268],[23.712,-6.496],[25.768,-6.507],[26.22,-6.971],[26.22,-7.471],[26.431,-7.489],[27.148,-8.105],[26.414,-8.694],[26.384,-8.694],[26.108,-8.986],[26.11,-9.809],[24.493,-11.439],[19.94,-11.434],[19.611,-11.772],[19.619,-15.416],[19.339,-15.739],[19.138,-15.936],[19.136,-19.462],[19.667,-20.239],[20.283,-20.505],[20.232,-21.187],[20.228,-21.246],[19.977,-21.429],[18.083,-19.266],[18.086,-16.033],[17.791,-15.727],[17.477,-15.418],[17.49,-11.805],[17.113,-11.433],[1.656,-11.439],[0.087,-9.875],[0.087,-8.713],[-0.261,-8.692],[-0.843,-8.113],[-0.265,-7.49],[0.254,-7.412],[0.296,-6.874],[0.297,-6.727],[0.055,-6.478],[-2.859,-5.962],[-4.349,-5.53],[-5.564,-4.901],[-6.626,-4.107],[-6.488,-3.999],[-3.788,-1.955],[-1.397,1.433],[-1.039,1.664],[0.724,1.663],[1.014,1.375],[1.056,-0.505],[1.058,-2.703],[3.331,-2.703],[3.994,-2.042],[4.336,-1.694],[7.743,-1.72],[11.295,-1.697],[11.568,-1.994],[11.559,-4.136],[11.954,-4.47],[12.358,-4.143],[12.402,-2.353],[13.85,-1.016],[17.583,-1.022],[17.931,-0.67],[17.925,2.504],[17.504,2.915],[-1.037,2.932],[-2.038,2.282],[-4.671,-1.434],[-8.734,-4.322],[-10.748,-5.53],[-11.844,-7.053],[-15.53,-8.77],[-16.616,-10.226],[-19.776,-11.583],[-21.138,-11.405],[-20.468,-8.371],[-19.872,-5.739],[-20.058,-5.368],[-21.03,-5.044],[-24.773,-3.009],[-25.659,-2.307],[-25.615,-2.623],[-26.095,-3.88],[-28.188,-4.339],[-28.182,-1.376],[-28.03,-1.225],[-26.897,-1.33],[-26.558,-1.396],[-27.212,-0.587],[-25.565,0.701],[-23.169,-1.606],[-18.511,-3.589],[-9.424,-2.352],[-5.907,0.297],[-2.771,6.189],[-2.341,9.825],[-2.049,10.132],[-0.551,10.142],[-0.25,9.849],[-0.372,7.885],[-0.677,5.885],[-0.162,5.885],[18.587,5.887],[19.373,5.946],[19.456,6.758],[19.148,7.15]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282000014361,0.234999997008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.441,21.711],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"Body Inner Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.531,19.277,0],"ix":2},"a":{"a":0,"k":[20.528,7.309,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.218,-0.175],[0,0],[0,0],[0,0],[0,0],[0,0],[4.679,1.44]],"o":[[0,0],[0,0],[0,0],[0,0],[0.216,0.175],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.68,-1.44]],"v":[[-20.279,-4.067],[-8.201,-1.906],[0.723,-3.519],[7.318,-7.059],[16.61,-5.058],[18.459,1.058],[19.185,1.406],[20.279,5.544],[19.185,7.059],[-5.48,7.059],[-11.9,-0.832]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936999990426,0.169000004787,0.149000010771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.528,7.309],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"Face Light Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.842,19.272,0],"ix":2},"a":{"a":0,"k":[1.967,5.302,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.717,5.052],[-1.717,5.052],[-1.717,-5.052],[1.717,-5.052]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976000019148,0.741000007181,0.741000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.967,5.302],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"Back Wheel Cover Black Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[13.81,24.179,0],"ix":2},"a":{"a":0,"k":[12.831,7.913,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-12.581,-3.056],[-8.625,0.145],[2.856,-2.465],[7.819,4.492],[9.671,7.652],[12.581,7.663],[12.059,1.58],[7.568,-5.178],[-0.965,-7.663],[-9.441,-5.327]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.395999983245,0.395999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.831,7.914],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"Back Light Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.814,18.853,0],"ix":2},"a":{"a":0,"k":[1.324,1.731,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.147,-1.482]],"o":[[0,0],[0,0]],"v":[[1.067,-1.482],[1.074,1.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.804000016755,0.616000007181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.323,1.732],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"Driver Head Outlines","parent":42,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.692,-1.422,0],"ix":2},"a":{"a":0,"k":[2.431,2.553,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.417,0.242],[0,0],[0,0],[-1.696,0.048],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.485,-0.146],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1.697,-0.049],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.485,0.145],[0,0],[0,0],[0,0]],"v":[[-1.289,1.811],[-1.289,-0.266],[-2.182,-0.266],[-1.503,-0.654],[0.049,-2.253],[1.62,-0.799],[2.182,-0.221],[1.62,-0.221],[1.62,0.413],[1.62,0.799],[1.357,0.799],[0.825,2.158],[0.243,2.012],[0.146,2.303],[-0.969,1.867]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.431,2.553],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"Driver Hand Outlines","parent":42,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7.378,5.125,0],"ix":2},"a":{"a":0,"k":[3.936,2.259,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.279,-2.009],[-0.874,-1.19],[1.161,-1.19],[2.664,-1.599],[2.664,-0.899],[3.246,-0.899],[1.84,0.119],[-1.117,0.119],[-2.508,-1.332],[1.226,0.952],[3.686,-0.528],[1.314,2.009],[-3.686,0.47]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.936,2.259],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"Driver Body Outlines","parent":35,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.33,11.297,0],"ix":2},"a":{"a":0,"k":[7.401,8.225,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.432,-0.534],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[1.552,-4.945],[0,0],[0,0],[0,0],[-1.745,2.667],[0,0],[2.431,0.533],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.593,-0.606],[-3.563,-6.957],[-3.563,-7.344],[-5.406,-7.975],[-5.406,-7.296],[-5.841,-0.606],[-4.201,2.304],[1.43,2.546],[3.223,5.891],[3.999,7.975],[5.745,6.957],[7.15,5.503],[4.581,5.746],[2.788,1.188],[-2.786,-0.267]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.4,8.225],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":43,"ty":3,"nm":"Front Particles Ctrl","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227,170,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"particle 200","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[100],"e":[0]},{"t":145}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":125,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":145}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":125,"op":146,"st":125,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"particle 199","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":133,"s":[100],"e":[0]},{"t":143}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":123,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":143}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":123,"op":144,"st":123,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":"particle 198","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":132,"s":[100],"e":[0]},{"t":142}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":122,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":142}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":122,"op":143,"st":122,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":"particle 197","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":130,"s":[100],"e":[0]},{"t":140}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":120,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":140}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":141,"st":120,"bm":0},{"ddd":0,"ind":48,"ty":4,"nm":"particle 196","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":131,"s":[100],"e":[0]},{"t":141}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":121,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":141}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":121,"op":142,"st":121,"bm":0},{"ddd":0,"ind":49,"ty":4,"nm":"particle 195","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":128,"s":[100],"e":[0]},{"t":138}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":118,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":138}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":118,"op":139,"st":118,"bm":0},{"ddd":0,"ind":50,"ty":4,"nm":"particle 194","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":126,"s":[100],"e":[0]},{"t":136}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":116,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":136}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":116,"op":137,"st":116,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":"particle 193","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":125,"s":[100],"e":[0]},{"t":135}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":115,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":135}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":115,"op":136,"st":115,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":"particle 192","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":123,"s":[100],"e":[0]},{"t":133}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":113,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":133}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":113,"op":134,"st":113,"bm":0},{"ddd":0,"ind":53,"ty":4,"nm":"particle 191","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":124,"s":[100],"e":[0]},{"t":134}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":114,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":134}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":114,"op":135,"st":114,"bm":0},{"ddd":0,"ind":54,"ty":4,"nm":"particle 190","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":121,"s":[100],"e":[0]},{"t":131}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":111,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":131}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":111,"op":132,"st":111,"bm":0},{"ddd":0,"ind":55,"ty":4,"nm":"particle 189","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":119,"s":[100],"e":[0]},{"t":129}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":109,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":129}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":109,"op":130,"st":109,"bm":0},{"ddd":0,"ind":56,"ty":4,"nm":"particle 188","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":118,"s":[100],"e":[0]},{"t":128}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":128}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":108,"op":129,"st":108,"bm":0},{"ddd":0,"ind":57,"ty":4,"nm":"particle 187","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":116,"s":[100],"e":[0]},{"t":126}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":106,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":126}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":106,"op":127,"st":106,"bm":0},{"ddd":0,"ind":58,"ty":4,"nm":"particle 186","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":117,"s":[100],"e":[0]},{"t":127}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":107,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":127}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":107,"op":128,"st":107,"bm":0},{"ddd":0,"ind":59,"ty":4,"nm":"particle 185","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115,"s":[100],"e":[0]},{"t":125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":125}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":105,"op":126,"st":105,"bm":0},{"ddd":0,"ind":60,"ty":4,"nm":"particle 184","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":114,"s":[100],"e":[0]},{"t":124}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":104,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":124}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":104,"op":125,"st":104,"bm":0},{"ddd":0,"ind":61,"ty":4,"nm":"particle 183","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112,"s":[100],"e":[0]},{"t":122}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":102,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":122}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":102,"op":123,"st":102,"bm":0},{"ddd":0,"ind":62,"ty":4,"nm":"particle 182","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":111,"s":[100],"e":[0]},{"t":121}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":101,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":121}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":101,"op":122,"st":101,"bm":0},{"ddd":0,"ind":63,"ty":4,"nm":"particle 181","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[100],"e":[0]},{"t":119}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":99,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":119}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":99,"op":120,"st":99,"bm":0},{"ddd":0,"ind":64,"ty":4,"nm":"particle 180","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[100],"e":[0]},{"t":118}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":118}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":119,"st":98,"bm":0},{"ddd":0,"ind":65,"ty":4,"nm":"particle 179","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":106,"s":[100],"e":[0]},{"t":116}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":116}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":96,"op":117,"st":96,"bm":0},{"ddd":0,"ind":66,"ty":4,"nm":"particle 178","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":107,"s":[100],"e":[0]},{"t":117}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":97,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":117}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":97,"op":118,"st":97,"bm":0},{"ddd":0,"ind":67,"ty":4,"nm":"particle 177","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[100],"e":[0]},{"t":115}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":95,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":115}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":116,"st":95,"bm":0},{"ddd":0,"ind":68,"ty":4,"nm":"particle 176","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":104,"s":[100],"e":[0]},{"t":114}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":114}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":115,"st":94,"bm":0},{"ddd":0,"ind":69,"ty":4,"nm":"particle 175","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":102,"s":[100],"e":[0]},{"t":112}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":92,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":112}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":92,"op":113,"st":92,"bm":0},{"ddd":0,"ind":70,"ty":4,"nm":"particle 148","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[100],"e":[0]},{"t":110}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":110}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":111,"st":90,"bm":0},{"ddd":0,"ind":71,"ty":4,"nm":"particle 147","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[100],"e":[0]},{"t":108}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":108}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":88,"op":109,"st":88,"bm":0},{"ddd":0,"ind":72,"ty":4,"nm":"particle 146","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":97,"s":[100],"e":[0]},{"t":107}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":107}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":87,"op":108,"st":87,"bm":0},{"ddd":0,"ind":73,"ty":4,"nm":"particle 145","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":95,"s":[100],"e":[0]},{"t":105}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":105}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":106,"st":85,"bm":0},{"ddd":0,"ind":74,"ty":4,"nm":"particle 144","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[100],"e":[0]},{"t":106}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":86,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":106}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":86,"op":107,"st":86,"bm":0},{"ddd":0,"ind":75,"ty":4,"nm":"particle 143","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93,"s":[100],"e":[0]},{"t":103}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":103}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":83,"op":104,"st":83,"bm":0},{"ddd":0,"ind":76,"ty":4,"nm":"particle 142","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":91,"s":[100],"e":[0]},{"t":101}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":101}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":81,"op":102,"st":81,"bm":0},{"ddd":0,"ind":77,"ty":4,"nm":"particle 141","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[100],"e":[0]},{"t":100}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":100}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":101,"st":80,"bm":0},{"ddd":0,"ind":78,"ty":4,"nm":"particle 140","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88,"s":[100],"e":[0]},{"t":98}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":98}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":99,"st":78,"bm":0},{"ddd":0,"ind":79,"ty":4,"nm":"particle 139","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[100],"e":[0]},{"t":99}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":79,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":99}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":79,"op":100,"st":79,"bm":0},{"ddd":0,"ind":80,"ty":4,"nm":"particle 138","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86,"s":[100],"e":[0]},{"t":96}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":96}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":76,"op":97,"st":76,"bm":0},{"ddd":0,"ind":81,"ty":4,"nm":"particle 137","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84,"s":[100],"e":[0]},{"t":94}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":94}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":74,"op":95,"st":74,"bm":0},{"ddd":0,"ind":82,"ty":4,"nm":"particle 136","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":83,"s":[100],"e":[0]},{"t":93}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":93}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":73,"op":94,"st":73,"bm":0},{"ddd":0,"ind":83,"ty":4,"nm":"particle 135","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[100],"e":[0]},{"t":91}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":91}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":71,"op":92,"st":71,"bm":0},{"ddd":0,"ind":84,"ty":4,"nm":"particle 134","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":82,"s":[100],"e":[0]},{"t":92}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":72,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":92}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":72,"op":93,"st":72,"bm":0},{"ddd":0,"ind":85,"ty":4,"nm":"particle 133","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":80,"s":[100],"e":[0]},{"t":90}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":91,"st":70,"bm":0},{"ddd":0,"ind":86,"ty":4,"nm":"particle 132","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[100],"e":[0]},{"t":89}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":89}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":69,"op":90,"st":69,"bm":0},{"ddd":0,"ind":87,"ty":4,"nm":"particle 131","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":77,"s":[100],"e":[0]},{"t":87}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":87}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":67,"op":88,"st":67,"bm":0},{"ddd":0,"ind":88,"ty":4,"nm":"particle 130","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76,"s":[100],"e":[0]},{"t":86}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":66,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":86}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":66,"op":87,"st":66,"bm":0},{"ddd":0,"ind":89,"ty":4,"nm":"particle 129","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":74,"s":[100],"e":[0]},{"t":84}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":64,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":84}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":64,"op":85,"st":64,"bm":0},{"ddd":0,"ind":90,"ty":4,"nm":"particle 128","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":73,"s":[100],"e":[0]},{"t":83}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":83}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":63,"op":84,"st":63,"bm":0},{"ddd":0,"ind":91,"ty":4,"nm":"particle 127","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71,"s":[100],"e":[0]},{"t":81}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":81}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":82,"st":61,"bm":0},{"ddd":0,"ind":92,"ty":4,"nm":"particle 126","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[100],"e":[0]},{"t":82}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":62,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":82}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":62,"op":83,"st":62,"bm":0},{"ddd":0,"ind":93,"ty":4,"nm":"particle 125","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":70,"s":[100],"e":[0]},{"t":80}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":81,"st":60,"bm":0},{"ddd":0,"ind":94,"ty":4,"nm":"particle 124","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":69,"s":[100],"e":[0]},{"t":79}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":59,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":79}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":59,"op":80,"st":59,"bm":0},{"ddd":0,"ind":95,"ty":4,"nm":"particle 123","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67,"s":[100],"e":[0]},{"t":77}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":57,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":77}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":57,"op":78,"st":57,"bm":0},{"ddd":0,"ind":96,"ty":4,"nm":"particle 122","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[0]},{"t":78}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":78}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":58,"op":79,"st":58,"bm":0},{"ddd":0,"ind":97,"ty":4,"nm":"particle 121","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66,"s":[100],"e":[0]},{"t":76}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":76}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":56,"op":77,"st":56,"bm":0},{"ddd":0,"ind":98,"ty":4,"nm":"particle 120","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":65,"s":[100],"e":[0]},{"t":75}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":75}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":76,"st":55,"bm":0},{"ddd":0,"ind":99,"ty":4,"nm":"particle 119","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[100],"e":[0]},{"t":73}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":73}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":53,"op":74,"st":53,"bm":0},{"ddd":0,"ind":100,"ty":4,"nm":"particle 118","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[100],"e":[0]},{"t":74}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":74}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":54,"op":75,"st":54,"bm":0},{"ddd":0,"ind":101,"ty":4,"nm":"particle 117","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[100],"e":[0]},{"t":72}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":72}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":52,"op":73,"st":52,"bm":0},{"ddd":0,"ind":102,"ty":4,"nm":"particle 116","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":61,"s":[100],"e":[0]},{"t":71}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":71}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51,"op":72,"st":51,"bm":0},{"ddd":0,"ind":103,"ty":4,"nm":"particle 115","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":59,"s":[100],"e":[0]},{"t":69}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":69}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":49,"op":70,"st":49,"bm":0},{"ddd":0,"ind":104,"ty":4,"nm":"particle 114","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":58,"s":[100],"e":[0]},{"t":68}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":68}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":69,"st":48,"bm":0},{"ddd":0,"ind":105,"ty":4,"nm":"particle 113","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[100],"e":[0]},{"t":66}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":66}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":46,"op":67,"st":46,"bm":0},{"ddd":0,"ind":106,"ty":4,"nm":"particle 112","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[100],"e":[0]},{"t":65}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":65}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":66,"st":45,"bm":0},{"ddd":0,"ind":107,"ty":4,"nm":"particle 111","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53,"s":[100],"e":[0]},{"t":63}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":43,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":63}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":43,"op":64,"st":43,"bm":0},{"ddd":0,"ind":108,"ty":4,"nm":"particle 110","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54,"s":[100],"e":[0]},{"t":64}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":64}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":44,"op":65,"st":44,"bm":0},{"ddd":0,"ind":109,"ty":4,"nm":"particle 109","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":52,"s":[100],"e":[0]},{"t":62}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":62}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":63,"st":42,"bm":0},{"ddd":0,"ind":110,"ty":4,"nm":"particle 108","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":51,"s":[100],"e":[0]},{"t":61}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":61}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":41,"op":62,"st":41,"bm":0},{"ddd":0,"ind":111,"ty":4,"nm":"particle 107","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[100],"e":[0]},{"t":59}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":39,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":59}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39,"op":60,"st":39,"bm":0},{"ddd":0,"ind":112,"ty":4,"nm":"particle 106","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[100],"e":[0]},{"t":57}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":57}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":58,"st":37,"bm":0},{"ddd":0,"ind":113,"ty":4,"nm":"particle 105","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[100],"e":[0]},{"t":55}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":55}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":56,"st":35,"bm":0},{"ddd":0,"ind":114,"ty":4,"nm":"particle 104","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[100],"e":[0]},{"t":54}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":34,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":54}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":34,"op":55,"st":34,"bm":0},{"ddd":0,"ind":115,"ty":4,"nm":"particle 103","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[100],"e":[0]},{"t":52}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":52}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":53,"st":32,"bm":0},{"ddd":0,"ind":116,"ty":4,"nm":"particle 102","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":43,"s":[100],"e":[0]},{"t":53}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":53}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":33,"op":54,"st":33,"bm":0},{"ddd":0,"ind":117,"ty":4,"nm":"particle 101","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":41,"s":[100],"e":[0]},{"t":51}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":51}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":52,"st":31,"bm":0},{"ddd":0,"ind":118,"ty":4,"nm":"particle 100","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[100],"e":[0]},{"t":50}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":50}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":51,"st":30,"bm":0},{"ddd":0,"ind":119,"ty":4,"nm":"particle 99","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38,"s":[100],"e":[0]},{"t":48}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":48}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":49,"st":28,"bm":0},{"ddd":0,"ind":120,"ty":4,"nm":"particle 98","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37,"s":[100],"e":[0]},{"t":47}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":47}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":27,"op":48,"st":27,"bm":0},{"ddd":0,"ind":121,"ty":4,"nm":"particle 97","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[100],"e":[0]},{"t":45}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":45}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":46,"st":25,"bm":0},{"ddd":0,"ind":122,"ty":4,"nm":"particle 96","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[100],"e":[0]},{"t":44}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":24,"op":45,"st":24,"bm":0},{"ddd":0,"ind":123,"ty":4,"nm":"particle 95","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32,"s":[100],"e":[0]},{"t":42}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":42}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":43,"st":22,"bm":0},{"ddd":0,"ind":124,"ty":4,"nm":"particle 94","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33,"s":[100],"e":[0]},{"t":43}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":43}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":23,"op":44,"st":23,"bm":0},{"ddd":0,"ind":125,"ty":4,"nm":"particle 93","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":31,"s":[100],"e":[0]},{"t":41}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":41}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":42,"st":21,"bm":0},{"ddd":0,"ind":126,"ty":4,"nm":"particle 92","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[100],"e":[0]},{"t":40}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":40}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":41,"st":20,"bm":0},{"ddd":0,"ind":127,"ty":4,"nm":"particle 91","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[100],"e":[0]},{"t":38}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":38}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":39,"st":18,"bm":0},{"ddd":0,"ind":128,"ty":4,"nm":"particle 90","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":29,"s":[100],"e":[0]},{"t":39}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":39}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":40,"st":19,"bm":0},{"ddd":0,"ind":129,"ty":4,"nm":"particle 89","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27,"s":[100],"e":[0]},{"t":37}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":37}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17,"op":38,"st":17,"bm":0},{"ddd":0,"ind":130,"ty":4,"nm":"particle 88","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":26,"s":[100],"e":[0]},{"t":36}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":36}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":37,"st":16,"bm":0},{"ddd":0,"ind":131,"ty":4,"nm":"particle 87","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[100],"e":[0]},{"t":34}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":14,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":14,"op":35,"st":14,"bm":0},{"ddd":0,"ind":132,"ty":4,"nm":"particle 86","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[100],"e":[0]},{"t":35}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":36,"st":15,"bm":0},{"ddd":0,"ind":133,"ty":4,"nm":"particle 85","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[100],"e":[0]},{"t":33}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":33}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":34,"st":13,"bm":0},{"ddd":0,"ind":134,"ty":4,"nm":"particle 84","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[100],"e":[0]},{"t":32}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":32}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":33,"st":12,"bm":0},{"ddd":0,"ind":135,"ty":4,"nm":"particle 83","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[0]},{"t":30}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":31,"st":10,"bm":0},{"ddd":0,"ind":136,"ty":4,"nm":"particle 82","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":19,"s":[100],"e":[0]},{"t":29}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":29}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9,"op":30,"st":9,"bm":0},{"ddd":0,"ind":137,"ty":4,"nm":"particle 81","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[100],"e":[0]},{"t":27}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":27}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":28,"st":7,"bm":0},{"ddd":0,"ind":138,"ty":4,"nm":"particle 80","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[100],"e":[0]},{"t":26}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":26}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":27,"st":6,"bm":0},{"ddd":0,"ind":139,"ty":4,"nm":"particle 79","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[100],"e":[0]},{"t":24}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":4,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":24}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":25,"st":4,"bm":0},{"ddd":0,"ind":140,"ty":4,"nm":"particle 78","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[100],"e":[0]},{"t":25}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[-7,-4,0],"e":[-27,-4,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":25}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":26,"st":5,"bm":0},{"ddd":0,"ind":141,"ty":4,"nm":"particle 77","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[100],"e":[0]},{"t":23}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[-7,-2,0],"e":[-27,-2,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":23}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":24,"st":3,"bm":0},{"ddd":0,"ind":142,"ty":4,"nm":"particle 76","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[100],"e":[0]},{"t":22}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[-6,-8,0],"e":[-26,-8,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":22}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":23,"st":2,"bm":0},{"ddd":0,"ind":143,"ty":4,"nm":"particle 75","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[0]},{"t":20}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,0,0],"e":[-20,0,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":20}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":21,"st":0,"bm":0},{"ddd":0,"ind":144,"ty":4,"nm":"particle 174","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[100],"e":[0]},{"t":145}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":125,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":145}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":125,"op":146,"st":125,"bm":0},{"ddd":0,"ind":145,"ty":4,"nm":"particle 173","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":133,"s":[100],"e":[0]},{"t":143}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":123,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":143}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":123,"op":144,"st":123,"bm":0},{"ddd":0,"ind":146,"ty":4,"nm":"particle 172","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":132,"s":[100],"e":[0]},{"t":142}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":122,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":142}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":122,"op":143,"st":122,"bm":0},{"ddd":0,"ind":147,"ty":4,"nm":"particle 171","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":130,"s":[100],"e":[0]},{"t":140}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":120,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":140}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":120,"op":141,"st":120,"bm":0},{"ddd":0,"ind":148,"ty":4,"nm":"particle 170","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":131,"s":[100],"e":[0]},{"t":141}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":121,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":141}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":121,"op":142,"st":121,"bm":0},{"ddd":0,"ind":149,"ty":4,"nm":"particle 169","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":128,"s":[100],"e":[0]},{"t":138}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":118,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":138}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":118,"op":139,"st":118,"bm":0},{"ddd":0,"ind":150,"ty":4,"nm":"particle 168","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":126,"s":[100],"e":[0]},{"t":136}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":116,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":136}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":116,"op":137,"st":116,"bm":0},{"ddd":0,"ind":151,"ty":4,"nm":"particle 167","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":125,"s":[100],"e":[0]},{"t":135}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":115,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":135}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":115,"op":136,"st":115,"bm":0},{"ddd":0,"ind":152,"ty":4,"nm":"particle 166","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":123,"s":[100],"e":[0]},{"t":133}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":113,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":133}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":113,"op":134,"st":113,"bm":0},{"ddd":0,"ind":153,"ty":4,"nm":"particle 165","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":124,"s":[100],"e":[0]},{"t":134}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":114,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":134}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":114,"op":135,"st":114,"bm":0},{"ddd":0,"ind":154,"ty":4,"nm":"particle 164","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":121,"s":[100],"e":[0]},{"t":131}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":111,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":131}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":111,"op":132,"st":111,"bm":0},{"ddd":0,"ind":155,"ty":4,"nm":"particle 163","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":119,"s":[100],"e":[0]},{"t":129}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":109,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":129}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":109,"op":130,"st":109,"bm":0},{"ddd":0,"ind":156,"ty":4,"nm":"particle 162","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":118,"s":[100],"e":[0]},{"t":128}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":128}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":108,"op":129,"st":108,"bm":0},{"ddd":0,"ind":157,"ty":4,"nm":"particle 161","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":116,"s":[100],"e":[0]},{"t":126}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":106,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":126}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":106,"op":127,"st":106,"bm":0},{"ddd":0,"ind":158,"ty":4,"nm":"particle 160","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":117,"s":[100],"e":[0]},{"t":127}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":107,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":127}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":107,"op":128,"st":107,"bm":0},{"ddd":0,"ind":159,"ty":4,"nm":"particle 159","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115,"s":[100],"e":[0]},{"t":125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":125}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":105,"op":126,"st":105,"bm":0},{"ddd":0,"ind":160,"ty":4,"nm":"particle 158","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":114,"s":[100],"e":[0]},{"t":124}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":104,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":124}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":104,"op":125,"st":104,"bm":0},{"ddd":0,"ind":161,"ty":4,"nm":"particle 157","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112,"s":[100],"e":[0]},{"t":122}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":102,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":122}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":102,"op":123,"st":102,"bm":0},{"ddd":0,"ind":162,"ty":4,"nm":"particle 156","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":111,"s":[100],"e":[0]},{"t":121}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":101,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":121}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":101,"op":122,"st":101,"bm":0},{"ddd":0,"ind":163,"ty":4,"nm":"particle 155","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[100],"e":[0]},{"t":119}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":99,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":119}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":99,"op":120,"st":99,"bm":0},{"ddd":0,"ind":164,"ty":4,"nm":"particle 154","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[100],"e":[0]},{"t":118}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":118}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":98,"op":119,"st":98,"bm":0},{"ddd":0,"ind":165,"ty":4,"nm":"particle 153","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":106,"s":[100],"e":[0]},{"t":116}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":96,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":116}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":96,"op":117,"st":96,"bm":0},{"ddd":0,"ind":166,"ty":4,"nm":"particle 152","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":107,"s":[100],"e":[0]},{"t":117}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":97,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":117}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":97,"op":118,"st":97,"bm":0},{"ddd":0,"ind":167,"ty":4,"nm":"particle 151","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[100],"e":[0]},{"t":115}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":95,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":115}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":95,"op":116,"st":95,"bm":0},{"ddd":0,"ind":168,"ty":4,"nm":"particle 150","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":104,"s":[100],"e":[0]},{"t":114}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":94,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":114}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":115,"st":94,"bm":0},{"ddd":0,"ind":169,"ty":4,"nm":"particle 149","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":102,"s":[100],"e":[0]},{"t":112}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":92,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":112}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":92,"op":113,"st":92,"bm":0},{"ddd":0,"ind":170,"ty":4,"nm":"particle 74","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[100],"e":[0]},{"t":110}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":110}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":111,"st":90,"bm":0},{"ddd":0,"ind":171,"ty":4,"nm":"particle 73","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[100],"e":[0]},{"t":108}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":108}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":88,"op":109,"st":88,"bm":0},{"ddd":0,"ind":172,"ty":4,"nm":"particle 72","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":97,"s":[100],"e":[0]},{"t":107}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":87,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":107}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":87,"op":108,"st":87,"bm":0},{"ddd":0,"ind":173,"ty":4,"nm":"particle 71","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":95,"s":[100],"e":[0]},{"t":105}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":85,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":105}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":106,"st":85,"bm":0},{"ddd":0,"ind":174,"ty":4,"nm":"particle 70","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[100],"e":[0]},{"t":106}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":86,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":106}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":86,"op":107,"st":86,"bm":0},{"ddd":0,"ind":175,"ty":4,"nm":"particle 69","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93,"s":[100],"e":[0]},{"t":103}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":83,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":103}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":83,"op":104,"st":83,"bm":0},{"ddd":0,"ind":176,"ty":4,"nm":"particle 68","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":91,"s":[100],"e":[0]},{"t":101}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":101}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":81,"op":102,"st":81,"bm":0},{"ddd":0,"ind":177,"ty":4,"nm":"particle 67","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[100],"e":[0]},{"t":100}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":80,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":100}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":80,"op":101,"st":80,"bm":0},{"ddd":0,"ind":178,"ty":4,"nm":"particle 66","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":88,"s":[100],"e":[0]},{"t":98}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":98}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":78,"op":99,"st":78,"bm":0},{"ddd":0,"ind":179,"ty":4,"nm":"particle 65","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[100],"e":[0]},{"t":99}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":79,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":99}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":79,"op":100,"st":79,"bm":0},{"ddd":0,"ind":180,"ty":4,"nm":"particle 64","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":86,"s":[100],"e":[0]},{"t":96}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":96}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":76,"op":97,"st":76,"bm":0},{"ddd":0,"ind":181,"ty":4,"nm":"particle 63","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":84,"s":[100],"e":[0]},{"t":94}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":94}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":74,"op":95,"st":74,"bm":0},{"ddd":0,"ind":182,"ty":4,"nm":"particle 62","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":83,"s":[100],"e":[0]},{"t":93}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":93}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":73,"op":94,"st":73,"bm":0},{"ddd":0,"ind":183,"ty":4,"nm":"particle 61","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[100],"e":[0]},{"t":91}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":91}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":71,"op":92,"st":71,"bm":0},{"ddd":0,"ind":184,"ty":4,"nm":"particle 60","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":82,"s":[100],"e":[0]},{"t":92}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":72,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":92}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":72,"op":93,"st":72,"bm":0},{"ddd":0,"ind":185,"ty":4,"nm":"particle 59","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":80,"s":[100],"e":[0]},{"t":90}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":70,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":70,"op":91,"st":70,"bm":0},{"ddd":0,"ind":186,"ty":4,"nm":"particle 58","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[100],"e":[0]},{"t":89}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":89}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":69,"op":90,"st":69,"bm":0},{"ddd":0,"ind":187,"ty":4,"nm":"particle 57","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":77,"s":[100],"e":[0]},{"t":87}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":87}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":67,"op":88,"st":67,"bm":0},{"ddd":0,"ind":188,"ty":4,"nm":"particle 56","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76,"s":[100],"e":[0]},{"t":86}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":66,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":86}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":66,"op":87,"st":66,"bm":0},{"ddd":0,"ind":189,"ty":4,"nm":"particle 55","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":74,"s":[100],"e":[0]},{"t":84}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":64,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":84}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":64,"op":85,"st":64,"bm":0},{"ddd":0,"ind":190,"ty":4,"nm":"particle 54","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":73,"s":[100],"e":[0]},{"t":83}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":83}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":63,"op":84,"st":63,"bm":0},{"ddd":0,"ind":191,"ty":4,"nm":"particle 53","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":71,"s":[100],"e":[0]},{"t":81}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":81}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":82,"st":61,"bm":0},{"ddd":0,"ind":192,"ty":4,"nm":"particle 52","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[100],"e":[0]},{"t":82}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":62,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":82}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":62,"op":83,"st":62,"bm":0},{"ddd":0,"ind":193,"ty":4,"nm":"particle 51","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":70,"s":[100],"e":[0]},{"t":80}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":80}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":81,"st":60,"bm":0},{"ddd":0,"ind":194,"ty":4,"nm":"particle 50","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":69,"s":[100],"e":[0]},{"t":79}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":59,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":79}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":59,"op":80,"st":59,"bm":0},{"ddd":0,"ind":195,"ty":4,"nm":"particle 49","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67,"s":[100],"e":[0]},{"t":77}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":57,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":77}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":57,"op":78,"st":57,"bm":0},{"ddd":0,"ind":196,"ty":4,"nm":"particle 48","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[0]},{"t":78}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":78}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":58,"op":79,"st":58,"bm":0},{"ddd":0,"ind":197,"ty":4,"nm":"particle 47","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66,"s":[100],"e":[0]},{"t":76}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":76}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":56,"op":77,"st":56,"bm":0},{"ddd":0,"ind":198,"ty":4,"nm":"particle 46","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":65,"s":[100],"e":[0]},{"t":75}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":75}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":55,"op":76,"st":55,"bm":0},{"ddd":0,"ind":199,"ty":4,"nm":"particle 45","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[100],"e":[0]},{"t":73}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":73}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":53,"op":74,"st":53,"bm":0},{"ddd":0,"ind":200,"ty":4,"nm":"particle 44","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[100],"e":[0]},{"t":74}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":74}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":54,"op":75,"st":54,"bm":0},{"ddd":0,"ind":201,"ty":4,"nm":"particle 43","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[100],"e":[0]},{"t":72}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":72}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":52,"op":73,"st":52,"bm":0},{"ddd":0,"ind":202,"ty":4,"nm":"particle 42","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":61,"s":[100],"e":[0]},{"t":71}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":71}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51,"op":72,"st":51,"bm":0},{"ddd":0,"ind":203,"ty":4,"nm":"particle 41","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":59,"s":[100],"e":[0]},{"t":69}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":69}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":49,"op":70,"st":49,"bm":0},{"ddd":0,"ind":204,"ty":4,"nm":"particle 40","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":58,"s":[100],"e":[0]},{"t":68}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":68}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":69,"st":48,"bm":0},{"ddd":0,"ind":205,"ty":4,"nm":"particle 39","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[100],"e":[0]},{"t":66}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":66}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":46,"op":67,"st":46,"bm":0},{"ddd":0,"ind":206,"ty":4,"nm":"particle 38","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[100],"e":[0]},{"t":65}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":65}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":45,"op":66,"st":45,"bm":0},{"ddd":0,"ind":207,"ty":4,"nm":"particle 37","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53,"s":[100],"e":[0]},{"t":63}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":43,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":63}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":43,"op":64,"st":43,"bm":0},{"ddd":0,"ind":208,"ty":4,"nm":"particle 36","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54,"s":[100],"e":[0]},{"t":64}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":64}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":44,"op":65,"st":44,"bm":0},{"ddd":0,"ind":209,"ty":4,"nm":"particle 35","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":52,"s":[100],"e":[0]},{"t":62}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":42,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":62}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":63,"st":42,"bm":0},{"ddd":0,"ind":210,"ty":4,"nm":"particle 34","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":51,"s":[100],"e":[0]},{"t":61}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":61}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":41,"op":62,"st":41,"bm":0},{"ddd":0,"ind":211,"ty":4,"nm":"particle 33","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[100],"e":[0]},{"t":59}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":39,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":59}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39,"op":60,"st":39,"bm":0},{"ddd":0,"ind":212,"ty":4,"nm":"particle 32","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":47,"s":[100],"e":[0]},{"t":57}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":57}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":58,"st":37,"bm":0},{"ddd":0,"ind":213,"ty":4,"nm":"particle 31","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[100],"e":[0]},{"t":55}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":35,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":55}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":56,"st":35,"bm":0},{"ddd":0,"ind":214,"ty":4,"nm":"particle 30","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[100],"e":[0]},{"t":54}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":34,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":54}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":34,"op":55,"st":34,"bm":0},{"ddd":0,"ind":215,"ty":4,"nm":"particle 29","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[100],"e":[0]},{"t":52}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":52}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":53,"st":32,"bm":0},{"ddd":0,"ind":216,"ty":4,"nm":"particle 28","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":43,"s":[100],"e":[0]},{"t":53}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":33,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":53}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":33,"op":54,"st":33,"bm":0},{"ddd":0,"ind":217,"ty":4,"nm":"particle 27","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":41,"s":[100],"e":[0]},{"t":51}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":31,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":51}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":31,"op":52,"st":31,"bm":0},{"ddd":0,"ind":218,"ty":4,"nm":"particle 26","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":40,"s":[100],"e":[0]},{"t":50}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":50}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":51,"st":30,"bm":0},{"ddd":0,"ind":219,"ty":4,"nm":"particle 25","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":38,"s":[100],"e":[0]},{"t":48}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":28,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":48}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":49,"st":28,"bm":0},{"ddd":0,"ind":220,"ty":4,"nm":"particle 24","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37,"s":[100],"e":[0]},{"t":47}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":27,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":47}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":27,"op":48,"st":27,"bm":0},{"ddd":0,"ind":221,"ty":4,"nm":"particle 23","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[100],"e":[0]},{"t":45}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":45}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":25,"op":46,"st":25,"bm":0},{"ddd":0,"ind":222,"ty":4,"nm":"particle 22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[100],"e":[0]},{"t":44}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":24,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":44}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":24,"op":45,"st":24,"bm":0},{"ddd":0,"ind":223,"ty":4,"nm":"particle 21","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":32,"s":[100],"e":[0]},{"t":42}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":22,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":42}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":43,"st":22,"bm":0},{"ddd":0,"ind":224,"ty":4,"nm":"particle 20","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33,"s":[100],"e":[0]},{"t":43}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":23,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":43}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":23,"op":44,"st":23,"bm":0},{"ddd":0,"ind":225,"ty":4,"nm":"particle 19","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":31,"s":[100],"e":[0]},{"t":41}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":21,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":41}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":42,"st":21,"bm":0},{"ddd":0,"ind":226,"ty":4,"nm":"particle 18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[100],"e":[0]},{"t":40}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":40}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":41,"st":20,"bm":0},{"ddd":0,"ind":227,"ty":4,"nm":"particle 17","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[100],"e":[0]},{"t":38}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":38}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":39,"st":18,"bm":0},{"ddd":0,"ind":228,"ty":4,"nm":"particle 16","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":29,"s":[100],"e":[0]},{"t":39}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":39}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":40,"st":19,"bm":0},{"ddd":0,"ind":229,"ty":4,"nm":"particle 15","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":27,"s":[100],"e":[0]},{"t":37}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":17,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":37}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17,"op":38,"st":17,"bm":0},{"ddd":0,"ind":230,"ty":4,"nm":"particle 14","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":26,"s":[100],"e":[0]},{"t":36}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":16,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":36}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":37,"st":16,"bm":0},{"ddd":0,"ind":231,"ty":4,"nm":"particle 13","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[100],"e":[0]},{"t":34}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":14,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":34}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":14,"op":35,"st":14,"bm":0},{"ddd":0,"ind":232,"ty":4,"nm":"particle 12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[100],"e":[0]},{"t":35}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":36,"st":15,"bm":0},{"ddd":0,"ind":233,"ty":4,"nm":"particle 11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":23,"s":[100],"e":[0]},{"t":33}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":33}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":34,"st":13,"bm":0},{"ddd":0,"ind":234,"ty":4,"nm":"particle 10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":22,"s":[100],"e":[0]},{"t":32}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":32}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":33,"st":12,"bm":0},{"ddd":0,"ind":235,"ty":4,"nm":"particle 9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":20,"s":[100],"e":[0]},{"t":30}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":31,"st":10,"bm":0},{"ddd":0,"ind":236,"ty":4,"nm":"particle 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":19,"s":[100],"e":[0]},{"t":29}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":29}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9,"op":30,"st":9,"bm":0},{"ddd":0,"ind":237,"ty":4,"nm":"particle 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17,"s":[100],"e":[0]},{"t":27}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":27}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":28,"st":7,"bm":0},{"ddd":0,"ind":238,"ty":4,"nm":"particle 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[100],"e":[0]},{"t":26}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":6,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":26}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":27,"st":6,"bm":0},{"ddd":0,"ind":239,"ty":4,"nm":"particle 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[100],"e":[0]},{"t":24}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":4,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":24}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":25,"st":4,"bm":0},{"ddd":0,"ind":240,"ty":4,"nm":"particle 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[100],"e":[0]},{"t":25}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[193,151,0],"e":[173,151,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":25}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":26,"st":5,"bm":0},{"ddd":0,"ind":241,"ty":4,"nm":"particle 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[100],"e":[0]},{"t":23}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":3,"s":[193,153,0],"e":[173,153,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":23}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":24,"st":3,"bm":0},{"ddd":0,"ind":242,"ty":4,"nm":"particle 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[100],"e":[0]},{"t":22}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[194,147,0],"e":[174,147,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":22}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":23,"st":2,"bm":0},{"ddd":0,"ind":243,"ty":4,"nm":"particle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[0]},{"t":20}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[200,155,0],"e":[180,155,0],"to":[-0.58333331346512,-14,0],"ti":[3.58333325386047,-16,0]},{"t":20}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.349019616842,0.247058823705,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-20,28.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":21,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"matte 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.235,155.416,0],"ix":2},"a":{"a":0,"k":[159.625,99.679,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[159.375,99.43],[-159.375,99.43],[-159.375,-99.43],[159.375,-99.43]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.898000021542,0.773000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.625,99.679],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":284,"op":427,"st":284,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Tractor","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":284,"s":[-8],"e":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":341.404,"s":[-5],"e":[7]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":348.957,"s":[7],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":364.063,"s":[3],"e":[-1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":379.17,"s":[-1],"e":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":391.255,"s":[-5],"e":[-12]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":400.319,"s":[-12],"e":[-6]},{"t":418.447265625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":284,"s":[-151.709],"e":[252.291]},{"t":426}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":284,"s":[284.709],"e":[271.709]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":320.255,"s":[271.709],"e":[262.709]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":341.404,"s":[262.709],"e":[232.709]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":348.957,"s":[232.709],"e":[247.709]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":364.063,"s":[247.709],"e":[262.709]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":379.17,"s":[262.709],"e":[271.209]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":391.255,"s":[271.209],"e":[286.209]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":400.319,"s":[286.209],"e":[268.209]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":413.915,"s":[268.209],"e":[257.209]},{"t":418.447265625}],"ix":4}},"a":{"a":0,"k":[84.07,197.084,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"w":400,"h":310,"ip":284,"op":427,"st":284,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"matte 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.235,155.416,0],"ix":2},"a":{"a":0,"k":[159.625,99.679,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[159.375,99.43],[-159.375,99.43],[-159.375,-99.43],[159.375,-99.43]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.898000021542,0.773000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.625,99.679],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":142,"op":285,"st":142,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Tractor","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":152.574,"s":[2],"e":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":161.639,"s":[1],"e":[-10.952]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":167.681,"s":[-10.952],"e":[-10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":175.234,"s":[-10],"e":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":182.787,"s":[-3],"e":[-2.895]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":219.043,"s":[-2.895],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":240.191,"s":[-6],"e":[-7]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":249.255,"s":[-7],"e":[-8]},{"t":284}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142,"s":[521.291],"e":[108.291]},{"t":284}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.486],"y":[0.936]},"o":{"x":[0.017],"y":[-0.006]},"n":["0p486_0p936_0p017_-0p006"],"t":161.639,"s":[214.709],"e":[189.887]},{"i":{"x":[0.673],"y":[1.24]},"o":{"x":[0.332],"y":[-0.185]},"n":["0p673_1p24_0p332_-0p185"],"t":167.681,"s":[189.887],"e":[196.785]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.047]},"n":["0p833_1_0p167_-0p047"],"t":175.234,"s":[196.785],"e":[214.785]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":182.787,"s":[214.785],"e":[218.785]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":199.404,"s":[218.785],"e":[219.285]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":228.106,"s":[219.285],"e":[216.785]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":240.191,"s":[216.785],"e":[218.785]},{"i":{"x":[0.596],"y":[0.694]},"o":{"x":[0.163],"y":[0]},"n":["0p596_0p694_0p163_0"],"t":249.255,"s":[218.785],"e":[226.676]},{"t":284}],"ix":4}},"a":{"a":0,"k":[84.07,197.084,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"w":400,"h":310,"ip":142,"op":285,"st":142,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.235,155.416,0],"ix":2},"a":{"a":0,"k":[159.625,99.679,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[159.375,99.43],[-159.375,99.43],[-159.375,-99.43],[159.375,-99.43]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.898000021542,0.773000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.625,99.679],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Tractor","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":19.639,"s":[0],"e":[-4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":51.361,"s":[-4],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64.915,"s":[0],"e":[1]},{"t":107.5146484375}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-81.709],"e":[291.291]},{"t":142}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.984],"y":[1.174]},"o":{"x":[0.016],"y":[0.174]},"n":["0p984_1p174_0p016_0p174"],"t":19.639,"s":[194.709],"e":[198.709]},{"i":{"x":[0.966],"y":[0.841]},"o":{"x":[0.034],"y":[0.08]},"n":["0p966_0p841_0p034_0p08"],"t":51.361,"s":[198.709],"e":[190.709]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0],"y":[0]},"n":["0p833_1_0_0"],"t":64.915,"s":[190.709],"e":[192.709]},{"t":119.685546875}],"ix":4}},"a":{"a":0,"k":[84.07,197.084,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"w":400,"h":310,"ip":0,"op":143,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Cloud 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":53,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[329.596,137.146,0],"ix":2},"a":{"a":0,"k":[30.206,5.341,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-10,4.659],[-1.334,-0.341],[-7.921,-8.999],[0,0]],"o":[[0,0],[10,-4.66],[1.333,0.34],[0,0],[0,0]],"v":[[-30.207,3.854],[-11.54,-2.153],[7.127,-2.153],[30.206,-1.146],[30.206,5.341]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.206,5.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Cloud 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":52,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[268.783,90.652,0],"ix":2},"a":{"a":0,"k":[84.003,12.222,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.003,0.005],[-8.101,1.603],[-6.328,1.682],[-7.071,1.057],[-13.586,3.264],[-3.685,1.116],[-13.401,-4.884],[-9.333,0]],"o":[[4.506,-6.796],[6.536,-1.294],[6.669,-1.772],[13.806,-2.053],[3.743,-0.899],[15.499,-4.694],[9.374,3.415],[-0.01,0]],"v":[[-84.003,11.935],[-63.714,-2.419],[-44.506,-2.117],[-26.836,-12.075],[6.28,2.766],[17.099,-1.228],[57.435,9.92],[84.003,11.94]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.003,12.222],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Cloud 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":45,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.443,84.782,0],"ix":2},"a":{"a":0,"k":[25.947,5.87,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.521,-2],[-6.836,-6.333],[-11.393,-9.333]],"o":[[0,0],[6.52,2],[6.835,6.333],[0,0]],"v":[[-25.946,5.87],[-16.573,0.552],[0.779,-4.115],[25.947,5.87]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.947,5.87],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Cloud 1 Outlines","sr":1,"ks":{"o":{"a":0,"k":60,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[110.659,122.68,0],"ix":2},"a":{"a":0,"k":[69.872,6.118,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.785,-4.018],[-11.344,0.301],[-6.857,-1.046],[-20.404,-0.256],[19.213,2.083],[4.157,-0.297],[0,0]],"o":[[0,0],[7.99,2.511],[7.15,-0.19],[8.506,1.298],[0,0],[-19.213,-2.083],[-4.157,0.298],[0,0]],"v":[[-69.872,-4.332],[-30.482,-4.332],[5.474,-2.052],[26.647,-0.763],[69.871,2.364],[10.608,5.637],[-19.114,2.661],[-69.872,6.118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.871,6.118],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Mud Dark 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.453,241.443,0],"ix":2},"a":{"a":0,"k":[159.646,16.692,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-38.708,-12.333],[-4.874,18.621],[0,0],[54.391,12.981],[11.076,-1.083],[0,0]],"o":[[0,0],[38.708,12.334],[0,0],[0,0],[-10.825,-2.583],[0,0],[0,0]],"v":[[-159.396,8.557],[0.229,-4.109],[159.396,-10.154],[159.396,7.225],[-4.514,3.462],[-37.574,1.094],[-159.359,13.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.646,16.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Mud Dark 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.311,208.501,0],"ix":2},"a":{"a":0,"k":[159.55,20.417,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-21.595,3.035],[-14.459,0.76],[-6.037,-0.293],[-10.699,-0.618],[-8.022,0.299],[-17.772,2.532],[-9.316,2.166],[-3.166,3.226],[0,0],[0,0],[12.667,-10.666],[12.365,1.981],[0,0]],"o":[[21.354,-4.439],[14.332,-2.015],[6.033,-0.317],[10.688,0.518],[8.018,0.463],[17.942,-0.671],[9.463,-1.349],[4.131,-0.961],[7.333,-7.472],[0,0],[0,0],[-12.666,10.667],[-12.366,-1.98],[0,0]],"v":[[-159.3,13.458],[-94.798,2.303],[-51.598,-2.203],[-33.469,-2.395],[-1.814,2.234],[22.277,2.308],[75.914,-2.665],[104.164,-7.71],[118.413,-12.695],[159.3,-16.527],[159.3,-6.501],[123.079,-6.501],[-26.555,5.146],[-159.283,20.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.55,20.417],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Mud Light 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.592,234.246,0],"ix":2},"a":{"a":0,"k":[159.461,20.849,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-38.926,-12.378],[-9.254,21.314],[0,0],[0,0]],"o":[[0,0],[38.927,12.378],[-0.027,4.686],[0,0],[0,0]],"v":[[-159.211,10.768],[25.798,-6.497],[159.211,-20.598],[159.211,20.598],[-158.826,20.598]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.349000010771,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.461,20.849],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Mud Dark 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.384,229.469,0],"ix":2},"a":{"a":0,"k":[159.785,25.625,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-51.667,-13.666],[0.069,-4],[0,0],[0,0]],"o":[[0,0],[51.667,13.667],[-0.07,4.001],[0,0],[0,0]],"v":[[-159.535,2.977],[67.465,-8.357],[159.466,-21.375],[159.227,25.375],[-158.618,24.644]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.785,25.625],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Mud Light 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.278,195.068,0],"ix":2},"a":{"a":0,"k":[159.583,13.261,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-21.871,-1.621],[0,0],[-24.66,-1.98],[0,0],[21.285,-10.8],[18.04,-0.099],[16.789,1],[8.846,-0.447],[0,0]],"o":[[0,0],[21.871,1.621],[0,0],[0,0],[0,0],[-8.011,4.064],[-16.439,0.09],[-19.585,-1.166],[-24.75,1.25],[0,0]],"v":[[-159.333,1.093],[-41.388,-7.771],[38.817,-8.512],[159.333,-11.032],[159.333,-1.219],[74.862,-2.068],[33.729,1.809],[-18.042,1.201],[-64.138,-0.318],[-159.302,13.012]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.349000010771,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.583,13.262],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Mud Dark 1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.236,195.086,0],"ix":2},"a":{"a":0,"k":[159.625,18.812,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-36.717,-5.6],[-49.373,-15.377],[0,0],[21.107,-4.577],[0,0]],"o":[[0,0],[41.567,6.337],[0,0],[0,0],[-21.108,4.576],[0,0]],"v":[[-159.375,18.561],[-5.739,6.581],[159.375,-3.113],[159.375,-10.641],[-59.887,-13.984],[-159.321,-10.607]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317999985639,0.2,0.165000002992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.625,18.811],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Mud Light 1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.262,217.559,0],"ix":2},"a":{"a":0,"k":[159.598,37.536,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-38.35,3.168],[-22.338,0.489],[0,0],[0,0],[0,0]],"o":[[0,0],[41.282,-3.41],[25.387,-0.556],[0,0],[0,0],[0,0]],"v":[[-159.348,-33.079],[-57.499,-33.876],[106.231,-33.008],[159.348,-33.522],[159.348,37.286],[-159.169,36.886]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458999992819,0.349000010771,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.598,37.536],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Grass Light Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.229,180.691,0],"ix":2},"a":{"a":0,"k":[159.381,6.727,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-19.854,-6.958],[-24.927,2.87],[-21.286,-0.394],[-21.984,-2.691],[-27.896,1.102],[0,0],[27.765,3.4],[22.112,0.409],[21.206,-2.442],[19.853,6.958],[0,0]],"o":[[0,0],[19.853,6.958],[21.206,-2.442],[22.112,0.409],[27.765,3.4],[0,0],[-27.896,1.101],[-21.984,-2.692],[-21.286,-0.393],[-24.927,2.87],[-19.854,-6.959],[0,0]],"v":[[-159.381,1.434],[-117.316,3.177],[-56.388,2.339],[8.047,1.4],[74.731,4.395],[159.381,3.344],[159.381,-1.012],[74.731,-2.415],[8.047,-5.411],[-56.388,-4.471],[-117.316,-3.633],[-159.315,-3.633]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.528999956916,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.381,6.727],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":2},{"ddd":0,"ind":19,"ty":4,"nm":"Grass Dark Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.262,178.289,0],"ix":2},"a":{"a":0,"k":[159.598,18.123,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-19.854,-6.958],[-24.927,2.871],[-21.286,-0.394],[-21.984,-2.692],[-27.895,1.102],[0,0],[0,0]],"o":[[0,0],[19.853,6.959],[21.206,-2.441],[22.113,0.409],[27.765,3.4],[0,0],[0,0],[0,0]],"v":[[-159.348,-11.232],[-116.393,-10.915],[-55.464,-11.753],[8.969,-12.691],[75.654,-9.695],[159.348,-8.611],[159.348,5.747],[-159.318,17.872]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.528999956916,0.294000004787,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.598,18.123],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"BG Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.235,155.416,0],"ix":2},"a":{"a":0,"k":[159.625,99.679,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[159.375,99.43],[-159.375,99.43],[-159.375,-99.43],[159.375,-99.43]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.898000021542,0.773000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.625,99.679],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":427,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/you're_in!.json b/example/resource/you're_in!.json new file mode 100644 index 0000000000..d261bea86f --- /dev/null +++ b/example/resource/you're_in!.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":30,"ip":0,"op":231,"w":800,"h":800,"nm":"Code","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Rope Movement","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":136.136136136136,"op":528.528528528529,"st":136.136136136136,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Rope Movement","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":136.136136136136,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"people line","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-60,691.205,0],"ix":2},"a":{"a":0,"k":[600,183,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.792156875134,0.800000011921,0.807843148708,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":1200,"h":366,"ip":0,"op":528.528528528529,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Blue Member 2","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,532,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1558.356,382.617],[1110,382.617],[1110,982],[1558.356,982]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":1920,"h":1080,"ip":136.136136136136,"op":528.528528528529,"st":136.136136136136,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Blue Member","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,532,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1558.356,382.617],[1110,382.617],[1110,982],[1558.356,982]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":1920,"h":1080,"ip":0,"op":528.528528528529,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"people line","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-4,693.205,0],"ix":2},"a":{"a":0,"k":[600,183,0],"ix":1},"s":{"a":0,"k":[95,95,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.701960802078,0.709803938866,0.717647075653,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":1200,"h":366,"ip":-23.023023023023,"op":528.528528528529,"st":-23.023023023023,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"pole","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1217,728.37,0],"ix":2},"a":{"a":0,"k":[121,123,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"w":242,"h":246,"ip":0,"op":528.528528528529,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"pole","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[701,727.37,0],"ix":2},"a":{"a":0,"k":[121,123,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"sy":[{"ty":0,"nm":"Stroke","c":{"a":0,"k":[0.615686297417,0.623529434204,0.631372570992,1],"ix":2},"s":{"a":0,"k":4,"ix":3}}],"w":242,"h":246,"ip":0,"op":528.528528528529,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"Party","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,542,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[-84.071,0],[0,-84.071],[0,0]],"o":[[0,0],[0,-84.071],[84.071,0],[0,0],[0,0]],"v":[[807,820.5],[807,498.467],[959.467,346],[1111.934,498.467],[1111.934,820.5]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":1920,"h":1080,"ip":0,"op":528.528528528529,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"Party","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,544,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[109,109,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[-84.071,0],[0,-84.071],[0,0]],"o":[[0,0],[0,-84.071],[84.071,0],[0,0],[0,0]],"v":[[807,795.729],[807,498.467],[959.467,346],[1111.934,498.467],[1111.934,795.729]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.792156875134,0.800000011921,0.807843148708,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":1920,"h":1080,"ip":0,"op":528.528528528529,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[945.75,491,0],"ix":2},"a":{"a":0,"k":[201.25,-332,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.074,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[196.5,-329],[206,-335]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[74.637,-258.274],[93.137,-269.274]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.075,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[74.637,-258.274],[93.137,-269.274]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-12.5,-142.5],[-11.5,-148.5]],"c":false}]},{"t":76.0760760760761}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":74.0740740740741,"op":77.0770770770771,"st":23.023023023023,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[950.75,472,0],"ix":2},"a":{"a":0,"k":[202.75,-324.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.074,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[198,-321.5],[207.5,-327.5]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[63,-248],[79.5,-258]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.075,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[63,-248],[79.5,-258]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-26.5,-117.5],[-25.5,-125]],"c":false}]},{"t":76.0760760760761}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":74.0740740740741,"op":77.0770770770771,"st":23.023023023023,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[959.75,451.75,0],"ix":2},"a":{"a":0,"k":[197.25,-334.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.074,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[206,-340.5],[188.5,-329]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[71,-270.5],[39,-250.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.075,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[71,-270.5],[39,-250.5]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-51.5,-122.5],[-54.5,-111.5]],"c":false}]},{"t":76.0760760760761}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":74.0740740740741,"op":77.0770770770771,"st":23.023023023023,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[966.5,573,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[196.5,-329],[206,-335]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[260,-323.5],[220,-322.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[260,-323.5],[220,-322.5]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[289,-314.5],[277,-322.5]],"c":false}]},{"t":53.053053053053}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51.0510510510511,"op":54.0540540540541,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,548,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[198,-321.5],[207.5,-327.5]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[260,-323.5],[220,-322.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[260,-323.5],[220,-322.5]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[308,-304.5],[296,-312.5]],"c":false}]},{"t":53.053053053053}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51.0510510510511,"op":54.0540540540541,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[206,-340.5],[188.5,-329]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[263.5,-337.5],[196.5,-337.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[263.5,-337.5],[196.5,-337.5]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[327,-304],[304,-322.5]],"c":false}]},{"t":53.053053053053}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51.0510510510511,"op":54.0540540540541,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Rope","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":509.509509509509,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ROPE","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.037,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.041,"s":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}],"e":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.044,"s":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}],"e":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46.046,"s":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48.048,"s":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.049,"s":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.05,"s":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.053,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.054,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55.055,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.069,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}],"e":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.071,"s":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}],"e":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73.073,"s":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}],"e":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.95,"s":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.888,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78.704,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.519,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.334,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}]},{"t":88.0880880880881}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":99,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.037,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.041,"s":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}],"e":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.044,"s":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}],"e":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46.046,"s":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48.048,"s":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.049,"s":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.05,"s":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.053,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.054,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55.055,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.069,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}],"e":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.071,"s":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}],"e":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73.073,"s":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}],"e":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.95,"s":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.888,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78.704,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.519,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.334,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}]},{"t":88.0880880880881}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":96,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.037,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.041,"s":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}],"e":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.044,"s":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}],"e":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46.046,"s":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48.048,"s":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.049,"s":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.05,"s":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.053,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.054,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55.055,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.069,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}],"e":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.071,"s":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}],"e":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73.073,"s":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}],"e":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.95,"s":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.888,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78.704,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.519,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.334,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}]},{"t":88.0880880880881}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":5,"ix":1},"e":{"a":0,"k":1,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.037,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.041,"s":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}],"e":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.044,"s":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}],"e":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46.046,"s":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48.048,"s":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.049,"s":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.05,"s":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.053,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.054,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55.055,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.069,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}],"e":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.071,"s":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}],"e":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73.073,"s":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}],"e":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.95,"s":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.888,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78.704,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.519,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.334,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}]},{"t":88.0880880880881}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":2,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.96862745098,0.874509803922,0.549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.037,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":41.041,"s":[{"i":[[0,0],[-157.997,69.524],[0,0]],"o":[[0,0],[89.76,-39.498],[0,0]],"v":[[-256,145],[53.997,60.476],[261,144]],"c":false}],"e":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.044,"s":[{"i":[[-131,67],[-167.543,-41.544],[0,0]],"o":[[131,-67],[111.003,27.524],[0,0]],"v":[[-85,118],[177.997,-67.524],[261,144]],"c":false}],"e":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":46.046,"s":[{"i":[[-58.242,135.122],[-109.997,-11.476],[0,0]],"o":[[25,-58],[113.747,11.867],[0,0]],"v":[[95,56],[209.997,-128.524],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48.048,"s":[{"i":[[-19.414,45.041],[-62.35,-12.578],[-16.222,-23.945]],"o":[[11.785,-72.253],[87.466,32.993],[30.606,47.27]],"v":[[156.215,-94.747],[225.35,-195.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49.049,"s":[{"i":[[0,0],[-63.35,-42.078],[-16.222,-23.945]],"o":[[0,0],[68.058,37.708],[30.606,47.27]],"v":[[161.715,-174.747],[260.35,-234.922],[261,144]],"c":false}],"e":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":50.05,"s":[{"i":[[-19.414,45.041],[-15.35,-48.578],[-16.222,-23.945]],"o":[[47.785,-55.253],[19.448,61.549],[30.606,47.27]],"v":[[163.215,-255.747],[295.35,-226.422],[261,144]],"c":false}],"e":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":51.051,"s":[{"i":[[0,0],[48.063,-75.399],[-16.181,-61.782]],"o":[[0,0],[-55.924,87.73],[0,0]],"v":[[201.995,-337.25],[261.924,-145.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.052,"s":[{"i":[[0,0],[25.07,-76.834],[-16.181,-61.782]],"o":[[0,0],[-29.695,91.056],[0,0]],"v":[[262.495,-339.75],[237.924,-129.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.053,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[331.995,-309.25],[213.924,-128.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.054,"s":[{"i":[[0,0],[2.076,-78.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.383],[0,0]],"v":[[371.495,-284.75],[217.924,-132.23],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":55.055,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[395.995,-254.25],[228.924,-130.73],[261,144]],"c":false}],"e":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.069,"s":[{"i":[[0,0],[0,-112.27],[-16.181,-61.782]],"o":[[0,0],[-3.467,94.382],[0,0]],"v":[[407.502,-239.456],[219.061,-134.017],[261,144]],"c":false}],"e":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":71.071,"s":[{"i":[[0,0],[30.019,-141.415],[-16.181,-61.782]],"o":[[0,0],[-30.019,141.415],[0,0]],"v":[[422.296,-193.428],[222.348,-132.373],[261,144]],"c":false}],"e":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":73.073,"s":[{"i":[[0,0],[-32.611,-39.166],[-42.089,-15.667]],"o":[[-66,58],[41.234,49.522],[0,0]],"v":[[114,-144],[87.497,51.476],[261,144]],"c":false}],"e":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":74.95,"s":[{"i":[[-13,-44],[-165.271,-51.701],[-66,8]],"o":[[13,44],[72.003,22.524],[167.916,-20.353]],"v":[[-150,-19],[16.997,141.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75.888,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[-7.003,178.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78.704,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[1.997,220.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81.519,"s":[{"i":[[0,0],[-124.003,0.476],[-66,8]],"o":[[0,0],[124.003,-0.476],[167.916,-20.353]],"v":[[-254,144],[6.997,159.476],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":84.334,"s":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,209.051],[261,144]],"c":false}],"e":[{"i":[[0,0],[-98.003,-3.524],[0,0]],"o":[[0,0],[98.003,3.524],[0,0]],"v":[[-256,145],[12.997,202.476],[261,144]],"c":false}]},{"t":88.0880880880881}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":2,"ix":1},"e":{"a":0,"k":95,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941176471,0.541176470588,0.470588235294,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":3,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":-26.026026026026,"op":637.637637637638,"st":37.037037037037,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1052,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[850,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[958,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":" ","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[756,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[668,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[466,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[574,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[372,212,0],"ix":2},"a":{"a":0,"k":[62,101,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]},{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":2,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":3,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":3,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"body 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60.83,132,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0.023529412225,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0.023529412225,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-8.00800800800801,"op":592.592592592593,"st":-8.00800800800801,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Head 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,45.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0.023529412225,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0.023529412225,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-3.003003003003,"op":597.597597597598,"st":-3.003003003003,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":3,"ty":0,"nm":"Person","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-15],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":4.505,"s":[0],"e":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":9.009,"s":[8],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.514,"s":[-11],"e":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18.018,"s":[13],"e":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24.024,"s":[13],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":30.03,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":42.042,"s":[0],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55.055,"s":[-6],"e":[-17.016]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.06,"s":[-17.016],"e":[17]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64.064,"s":[17],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":69.069,"s":[-13],"e":[23]},{"t":75.0750750750751}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[-52.424,794.634,0],"e":[94.576,820.634,0],"to":[62.4243774414062,-102.634155273438,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":4.505,"s":[94.576,820.634,0],"e":[271.576,820.634,0],"to":[0,0,0],"ti":[-93.5756225585938,-156.634155273438,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9.009,"s":[271.576,820.634,0],"e":[448.576,806.634,0],"to":[2.57562255859375,-2.3658447265625,0],"ti":[-99.5756225585938,-121.634155273438,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":13.514,"s":[448.576,806.634,0],"e":[530.576,821.634,0],"to":[45.5756225585938,-49.3658447265625,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18.018,"s":[530.576,821.634,0],"e":[603.576,821.634,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.578,"y":0.578},"o":{"x":0.167,"y":0.167},"n":"0p578_0p578_0p167_0p167","t":27.027,"s":[603.576,821.634,0],"e":[603.576,821.634,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.578,"y":1},"o":{"x":0.344,"y":0},"n":"0p578_1_0p344_0","t":42.042,"s":[603.576,821.634,0],"e":[603.576,812.634,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.344,"y":0},"n":"0p833_0p833_0p344_0","t":55.055,"s":[603.576,812.634,0],"e":[797.576,798.634,0],"to":[0,0,0],"ti":[-84,-62.1666679382324,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":60.06,"s":[797.576,798.634,0],"e":[951.576,823.634,0],"to":[23,-36.8333320617676,0],"ti":[-27.4243774414062,-58.3658447265625,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":64.064,"s":[951.576,823.634,0],"e":[1157.576,803.634,0],"to":[61.6717796325684,-103.519493103027,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":69.069,"s":[1157.576,803.634,0],"e":[1378.576,825.634,0],"to":[0,0,0],"ti":[-82.5756225585938,-100.634155273438,0]},{"t":75.0750750750751}],"ix":2},"a":{"a":0,"k":[94.308,184.077,0],"ix":1},"s":{"a":0,"k":[130,130,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"n","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-17.31,-0.493],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[17.31,0.493],[0,0],[0,0]],"v":[[128.48,-7.642],[-6.054,-7.642],[-6.054,79.804],[41.173,86.727],[62.708,80.403],[81.173,87.112],[128.48,79.804]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[0.203921571374,0.701960802078,0.89411765337,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"w":124,"h":202,"ip":-7.00700700700701,"op":593.593593593594,"st":-7.00700700700701,"bm":0}]},{"id":"comp_6","layers":[{"ddd":0,"ind":2,"ty":0,"nm":"ball top","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123,36,0],"ix":2},"a":{"a":0,"k":[55.5,55.5,0],"ix":1},"s":{"a":0,"k":[53,53,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Change to Color 3","np":13,"mn":"ADBE Change To Color","ix":1,"en":1,"ef":[{"ty":2,"nm":"From","mn":"ADBE Change To Color-0001","ix":1,"v":{"a":0,"k":[0.917647063732,0.921568632126,0.937254905701,1],"ix":1}},{"ty":2,"nm":"To","mn":"ADBE Change To Color-0002","ix":2,"v":{"a":0,"k":[0.792156875134,0.800000011921,0.807843148708,1],"ix":2}},{"ty":7,"nm":"Change","mn":"ADBE Change To Color-0003","ix":3,"v":{"a":0,"k":4,"ix":3}},{"ty":7,"nm":"Change By","mn":"ADBE Change To Color-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":6,"nm":"Tolerance","mn":"ADBE Change To Color-0010","ix":5,"v":0},{"ty":0,"nm":"Hue","mn":"ADBE Change To Color-0005","ix":6,"v":{"a":0,"k":0.03,"ix":6}},{"ty":0,"nm":"Lightness","mn":"ADBE Change To Color-0006","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"nm":"Saturation","mn":"ADBE Change To Color-0007","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"Saturation","mn":"ADBE Change To Color-0011","ix":9,"v":0},{"ty":0,"nm":"Softness","mn":"ADBE Change To Color-0008","ix":10,"v":{"a":0,"k":0.5,"ix":10}},{"ty":7,"nm":"View Correction Matte","mn":"ADBE Change To Color-0009","ix":11,"v":{"a":0,"k":0,"ix":11}}]},{"ty":5,"nm":"Change to Color 2","np":13,"mn":"ADBE Change To Color","ix":2,"en":1,"ef":[{"ty":2,"nm":"From","mn":"ADBE Change To Color-0001","ix":1,"v":{"a":0,"k":[0.819607853889,0.831372559071,0.858823537827,1],"ix":1}},{"ty":2,"nm":"To","mn":"ADBE Change To Color-0002","ix":2,"v":{"a":0,"k":[0.615686297417,0.623529434204,0.631372570992,1],"ix":2}},{"ty":7,"nm":"Change","mn":"ADBE Change To Color-0003","ix":3,"v":{"a":0,"k":4,"ix":3}},{"ty":7,"nm":"Change By","mn":"ADBE Change To Color-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":6,"nm":"Tolerance","mn":"ADBE Change To Color-0010","ix":5,"v":0},{"ty":0,"nm":"Hue","mn":"ADBE Change To Color-0005","ix":6,"v":{"a":0,"k":0.03,"ix":6}},{"ty":0,"nm":"Lightness","mn":"ADBE Change To Color-0006","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"nm":"Saturation","mn":"ADBE Change To Color-0007","ix":8,"v":{"a":0,"k":1,"ix":8}},{"ty":6,"nm":"Saturation","mn":"ADBE Change To Color-0011","ix":9,"v":0},{"ty":0,"nm":"Softness","mn":"ADBE Change To Color-0008","ix":10,"v":{"a":0,"k":0.5,"ix":10}},{"ty":7,"nm":"View Correction Matte","mn":"ADBE Change To Color-0009","ix":11,"v":{"a":0,"k":0,"ix":11}}]}],"sy":[{"ty":0,"nm":"Stroke","c":{"a":0,"k":[0.615686297417,0.623529434204,0.631372570992,1],"ix":2},"s":{"a":0,"k":1,"ix":3}}],"w":111,"h":111,"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.676,138.221,0],"ix":2},"a":{"a":0,"k":[-349.324,174.221,0],"ix":1},"s":{"a":0,"k":[157.387,91,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[9.352,225.559],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0.027450980619,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156862745,0.8,0.807843137255,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-349.324,174.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[476,-48,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[54.023,17.809],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.61568627451,0.623529411765,0.63137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156862745,0.8,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-352.988,139.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[122.001,225.774,0],"ix":2},"a":{"a":0,"k":[0.001,0.957,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.597,0],[0,0],[2.123,1.482],[0,0],[10.938,-7.532],[0,0]],"o":[[0,0],[2.589,0],[0,0],[-10.891,-7.6],[0,0],[-2.139,1.473]],"v":[[-42.541,15.183],[42.544,15.183],[44.058,10.367],[18.4,-7.538],[-17.892,-7.651],[-44.042,10.358]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.61568627451,0.623529411765,0.63137254902,1],"ix":3,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156862745,0.8,0.807843137255,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0}]},{"id":"comp_7","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[55.697,55.697,0],"ix":2},"a":{"a":0,"k":[-325.303,-176.303,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[107.395,107.395],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0.027450980619,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-325.303,-176.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[375,232,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[171.367,158.457],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0.023529412225,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647058824,0.921568627451,0.937254901961,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-349.512,-215.295],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[55.697,55.697,0],"ix":2},"a":{"a":0,"k":[-325.303,-176.303,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[107.395,107.395],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0.027450980619,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.819607843137,0.83137254902,0.858823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-325.303,-176.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0}]},{"id":"comp_8","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"party thing","refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[869,465,0],"ix":2},"a":{"a":0,"k":[942,467,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Spotlight 2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":-17.017,"s":[0],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":17.017,"s":[-39],"e":[-11]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":53.053,"s":[-11],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":87.087,"s":[-39],"e":[-11]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":123.123,"s":[-11],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":152.152,"s":[-39],"e":[-11]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":188.188,"s":[-11],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":222.222,"s":[-39],"e":[-11]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":258.258,"s":[-11],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":292.292,"s":[-39],"e":[-11]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":328.328,"s":[-11],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":357.357,"s":[-39],"e":[-11]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":393.393,"s":[-11],"e":[-39]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":427.427,"s":[-39],"e":[-11]},{"t":463.463463463463}],"ix":10},"p":{"a":0,"k":[1108,378,0],"ix":2},"a":{"a":0,"k":[-158,-162,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-166,-182],[-140,416],[296,268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215686275,0.862745098039,0.952941176471,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-17.017017017017,"op":583.583583583584,"st":-17.017017017017,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,508,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[575.859,143.445],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.93,266.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"body 13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[813.83,684,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"body 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1066.83,674,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"body 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[942.83,670,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"body 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[910.83,698,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"body 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1002.83,730,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"body 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1066.83,690,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"body 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[947.17,716,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"body 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1092,724,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"body 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[875.17,690,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"body 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[985.17,664,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[908,686,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"party thing","refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[994.5,416.5,0],"ix":2},"a":{"a":0,"k":[942,467,0],"ix":1},"s":{"a":0,"k":[103,103,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"party thing","refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1053,525.5,0],"ix":2},"a":{"a":0,"k":[942,467,0],"ix":1},"s":{"a":0,"k":[47,47,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Head 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1100,657.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Head 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[815.305,609.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Head 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[874.305,608.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Head 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1013.305,659.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Head 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[961.305,661.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Head 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[885.305,661.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Spotlight","sr":1,"ks":{"o":{"a":0,"k":55,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":0,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":34.034,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":70.07,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":104.104,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":140.14,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":174.174,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":210.21,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":244.244,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":280.28,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":314.314,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":350.35,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":384.384,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":420.42,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":454.454,"s":[41],"e":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":490.49,"s":[0],"e":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"n":["0p4_1_0p4_0"],"t":524.525,"s":[41],"e":[0]},{"t":560.560560560561}],"ix":10},"p":{"a":0,"k":[802,378,0],"ix":2},"a":{"a":0,"k":[-158,-162,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-166,-182],[-140,416],[296,268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811764705882,0.929411764706,0.98431372549,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Head 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[804.305,610.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"body 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[804.17,686,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"body 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[861.17,686,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[31,31,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-59,0],[0,-59],[0,0]],"o":[[0,0],[0,-59],[59,0],[0,0],[0,0]],"v":[[-107,166.5],[-107,-59.5],[0,-166.5],[107,-59.5],[107,166.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Head 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1061.305,609.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"Head 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[991.305,609.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Head 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[919.305,609.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"Head","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[853.305,609.305,0],"ix":2},"a":{"a":0,"k":[-156.695,39.305,0],"ix":1},"s":{"a":0,"k":[68,68,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle - position","np":4,"mn":"ADBE CM WigglePosition","ix":1,"en":1,"ef":[{"ty":0,"nm":"Wiggle Speed (wigs/sec)","mn":"ADBE CM WigglePosition-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":0,"nm":"Wiggle Amount (pixels)","mn":"ADBE CM WigglePosition-0002","ix":2,"v":{"a":0,"k":15,"ix":2}}]},{"ty":5,"nm":"(Transform)","np":15,"mn":"ADBE Geometry2","ix":2,"en":1,"ef":[{"ty":3,"nm":"Anchor Point","mn":"ADBE Geometry2-0001","ix":1,"v":{"a":0,"k":[0,0],"ix":1}},{"ty":3,"nm":"Position","mn":"ADBE Geometry2-0002","ix":2,"v":{"a":0,"k":[0,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(effect('Wiggle - position')('Wiggle Speed (wigs/sec)'), effect('Wiggle - position')('Wiggle Amount (pixels)'));"}},{"ty":7,"nm":"Uniform Scale","mn":"ADBE Geometry2-0011","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":0,"nm":"Scale Height","mn":"ADBE Geometry2-0003","ix":4,"v":{"a":0,"k":100,"ix":4}},{"ty":0,"nm":"Scale Width","mn":"ADBE Geometry2-0004","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Skew","mn":"ADBE Geometry2-0005","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Skew Axis","mn":"ADBE Geometry2-0006","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Rotation","mn":"ADBE Geometry2-0007","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"nm":"Opacity","mn":"ADBE Geometry2-0008","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"nm":"Use Composition’s Shutter Angle","mn":"ADBE Geometry2-0009","ix":10,"v":{"a":0,"k":1,"ix":10}},{"ty":0,"nm":"Shutter Angle","mn":"ADBE Geometry2-0010","ix":11,"v":{"a":0,"k":0,"ix":11}},{"ty":7,"nm":"Sampling","mn":"ADBE Geometry2-0012","ix":12,"v":{"a":0,"k":1,"ix":12}},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":13,"v":{"a":0,"k":1,"ix":13}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[105.391,105.391],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921568627,0.701960784314,0.894117647059,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-156.695,39.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"background","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Gradient Ramp","np":11,"mn":"ADBE Ramp","ix":1,"en":1,"ef":[{"ty":3,"nm":"Start of Ramp","mn":"ADBE Ramp-0001","ix":1,"v":{"a":0,"k":[952,297],"ix":1}},{"ty":2,"nm":"Start Color","mn":"ADBE Ramp-0002","ix":2,"v":{"a":0,"k":[0.811764717102,0.929411768913,0.984313726425,1],"ix":2}},{"ty":3,"nm":"End of Ramp","mn":"ADBE Ramp-0003","ix":3,"v":{"a":0,"k":[953,632],"ix":3}},{"ty":2,"nm":"End Color","mn":"ADBE Ramp-0004","ix":4,"v":{"a":0,"k":[0.423529416323,0.780392169952,0.917647063732,1],"ix":4}},{"ty":7,"nm":"Ramp Shape","mn":"ADBE Ramp-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":0,"nm":"Ramp Scatter","mn":"ADBE Ramp-0006","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Blend With Original","mn":"ADBE Ramp-0007","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":6,"nm":"","mn":"ADBE Ramp-0008","ix":8,"v":0},{"ty":7,"nm":"GPU Rendering","mn":"ADBE Force CPU GPU","ix":9,"v":{"a":0,"k":1,"ix":9}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1920,1080],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.407843137255,0.780392156863,0.925490196078,1],"ix":4,"x":"var $bm_rt;\nvar rayColorPalette, rayColorSwatch;\ntry {\n rayColorPalette = 'Ray - palette 01';\n rayColorSwatch = Math.floor(mul(value[2], 255));\n $bm_rt = comp(rayColorPalette).layer(1)(4)(rayColorSwatch)(1);\n} catch (e) {\n $bm_rt = value;\n}"},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-2.002002002002,"op":598.598598598599,"st":-2.002002002002,"bm":0}]},{"id":"comp_9","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":61,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[16],"e":[1816]},{"t":463.463463463463}],"ix":10},"p":{"a":0,"k":[944,466,0],"ix":2},"a":{"a":0,"k":[-16,-74,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":0,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":6.006,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":15.015,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":21.021,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":30.03,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":36.036,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":45.045,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":51.051,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":60.06,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":66.066,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":75.075,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":81.081,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":90.09,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":96.096,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":105.105,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":111.111,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":120.12,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":126.126,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":135.135,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":141.141,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":150.15,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":156.156,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":165.165,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":171.171,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":180.18,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":186.186,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":195.195,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":201.201,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":210.21,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":216.216,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":225.225,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":231.231,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":240.24,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":246.246,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":255.255,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":261.261,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":270.27,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":276.276,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":285.285,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":291.291,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":300.3,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":306.306,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":315.315,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":321.321,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":330.33,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":336.336,"s":[131,131,100],"e":[47,47,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":345.345,"s":[47,47,100],"e":[131,131,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"n":["0p4_1_0p6_0","0p4_1_0p6_0","0p4_1_0p6_0"],"t":351.351,"s":[131,131,100],"e":[47,47,100]},{"t":360.36036036036}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-28.016,-70.555],[-4.603,-77.788]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.901960784314,0.952941176471,0.98431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-20,-86],[-13.032,-63.785]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.901960784314,0.952941176471,0.98431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.600600600601,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Members First","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[531,420,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[64,64,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":600.600600600601,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From c5e85c94b449139347d0e9e88ef788e6eaedaa96 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 15 Sep 2018 23:03:04 +0900 Subject: [PATCH 264/672] lottie/build: add sanitizer build to lottie-player library. Change-Id: I51d7d4b21bae19f4b6174ccb8f48ceefcc01f434 --- meson.build | 16 ++++++++++++++++ meson_options.txt | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/meson.build b/meson.build index 9552d9b4a5..a3315b59e1 100644 --- a/meson.build +++ b/meson.build @@ -8,6 +8,22 @@ add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_s compiler_flags = ['-Wall', '-O2', '-std=c++14', '-fvisibility=hidden'] +if get_option('asan') == true + compiler_flags += ['-fsanitize=address'] + add_global_link_arguments('-fsanitize=address', language: 'cpp') +endif + +if get_option('msan') == true + compiler_flags += ['-fsanitize=memory'] + add_global_link_arguments('-fsanitize=memory', language: 'cpp') +endif + +if get_option('tsan') == true + compiler_flags += ['-fsanitize=thread'] + add_global_link_arguments('-fsanitize=thread', language: 'cpp') +endif + + if (build_machine.system() == 'linux') compiler_flags += ['-pthread'] add_global_link_arguments('-pthread', language: 'cpp') diff --git a/meson_options.txt b/meson_options.txt index d8e58902a5..c2c548fcdc 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -12,3 +12,21 @@ option('text', type: 'boolean', value: false, description: 'enable text module') + + +option('asan', + type: 'boolean', + value: false, + description: 'enable adress sanitizer') + + +option('msan', + type: 'boolean', + value: false, + description: 'enable memory sanitizer') + + +option('tsan', + type: 'boolean', + value: false, + description: 'enable thread sanitizer') From cf2d643534a5ce067c5a7100cf7346c5abd55afe Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 18 Sep 2018 11:46:57 +0900 Subject: [PATCH 265/672] lottie/camke: use ${LIB_INSTALL_DIR} instead of hard coded lib/ path. Change-Id: I10152adb394df81b241afb3ca7ae34169917eb94 --- CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fa20cfe19..1e9b01d454 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,15 +49,15 @@ SET(EXEC_DIR ${PREFIX}) SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCDIR ${PREFIX}/include) CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) #install header install(FILES inc/lottieanimation.h inc/lottieanimation_capi.h inc/lottiecommon.h DESTINATION include) #install lib install( TARGETS lottie-player EXPORT lottie-player-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib + LIBRARY DESTINATION ${LIB_INSTALL_DIR} + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} INCLUDES DESTINATION include ) @@ -66,7 +66,7 @@ install( TARGETS lottie-player EXPORT lottie-player-targets install( EXPORT lottie-player-targets FILE lottie-playerTargets.cmake NAMESPACE lottie-player:: - DESTINATION lib/cmake/lottie-player + DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player ) @@ -80,14 +80,14 @@ write_basic_package_version_file( configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/lottie-playerConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake - INSTALL_DESTINATION lib/cmake/lottie-player + INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player ) #Install the config, configversion and custom find modules install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake - DESTINATION lib/cmake/lottie-player + DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player ) From e341c2cf579eabc08167c77153df79e3251fa941 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 19 Sep 2018 11:29:26 +0900 Subject: [PATCH 266/672] lottie: make animation class constructor private. we can't use make_unique to create the animation object anymore because the constructor is private. so used unique_ptr constructor instead. Change-Id: I23b68c68d1b960085800365662ebb1cc676731cc --- inc/lottieanimation.h | 11 +++-------- src/lottie/lottieanimation.cpp | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index c2a4e26616..08edd48914 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -28,7 +28,7 @@ #endif class AnimationImpl; -class LOTNode; +struct LOTNode; namespace lottie { @@ -209,17 +209,12 @@ public: */ ~Animation(); +private: /** * @brief default constructor - * - * @note user should never construct animation object. - * they should call the one of the factory method instead. - * - * @see loadFromFile() - * @see loadFromData() */ Animation(); -private: + std::unique_ptr d; }; diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 07dfcb06bb..f7a929fd86 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -199,7 +199,7 @@ Animation::loadFromData(std::string jsonData, const std::string &key) LottieLoader loader; if (loader.loadFromData(std::move(jsonData), key)) { - auto animation = std::make_unique(); + auto animation = std::unique_ptr(new Animation); animation->d->init(loader.model()); return animation; } @@ -216,7 +216,7 @@ Animation::loadFromFile(const std::string &path) LottieLoader loader; if (loader.load(path)) { - auto animation = std::make_unique(); + auto animation = std::unique_ptr(new Animation); animation->d->init(loader.model()); return animation; } From 3df7886b6d84d1f134d1f57ae9cac86da0df3310 Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Thu, 27 Sep 2018 13:46:09 +0900 Subject: [PATCH 267/672] Fixes a spelling and some minor formatting. Change-Id: Ie6a0f4706eae8cf87335aaeabec2b66050109ef0 --- meson_options.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/meson_options.txt b/meson_options.txt index c2c548fcdc..f1463c84a8 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,32 +1,32 @@ option('test', type: 'boolean', value: false, - description: 'enable unit test') + description: 'Enable building unit tests') option('example', type: 'boolean', value: true, - description: 'enable example') + description: 'Enable building examples') option('text', type: 'boolean', value: false, - description: 'enable text module') + description: 'Enable text module') option('asan', type: 'boolean', value: false, - description: 'enable adress sanitizer') + description: 'Enable address sanitizer') option('msan', type: 'boolean', value: false, - description: 'enable memory sanitizer') + description: 'Enable memory sanitizer') option('tsan', type: 'boolean', value: false, - description: 'enable thread sanitizer') + description: 'Enable thread sanitizer') From 571aae0e7cba1b5a14c32ae6e6726803c701976d Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Thu, 27 Sep 2018 13:48:25 +0900 Subject: [PATCH 268/672] README: Fix a few typos Change-Id: I6549291543f0c3f5626b0fb3011f712d1d9df34f --- README.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.txt b/README.txt index 9e308c73ea..957c3dbcf4 100644 --- a/README.txt +++ b/README.txt @@ -1,14 +1,14 @@ -BUILD INSTRUCTION -================= +BUILD INSTRUCTIONS +================== 1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) 2. install ninja build tool (https://ninja-build.org/) -4. invoke meson build/ or meson -Dexample=true build/ -5. invoke ninja inside the build folder. +3. invoke meson build/ or meson -Dexample=true build/ +4. invoke ninja inside the build folder. NOTE: run meson configure to see all the build options -BUILD EXAMPLE -=============== +BUILD EXAMPLES +============== 1. meson configure -Dexample=true 2. ninja -3. to run example invoke ./build/example/demo +3. to run examples invoke ./build/example/demo, etc. From 0e0b4671b13aebaee15d27782b3597fd469c4ca1 Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Thu, 27 Sep 2018 13:49:30 +0900 Subject: [PATCH 269/672] README: Add docs for running testsuite Change-Id: Ifcbdaf1a2aecd1b61e43faf9bac603d6d1151400 --- README.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.txt b/README.txt index 957c3dbcf4..0dfc8a7e91 100644 --- a/README.txt +++ b/README.txt @@ -12,3 +12,9 @@ BUILD EXAMPLES 1. meson configure -Dexample=true 2. ninja 3. to run examples invoke ./build/example/demo, etc. + +RUN TESTS +========= +1. meson configure -Dtest=true +2. ninja +3. invoke testsuites as ./build/test/animationTestSuite and ./build/test/vectorTestSuite From 1db8d75849def01c145e1dd5112c837dcb81d399 Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Thu, 27 Sep 2018 13:50:11 +0900 Subject: [PATCH 270/672] README: Document how to build using cmake Reviewd-By: Hermet Park Change-Id: I25056d78d5b540fe0568825a617979b6439f508b --- README.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.txt b/README.txt index 0dfc8a7e91..e028653b4f 100644 --- a/README.txt +++ b/README.txt @@ -18,3 +18,17 @@ RUN TESTS 1. meson configure -Dtest=true 2. ninja 3. invoke testsuites as ./build/test/animationTestSuite and ./build/test/vectorTestSuite + +BUILD WITH CMAKE +================ +liblottie-player can also be built using the cmake build system. + +1. install cmake. (Follow instructions at https://cmake.org/download/) +2. create a new build/ directory +3. invoke cmake from inside build/ as cmake -DLIB_INSTALL_DIR=lib .. +4. invoke make +5. invoke sudo make install to install, if desired. + +To install to a different prefix, specify it when running cmake, e.g.: + cmake -DCMAKE_INSTALL_PREFIX:PATH=~/Build -DLIB_INSTALL_DIR=~/Build/lib .. + From c0f50fb89ae72853c3f586e525567b848785a192 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 16 Oct 2018 10:19:26 +0900 Subject: [PATCH 271/672] lottie: make destructor virtual for proper cleanup of derived object Change-Id: I0c91778834b46365598381e57363e36c2c91de63 --- src/vector/vdrawable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index 7f2ac523e7..c24bee4765 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -19,7 +19,7 @@ public: Stroke, }; typedef vFlag DirtyFlag; - VDrawable() = default; + virtual ~VDrawable() = default; void setPath(const VPath &path); void setFillRule(FillRule rule) { mFillRule = rule; } void setBrush(const VBrush &brush) { mBrush = brush; } From a7ec7801811c022be0fa57c6cb5e7cadfb6ed9d5 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 17 Oct 2018 19:45:02 +0900 Subject: [PATCH 272/672] lottieitem : fix wrong matrix computation order. It occured scaled position, now it's fixed. Change-Id: Id179c32139fb0722a6f4faaaea7044944c2e4c92 --- src/lottie/lottieitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index e4ad40cb63..25f39b1c2f 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -80,7 +80,7 @@ bool LOTCompItem::update(int frameNo) float ty = (viewPort.height() - viewBox.height() * scale) * 0.5; VMatrix m; - m.scale(scale, scale).translate(tx, ty); + m.translate(tx, ty).scale(scale, scale); mRootLayer->update(frameNo, m, 1.0); mCurFrameNo = frameNo; From 871251479df3d8b6697a0334dc2420c435708a53 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 23 Oct 2018 08:55:39 +0900 Subject: [PATCH 273/672] lottie: Add duration() and frameAtPos() api to CompositionData model. Change-Id: I7ff968b8262270dcd7b47a16f1a9549f7ffdb7d5 --- src/lottie/lottieanimation.cpp | 10 ++-------- src/lottie/lottiemodel.h | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index f7a929fd86..a6ba779d4a 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -40,12 +40,7 @@ size_t AnimationImpl::totalFrame() const size_t AnimationImpl::frameAtPos(double pos) const { - if (pos < 0) pos = 0; - if (pos > 1) pos = 1; - - if (mModel->isStatic()) return 0; - - return mModel->startFrame() + pos * mModel->frameDuration(); + return mModel->frameAtPos(pos); } VSize AnimationImpl::size() const @@ -63,8 +58,7 @@ const std::vector &AnimationImpl::renderList(size_t frameNo, const VS double AnimationImpl::duration() const { - if (mModel->isStatic()) return 0; - return double(mModel->frameDuration()) / double(mModel->frameRate()); + return mModel->duration(); } bool AnimationImpl::update(size_t frameNo, const VSize &size) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 3d0183f25e..7d61ebf11c 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -324,6 +324,16 @@ class LOTCompositionData : public LOTData { public: LOTCompositionData():LOTData(LOTData::Type::Composition){} + double duration() const { + return isStatic() ? startFrame() : + frameDuration() / frameRate(); // in second + } + size_t frameAtPos(double pos) const { + if (pos < 0) pos = 0; + if (pos > 1) pos = 1; + return isStatic() ? startFrame() : + startFrame() + pos * frameDuration(); + } long frameDuration() const {return mEndFrame - mStartFrame -1;} float frameRate() const {return mFrameRate;} long startFrame() const {return mStartFrame;} @@ -624,10 +634,12 @@ public: class LOTModel { public: - bool isStatic() const{return mRoot->isStatic();} - size_t frameDuration() {return mRoot->frameDuration();} - size_t frameRate() {return mRoot->frameRate();} - size_t startFrame() {return mRoot->startFrame();} + bool isStatic() const {return mRoot->isStatic();} + double duration() const {return mRoot->duration();} + size_t frameDuration() const {return mRoot->frameDuration();} + size_t frameRate() const {return mRoot->frameRate();} + size_t startFrame() const {return mRoot->startFrame();} + size_t frameAtPos(double pos) const {return mRoot->frameAtPos(pos);} public: std::shared_ptr mRoot; }; From 416adb599e5a9fef10b0e07ccb75a060c804a5aa Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 23 Oct 2018 09:09:49 +0900 Subject: [PATCH 274/672] lottie: make functions inline. Change-Id: I0e9a085071965c95fb4867e313260f8c0b051e24 --- src/lottie/lottieanimation.cpp | 44 ++++++++-------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index a6ba779d4a..86edc96404 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -11,16 +11,17 @@ using namespace lottie; class AnimationImpl { public: - void init(const std::shared_ptr &model); - bool update(size_t frameNo, const VSize &size); - VSize size() const; - double duration() const; - double frameRate() const; - size_t totalFrame() const; - size_t frameAtPos(double pos) const; - const std::vector &renderList(size_t frameNo, const VSize &size); - Surface render(size_t frameNo, const Surface &surface); + void init(const std::shared_ptr &model); + bool update(size_t frameNo, const VSize &size); + VSize size() const {return mCompItem->size();} + double duration() const {return mModel->duration();} + double frameRate() const {return mModel->frameRate();} + size_t totalFrame() const {return mModel->frameDuration();} + size_t frameAtPos(double pos) const {return mModel->frameAtPos(pos);} + Surface render(size_t frameNo, const Surface &surface); + const std::vector & + renderList(size_t frameNo, const VSize &size); private: std::string mFilePath; std::shared_ptr mModel; @@ -28,26 +29,6 @@ private: std::atomic mRenderInProgress; }; -double AnimationImpl::frameRate() const -{ - return mModel->frameRate(); -} - -size_t AnimationImpl::totalFrame() const -{ - return mModel->frameDuration(); -} - -size_t AnimationImpl::frameAtPos(double pos) const -{ - return mModel->frameAtPos(pos); -} - -VSize AnimationImpl::size() const -{ - return mCompItem->size(); -} - const std::vector &AnimationImpl::renderList(size_t frameNo, const VSize &size) { if (update(frameNo, size)) { @@ -56,11 +37,6 @@ const std::vector &AnimationImpl::renderList(size_t frameNo, const VS return mCompItem->renderList(); } -double AnimationImpl::duration() const -{ - return mModel->duration(); -} - bool AnimationImpl::update(size_t frameNo, const VSize &size) { if (frameNo > mModel->frameDuration()) From 4da0782f60960ecec679e163ec9ba52b1534b88f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 23 Oct 2018 09:46:20 +0900 Subject: [PATCH 275/672] lottie/feature: Added timeRemap feature implementation. Change-Id: I89df91f3cc709fa8fa392586218676770c0aac84 --- src/lottie/lottieitem.cpp | 10 +++++----- src/lottie/lottiemodel.h | 18 ++++++++++++++++++ src/lottie/lottieparser.cpp | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 25f39b1c2f..37b6a5a7ab 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -254,21 +254,21 @@ void LOTLayerItem::updateStaticProperty() mStatic = mPrecompLayer ? (mStatic & mPrecompLayer->isStatic()) : mStatic; } -void LOTLayerItem::update(int frameNo, const VMatrix &parentMatrix, +void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, float parentAlpha) { - mFrameNo = frameNo; + mFrameNo = mLayerData->timeRemap(frameNumber); // 1. check if the layer is part of the current frame if (!visible()) return; // 2. calculate the parent matrix and alpha - VMatrix m = matrix(frameNo); + VMatrix m = matrix(frameNo()); m *= parentMatrix; - float alpha = parentAlpha * opacity(frameNo); + float alpha = parentAlpha * opacity(frameNo()); // 6. update the mask if (hasMask()) { - for (auto &i : mMasks) i->update(frameNo, m, alpha, mDirtyFlag); + for (auto &i : mMasks) i->update(frameNo(), m, alpha, mDirtyFlag); } // 3. update the dirty flag based on the change diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 7d61ebf11c..00e84f645a 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -292,6 +292,7 @@ public: int solidWidth() const noexcept{return mSolidLayer.mWidth;} int solidHeight() const noexcept{return mSolidLayer.mHeight;} LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} + int timeRemap(int frameNo) const; public: struct SolidLayer { int mWidth{0}; @@ -318,6 +319,7 @@ public: bool mHasGradient{false}; bool mRoot{false}; std::vector> mMasks; + LOTCompositionData *mCompRef; }; class LOTCompositionData : public LOTData @@ -334,6 +336,9 @@ public: return isStatic() ? startFrame() : startFrame() + pos * frameDuration(); } + long frameAtTime(double timeInSec) const { + return isStatic() ? startFrame() : frameAtPos(timeInSec / duration()); + } long frameDuration() const {return mEndFrame - mStartFrame -1;} float frameRate() const {return mFrameRate;} long startFrame() const {return mStartFrame;} @@ -355,6 +360,19 @@ public: }; +/** + * TimeRemap has the value in time domain(in sec) + * To get the proper mapping first we get the mapped time at the current frame Number + * then we need to convert mapped time to frame number using the composition time line + * Ex: at frame 10 the mappend time is 0.5(500 ms) which will be convert to frame number + * 30 if the frame rate is 60. or will result to frame number 15 if the frame rate is 30. + */ +inline int LOTLayerData::timeRemap(int frameNo) const +{ + return mTimeRemap.isStatic() ? frameNo : + mCompRef->frameAtTime(mTimeRemap.value(frameNo)); +} + class LOTTransformData : public LOTData { public: diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 5902659988..4c625e0ff9 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -810,7 +810,7 @@ std::shared_ptr LottieParserImpl::parseLayer() layer->setStatic(staticFlag && layer->mTransform->isStatic() && !hasLayerRef); - + layer->mCompRef = compRef; return sharedLayer; } From 1f0986972362737bef2ed0ecc8d3576d69731c60 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 31 Oct 2018 16:57:55 +0900 Subject: [PATCH 276/672] lottie: Added TimeStreatch feature to lottie. Details: still some resources are not working ex:hiking.json need to find out what other properties also affected by time streatch property. Change-Id: I5846c74549e86f13606de5dd824fef00e2d5857a --- example/resource/walking.json | 2 +- src/lottie/lottieitem.cpp | 4 ++-- src/lottie/lottiemodel.h | 11 +++++++++-- src/lottie/lottieparser.cpp | 3 +++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/example/resource/walking.json b/example/resource/walking.json index 99e5d61d4a..344dd0666a 100755 --- a/example/resource/walking.json +++ b/example/resource/walking.json @@ -1 +1 @@ -{"v":"5.0.6","fr":60,"ip":0,"op":90,"w":200,"h":200,"nm":"walking","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,102,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.438,-16.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.66,4.158],[0.55,-0.255],[0.162,-0.111],[0,0],[0.052,-0.433],[0,0],[-0.72,-0.085],[-0.053,0],[-0.079,0.669],[0,0],[0,0]],"o":[[-0.122,0.001],[-0.175,0.062],[0,0],[-0.358,0.248],[0,0],[-0.083,0.72],[0.053,0.006],[0.656,0],[0,0],[0,0],[0,0]],"v":[[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-6.499,-11.32],[-7.142,-10.25],[-7.54,-4.643],[-6.387,-3.183],[-6.23,-3.174],[-4.926,-4.334],[-4.207,-9.214],[-2.379,-10.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.219,-10.875],"ix":2},"a":{"a":0,"k":[1.219,-15.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[-40],"e":[-71]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[-71],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[-40],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.091,-0.063],[0,0],[-0.282,0],[-0.276,0.395],[0.644,0.449],[0,0],[0,0],[0.035,0.064]],"o":[[0.074,0.082],[0,0],[0.247,0.175],[0.448,0],[0.447,-0.644],[0,0],[0,0],[-0.291,-1.581],[-4.465,2.376]],"v":[[4.208,-6.719],[4.455,-6.499],[8.738,-3.549],[9.55,-3.292],[10.717,-3.899],[10.366,-5.878],[6.496,-8.672],[4.938,-13.658],[1.653,-16.626]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.313,-10.375],"ix":2},"a":{"a":0,"k":[1.313,-15.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[40],"e":[78]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[78],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[40],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":126,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":135,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":153,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":171,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.063,2.75],"ix":2},"a":{"a":0,"k":[-0.063,-2.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[-42],"e":[-57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":126,"s":[-57],"e":[-59]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[-59],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[-25],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[4],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":108,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":126,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":135,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":153,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":171,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"t":180}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.094,3.281],"ix":2},"a":{"a":0,"k":[1.094,-1.719],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[34],"e":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":126,"s":[64],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":135,"s":[60],"e":[18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":153,"s":[18],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[4],"e":[0]},{"t":180}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.013,0.152],[0,0],[-0.091,-0.063],[1.678,0.136],[0.55,-0.255],[0.162,-0.111],[0,0],[0,0],[-0.022,-0.203],[-1.843,0.062]],"o":[[0.034,-0.145],[0,0],[0.074,0.082],[0,0],[-0.65,-0.052],[-0.175,0.062],[0,0],[0,0],[-0.018,0.211],[0,0],[1.843,-0.062]],"v":[[3.59,-2.105],[3.664,-2.552],[4.208,-6.719],[4.455,-6.499],[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-2.379,-10.24],[-2.626,-3.062],[-2.616,-2.439],[0.782,2.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":90,"op":690,"st":90,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,102,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.438,-16.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.66,4.158],[0.55,-0.255],[0.162,-0.111],[0,0],[0.052,-0.433],[0,0],[-0.72,-0.085],[-0.053,0],[-0.079,0.669],[0,0],[0,0]],"o":[[-0.122,0.001],[-0.175,0.062],[0,0],[-0.358,0.248],[0,0],[-0.083,0.72],[0.053,0.006],[0.656,0],[0,0],[0,0],[0,0]],"v":[[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-6.499,-11.32],[-7.142,-10.25],[-7.54,-4.643],[-6.387,-3.183],[-6.23,-3.174],[-4.926,-4.334],[-4.207,-9.214],[-2.379,-10.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.219,-10.875],"ix":2},"a":{"a":0,"k":[1.219,-15.875],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[-40],"e":[-71]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[-71],"e":[-40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[-40],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.091,-0.063],[0,0],[-0.282,0],[-0.276,0.395],[0.644,0.449],[0,0],[0,0],[0.035,0.064]],"o":[[0.074,0.082],[0,0],[0.247,0.175],[0.448,0],[0.447,-0.644],[0,0],[0,0],[-0.291,-1.581],[-4.465,2.376]],"v":[[4.208,-6.719],[4.455,-6.499],[8.738,-3.549],[9.55,-3.292],[10.717,-3.899],[10.366,-5.878],[6.496,-8.672],[4.938,-13.658],[1.653,-16.626]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.313,-10.375],"ix":2},"a":{"a":0,"k":[1.313,-15.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[40],"e":[78]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[78],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[40],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-13.908,5.842],[-14.222,8.524],[-13.282,8.855],[-12.04,9.012],[-4.151,10.956],[-3.306,10.456],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-9.071,14.817],[-8.832,16.934],[-7.892,17.265],[-6.713,16.695],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-8.141,13.802],[-7.902,15.92],[-6.961,16.251],[-5.783,15.681],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}],"e":[{"i":[[7.053,-0.748],[0,0],[0,0],[-0.65,-0.519],[-0.331,0],[-0.297,0.374],[0,0],[-0.065,0.158],[0,0]],"o":[[-0.072,-0.061],[0,0],[-0.519,0.651],[0.277,0.222],[0.441,0],[0,0],[0.106,-0.134],[0,0],[0,0]],"v":[[-2.616,-2.439],[-5.683,6.781],[-10.646,13.483],[-10.407,15.601],[-9.466,15.932],[-8.288,15.362],[-2.648,8.873],[-2.389,8.435],[0.782,2.375]],"c":true}]},{"t":90}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.063,2.75],"ix":2},"a":{"a":0,"k":[-0.063,-2.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[-42]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[-42],"e":[-57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[-57],"e":[-59]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[-59],"e":[-25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[-25],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[4],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":18,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.788,14.342],[11.253,15.428],[11.706,15.362],[12.724,13.443]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":63,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[-0.146,0.395]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.884,7.314],[9.099,6.616],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[1.131,14.888],[2.597,15.974],[3.049,15.908],[4.628,14.457]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":81,"s":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[9.722,13.827],[11.188,14.913],[11.64,14.846],[12.659,12.927]],"c":true}],"e":[{"i":[[0,0],[0.101,0.149],[0,0],[-0.007,0.021],[0,0],[0,0],[0,0],[-0.656,0],[-0.15,0.046],[0.248,0.813]],"o":[[-0.054,-0.172],[0,0],[0.034,-0.145],[-5.804,0.458],[0,0],[0,0],[0.201,0.661],[0.149,0],[0.811,-0.248],[0,0]],"v":[[8.566,6.553],[8.333,6.066],[3.59,-2.105],[3.664,-2.552],[0.782,2.375],[5.127,7.892],[7.725,15.592],[9.191,16.678],[9.643,16.612],[10.662,14.693]],"c":true}]},{"t":90}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.094,3.281],"ix":2},"a":{"a":0,"k":[1.094,-1.719],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[34]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[34],"e":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":36,"s":[64],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[60],"e":[18]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":63,"s":[18],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":81,"s":[4],"e":[0]},{"t":90}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.013,0.152],[0,0],[-0.091,-0.063],[1.678,0.136],[0.55,-0.255],[0.162,-0.111],[0,0],[0,0],[-0.022,-0.203],[-1.843,0.062]],"o":[[0.034,-0.145],[0,0],[0.074,0.082],[0,0],[-0.65,-0.052],[-0.175,0.062],[0,0],[0,0],[-0.018,0.211],[0,0],[1.843,-0.062]],"v":[[3.59,-2.105],[3.664,-2.552],[4.208,-6.719],[4.455,-6.499],[1.653,-16.626],[-0.169,-16.3],[-0.678,-16.043],[-2.379,-10.24],[-2.626,-3.062],[-2.616,-2.439],[0.782,2.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.2.0","fr":30,"ip":0,"op":23,"w":200,"h":200,"nm":"walking_lottie2","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Arm front","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.824],"y":[0.888]},"o":{"x":[0.253],"y":[0.288]},"n":["0p824_0p888_0p253_0p288"],"t":0,"s":[0],"e":[52.03]},{"i":{"x":[0.833],"y":[0.837]},"o":{"x":[0.188],"y":[0.296]},"n":["0p833_0p837_0p188_0p296"],"t":18.615,"s":[52.03],"e":[78]},{"i":{"x":[0.718],"y":[6.132]},"o":{"x":[0.158],"y":[1.651]},"n":["0p718_6p132_0p158_1p651"],"t":41.5,"s":[78],"e":[80]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[25.234,20.066,0],"e":[24.434,20.416,0],"to":[-0.13333334028721,0.05833333358169,0],"ti":[0.13333334028721,-0.05833333358169,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[25.234,20.066,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[100,109,100]},{"t":60.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-2.467,-3.971],[-1.325,0.482],[0.498,1.834],[0.999,3.289],[2.487,-1.104],[-0.843,-1.506]],"o":[[1.385,2.229],[1.27,-0.462],[-0.968,-3.563],[-0.592,-1.949],[-2.319,1.029],[2.566,4.585]],"v":[[6.977,-13.958],[11.185,-12.062],[12.237,-16.339],[8.878,-27.206],[3.03,-30.334],[0.844,-24.514]],"c":true}],"e":[{"i":[[-2.467,-3.971],[-1.325,0.482],[0.619,1.797],[1.209,3.191],[2.584,-0.786],[-0.866,-1.493]],"o":[[1.385,2.229],[1.27,-0.462],[-1.204,-3.493],[-0.721,-1.905],[-2.427,0.738],[2.628,4.531]],"v":[[7.114,-14.006],[11.185,-12.062],[12.237,-16.339],[8.366,-27.055],[3.03,-30.334],[0.844,-24.514]],"c":true}]},{"t":60.5}],"ix":2},"nm":"r_arm","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Arm front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Elbow front","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1.059]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1p059_0p167_0p167"],"t":0,"s":[0],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.062]},"n":["0p833_0p833_0p167_0p062"],"t":18.615,"s":[19],"e":[-22]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[31.234,33.516,0],"ix":2},"a":{"a":0,"k":[31.234,33.516,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-1.001,-0.7],[0,0],[-1.185,1.671],[1.212,0.847],[2.498,1.759],[1.008,-1.186]],"o":[[2.846,1.992],[0.466,0.328],[0.853,-1.204],[0,0],[-1.079,-0.76],[-1.119,1.316]],"v":[[8.434,-12.16],[16.389,-6.575],[20.191,-7.347],[19.529,-11.076],[12.238,-16.339],[7.809,-16.014]],"c":true}],"e":[{"i":[[-1.001,-0.7],[0,0],[-0.952,1.247],[1.212,0.847],[2.498,1.759],[1.008,-1.186]],"o":[[2.846,1.992],[0.466,0.328],[0.675,-0.885],[0,0],[-1.079,-0.76],[-1.119,1.316]],"v":[[8.434,-12.16],[17.463,-5.872],[20.511,-6.508],[19.98,-9.593],[12.019,-16],[7.809,-16.014]],"c":true}]},{"t":60.5}],"ix":2},"nm":"r_hand","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Elbow front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Arm Back","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.842],"y":[0.879]},"o":{"x":[0.249],"y":[0.253]},"n":["0p842_0p879_0p249_0p253"],"t":0,"s":[0],"e":[-60]},{"i":{"x":[0.838],"y":[0.908]},"o":{"x":[0.162],"y":[0.295]},"n":["0p838_0p908_0p162_0p295"],"t":18.615,"s":[-60],"e":[-91]},{"i":{"x":[0.756],"y":[-0.317]},"o":{"x":[0.167],"y":[-0.206]},"n":["0p756_-0p317_0p167_-0p206"],"t":41.419,"s":[-91],"e":[-79]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[23.609,20.141,0],"e":[25.809,21.041,0],"to":[0.36666667461395,0.15000000596046,0],"ti":[-0.36666667461395,-0.15000000596046,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[23.559,20.141,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[89,89,100]},{"t":60.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.098,1.659],[1.912,-1.556],[1.466,-1.268],[-0.759,-1.09],[-0.939,0.554],[-0.967,0.893]],"o":[[-0.896,-1.354],[-3.827,3.114],[-0.704,0.608],[0.656,0.942],[1.133,-0.669],[1.613,-1.489]],"v":[[4.838,-29.564],[-1.502,-30.049],[-12.756,-20.862],[-13.105,-17.24],[-9.45,-16.534],[3.942,-23.94]],"c":true},"ix":2},"nm":"l_arm","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Arm Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Elbow Back","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.137],"y":[0.186]},"n":["0p667_1_0p137_0p186"],"t":0,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18.615,"s":[40],"e":[40]},{"i":{"x":[0.831],"y":[0.764]},"o":{"x":[0.333],"y":[0]},"n":["0p831_0p764_0p333_0"],"t":41.419,"s":[40],"e":[19]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[10.684,28.939,0],"ix":2},"a":{"a":0,"k":[10.684,28.939,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[105,105,100]},{"t":60.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[2.129,0.244],[0.078,-1.09],[0.214,-3.524],[-1.164,-0.086],[-0.234,1.66],[-0.414,3.179]],"o":[[-1.997,-0.229],[-0.259,3.607],[-0.088,1.443],[1.269,0.093],[0.418,-2.972],[0.177,-1.357]],"v":[[-10.343,-21.775],[-13.456,-19.237],[-14.202,-8.747],[-12.034,-5.997],[-9.281,-8.165],[-7.775,-18.559]],"c":true}],"e":[{"i":[[2.129,0.244],[0.078,-1.09],[0.214,-3.524],[-1.164,-0.086],[-0.234,1.66],[-0.414,3.179]],"o":[[-1.997,-0.229],[-0.259,3.607],[-0.088,1.443],[1.269,0.093],[0.418,-2.972],[0.177,-1.357]],"v":[[-10.343,-21.775],[-13.456,-19.237],[-14.278,-8.773],[-11.884,-6.006],[-8.659,-8.292],[-7.553,-18.455]],"c":true}]},{"t":60.5}],"ix":2},"nm":"l_hand","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Elbow Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Thigh Front","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.897]},"o":{"x":[0.238],"y":[0.242]},"n":["0p833_0p897_0p238_0p242"],"t":0,"s":[0],"e":[-42]},{"i":{"x":[0.836],"y":[0.904]},"o":{"x":[0.167],"y":[0.333]},"n":["0p836_0p904_0p167_0p333"],"t":18.615,"s":[-42],"e":[-58]},{"i":{"x":[0.845],"y":[21300043.174]},"o":{"x":[0.147],"y":[8734441.235]},"n":["0p845_21300043p174_0p147_8734441p235"],"t":41.5,"s":[-58],"e":[-58]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[21.834,43.741,0],"e":[21.834,43.441,0],"to":[0,-0.05000000074506,0],"ti":[0,0.05000000074506,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[21.834,43.741,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-4.9,-4.622],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true},"ix":2},"nm":"R_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Leg Front","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.127],"y":[0.19]},"n":["0p667_1_0p127_0p19"],"t":0,"s":[0],"e":[54]},{"i":{"x":[0.805],"y":[0.993]},"o":{"x":[0.333],"y":[0]},"n":["0p805_0p993_0p333_0"],"t":18.615,"s":[54],"e":[-3.419]},{"i":{"x":[0.752],"y":[0.1]},"o":{"x":[0.196],"y":[-0.057]},"n":["0p752_0p1_0p196_-0p057"],"t":41.5,"s":[-3.419],"e":[2.5]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[13.884,62.316,0],"e":[13.428,63.19,0],"to":[-0.07598020881414,0.14574256539345,0],"ti":[0.07598020881414,-0.14574256539345,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[13.884,62.316,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.857,1.296],[0.872,-1.201],[0,0],[-1.227,-0.977],[-0.619,0],[-0.562,0.702],[-3.613,4.33]],"o":[[-1.839,-1.283],[-3.081,4.247],[-0.979,1.229],[0.523,0.415],[0.836,0],[0,0],[0.907,-1.088]],"v":[[-5.65,11.629],[-10.708,12.773],[-20.055,25.4],[-19.605,29.391],[-17.837,30.014],[-15.611,28.941],[-4.676,16.291]],"c":true},"ix":2},"nm":"Leg front","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"R_foot","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"torso","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[502.643,499.348,0],"e":[502.643,490.047,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":21,"s":[502.643,490.047,0],"e":[502.643,499.348,0],"to":[0,0,0],"ti":[0,0,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[21.284,39.916,0],"ix":1},"s":{"a":0,"k":[1000,1000,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.025,0.287],[0,0],[0,0],[3.159,0.256],[1.038,-0.48],[0.387,-0.281],[0,0],[0,0],[-0.045,-0.383],[-4.037,-0.099]],"o":[[0.065,-0.274],[0,0],[0.141,0.154],[-0.549,-2.977],[-1.225,-0.098],[-0.329,0.116],[-2.963,3.919],[0,0],[-0.033,0.396],[0,0],[4.013,0.098]],"v":[[6.764,-3.965],[6.902,-4.809],[7.928,-12.659],[9.303,-25.73],[3.115,-31.324],[-0.32,-30.709],[-1.277,-30.224],[-4.482,-19.29],[-4.949,-5.766],[-4.926,-4.596],[0.872,1.323]],"c":true},"ix":2},"nm":"torso","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"torso","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Thigh Back","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.849]},"o":{"x":[0.251],"y":[0.192]},"n":["0p833_0p849_0p251_0p192"],"t":0,"s":[0],"e":[27.02]},{"i":{"x":[0.833],"y":[0.901]},"o":{"x":[0.167],"y":[0.182]},"n":["0p833_0p901_0p167_0p182"],"t":18.615,"s":[27.02],"e":[54.62]},{"i":{"x":[0.758],"y":[3.564]},"o":{"x":[0.167],"y":[0.956]},"n":["0p758_3p564_0p167_0p956"],"t":41.419,"s":[54.62],"e":[57]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[21.834,43.916,0],"e":[21.584,43.116,0],"to":[-0.04166666790843,-0.13333334028721,0],"ti":[0.04166666790843,0.13333334028721,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[21.834,43.916,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.188,-1.209],[1.472,4.473],[9.661,14.867],[14.376,16.249]],"c":true},"ix":2},"nm":"l_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Leg Back","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.992]},"o":{"x":[0.116],"y":[0.359]},"n":["0p833_0p992_0p116_0p359"],"t":0,"s":[0],"e":[-14]},{"i":{"x":[0.752],"y":[0.621]},"o":{"x":[0.167],"y":[-0.004]},"n":["0p752_0p621_0p167_-0p004"],"t":41.419,"s":[-14],"e":[-1]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[34.209,61.291,0],"ix":2},"a":{"a":0,"k":[34.209,61.291,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.449,5.274],[2.016,-0.941],[-0.516,-1.524],[0,0],[-1.238,0],[-0.282,0.085],[0.468,1.529]],"o":[[-0.424,-1.544],[-1.718,0.802],[1.65,4.878],[0.381,1.245],[0.282,0],[1.529,-0.468],[0,0]],"v":[[16.137,12.346],[11.679,10.269],[9.66,14.868],[14.551,29.374],[17.315,31.422],[18.165,31.296],[20.085,27.682]],"c":true},"ix":2},"nm":"l_foot","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Leg back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"head","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.334,16.966,0],"ix":2},"a":{"a":0,"k":[24.334,16.966,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.955,0.722],[0.719,3.946],[3.946,-0.716],[-0.708,-3.944]],"o":[[3.937,-0.71],[-0.708,-3.948],[-3.949,0.709],[0.716,3.945]],"v":[[1.297,7.139],[7.139,-1.293],[-1.294,-7.145],[-7.15,1.292]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.298,8.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"walking_1000","refId":"comp_0","sr":0.37999999523163,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[97.5,99,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[22.2,22.2,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":478.799993991852,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 37b6a5a7ab..36a69d96b7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -257,7 +257,7 @@ void LOTLayerItem::updateStaticProperty() void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, float parentAlpha) { - mFrameNo = mLayerData->timeRemap(frameNumber); + mFrameNo = frameNumber; // 1. check if the layer is part of the current frame if (!visible()) return; @@ -399,7 +399,7 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const void LOTCompLayerItem::updateContent() { for (const auto &layer : mLayers) { - layer->update(frameNo(), combinedMatrix(), combinedAlpha()); + layer->update( mLayerData->timeRemap(frameNo()), combinedMatrix(), combinedAlpha()); } } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 00e84f645a..34c4995489 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -369,8 +369,15 @@ public: */ inline int LOTLayerData::timeRemap(int frameNo) const { - return mTimeRemap.isStatic() ? frameNo : - mCompRef->frameAtTime(mTimeRemap.value(frameNo)); + frameNo = mTimeRemap.isStatic() ? frameNo : + mCompRef->frameAtTime(mTimeRemap.value(frameNo)); + /* Apply time streatch if it has any. + * Time streatch is just a factor by which the animation will speedup or slow + * down with respect to the overal animation. + * Time streach factor is already applied to the layers inFrame and outFrame. + * @TODO need to find out if timestreatch also affects the in and out frame of the + * child layers or not. */ + return frameNo / mTimeStreatch; } class LOTTransformData : public LOTData diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 4c625e0ff9..bdc3028bb5 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -798,6 +798,7 @@ std::shared_ptr LottieParserImpl::parseLayer() Skip(key); } } + // update the static property of layer bool staticFlag = true; for (const auto& child : layer->mChildren) { @@ -1895,6 +1896,8 @@ public: << ", mask:"<hasMask() << ", inFm:" << obj->mInFrame << ", outFm:" << obj->mOutFrame + << ", stFm:" << obj->mStartFrame + << ", ts:" << obj->mTimeStreatch << "\n"; visitChildren(static_cast(obj), level); vDebug << level From 1297e1162fcf2e8266c67238615a5aef85fea45c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 31 Oct 2018 17:18:55 +0900 Subject: [PATCH 277/672] lottie: take startFrame of composition layer into account while updating children layers. Change-Id: I693d18d8ba5757030f8166c263641ad900b8d835 --- src/lottie/lottieitem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 36a69d96b7..0df4247298 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -399,7 +399,8 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const void LOTCompLayerItem::updateContent() { for (const auto &layer : mLayers) { - layer->update( mLayerData->timeRemap(frameNo()), combinedMatrix(), combinedAlpha()); + layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(), + combinedMatrix(), combinedAlpha()); } } From 3edf19165b56bc25f46b4c669bbb7d43ce1655ae Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 1 Nov 2018 10:18:02 +0900 Subject: [PATCH 278/672] lottie: Fix the issue of assuming the startframe of composition is always zero. use the start and end frame instead. Change-Id: I16cee8b8fbf651faa8c736d979bab51a07dbfa4d --- src/lottie/lottieanimation.cpp | 7 +++++-- src/lottie/lottiemodel.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 86edc96404..f0086a6c2a 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -39,8 +39,11 @@ const std::vector &AnimationImpl::renderList(size_t frameNo, const VS bool AnimationImpl::update(size_t frameNo, const VSize &size) { - if (frameNo > mModel->frameDuration()) - frameNo = mModel->frameDuration(); + if (frameNo > mModel->endFrame()) + frameNo = mModel->endFrame(); + + if (frameNo < mModel->startFrame()) + frameNo = mModel->startFrame(); mCompItem->resize(size); return mCompItem->update(frameNo); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 34c4995489..d0a2e4cdd3 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -664,6 +664,7 @@ public: size_t frameDuration() const {return mRoot->frameDuration();} size_t frameRate() const {return mRoot->frameRate();} size_t startFrame() const {return mRoot->startFrame();} + size_t endFrame() const {return mRoot->endFrame();} size_t frameAtPos(double pos) const {return mRoot->frameAtPos(pos);} public: std::shared_ptr mRoot; From 5265f844b97923bf835e0f7d3a29ea96891bc4e9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 1 Nov 2018 10:57:14 +0900 Subject: [PATCH 279/672] lottie/vector: added new addroundrect api with uniform roundness of corner. Change-Id: Id6584d3b4fc4b81f2407ba66cafca4b6521d7fd8 --- src/vector/vpath.cpp | 8 ++++++++ src/vector/vpath.h | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 7d6701c282..0f246d9000 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -215,6 +215,14 @@ void VPath::VPathData::addRect(const VRectF &rect, VPath::Direction dir) } } +void VPath::VPathData::addRoundRect(const VRectF &rect, float roundness, + VPath::Direction dir) +{ + if (2 * roundness > rect.width()) roundness = rect.width()/2.0; + if (2 * roundness > rect.height()) roundness = rect.height()/2.0; + addRoundRect(rect, roundness, roundness, dir); +} + void VPath::VPathData::addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir) { diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 567d99c8a6..6a22225329 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -33,6 +33,8 @@ public: void addOval(const VRectF &rect, VPath::Direction dir = Direction::CW); void addRoundRect(const VRectF &rect, float rx, float ry, VPath::Direction dir = Direction::CW); + void addRoundRect(const VRectF &rect, float roundness, + VPath::Direction dir = Direction::CW); void addRect(const VRectF &rect, VPath::Direction dir = Direction::CW); void addPolystar(float points, float innerRadius, float outerRadius, float innerRoundness, float outerRoundness, @@ -62,6 +64,7 @@ private: void transform(const VMatrix &m); float length() const; void addRoundRect(const VRectF &, float, float, VPath::Direction); + void addRoundRect(const VRectF &, float, VPath::Direction); void addRect(const VRectF &, VPath::Direction); void arcTo(const VRectF &, float, float, bool); void addCircle(float, float, float, VPath::Direction); @@ -174,6 +177,12 @@ inline void VPath::addRoundRect(const VRectF &rect, float rx, float ry, d.write().addRoundRect(rect, rx, ry, dir); } +inline void VPath::addRoundRect(const VRectF &rect, float roundness, + VPath::Direction dir) +{ + d.write().addRoundRect(rect, roundness, dir); +} + inline void VPath::addCircle(float cx, float cy, float radius, VPath::Direction dir) { From b5248f473a3930862855509c6c558ebb784a41ff Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 1 Nov 2018 10:58:37 +0900 Subject: [PATCH 280/672] lottie: Use the new addroundrect api to get uniform corner as expected from AE. Change-Id: Ifcc1486a530d6ddd195bf45a4ea7bf4a4c8ddaa7 --- src/lottie/lottieitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 0df4247298..0249becdaf 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -692,7 +692,7 @@ void LOTRectItem::updatePath(VPath& path, int frameNo) size.y()); path.reset(); - path.addRoundRect(r, roundness, roundness, mData->direction()); + path.addRoundRect(r, roundness, mData->direction()); updateCache(frameNo, pos, size, roundness); } From 5fedd3479d2ed91db051f84a9d87601a9218c456 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 1 Nov 2018 10:59:36 +0900 Subject: [PATCH 281/672] lottie: added new resource from UX. Change-Id: I22e3866f23354afecc9620982cdcc1ff1a2e5ef9 --- example/resource/cue_lottie2.json | 1 + 1 file changed, 1 insertion(+) create mode 100755 example/resource/cue_lottie2.json diff --git a/example/resource/cue_lottie2.json b/example/resource/cue_lottie2.json new file mode 100755 index 0000000000..6cb870242a --- /dev/null +++ b/example/resource/cue_lottie2.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":60,"ip":68,"op":140,"w":360,"h":360,"nm":"cue_lottie2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[0],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":73,"s":[10],"e":[-8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":76,"s":[-8],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":82,"s":[0],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":85,"s":[10],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":115,"s":[0],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[10],"e":[-8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":123,"s":[-8],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":129,"s":[0],"e":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":132,"s":[10],"e":[0]},{"t":140}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":68,"s":[180,338.75,0],"e":[180,328.75,0],"to":[0,-1.66666662693024,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":76,"s":[180,328.75,0],"e":[180,338.75,0],"to":[0,0,0],"ti":[0,-0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":82,"s":[180,338.75,0],"e":[180,333.75,0],"to":[0,0.83333331346512,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":88,"s":[180,333.75,0],"e":[180,338.75,0],"to":[0,0,0],"ti":[0,-0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":93,"s":[180,338.75,0],"e":[180,338.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":115,"s":[180,338.75,0],"e":[180,328.75,0],"to":[0,-1.66666662693024,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":123,"s":[180,328.75,0],"e":[180,338.75,0],"to":[0,0,0],"ti":[0,-0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":129,"s":[180,338.75,0],"e":[180,333.75,0],"to":[0,0.83333331346512,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":135,"s":[180,333.75,0],"e":[180,338.75,0],"to":[0,0,0],"ti":[0,-0.83333331346512,0]},{"t":140}],"ix":2},"a":{"a":0,"k":[0,140,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[51.5,11],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,140],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":901,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 83b433d4e4cc98f29dd3c113ee620f62d03dd512 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 5 Nov 2018 17:04:07 +0900 Subject: [PATCH 282/672] lottianimation: fix incorrect animation in time stretch. Instead of applying startFrame at frameAtPos() but applied it at update() in generic way. This change could make apis useful at both raw frame control and normalized frame controls. This fixes "cue" animation sample. Change-Id: I0adfd73410291cdee95455b18ef8720482c81090 --- src/lottie/lottieanimation.cpp | 2 ++ src/lottie/lottiemodel.h | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index f0086a6c2a..2e9cd17e3e 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -39,6 +39,8 @@ const std::vector &AnimationImpl::renderList(size_t frameNo, const VS bool AnimationImpl::update(size_t frameNo, const VSize &size) { + frameNo += mModel->startFrame(); + if (frameNo > mModel->endFrame()) frameNo = mModel->endFrame(); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index d0a2e4cdd3..3550b21dfc 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -333,8 +333,7 @@ public: size_t frameAtPos(double pos) const { if (pos < 0) pos = 0; if (pos > 1) pos = 1; - return isStatic() ? startFrame() : - startFrame() + pos * frameDuration(); + return isStatic() ? 0 : pos * frameDuration(); } long frameAtTime(double timeInSec) const { return isStatic() ? startFrame() : frameAtPos(timeInSec / duration()); From a30e5fe28ec7acd66bb08249e6f8a35c5f3494f8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 9 Nov 2018 10:16:24 +0900 Subject: [PATCH 283/672] lottie: Take care of parentAlpha when drawing with gradient. Change-Id: Iacdf1df1010a8afe69d15dffa5793791aabc4fef --- src/lottie/lottieitem.cpp | 2 ++ src/vector/vbrush.h | 3 +++ src/vector/vdrawhelper.cpp | 15 ++++++++------- src/vector/vglobal.h | 9 +++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 0249becdaf..cb7a2ad8e8 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -851,6 +851,7 @@ void LOTGFillItem::updateContent(int frameNo) void LOTGFillItem::updateRenderNode() { + mGradient->setAlpha(parentAlpha()); mDrawable->setBrush(VBrush(mGradient.get())); mDrawable->setFillRule(mFillRule); } @@ -926,6 +927,7 @@ void LOTGStrokeItem::updateContent(int frameNo) void LOTGStrokeItem::updateRenderNode() { float scale = getScale(mGradient->mMatrix); + mGradient->setAlpha(parentAlpha()); mDrawable->setBrush(VBrush(mGradient.get())); mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index ca03a1dce0..9a31715352 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -17,6 +17,8 @@ public: enum class Type { Linear, Radial }; VGradient(VGradient::Type type); void setStops(const VGradientStops &stops); + void setAlpha(float alpha) {mAlpha = alpha;} + float alpha() const {return mAlpha;} VGradient() = default; public: @@ -25,6 +27,7 @@ public: VGradient::Spread mSpread; VGradient::Mode mMode; VGradientStops mStops; + float mAlpha{1.0}; union { struct { float x1, y1, x2, y2; diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 90f20ebb88..2deb2aaf33 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -15,17 +15,16 @@ public: typedef std::unordered_multimap> VGradientColorTableHash; - bool generateGradientColorTable(const VGradientStops &stops, + bool generateGradientColorTable(const VGradientStops &stops, float alpha, uint32_t *colorTable, int size); inline const std::shared_ptr getBuffer( const VGradient &gradient) { uint64_t hash_val = 0; std::shared_ptr info; - const VGradientStops &stops = gradient.mStops; for (uint i = 0; i < stops.size() && i <= 2; i++) - hash_val += stops[i].second.premulARGB(); + hash_val += (stops[i].second.premulARGB() * gradient.alpha()); cacheAccess.lock(); @@ -72,7 +71,7 @@ protected: } auto cache_entry = std::make_shared(gradient.mStops); cache_entry->alpha = generateGradientColorTable( - gradient.mStops, cache_entry->buffer32, VGradient::colorTableSize); + gradient.mStops, gradient.alpha(), cache_entry->buffer32, VGradient::colorTableSize); cache.insert(std::make_pair(hash_val, cache_entry)); return cache_entry; } @@ -81,7 +80,7 @@ protected: std::mutex cacheAccess; }; -bool VGradientCache::generateGradientColorTable(const VGradientStops &stops, +bool VGradientCache::generateGradientColorTable(const VGradientStops &stops, float opacity, uint32_t *colorTable, int size) { int dist, idist, pos = 0, i; @@ -91,10 +90,12 @@ bool VGradientCache::generateGradientColorTable(const VGradientStops &stops, uint32_t curColor, nextColor; float delta, t, incr, fpos; + if (!vCompare(opacity, 1.0f)) alpha = true; + start = stops.data(); curr = start; if (!curr->second.isOpaque()) alpha = true; - curColor = curr->second.premulARGB(); + curColor = curr->second.premulARGB(opacity); incr = 1.0 / (float)size; fpos = 1.5 * incr; @@ -111,7 +112,7 @@ bool VGradientCache::generateGradientColorTable(const VGradientStops &stops, next = (start + i + 1); delta = 1 / (next->first - curr->first); if (!next->second.isOpaque()) alpha = true; - nextColor = next->second.premulARGB(); + nextColor = next->second.premulARGB(opacity); while (fpos < next->first && pos < size) { t = (fpos - curr->first) * delta; dist = (int)(255 * t); diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index d9cd17c3fc..87438cf237 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -259,6 +259,15 @@ public: return uint((a << 24) | (pr << 16) | (pg << 8) | (pb)); } + uint premulARGB(float opacity) const + { + int alpha = a * opacity; + int pr = (r * alpha) / 255; + int pg = (g * alpha) / 255; + int pb = (b * alpha) / 255; + return uint((alpha << 24) | (pr << 16) | (pg << 8) | (pb)); + } + public: uchar a; uchar r; From c3a7b9f53f050b25bff1ac680748b67cd9c38bff Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 9 Nov 2018 10:50:00 +0900 Subject: [PATCH 284/672] lottie: update LOTNode with the gradient stop value. Change-Id: I85f882418d66341f2667428e293364e2cd916a9e --- inc/lottiecommon.h | 8 ++++++++ src/lottie/lottieitem.cpp | 29 ++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 22400e6a39..dd65f9b7fd 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -71,6 +71,12 @@ typedef enum GradientRadial } LOTGradientType; +typedef struct +{ + float pos; + unsigned char r, g, b, a; +}GradientStop; + typedef struct LOTNode { #define ChangeFlagNone 0x0000 @@ -101,6 +107,8 @@ typedef struct LOTNode { struct { LOTGradientType type; + GradientStop *stopPtr; + unsigned int stopCount; struct { float x, y; } start, end, center, focal; diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index cb7a2ad8e8..bf9ffac63b 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -992,9 +992,34 @@ void LOTRepeaterItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/, void LOTRepeaterItem::renderList(std::vector &/*list*/) {} +static void updateGStops(LOTNode *n, const VGradient *grad) +{ + if (grad->mStops.size() != n->mGradient.stopCount) { + if (n->mGradient.stopCount) + free(n->mGradient.stopPtr); + n->mGradient.stopCount = grad->mStops.size(); + n->mGradient.stopPtr = (GradientStop *) malloc(n->mGradient.stopCount * sizeof(GradientStop)); + } + + GradientStop *ptr = n->mGradient.stopPtr; + for (const auto &i : grad->mStops) { + ptr->pos = i.first; + ptr->a = i.second.alpha() * grad->alpha(); + ptr->r = i.second.red(); + ptr->g = i.second.green(); + ptr->b = i.second.blue(); + ptr++; + } + +} + void LOTDrawable::sync() { - if (!mCNode) mCNode = std::make_unique(); + if (!mCNode) { + mCNode = std::make_unique(); + mCNode->mGradient.stopPtr = nullptr; + mCNode->mGradient.stopCount = 0; + } mCNode->mFlag = ChangeFlagNone; if (mFlag & DirtyState::None) return; @@ -1077,6 +1102,7 @@ void LOTDrawable::sync() mCNode->mGradient.start.y = mBrush.mGradient->linear.y1; mCNode->mGradient.end.x = mBrush.mGradient->linear.x2; mCNode->mGradient.end.y = mBrush.mGradient->linear.y2; + updateGStops(mCNode.get(), mBrush.mGradient); break; case VBrush::Type::RadialGradient: mCNode->mType = LOTBrushType::BrushGradient; @@ -1087,6 +1113,7 @@ void LOTDrawable::sync() mCNode->mGradient.focal.y = mBrush.mGradient->radial.fy; mCNode->mGradient.cradius = mBrush.mGradient->radial.cradius; mCNode->mGradient.fradius = mBrush.mGradient->radial.fradius; + updateGStops(mCNode.get(), mBrush.mGradient); break; default: break; From 557d3ae594d1e1b3303517b8b6fc203617d927cf Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 9 Nov 2018 20:18:37 +0900 Subject: [PATCH 285/672] interface: updated Graident structure naming. Change-Id: Ib4b316afd353b0c4762c051bae0f3f277393cac2 --- example/lottieview.cpp | 4 ++-- inc/lottiecommon.h | 8 ++++---- src/lottie/lottieitem.cpp | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index bc7eb40c6f..be9f2a1c19 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -60,7 +60,7 @@ void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) //evas_vg_shape_stroke_meter_limit_set(shape, node->mStroke.meterLimit); } // update paint info - if (node->mType == LOTBrushType::BrushSolid) { + if (node->mBrushType == LOTBrushType::BrushSolid) { int r = (node->mColor.r * node->mColor.a)/255; int g = (node->mColor.g * node->mColor.a)/255; int b = (node->mColor.b * node->mColor.a)/255; @@ -71,7 +71,7 @@ void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) evas_vg_node_color_set(shape, r, g, b, a); } - } else if (node->mType == LOTBrushType::BrushGradient) { + } else if (node->mBrushType == LOTBrushType::BrushGradient) { //TODO fill the gradient info } } diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index dd65f9b7fd..48db67e10e 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -71,11 +71,11 @@ typedef enum GradientRadial } LOTGradientType; -typedef struct +typedef struct LOTGradientStop { float pos; unsigned char r, g, b, a; -}GradientStop; +} LOTGradientStop; typedef struct LOTNode { @@ -107,7 +107,7 @@ typedef struct LOTNode { struct { LOTGradientType type; - GradientStop *stopPtr; + LOTGradientStop *stopPtr; unsigned int stopCount; struct { float x, y; @@ -117,7 +117,7 @@ typedef struct LOTNode { } mGradient; int mFlag; - LOTBrushType mType; + LOTBrushType mBrushType; LOTFillRule mFillRule; } LOTNode; diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index bf9ffac63b..be40d975a1 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -998,10 +998,10 @@ static void updateGStops(LOTNode *n, const VGradient *grad) if (n->mGradient.stopCount) free(n->mGradient.stopPtr); n->mGradient.stopCount = grad->mStops.size(); - n->mGradient.stopPtr = (GradientStop *) malloc(n->mGradient.stopCount * sizeof(GradientStop)); + n->mGradient.stopPtr = (LOTGradientStop *) malloc(n->mGradient.stopCount * sizeof(LOTGradientStop)); } - GradientStop *ptr = n->mGradient.stopPtr; + LOTGradientStop *ptr = n->mGradient.stopPtr; for (const auto &i : grad->mStops) { ptr->pos = i.first; ptr->a = i.second.alpha() * grad->alpha(); @@ -1089,14 +1089,14 @@ void LOTDrawable::sync() switch (mBrush.type()) { case VBrush::Type::Solid: - mCNode->mType = LOTBrushType::BrushSolid; + mCNode->mBrushType = LOTBrushType::BrushSolid; mCNode->mColor.r = mBrush.mColor.r; mCNode->mColor.g = mBrush.mColor.g; mCNode->mColor.b = mBrush.mColor.b; mCNode->mColor.a = mBrush.mColor.a; break; case VBrush::Type::LinearGradient: - mCNode->mType = LOTBrushType::BrushGradient; + mCNode->mBrushType = LOTBrushType::BrushGradient; mCNode->mGradient.type = LOTGradientType::GradientLinear; mCNode->mGradient.start.x = mBrush.mGradient->linear.x1; mCNode->mGradient.start.y = mBrush.mGradient->linear.y1; @@ -1105,7 +1105,7 @@ void LOTDrawable::sync() updateGStops(mCNode.get(), mBrush.mGradient); break; case VBrush::Type::RadialGradient: - mCNode->mType = LOTBrushType::BrushGradient; + mCNode->mBrushType = LOTBrushType::BrushGradient; mCNode->mGradient.type = LOTGradientType::GradientRadial; mCNode->mGradient.center.x = mBrush.mGradient->radial.cx; mCNode->mGradient.center.y = mBrush.mGradient->radial.cy; From 1092772b3a7944014f9c79fe58e4d18a9e5ae87b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 12 Nov 2018 14:58:04 +0900 Subject: [PATCH 286/672] lottieitem: apply transform for linear gradient coordinates. gradient and shape coordinates must be in same space, gradient coordinates didn't on it. Change-Id: Ic697c066c4303c47dd382f11af2f9afb33d6a937 --- src/lottie/lottieitem.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index be40d975a1..db85170634 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1095,15 +1095,20 @@ void LOTDrawable::sync() mCNode->mColor.b = mBrush.mColor.b; mCNode->mColor.a = mBrush.mColor.a; break; - case VBrush::Type::LinearGradient: + case VBrush::Type::LinearGradient: { mCNode->mBrushType = LOTBrushType::BrushGradient; mCNode->mGradient.type = LOTGradientType::GradientLinear; - mCNode->mGradient.start.x = mBrush.mGradient->linear.x1; - mCNode->mGradient.start.y = mBrush.mGradient->linear.y1; - mCNode->mGradient.end.x = mBrush.mGradient->linear.x2; - mCNode->mGradient.end.y = mBrush.mGradient->linear.y2; + VPointF s = mBrush.mGradient->mMatrix.map({mBrush.mGradient->linear.x1, + mBrush.mGradient->linear.y1}); + VPointF e = mBrush.mGradient->mMatrix.map({mBrush.mGradient->linear.x2, + mBrush.mGradient->linear.y2}); + mCNode->mGradient.start.x = s.x(); + mCNode->mGradient.start.y = s.y(); + mCNode->mGradient.end.x = e.x(); + mCNode->mGradient.end.y = e.y(); updateGStops(mCNode.get(), mBrush.mGradient); break; + } case VBrush::Type::RadialGradient: mCNode->mBrushType = LOTBrushType::BrushGradient; mCNode->mGradient.type = LOTGradientType::GradientRadial; From d0456101661e6dcd99f1ece2bb91c10992c7c639 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 12 Nov 2018 15:48:09 +0900 Subject: [PATCH 287/672] lottie/example: update example with gradient support for efl renderer. Change-Id: I44bad80372b197572368bae45f109e81a2a4a989 --- example/lottieview.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index be9f2a1c19..623e154cbe 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -72,7 +72,35 @@ void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) } } else if (node->mBrushType == LOTBrushType::BrushGradient) { - //TODO fill the gradient info + Efl_VG *grad = nullptr; + if (node->mGradient.type == GradientLinear) { + grad = evas_vg_gradient_linear_add(parent); + evas_vg_gradient_linear_start_set(grad, node->mGradient.start.x, node->mGradient.start.y); + evas_vg_gradient_linear_end_set(grad, node->mGradient.end.x, node->mGradient.end.y); + } else { + grad = evas_vg_gradient_radial_add(parent); + evas_vg_gradient_radial_center_set(grad, node->mGradient.center.x, node->mGradient.center.y); + evas_vg_gradient_radial_radius_set(grad, node->mGradient.cradius); + evas_vg_gradient_radial_focal_set(grad, node->mGradient.focal.x, node->mGradient.focal.y); + } + int stop_count = node->mGradient.stopCount; + if (stop_count) + { + Efl_Gfx_Gradient_Stop *stops = (Efl_Gfx_Gradient_Stop *)calloc(stop_count, sizeof(Efl_Gfx_Gradient_Stop)); + for (int i = 0; i mGradient.stopPtr[i].pos; + stops[i].r = (node->mGradient.stopPtr[i].r * node->mGradient.stopPtr[i].a)/255; + stops[i].g = (node->mGradient.stopPtr[i].g * node->mGradient.stopPtr[i].a)/255; + stops[i].b = (node->mGradient.stopPtr[i].b * node->mGradient.stopPtr[i].a)/255; + stops[i].a = node->mGradient.stopPtr[i].a; + } + evas_vg_gradient_stop_set(grad, stops, stop_count); + } + if (node->mStroke.enable) { + evas_vg_shape_stroke_fill_set(shape, grad); + } else { + evas_vg_shape_fill_set(shape, grad); + } } } From 9dad8b7d6fb37961e6beb062c1a123b61230da8e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 13 Nov 2018 14:54:23 +0900 Subject: [PATCH 288/672] lottieitem: apply transform for radial gradient values. gradient and shape cooridnates must be in same space, implement them of missing calc. Change-Id: I21d3024718e9cb64e0072db680ec07e77b8c3d43 --- src/lottie/lottieitem.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index db85170634..cb36b13acf 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1108,18 +1108,25 @@ void LOTDrawable::sync() mCNode->mGradient.end.y = e.y(); updateGStops(mCNode.get(), mBrush.mGradient); break; - } - case VBrush::Type::RadialGradient: + } + case VBrush::Type::RadialGradient: { mCNode->mBrushType = LOTBrushType::BrushGradient; mCNode->mGradient.type = LOTGradientType::GradientRadial; - mCNode->mGradient.center.x = mBrush.mGradient->radial.cx; - mCNode->mGradient.center.y = mBrush.mGradient->radial.cy; - mCNode->mGradient.focal.x = mBrush.mGradient->radial.fx; - mCNode->mGradient.focal.y = mBrush.mGradient->radial.fy; - mCNode->mGradient.cradius = mBrush.mGradient->radial.cradius; - mCNode->mGradient.fradius = mBrush.mGradient->radial.fradius; + VPointF c = mBrush.mGradient->mMatrix.map({mBrush.mGradient->radial.cx, + mBrush.mGradient->radial.cy}); + VPointF f = mBrush.mGradient->mMatrix.map({mBrush.mGradient->radial.fx, + mBrush.mGradient->radial.fy}); + mCNode->mGradient.center.x = c.x(); + mCNode->mGradient.center.y = c.y(); + mCNode->mGradient.focal.x = f.x(); + mCNode->mGradient.focal.y = f.y(); + + float scale = getScale(mBrush.mGradient->mMatrix); + mCNode->mGradient.cradius = mBrush.mGradient->radial.cradius * scale; + mCNode->mGradient.fradius = mBrush.mGradient->radial.fradius * scale; updateGStops(mCNode.get(), mBrush.mGradient); break; + } default: break; } From dc9bcd449f765e2166b16fd34e6f2cf3e9297afb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 13 Nov 2018 18:09:45 +0900 Subject: [PATCH 289/672] lottie/parser: parse Hidden property of lottie objects. Change-Id: I6d9288404045d4332017320b4102c3c5dc6b7d96 --- src/lottie/lottiemodel.h | 2 ++ src/lottie/lottieparser.cpp | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 3550b21dfc..eaa33c55d8 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -247,8 +247,10 @@ public: inline LOTData::Type type() const {return mType;} bool isStatic() const{return mStatic;} void setStatic(bool value) {mStatic = value;} + bool hidden() const {return mHidden;} public: bool mStatic{true}; + bool mHidden{false}; LOTData::Type mType; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index bdc3028bb5..30cf7c8a47 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -924,9 +924,7 @@ void LottieParserImpl::parseObject(LOTGroupData *parent) while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "ty")) { auto child = parseObjectTypeAttr(); - if (child) { - if (child) parent->mChildren.push_back(child); - } + if (child && !child->hidden()) parent->mChildren.push_back(child); } else { Skip(key); } @@ -983,6 +981,8 @@ std::shared_ptr LottieParserImpl::parseRectObject() parseProperty(obj->mRound); } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { Skip(key); } @@ -1008,6 +1008,8 @@ std::shared_ptr LottieParserImpl::parseEllipseObject() parseProperty(obj->mSize); } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { Skip(key); } @@ -1030,6 +1032,8 @@ std::shared_ptr LottieParserImpl::parseShapeObject() parseShapeProperty(obj->mShape); } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vDebug << "Shape property ignored :" << key; @@ -1072,6 +1076,8 @@ std::shared_ptr LottieParserImpl::parsePolystarObject() if (starType == 2) obj->mType = LOTPolystarData::PolyType::Polygon; } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vDebug << "Polystar property ignored :" << key; @@ -1121,6 +1127,8 @@ std::shared_ptr LottieParserImpl::parseTrimObject() parseProperty(obj->mOffset); } else if (0 == strcmp(key, "m")) { obj->mTrimType = getTrimType(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vDebug << "Trim property ignored :" << key; @@ -1146,6 +1154,8 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() parseProperty(obj->mOffset); } else if (0 == strcmp(key, "tr")) { obj->mTransform = parseTransformObject(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vDebug << "Repeater property ignored :" << key; @@ -1196,6 +1206,8 @@ std::shared_ptr LottieParserImpl::parseTransformObject() parseProperty(obj->mSkewAxis); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { Skip(key); } @@ -1229,6 +1241,8 @@ std::shared_ptr LottieParserImpl::parseFillObject() obj->mEnabled = GetBool(); } else if (0 == strcmp(key, "r")) { obj->mFillRule = getFillRule(); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vWarning << "Fill property skipped = " << key; @@ -1322,6 +1336,8 @@ std::shared_ptr LottieParserImpl::parseStrokeObject() obj->mMeterLimit = GetDouble(); } else if (0 == strcmp(key, "d")) { parseDashProperty(obj->mDash); + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vWarning << "Stroke property skipped = " << key; @@ -1360,6 +1376,8 @@ void LottieParserImpl::parseGradientProperty(LOTGradient *obj, const char *key) Skip(nullptr); } } + } else if (0 == strcmp(key, "hd")) { + obj->mHidden = GetBool(); } else { #ifdef DEBUG_PARSER vWarning << "Gradient property skipped = " << key; From e4120d8612431bb5c935af94a5b5be12b28f61e1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 14 Nov 2018 11:08:39 +0900 Subject: [PATCH 290/672] lottie/model: support fractional frame number in keyframe object. Change-Id: I1a94b3bffbe7f01e462fcf3f93b822c356bae7b0 --- src/lottie/lottiemodel.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index eaa33c55d8..05c888c3f1 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -165,13 +165,13 @@ class LOTKeyFrame { public: T value(int frameNo) const { - float progress = mInterpolator->value(float(frameNo - mStartFrame) / float(mEndFrame - mStartFrame)); + float progress = mInterpolator->value((frameNo - mStartFrame) / (mEndFrame - mStartFrame)); return mValue.value(progress); } public: - int mStartFrame{0}; - int mEndFrame{0}; + float mStartFrame{0}; + float mEndFrame{0}; std::shared_ptr mInterpolator; LOTKeyFrameValue mValue; }; From b5b39a6aac5f6c57aea866a26ad3d7054d9edf42 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 14 Nov 2018 16:36:04 +0900 Subject: [PATCH 291/672] lottie/vector: fixed the crash in bezier::length() api. Change-Id: I397ecdc65382bd30174bc95ff34063384d12972b --- src/vector/vbezier.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index bc31fa2e88..d33d235234 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -32,7 +32,7 @@ float VBezier::length() const chord = VLine::length(x1, y1, x4, y4); - if (!vCompare(len, chord)) { + if ((len - chord) > 0.01) { split(&left, &right); /* split in two */ length = left.length() + /* try left side */ right.length(); /* try right side */ From 9328482600d3ad2fc92b0055afe2123801f2c608 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 14 Nov 2018 15:57:02 +0900 Subject: [PATCH 292/672] lottie: fix position property animation along path. Change-Id: I5b30f96a0e8358d2f6b75685ad9025dcdd4dee60 --- src/lottie/lottiemodel.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 05c888c3f1..b3dba6063e 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -151,8 +151,14 @@ struct LOTKeyFrameValue VPointF value(float t) const { if (mPathKeyFrame) { - return VBezier::fromPoints(mStartValue, mStartValue + mOutTangent, - mEndValue + mInTangent, mEndValue).pointAt(t); + /* + * position along the path calcualated + * using bezier at progress length (t * bezlen) + */ + VBezier b = VBezier::fromPoints(mStartValue, mStartValue + mOutTangent, + mEndValue + mInTangent, mEndValue); + return b.pointAt(b.tAtLength(t * b.length())); + } else { return lerp(mStartValue, mEndValue, t); } From 73340247bd316addb8530e4449288c3f338a7134 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 14 Nov 2018 16:40:43 +0900 Subject: [PATCH 293/672] lottieitem: free alloc memory properly. gradient stops must be freed. Change-Id: Ibc25e8e8e1c59762c0b757d15897a8ca5adf1f24 --- src/lottie/lottieitem.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 364da41731..7cdf5fe27a 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -160,6 +160,11 @@ public: void sync(); public: std::unique_ptr mCNode; + + ~LOTDrawable() { + if (mCNode.get()->mGradient.stopCount > 0) + free(mCNode.get()->mGradient.stopPtr); + } }; class LOTPathDataItem; From 99886884a42eb7039803b584d3142ee94b8ebc8d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 14 Nov 2018 16:52:40 +0900 Subject: [PATCH 294/672] lottie: Fix crash issue from last patch. Change-Id: Ia8178e3454e26ae2ced8fb0bef66b1c5026f1d26 --- src/lottie/lottieitem.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 7cdf5fe27a..9a5f1dc5e6 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -162,8 +162,8 @@ public: std::unique_ptr mCNode; ~LOTDrawable() { - if (mCNode.get()->mGradient.stopCount > 0) - free(mCNode.get()->mGradient.stopPtr); + if (mCNode && mCNode->mGradient.stopPtr) + free(mCNode->mGradient.stopPtr); } }; From fe211418e622b3bf81fcd60d7cdfd4c0abd1ae85 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 15 Nov 2018 11:36:58 +0900 Subject: [PATCH 295/672] lottie/vector: add angle api to VLine class Change-Id: Iaa839e5a4e7a0517c7a9a01cb8e0de972dba95c6 --- src/vector/vline.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vector/vline.h b/src/vector/vline.h index 5ac6eb317a..bd959c3c59 100644 --- a/src/vector/vline.h +++ b/src/vector/vline.h @@ -21,7 +21,7 @@ public: void splitAtLength(float length, VLine &left, VLine &right) const; VPointF p1() const { return {mX1, mY1}; } VPointF p2() const { return {mX2, mY2}; } - + float angle() const; static float length(float x1, float y1, float x2, float y2); private: @@ -31,6 +31,15 @@ private: float mY2{0}; }; +inline float VLine::angle() const +{ + const float dx = mX2 - mX1; + const float dy = mY2 - mY1; + + const float theta = std::atan2(dy, dx) * 180.0 / M_PI; + return theta; +} + // approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. // With alpha = 1, beta = 3/8, giving results with the largest error less // than 7% compared to the exact value. @@ -62,4 +71,4 @@ inline void VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) cons right.mY2 = mY2; } -#endif //VLINE_H \ No newline at end of file +#endif //VLINE_H From ea7f55d44a08c1f580195fa74b84779250763797 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 15 Nov 2018 11:40:04 +0900 Subject: [PATCH 296/672] lottie: refactor to use line api to calculate angle. Change-Id: If9440f5fbf1b926a969226aad524db74881ba12f --- src/lottie/lottiemodel.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 38179a9705..d6f50cea58 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -245,12 +245,9 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) */ float progress = mHighlightLength.value(frameNo) / 100.0f; if (vCompare(progress, 1.0f)) progress = 0.99f; - float dy = end.y() - start.y(); - float dx = end.x() - start.x(); - float slope = (dx == 0) ? dy * INFINITY : dy / dx; - float startAngleRad = std::atan(slope); - int highlightAngle = mHighlightAngle.value(frameNo); - float angle = startAngleRad + (highlightAngle * M_PI / 180.0f); + float startAngle = VLine(start, end).angle(); + float highlightAngle = mHighlightAngle.value(frameNo); + float angle = ((startAngle + highlightAngle) * M_PI) / 180.0f; grad->radial.fx = grad->radial.cx + std::cos(angle) * progress * grad->radial.cradius; grad->radial.fy = From 18bb0afcfe5399abbfb84b9ec2f201e637172a1d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 15 Nov 2018 11:42:10 +0900 Subject: [PATCH 297/672] lottie/vector: added angleAt() api to bezier class. Change-Id: Ie5a3f68ad849d1a283363e1eae50ce9520bddb7a --- src/vector/vbezier.cpp | 25 +++++++++++++++++++++++++ src/vector/vbezier.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index d33d235234..de52839c66 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -93,4 +93,29 @@ void VBezier::splitAtLength(float len, VBezier *left, VBezier *right) right->parameterSplitLeft(t, left); } +VPointF VBezier::derivative(float t) const +{ + // p'(t) = 3 * (-(1-2t+t^2) * p0 + (1 - 4 * t + 3 * t^2) * p1 + (2 * t - 3 * t^2) * p2 + t^2 * p3) + + float m_t = 1. - t; + + float d = t * t; + float a = -m_t * m_t; + float b = 1 - 4 * t + 3 * d; + float c = 2 * t - 3 * d; + + return 3 * VPointF(a * x1 + b * x2 + c * x3 + d * x4, + a * y1 + b * y2 + c * y3 + d * y4); +} + + +float VBezier::angleAt(float t) const +{ + if (t < 0 || t > 1) { + return 0; + } + return VLine({}, derivative(t)).angle(); +} + + V_END_NAMESPACE diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index f41e532630..12e9923bcf 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -9,6 +9,7 @@ class VBezier { public: VBezier() = default; VPointF pointAt(float t) const; + float angleAt(float t) const; VBezier onInterval(float t0, float t1) const; float length() const; static void coefficients(float t, float &a, float &b, float &c, float &d); From aa99eda0f7e81f37e33c754a91c83988ca9ef0e8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 15 Nov 2018 11:45:57 +0900 Subject: [PATCH 298/672] lottie/parser: support parsing auto orient property of layer. Change-Id: Ib7d757d43633d601fd76e8c3393219f7682c9112 --- src/lottie/lottiemodel.h | 2 ++ src/lottie/lottieparser.cpp | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index b3dba6063e..385091facc 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -300,6 +300,7 @@ public: int solidWidth() const noexcept{return mSolidLayer.mWidth;} int solidHeight() const noexcept{return mSolidLayer.mHeight;} LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} + bool autoOrient() const noexcept{return mAutoOrient;} int timeRemap(int frameNo) const; public: struct SolidLayer { @@ -326,6 +327,7 @@ public: bool mHasRepeater{false}; bool mHasGradient{false}; bool mRoot{false}; + bool mAutoOrient{false}; std::vector> mMasks; LOTCompositionData *mCompRef; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 30cf7c8a47..18e576b734 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -791,6 +791,8 @@ std::shared_ptr LottieParserImpl::parseLayer() layer->mHasMask = GetBool(); } else if (0 == strcmp(key, "masksProperties")) { parseMaskProperty(layer); + } else if (0 == strcmp(key, "ao")) { + layer->mAutoOrient = GetInt(); } else { #ifdef DEBUG_PARSER vWarning << "Layer Attribute Skipped : " << key; @@ -1206,7 +1208,7 @@ std::shared_ptr LottieParserImpl::parseTransformObject() parseProperty(obj->mSkewAxis); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); - } else if (0 == strcmp(key, "hd")) { + } else if (0 == strcmp(key, "hd")) { obj->mHidden = GetBool(); } else { Skip(key); @@ -1916,6 +1918,7 @@ public: << ", outFm:" << obj->mOutFrame << ", stFm:" << obj->mStartFrame << ", ts:" << obj->mTimeStreatch + << ", ao:" << obj->autoOrient() << "\n"; visitChildren(static_cast(obj), level); vDebug << level From 8b0bac112c43dcba72e5d89b1af1d3777448d3f6 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 15 Nov 2018 13:51:18 +0900 Subject: [PATCH 299/672] lottie: added support of auto oriented feature in lottie. Change-Id: Id2290aa0949519fc24b165f9a24aff4151871507 --- example/resource/ao.json | 1 + src/lottie/lottieitem.cpp | 4 +-- src/lottie/lottiemodel.cpp | 9 ++++--- src/lottie/lottiemodel.h | 52 +++++++++++++++++++++++++++++--------- 4 files changed, 49 insertions(+), 17 deletions(-) create mode 100755 example/resource/ao.json diff --git a/example/resource/ao.json b/example/resource/ao.json new file mode 100755 index 0000000000..9f78a33ca8 --- /dev/null +++ b/example/resource/ao.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-89.47,0],[0,-89.47],[89.47,0],[0,89.47]],"o":[[89.47,0],[0,89.47],[-89.47,0],[0,-89.47]],"v":[[0,-162],[162,0],[0,162],[-162,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.562,"y":0.562},"o":{"x":0.167,"y":0.167},"n":"0p562_0p562_0p167_0p167","t":8,"s":[250,88,0],"e":[412,250,0],"to":[89.4701232910156,0,0],"ti":[0,-89.4701232910156,0]},{"i":{"x":0.656,"y":0.656},"o":{"x":0.311,"y":0.311},"n":"0p656_0p656_0p311_0p311","t":38,"s":[412,250,0],"e":[250,412,0],"to":[0,89.4701232910156,0],"ti":[89.4701232910156,0,0]},{"i":{"x":0.689,"y":0.689},"o":{"x":0.343,"y":0.343},"n":"0p689_0p689_0p343_0p343","t":68,"s":[250,412,0],"e":[88,250,0],"to":[-89.4701232910156,0,0],"ti":[0,89.4701232910156,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.437,"y":0.437},"n":"0p833_0p833_0p437_0p437","t":98,"s":[88,250,0],"e":[250,88,0],"to":[0,-89.4701232910156,0],"ti":[-89.4701232910156,0,0]},{"t":128}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":1,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index cb36b13acf..d190483bdf 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -299,10 +299,10 @@ float LOTLayerItem::opacity(int frameNo) const VMatrix LOTLayerItem::matrix(int frameNo) const { if (mParentLayer) - return mLayerData->mTransform->matrix(frameNo) * + return mLayerData->mTransform->matrix(frameNo, mLayerData->autoOrient()) * mParentLayer->matrix(frameNo); else - return mLayerData->mTransform->matrix(frameNo); + return mLayerData->mTransform->matrix(frameNo, mLayerData->autoOrient()); } bool LOTLayerItem::visible() const diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index d6f50cea58..e5283bedc9 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -47,12 +47,12 @@ void LOTCompositionData::processRepeaterObjects() visitor.visit(mRootLayer.get()); } -VMatrix LOTTransformData::matrix(int frameNo) const +VMatrix LOTTransformData::matrix(int frameNo, bool autoOrient) const { if (mStaticMatrix) return mCachedMatrix; else - return computeMatrix(frameNo); + return computeMatrix(frameNo, autoOrient); } float LOTTransformData::opacity(int frameNo) const @@ -65,7 +65,7 @@ void LOTTransformData::cacheMatrix() mCachedMatrix = computeMatrix(0); } -VMatrix LOTTransformData::computeMatrix(int frameNo) const +VMatrix LOTTransformData::computeMatrix(int frameNo, bool autoOrient) const { VMatrix m; VPointF position = mPosition.value(frameNo); @@ -73,8 +73,11 @@ VMatrix LOTTransformData::computeMatrix(int frameNo) const position.setX(mX.value(frameNo)); position.setY(mY.value(frameNo)); } + + float angle = autoOrient ? mPosition.angle(frameNo) : 0; m.translate(position) .rotate(mRotation.value(frameNo)) + .rotate(angle) .scale(mScale.value(frameNo) / 100.f) .translate(-mAnchor.value(frameNo)); return m; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 385091facc..73034ebc0c 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -138,6 +138,7 @@ struct LOTKeyFrameValue T value(float t) const { return lerp(mStartValue, mEndValue, t); } + float angle(float ) const { return 0;} }; template <> @@ -163,6 +164,15 @@ struct LOTKeyFrameValue return lerp(mStartValue, mEndValue, t); } } + + float angle(float t) const { + if (mPathKeyFrame) { + VBezier b = VBezier::fromPoints(mStartValue, mStartValue + mOutTangent, + mEndValue + mInTangent, mEndValue); + return b.angleAt(b.tAtLength(t * b.length())); + } + return 0; + } }; @@ -170,9 +180,14 @@ template class LOTKeyFrame { public: + float progress(int frameNo) const { + return mInterpolator->value((frameNo - mStartFrame) / (mEndFrame - mStartFrame)); + } T value(int frameNo) const { - float progress = mInterpolator->value((frameNo - mStartFrame) / (mEndFrame - mStartFrame)); - return mValue.value(progress); + return mValue.value(progress(frameNo)); + } + float angle(int frameNo) const { + return mValue.angle(progress(frameNo)); } public: @@ -192,12 +207,25 @@ public: if(mKeyFrames.back().mEndFrame <= frameNo) return mKeyFrames.back().mValue.mEndValue; - for(auto keyFrame : mKeyFrames) { + for(const auto &keyFrame : mKeyFrames) { if (frameNo >= keyFrame.mStartFrame && frameNo < keyFrame.mEndFrame) return keyFrame.value(frameNo); } return T(); } + + float angle(int frameNo) const { + if ((mKeyFrames.front().mStartFrame >= frameNo) || + (mKeyFrames.back().mEndFrame <= frameNo) ) + return 0; + + for(const auto &keyFrame : mKeyFrames) { + if (frameNo >= keyFrame.mStartFrame && frameNo < keyFrame.mEndFrame) + return keyFrame.angle(frameNo); + } + return 0; + } + public: std::vector> mKeyFrames; }; @@ -209,15 +237,15 @@ public: LOTAnimatable():mValue(),mAnimInfo(nullptr){} LOTAnimatable(const T &value): mValue(value){} bool isStatic() const {if (mAnimInfo) return false; else return true;} - T value(int frameNo) const{ - if (isStatic()) - return mValue; - else - return mAnimInfo->value(frameNo); + T value(int frameNo) const { + return isStatic() ? mValue : mAnimInfo->value(frameNo); + } + float angle(int frameNo) const { + return isStatic() ? 0 : mAnimInfo->angle(frameNo); } public: - T mValue; - int mPropertyIndex; /* "ix" */ + T mValue; + int mPropertyIndex; /* "ix" */ std::unique_ptr> mAnimInfo; }; @@ -393,12 +421,12 @@ class LOTTransformData : public LOTData { public: LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} - VMatrix matrix(int frameNo) const; + VMatrix matrix(int frameNo, bool autoOrient = false) const; float opacity(int frameNo) const; void cacheMatrix(); bool staticMatrix() const {return mStaticMatrix;} private: - VMatrix computeMatrix(int frameNo) const; + VMatrix computeMatrix(int frameNo, bool autoOrient = false) const; public: LOTAnimatable mRotation{0}; /* "r" */ LOTAnimatable mScale; /* "s" */ From 90577029f2490089a54643654f4832fedd2fe18a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 15 Nov 2018 17:19:13 +0900 Subject: [PATCH 300/672] lottie/feature: Added 3D layer support in lottie player. Change-Id: I1f37f299761570d08ef9bda39a66df757b215e5a --- example/resource/3d.json | 1 + src/lottie/lottiemodel.cpp | 21 ++++++++++++++++----- src/lottie/lottiemodel.h | 33 +++++++++++++++++++++------------ src/lottie/lottieparser.cpp | 23 ++++++++++++++++++++--- 4 files changed, 58 insertions(+), 20 deletions(-) create mode 100755 example/resource/3d.json diff --git a/example/resource/3d.json b/example/resource/3d.json new file mode 100755 index 0000000000..a5babf8bc6 --- /dev/null +++ b/example/resource/3d.json @@ -0,0 +1 @@ +{"v":"5.2.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"Comp 1","ddd":1,"assets":[],"layers":[{"ddd":1,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":0,"k":0,"ix":9},"rz":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":55}],"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[75,384,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.075893886387,0.175385013223,0.921568632126,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":1,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":0,"k":0,"ix":8},"ry":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":55}],"ix":9},"rz":{"a":0,"k":0,"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[76,234,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.025943866,0.945098042488,0.134079754353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":1,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"rx":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[360]},{"t":55}],"ix":8},"ry":{"a":0,"k":0,"ix":9},"rz":{"a":0,"k":0,"ix":10},"or":{"a":0,"k":[0,0,0],"ix":7},"p":{"a":0,"k":[76,72,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index e5283bedc9..1b5cd98cb6 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -75,11 +75,22 @@ VMatrix LOTTransformData::computeMatrix(int frameNo, bool autoOrient) const } float angle = autoOrient ? mPosition.angle(frameNo) : 0; - m.translate(position) - .rotate(mRotation.value(frameNo)) - .rotate(angle) - .scale(mScale.value(frameNo) / 100.f) - .translate(-mAnchor.value(frameNo)); + if (ddd()) { + m.translate(position) + .rotate(mRotation.value(frameNo)) + .rotate(angle) + .rotate(m3D->mRz.value(frameNo)) + .rotate(m3D->mRy.value(frameNo), VMatrix::Axis::Y) + .rotate(m3D->mRx.value(frameNo), VMatrix::Axis::X) + .scale(mScale.value(frameNo) / 100.f) + .translate(-mAnchor.value(frameNo)); + } else { + m.translate(position) + .rotate(mRotation.value(frameNo)) + .rotate(angle) + .scale(mScale.value(frameNo) / 100.f) + .translate(-mAnchor.value(frameNo)); + } return m; } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 73034ebc0c..226cee5e2d 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -417,6 +417,13 @@ inline int LOTLayerData::timeRemap(int frameNo) const return frameNo / mTimeStreatch; } +struct LOT3DData +{ + LOTAnimatable mRx{0}; + LOTAnimatable mRy{0}; + LOTAnimatable mRz{0}; +}; + class LOTTransformData : public LOTData { public: @@ -425,21 +432,23 @@ public: float opacity(int frameNo) const; void cacheMatrix(); bool staticMatrix() const {return mStaticMatrix;} + bool ddd() const {return m3D ? true : false;} private: VMatrix computeMatrix(int frameNo, bool autoOrient = false) const; public: - LOTAnimatable mRotation{0}; /* "r" */ - LOTAnimatable mScale; /* "s" */ - LOTAnimatable mPosition; /* "p" */ - LOTAnimatable mX{0}; - LOTAnimatable mY{0}; - LOTAnimatable mAnchor; /* "a" */ - LOTAnimatable mOpacity{100}; /* "o" */ - LOTAnimatable mSkew{0}; /* "sk" */ - LOTAnimatable mSkewAxis{0}; /* "sa" */ - bool mStaticMatrix{true}; - bool mSeparate{false}; - VMatrix mCachedMatrix; + std::unique_ptr m3D; + LOTAnimatable mRotation{0}; /* "r" */ + LOTAnimatable mScale; /* "s" */ + LOTAnimatable mPosition; /* "p" */ + LOTAnimatable mX{0}; + LOTAnimatable mY{0}; + LOTAnimatable mAnchor; /* "a" */ + LOTAnimatable mOpacity{100}; /* "o" */ + LOTAnimatable mSkew{0}; /* "sk" */ + LOTAnimatable mSkewAxis{0}; /* "sa" */ + bool mStaticMatrix{true}; + bool mSeparate{false}; + VMatrix mCachedMatrix; }; class LOTFillData : public LOTData diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 18e576b734..3f42d114f2 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -208,7 +208,7 @@ public: std::shared_ptr parseShapeObject(); std::shared_ptr parsePolystarObject(); - std::shared_ptr parseTransformObject(); + std::shared_ptr parseTransformObject(bool ddd = false); std::shared_ptr parseFillObject(); std::shared_ptr parseGFillObject(); std::shared_ptr parseStrokeObject(); @@ -738,6 +738,7 @@ std::shared_ptr LottieParserImpl::parseLayer() LOTLayerData *layer = sharedLayer.get(); curLayerRef = layer; bool hasLayerRef = false; + bool ddd = true; EnterObject(); while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "ty")) { /* Type of layer*/ @@ -746,6 +747,9 @@ std::shared_ptr LottieParserImpl::parseLayer() parenting and expressions.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mId = GetInt(); + } else if (0 == strcmp(key, "ddd")) { /*3d layer */ + RAPIDJSON_ASSERT(PeekType() == kNumberType); + ddd = GetInt(); } else if (0 == strcmp(key, "parent")) { /*Layer Parent. Uses "ind" of parent.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mParentId = GetInt(); @@ -776,7 +780,7 @@ std::shared_ptr LottieParserImpl::parseLayer() } else if (0 == strcmp(key, "ks")) { RAPIDJSON_ASSERT(PeekType() == kObjectType); EnterObject(); - layer->mTransform = parseTransformObject(); + layer->mTransform = parseTransformObject(ddd); } else if (0 == strcmp(key, "shapes")) { parseShapesAttr(layer); } else if (0 == strcmp(key, "sw")) { @@ -1174,12 +1178,14 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/shapes/transform.json */ -std::shared_ptr LottieParserImpl::parseTransformObject() +std::shared_ptr LottieParserImpl::parseTransformObject(bool ddd) { std::shared_ptr sharedTransform = std::make_shared(); LOTTransformData *obj = sharedTransform.get(); + if (ddd) obj->m3D = std::make_unique(); + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "a")) { parseProperty(obj->mAnchor); @@ -1210,6 +1216,12 @@ std::shared_ptr LottieParserImpl::parseTransformObject() parseProperty(obj->mOpacity); } else if (0 == strcmp(key, "hd")) { obj->mHidden = GetBool(); + } else if (0 == strcmp(key, "rx")) { + parseProperty(obj->m3D->mRx); + } else if (0 == strcmp(key, "ry")) { + parseProperty(obj->m3D->mRy); + } else if (0 == strcmp(key, "rz")) { + parseProperty(obj->m3D->mRz); } else { Skip(key); } @@ -1218,6 +1230,10 @@ std::shared_ptr LottieParserImpl::parseTransformObject() obj->mRotation.isStatic() && obj->mScale.isStatic() && obj->mSkew.isStatic() && obj->mSkewAxis.isStatic() && obj->mX.isStatic() && obj->mY.isStatic(); + if (obj->m3D) { + obj->mStaticMatrix = obj->mStaticMatrix && obj->m3D->mRx.isStatic() && + obj->m3D->mRy.isStatic() && obj->m3D->mRz.isStatic(); + } obj->setStatic(obj->mStaticMatrix && obj->mOpacity.isStatic()); @@ -1919,6 +1935,7 @@ public: << ", stFm:" << obj->mStartFrame << ", ts:" << obj->mTimeStreatch << ", ao:" << obj->autoOrient() + << ", ddd:" << obj->mTransform->ddd() << "\n"; visitChildren(static_cast(obj), level); vDebug << level From bd6d331108b35b9ff81fe1c9085e4c16dfd60eeb Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 16 Nov 2018 11:46:15 +0900 Subject: [PATCH 301/672] resource: remove-- Change-Id: I44dcb7e01c91a8633ed844974e8091aa59297b86 --- example/resource/dead_lift.json | 1 - example/resource/hiking.json | 1 - example/resource/running.json | 1 - example/resource/walking.json | 1 - example/resource/yoga.json | 1 - 5 files changed, 5 deletions(-) delete mode 100755 example/resource/dead_lift.json delete mode 100755 example/resource/hiking.json delete mode 100755 example/resource/running.json delete mode 100755 example/resource/walking.json delete mode 100755 example/resource/yoga.json diff --git a/example/resource/dead_lift.json b/example/resource/dead_lift.json deleted file mode 100755 index 3d20b4b6a6..0000000000 --- a/example/resource/dead_lift.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.2.0","fr":30,"ip":0,"op":59,"w":200,"h":200,"nm":"dead_lift_lottie","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"weights","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":1,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[9.577,20.488],[4.45,19.365],[5.573,14.238],[10.7,15.361]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"head","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[49],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":37.5,"s":[49],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":61,"s":[0],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.5,"s":[-13],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":75,"s":[-13],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78,"s":[0],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[49],"e":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112.5,"s":[49],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136,"s":[0],"e":[-13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[-13],"e":[-13]},{"t":150}],"ix":10},"p":{"a":0,"k":[28.1,16.1,0],"ix":2},"a":{"a":0,"k":[28.1,16.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.6,0.391],[0.385,3.596],[3.595,-0.383],[-0.378,-3.593]],"o":[[3.585,-0.378],[-0.38,-3.598],[-3.597,0.378],[0.387,3.593]],"v":[[11.984,-19.214],[17.794,-26.411],[10.594,-32.226],[4.775,-25.024]],"c":true},"ix":2},"nm":"head","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"hands","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.869]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p869_0p167_0p167"],"t":0,"s":[0],"e":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.23]},"n":["0p667_1_0p167_0p23"],"t":15,"s":[30],"e":[47]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[47],"e":[47]},{"i":{"x":[0.928],"y":[0.939]},"o":{"x":[0.333],"y":[0]},"n":["0p928_0p939_0p333_0"],"t":37.5,"s":[47],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.163],"y":[0.296]},"n":["0p667_1_0p163_0p296"],"t":61,"s":[0],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.5,"s":[-6],"e":[-6]},{"i":{"x":[0.833],"y":[0.706]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p706_0p333_0"],"t":73,"s":[-6],"e":[0]},{"i":{"x":[0.833],"y":[0.884]},"o":{"x":[0.167],"y":[0.141]},"n":["0p833_0p884_0p167_0p141"],"t":78,"s":[0],"e":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.256]},"n":["0p667_1_0p167_0p256"],"t":90,"s":[30],"e":[47]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[47],"e":[47]},{"i":{"x":[0.833],"y":[0.853]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p853_0p333_0"],"t":112.5,"s":[47],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.319]},"n":["0p667_1_0p167_0p319"],"t":136,"s":[0],"e":[-6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[-6],"e":[-6]},{"t":150}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[27.439,19.512,0],"e":[27.053,20.09,0],"to":[-0.06430775672197,0.09626676887274,0],"ti":[0.06430775672197,-0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[27.053,20.09,0],"e":[27.053,20.09,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[27.053,20.09,0],"e":[27.439,19.512,0],"to":[0.06430775672197,-0.09626676887274,0],"ti":[-0.06430775672197,0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[27.439,19.512,0],"e":[27.053,20.09,0],"to":[-0.06430775672197,0.09626676887274,0],"ti":[0.06430775672197,-0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[27.053,20.09,0],"e":[27.053,20.09,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.5,"s":[27.053,20.09,0],"e":[27.439,19.512,0],"to":[0.06430775672197,-0.09626676887274,0],"ti":[-0.06430775672197,0.09626676887274,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":142.5,"s":[27.439,19.512,0],"e":[27.439,19.512,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150}],"ix":2},"a":{"a":0,"k":[27.439,19.512,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.839,-0.295],[-0.129,2.689],[1.844,3.448],[1.127,-3.074]],"o":[[0,0],[1.833,-0.412],[0.128,-2.242],[0.244,-5.19],[-1.739,-3.252],[-1.186,3.234]],"v":[[3.992,-4.48],[4.392,4.402],[9.964,4.223],[10.357,-2.089],[10.249,-14.607],[3.946,-14.093]],"c":true},"ix":2},"nm":"hand","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.627,33.039],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":28,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"weights matt","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[29.116,53.347],[23.989,52.224],[25.112,47.097],[30.239,48.22]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"torso ","parent":7,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[-119]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[-119],"e":[-119]},{"i":{"x":[0.833],"y":[0.851]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p851_0p333_0"],"t":37.5,"s":[-119],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.289]},"n":["0p667_1_0p167_0p289"],"t":61,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":67.5,"s":[17],"e":[17]},{"i":{"x":[0.833],"y":[0.792]},"o":{"x":[0.321],"y":[0.041]},"n":["0p833_0p792_0p321_0p041"],"t":73,"s":[17],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.161]},"n":["0p833_0p833_0p167_0p161"],"t":78,"s":[0],"e":[-119]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[-119],"e":[-119]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112.5,"s":[-119],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136,"s":[0],"e":[17]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[17],"e":[17]},{"t":150}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[4.825,31.85,0],"e":[6.859,33.368,0],"to":[0.27745488286018,0.19427600502968,0],"ti":[-0.67366856336594,-0.47170782089233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":19.5,"s":[6.859,33.368,0],"e":[7.528,33.743,0],"to":[0.42024019360542,0.2942553460598,0],"ti":[-0.15734429657459,-0.11017366498709,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[7.528,33.743,0],"e":[7.528,33.743,0],"to":[0.40957602858543,0.28678822517395,0],"ti":[-0.15734429657459,-0.11017366498709,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[7.528,33.743,0],"e":[6.859,33.368,0],"to":[0.40957602858543,0.28678822517395,0],"ti":[-0.67366856336594,-0.47170782089233,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":44.5,"s":[6.859,33.368,0],"e":[4.825,31.85,0],"to":[0.42024019360542,0.2942553460598,0],"ti":[0.28288394212723,0.45438802242279,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[4.825,31.85,0],"e":[5.162,30.642,0],"to":[-0.28288394212723,-0.45438802242279,0],"ti":[-0.05611232668161,0.20132550597191,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[5.162,30.642,0],"e":[5.162,30.642,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[5.162,30.642,0],"e":[4.825,31.85,0],"to":[-0.05611232668161,0.20132550597191,0],"ti":[-0.3534637093544,-0.48811373114586,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[4.825,31.85,0],"e":[7.282,33.571,0],"to":[0.3534637093544,0.48811373114586,0],"ti":[-0.40957602858543,-0.28678822517395,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[7.282,33.571,0],"e":[7.282,33.571,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.5,"s":[7.282,33.571,0],"e":[4.825,31.85,0],"to":[-0.40957602858543,-0.28678822517395,0],"ti":[0.40957602858543,0.28678822517395,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[4.825,31.85,0],"e":[4.825,31.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":142.5,"s":[4.825,31.85,0],"e":[4.825,31.85,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150}],"ix":2},"a":{"a":0,"k":[4.825,31.85,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-4.115,5.518],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.888,-5.492],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":8.5,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-4.115,5.518],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.888,-5.492],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.775,-5.227],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.775,-5.227],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":37.5,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[3.75,-1.149],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-3.912,1.199],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.259,-10.266],[-17.476,-7.143],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.704,-5.203],[-17.473,4.318],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":55.5,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-18.704,-5.203],[-17.473,4.318],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.992,-4.48],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}],"e":[{"i":[[0,0],[1.795,3.474],[4.301,-2.498],[3.042,-1.896],[1.104,-1.607],[-2.497,-2.7],[-5.135,2.372]],"o":[[0,0],[-1.696,-3.288],[-4.883,2.834],[-1.824,1.135],[-2.317,3.373],[2.353,1.731],[4.839,-2.236]],"v":[[3.485,-5.29],[10.249,-14.607],[-0.126,-17.167],[-11.26,-10.266],[-16.729,-5.839],[-16.792,3.86],[-5.851,-0.338]],"c":true}]},{"t":105}],"ix":2},"nm":"torso","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"weights matt 3","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[29.116,53.347],[23.989,52.224],[25.112,47.097],[30.239,48.22]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"thigh","parent":9,"tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":0,"s":[0],"e":[55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":30,"s":[55],"e":[55]},{"i":{"x":[0.833],"y":[0.843]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p843_0p333_0"],"t":37.5,"s":[55],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.217]},"n":["0p667_1_0p167_0p217"],"t":61,"s":[0],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67.5,"s":[-11],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":72,"s":[-11],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":78,"s":[0],"e":[55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":105,"s":[55],"e":[55]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":112.5,"s":[55],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136,"s":[0],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":142.5,"s":[-11],"e":[-11]},{"t":150}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[20.025,42.75,0],"e":[20.025,43.85,0],"to":[0,0.18333333730698,0],"ti":[0,-0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[20.025,43.85,0],"e":[20.025,43.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[20.025,43.85,0],"e":[20.025,42.75,0],"to":[0,-0.18333333730698,0],"ti":[0,0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67.5,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":75,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":78,"s":[20.025,42.75,0],"e":[20.025,43.85,0],"to":[0,0.18333333730698,0],"ti":[0,-0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":105,"s":[20.025,43.85,0],"e":[20.025,43.85,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":112.5,"s":[20.025,43.85,0],"e":[20.025,42.75,0],"to":[0,-0.18333333730698,0],"ti":[0,0.18333333730698,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":142.5,"s":[20.025,42.75,0],"e":[20.025,42.75,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150}],"ix":2},"a":{"a":0,"k":[20.19,42.716,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.828,-1.098],[-1.283,-0.728]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.452,0.683],[3.222,1.936],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-18.637,3.719],[-14.684,7.437],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}],"e":[{"i":[[-1.526,1.55],[1.865,1.609],[0,0],[4.039,2.055],[-2.497,-3.769],[-1.466,-0.985],[-1.362,-0.773]],"o":[[1.296,-1.316],[-1.865,-1.609],[0,0],[-3.828,-1.947],[0.394,0.594],[3.771,2.533],[1.891,1.073]],"v":[[3.266,12.189],[2.326,6.425],[-5.766,-0.392],[-13.729,-6.164],[-17.442,3.06],[-14.452,5.52],[-3.33,12.043]],"c":true}]},{"t":78}],"ix":2},"nm":"thigh","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"weights matt 2","parent":3,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.9,38.1,0],"ix":2},"a":{"a":0,"k":[26.9,38.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.725,-1.107],[1.105,1.725],[-1.727,1.106],[-1.107,-1.726]],"o":[[-1.728,1.104],[-1.107,-1.726],[1.725,-1.107],[1.105,1.725]],"v":[[29.116,53.347],[23.989,52.224],[25.112,47.097],[30.239,48.22]],"c":true},"ix":2},"nm":"weight center","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight center","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.063,4.78],[4.78,-3.064],[-3.064,-4.779],[-4.779,3.061]],"o":[[-3.061,-4.777],[-4.779,3.062],[3.062,4.779],[4.779,-3.063]],"v":[[16.227,11.817],[2.029,8.708],[-1.08,22.907],[13.118,26.017]],"c":true},"ix":2},"nm":"weight","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":8},"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"weight","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"legs","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[494.375,799.75,0],"ix":2},"a":{"a":0,"k":[19.437,62.975,0],"ix":1},"s":{"a":0,"k":[1000,1000,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":15,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":30,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37.5,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":61,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":90,"s":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.049,11.019],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}],"e":[{"i":[[0.21,-4.353],[0.057,0.094],[-0.008,-0.323],[-1.648,-0.443],[-0.114,-0.011],[-0.361,1.457],[0,0],[0.801,0.445]],"o":[[-0.005,0.109],[0.05,2.846],[0.039,1.424],[0.114,0.029],[1.373,0.175],[0,0],[0.152,-3.142],[-1.66,-0.922]],"v":[[-3.399,9.969],[-2.863,23.662],[-2.762,29.185],[-0.723,32.369],[-0.382,32.434],[2.678,30.217],[4.133,11.183],[2.078,6.564]],"c":true}]},{"t":105}],"ix":2},"nm":"toes","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.539,32.859],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":79,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Dead_lift_layers_V2","refId":"comp_0","sr":0.75,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.125,100.062,0],"ix":2},"a":{"a":0,"k":[489.773,414.205,0],"ix":1},"s":{"a":0,"k":[22,22,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":59.25,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/hiking.json b/example/resource/hiking.json deleted file mode 100755 index 42defb3c3d..0000000000 --- a/example/resource/hiking.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.2.0","fr":30,"ip":0,"op":30,"w":200,"h":200,"nm":"hiking_lottie","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Arm Front","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.791]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p791_0p167_0p167"],"t":0,"s":[0],"e":[14.952]},{"i":{"x":[0.833],"y":[0.997]},"o":{"x":[0.167],"y":[0.137]},"n":["0p833_0p997_0p167_0p137"],"t":13,"s":[14.952],"e":[36]},{"i":{"x":[0.833],"y":[0.838]},"o":{"x":[0.167],"y":[-0.005]},"n":["0p833_0p838_0p167_-0p005"],"t":25,"s":[36],"e":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.176]},"n":["0p833_0p833_0p167_0p176"],"t":44.033,"s":[16],"e":[6.311]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":54,"s":[6.311],"e":[0]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[517.5,323,0],"ix":2},"a":{"a":0,"k":[23.617,21.138,0],"ix":1},"s":{"a":0,"k":[1054,1054,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.843,-2.751],[-1.257,0.721],[0.745,1.4],[1.544,2.649],[1.598,-0.917],[-0.87,-1.54]],"o":[[0.781,1.166],[1.229,-0.706],[-1.477,-2.775],[-0.619,-1.062],[-1.46,0.837],[1.321,2.338]],"v":[[-4.014,-15.08],[-0.363,-14.066],[0.457,-17.473],[-5.18,-27.854],[-9.623,-29.411],[-10.997,-24.969]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.186,48.287],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Arm","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Elbow Front","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.977]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p977_0p333_0"],"t":25,"s":[0],"e":[-38]},{"i":{"x":[0.744],"y":[0.885]},"o":{"x":[0.167],"y":[-0.015]},"n":["0p744_0p885_0p167_-0p015"],"t":44.033,"s":[-38],"e":[-8]},{"i":{"x":[0.74],"y":[0.751]},"o":{"x":[0.272],"y":[0.298]},"n":["0p74_0p751_0p272_0p298"],"t":54,"s":[-8],"e":[0]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[30.353,31.479,0],"ix":2},"a":{"a":0,"k":[30.353,31.479,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.263,-0.087],[0,0],[0.04,1.289],[1.288,-0.04],[3.586,0.642],[0.127,-1.434]],"o":[[4.099,0.281],[1.29,-0.043],[-0.043,-1.286],[0,0],[-1.244,-0.223],[-0.148,1.673]],"v":[[-3.047,-14.016],[8.84,-13.072],[11.1,-15.48],[8.692,-17.735],[-2.38,-19.75],[-5.596,-17.276]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.336,31.487],"ix":2},"a":{"a":0,"k":[-3,-16.85],"ix":1},"s":{"a":0,"k":[103,103],"ix":3},"r":{"a":0,"k":10.727,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Elbow","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Stick","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.904]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p904_0p333_0"],"t":0,"s":[0],"e":[7]},{"i":{"x":[0.833],"y":[0.331]},"o":{"x":[0.167],"y":[0.806]},"n":["0p833_0p331_0p167_0p806"],"t":13,"s":[7],"e":[7.773]},{"i":{"x":[0.833],"y":[1.344]},"o":{"x":[0.167],"y":[0.113]},"n":["0p833_1p344_0p167_0p113"],"t":25.033,"s":[7.773],"e":[15]},{"i":{"x":[0.833],"y":[0.95]},"o":{"x":[0.167],"y":[0.044]},"n":["0p833_0p95_0p167_0p044"],"t":44.033,"s":[15],"e":[-15]},{"i":{"x":[0.874],"y":[0.848]},"o":{"x":[0.167],"y":[-0.066]},"n":["0p874_0p848_0p167_-0p066"],"t":54,"s":[-15],"e":[0]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[43.114,35.179,0],"ix":2},"a":{"a":0,"k":[43.114,35.179,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,0.014],[0.014,-0.708],[0,0],[-0.415,-0.002],[-0.016,0.506],[0,0]],"o":[[-0.708,-0.014],[0,0],[-0.015,0.505],[0.415,0.002],[0,0],[0.014,-0.706]],"v":[[21.135,-21.998],[19.829,-20.743],[19.315,29.155],[20.04,30.077],[20.822,29.166],[22.389,-20.694]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.653,45.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"stick","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"hiking_Layers_v2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":30,"op":60.5,"st":30,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"hiking_Layers_v2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":30.5,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"head","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":12,"ix":10},"p":{"a":0,"k":[26.05,15.81,0],"ix":2},"a":{"a":0,"k":[24.334,16.966,0],"ix":1},"s":{"a":0,"k":[94.877,94.877,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.955,0.722],[0.719,3.946],[3.946,-0.716],[-0.708,-3.944]],"o":[[3.937,-0.71],[-0.708,-3.948],[-3.949,0.709],[0.716,3.945]],"v":[[1.297,7.139],[7.139,-1.293],[-1.294,-7.145],[-7.15,1.292]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.298,8.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Thigh Back","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.842]},"o":{"x":[0.251],"y":[0.207]},"n":["0p833_0p842_0p251_0p207"],"t":0,"s":[2],"e":[27.02]},{"i":{"x":[0.833],"y":[0.892]},"o":{"x":[0.167],"y":[0.175]},"n":["0p833_0p892_0p167_0p175"],"t":9.385,"s":[27.02],"e":[54.62]},{"i":{"x":[0.758],"y":[2.134]},"o":{"x":[0.167],"y":[0.465]},"n":["0p758_2p134_0p167_0p465"],"t":20.881,"s":[54.62],"e":[60]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[22.634,39.387,0],"e":[23.203,38.296,0],"to":[0.09487666189671,-0.18184693157673,0],"ti":[-0.09487666189671,0.18184693157673,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[21.834,43.916,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[97.877,97.877,100],"e":[101.877,101.877,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.188,-1.209],[1.472,4.473],[9.661,14.867],[14.376,16.249]],"c":true}],"e":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.586,0.678],[0.504,5.089],[9.661,14.867],[14.376,16.249]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.587,"s":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.586,0.678],[0.504,5.089],[9.661,14.867],[14.376,16.249]],"c":true}],"e":[{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.188,-1.209],[1.473,4.473],[9.661,14.868],[14.376,16.249]],"c":true}]},{"t":30.5}],"ix":2},"nm":"l_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Leg Back","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.943]},"o":{"x":[0.116],"y":[0.359]},"n":["0p833_0p943_0p116_0p359"],"t":0,"s":[0],"e":[-14]},{"i":{"x":[0.752],"y":[0.297]},"o":{"x":[0.167],"y":[-0.053]},"n":["0p752_0p297_0p167_-0p053"],"t":20.881,"s":[-14],"e":[-7]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[34.319,61.409,0],"e":[33.939,60.92,0],"to":[-0.06338728219271,-0.08141442388296,0],"ti":[0.06338728219271,0.08141442388296,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[34.209,61.291,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,102,100],"e":[103,102,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.449,5.274],[2.016,-0.941],[-0.516,-1.524],[0,0],[-1.238,0],[-0.282,0.085],[0.468,1.529]],"o":[[-0.424,-1.544],[-1.718,0.802],[1.65,4.878],[0.381,1.245],[0.282,0],[1.529,-0.468],[0,0]],"v":[[16.137,12.346],[11.679,10.269],[9.969,14.857],[14.544,29.85],[17.198,32.21],[18.337,32.05],[20.065,28.48]],"c":true},"ix":2},"nm":"l_foot","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Leg back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Thigh Front","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.238],"y":[0.228]},"n":["0p833_0p898_0p238_0p228"],"t":0,"s":[2.5],"e":[-42]},{"i":{"x":[0.836],"y":[0.904]},"o":{"x":[0.167],"y":[0.348]},"n":["0p836_0p904_0p167_0p348"],"t":9.385,"s":[-42],"e":[-58]},{"i":{"x":[0.845],"y":[0.069]},"o":{"x":[0.147],"y":[-0.382]},"n":["0p845_0p069_0p147_-0p382"],"t":20.922,"s":[-58],"e":[-55]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[22.919,39.6,0],"e":[23.583,40.312,0],"to":[0.11068943887949,0.11859582364559,0],"ti":[-0.11068943887949,-0.11859582364559,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[21.834,43.741,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[101.877,101.877,100],"e":[97.877,97.877,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-4.9,-4.622],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}],"e":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-5.777,-4.958],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5.293,"s":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-5.777,-4.958],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}],"e":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-6.058,-5.209],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":9.326,"s":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-6.058,-5.209],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}],"e":[{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-4.9,-4.622],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true}]},{"t":30.5}],"ix":2},"nm":"R_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Leg Front","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.127],"y":[0.177]},"n":["0p667_1_0p127_0p177"],"t":0,"s":[-4],"e":[54]},{"i":{"x":[0.805],"y":[0.993]},"o":{"x":[0.333],"y":[0]},"n":["0p805_0p993_0p333_0"],"t":9.385,"s":[54],"e":[-3.419]},{"i":{"x":[0.752],"y":[0.23]},"o":{"x":[0.196],"y":[-0.049]},"n":["0p752_0p23_0p196_-0p049"],"t":20.922,"s":[-3.419],"e":[3.5]},{"t":30.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[13.857,62.221,0],"e":[13.787,62.753,0],"to":[-0.01168949250132,0.08866687119007,0],"ti":[0.01168949250132,-0.08866687119007,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[13.884,62.316,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[100,100,100]},{"t":30.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.857,1.296],[0.872,-1.201],[0,0],[-1.227,-0.977],[-0.619,0],[-0.562,0.702],[-3.613,4.33]],"o":[[-1.839,-1.283],[-3.081,4.247],[-0.979,1.229],[0.523,0.415],[0.836,0],[0,0],[0.907,-1.088]],"v":[[-5.65,11.629],[-10.708,12.773],[-20.055,25.4],[-19.605,29.391],[-17.837,30.014],[-15.611,28.941],[-4.676,16.291]],"c":true},"ix":2},"nm":"Leg front","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"R_foot","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"TORSO","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[511,506,0],"e":[511,496.248,0],"to":[0,-1.62533092498779,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":10.587,"s":[511,496.248,0],"e":[511,506,0],"to":[0,0,0],"ti":[0,-1.62533092498779,0]},{"t":30.5}],"ix":2},"a":{"a":0,"k":[23,38.5,0],"ix":1},"s":{"a":0,"k":[1054,1054,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}],"e":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-1.887,-1.611],[-1.795,-0.058],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.843,0.72],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-3.979,-0.971],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10.587,"s":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-1.887,-1.611],[-1.795,-0.058],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.843,0.72],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-3.979,-0.971],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}],"e":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20.922,"s":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}],"e":[{"i":[[0,0],[0,0],[3.672,0.557],[0.558,-3.682],[0,0],[-0.823,-1.407],[-2.748,-0.089],[0,0],[0,0]],"o":[[0,0],[0.557,-3.685],[-3.685,-0.56],[0,0],[0,0],[0.738,1.263],[5.308,0.173],[0,0],[0,0]],"v":[[8.616,-17.211],[9.72,-22.24],[4.062,-29.918],[-3.619,-24.263],[-5.816,-5.089],[-5.023,-2.225],[-0.111,0.349],[6.094,-5.684],[7.331,-11.335]],"c":true}]},{"t":30.5}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.653,45.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"torso","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.571,-0.187],[-0.062,-0.002],[-0.096,2.661],[0,0],[-2.471,2.067],[8.487,-0.754],[0.256,-1.657],[0.01,-0.309],[0,0]],"o":[[0.062,0.008],[2.657,0.096],[0,0],[0,0],[1.822,-1.522],[-3.647,0.322],[-0.066,0.292],[0,0],[-0.094,2.601]],"v":[[-3.066,13.395],[-2.881,13.407],[2.105,8.764],[2.967,0.785],[5.798,-7.349],[-1.637,-12.749],[-6.521,-7.084],[-6.641,-6.177],[-7.525,8.418]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.603,23.407],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"back_pack","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.5,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"hiking_layers_stick_v2","refId":"comp_0","sr":0.5,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.688,100,0],"ix":2},"a":{"a":0,"k":[506.25,515.909,0],"ix":1},"s":{"a":0,"k":[22,22,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":30,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/running.json b/example/resource/running.json deleted file mode 100755 index 3f7219a525..0000000000 --- a/example/resource/running.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.0.6","fr":60,"ip":0,"op":96,"w":200,"h":200,"nm":"running","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.657,107.486,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.625,-20.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.017,0.019],[0.04,0.027],[0,0],[0,0],[0,0],[-0.672,0],[-0.124,0.03],[0.205,0.745],[0,0],[0.348,0.264],[0,0]],"o":[[-0.013,0.013],[0,0],[0,0],[0,0],[0.173,0.629],[0.123,0],[0.807,-0.189],[0,0],[-0.11,-0.401],[0,0],[0,0]],"v":[[2.561,-4.414],[0.991,-2.508],[2.518,0.539],[9.146,5.668],[11.642,14.735],[13.1,15.782],[13.472,15.738],[14.561,14.047],[13.08,4.085],[12.375,3.061],[5.551,-3.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,-2.188],"ix":2},"a":{"a":0,"k":[3.063,-2.188],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":192,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":204,"s":[0],"e":[94]},{"t":216}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.039,-0.055],[0,0],[0,0],[0.064,-0.838],[-0.814,-0.068],[0,0],[-0.055,0],[-0.387,0.536],[0,0],[0.941,1.069]],"o":[[-0.043,0.051],[0,0],[0,0],[-0.815,-0.069],[-0.066,0.839],[0,0],[0.057,0.004],[0.69,0],[0,0],[0,0],[-1.011,-1.15]],"v":[[-0.697,-4.047],[-0.822,-3.891],[-5.511,3.443],[-13.571,3.263],[-15.162,4.658],[-13.808,6.299],[-4.627,7.337],[-4.461,7.344],[-2.736,6.49],[2.518,0.539],[3.114,-3.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-3.313],"ix":2},"a":{"a":0,"k":[2,-3.313],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":192,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":204,"s":[0],"e":[-92]},{"t":216}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.576,0.03],[-0.027,0.003],[-0.261,0.549],[0,0],[0.723,0.342],[0.341,-0.722],[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.218,-1.676],[0,0]],"o":[[0.348,0.465],[0.027,-0.002],[0.604,-0.061],[0,0],[0.343,-0.722],[-0.722,-0.341],[0,0],[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.956,-0.079],[-0.218,1.676],[0,0]],"v":[[8.772,-5.613],[10.252,-4.92],[10.334,-4.927],[11.728,-5.911],[14.885,-10.833],[14.198,-12.759],[12.272,-12.071],[10.205,-9.296],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[2.522,-12.203],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.5,-14.094],"ix":2},"a":{"a":0,"k":[3.5,-14.094],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[102]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[102]},{"t":192}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,1.598],[0,0],[0,0],[0.003,0],[0.309,-0.694],[0,0],[-0.727,-0.324],[-0.142,-0.016],[-0.263,0.59],[0,0],[0,0]],"o":[[0.571,-1.598],[0,0],[-0.002,0],[-0.752,-0.087],[0,0],[-0.324,0.727],[0.138,0.061],[0.61,0.071],[0,0],[0,0],[0,0]],"v":[[4.577,-12.524],[3.928,-15.382],[-2.871,-15.695],[-2.877,-15.695],[-4.66,-14.677],[-6.655,-9.525],[-5.924,-7.621],[-5.502,-7.506],[-4.02,-8.352],[-2.009,-12.1],[0.749,-11.524]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.656,-13.281],"ix":2},"a":{"a":0,"k":[4.656,-13.281],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[-146]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":144,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":168,"s":[0],"e":[-146]},{"t":192}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.237,0.013],[0.018,0.003],[0,0],[1.075,-1.386],[0,0],[0,0],[0.039,-0.055],[0,0],[0,0],[0.348,0.264],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.238,-0.059],[-0.016,-0.002],[0,0],[0,0],[-1.075,1.386],[0,0],[-0.043,0.051],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.798,-10.046],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[4.795,-15.336],[4.746,-15.345],[3.928,-15.382],[1.879,-14.538],[0.749,-11.524],[-0.697,-4.047],[-0.822,-3.891],[-0.403,-0.141],[2.518,0.539],[5.47,-0.404],[5.551,-3.128],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":96,"op":192,"st":96,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.657,107.486,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.083,-0.067],[-0.067,2.085],[2.085,0.067],[0.068,-2.084]],"o":[[2.084,0.068],[0.067,-2.084],[-2.083,-0.068],[-0.067,2.085]],"v":[[-0.123,3.772],[3.774,0.12],[0.122,-3.773],[-3.774,-0.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.625,-20.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.017,0.019],[0.04,0.027],[0,0],[0,0],[0,0],[-0.672,0],[-0.124,0.03],[0.205,0.745],[0,0],[0.348,0.264],[0,0]],"o":[[-0.013,0.013],[0,0],[0,0],[0,0],[0.173,0.629],[0.123,0],[0.807,-0.189],[0,0],[-0.11,-0.401],[0,0],[0,0]],"v":[[2.561,-4.414],[0.991,-2.508],[2.518,0.539],[9.146,5.668],[11.642,14.735],[13.1,15.782],[13.472,15.738],[14.561,14.047],[13.08,4.085],[12.375,3.061],[5.551,-3.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.063,-2.188],"ix":2},"a":{"a":0,"k":[3.063,-2.188],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[94]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[94],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[0],"e":[94]},{"t":120}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg left","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.039,-0.055],[0,0],[0,0],[0.064,-0.838],[-0.814,-0.068],[0,0],[-0.055,0],[-0.387,0.536],[0,0],[0.941,1.069]],"o":[[-0.043,0.051],[0,0],[0,0],[-0.815,-0.069],[-0.066,0.839],[0,0],[0.057,0.004],[0.69,0],[0,0],[0,0],[-1.011,-1.15]],"v":[[-0.697,-4.047],[-0.822,-3.891],[-5.511,3.443],[-13.571,3.263],[-15.162,4.658],[-13.808,6.299],[-4.627,7.337],[-4.461,7.344],[-2.736,6.49],[2.518,0.539],[3.114,-3.753]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2,-3.313],"ix":2},"a":{"a":0,"k":[2,-3.313],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[-92]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":96,"s":[-92],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[0],"e":[-92]},{"t":120}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leg right","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.576,0.03],[-0.027,0.003],[-0.261,0.549],[0,0],[0.723,0.342],[0.341,-0.722],[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.218,-1.676],[0,0]],"o":[[0.348,0.465],[0.027,-0.002],[0.604,-0.061],[0,0],[0.343,-0.722],[-0.722,-0.341],[0,0],[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.956,-0.079],[-0.218,1.676],[0,0]],"v":[[8.772,-5.613],[10.252,-4.92],[10.334,-4.927],[11.728,-5.911],[14.885,-10.833],[14.198,-12.759],[12.272,-12.071],[10.205,-9.296],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[2.522,-12.203],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.5,-14.094],"ix":2},"a":{"a":0,"k":[3.5,-14.094],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[102]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[102],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[102]},{"t":96}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm left","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.571,1.598],[0,0],[0,0],[0.003,0],[0.309,-0.694],[0,0],[-0.727,-0.324],[-0.142,-0.016],[-0.263,0.59],[0,0],[0,0]],"o":[[0.571,-1.598],[0,0],[-0.002,0],[-0.752,-0.087],[0,0],[-0.324,0.727],[0.138,0.061],[0.61,0.071],[0,0],[0,0],[0,0]],"v":[[4.577,-12.524],[3.928,-15.382],[-2.871,-15.695],[-2.877,-15.695],[-4.66,-14.677],[-6.655,-9.525],[-5.924,-7.621],[-5.502,-7.506],[-4.02,-8.352],[-2.009,-12.1],[0.749,-11.524]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.656,-13.281],"ix":2},"a":{"a":0,"k":[4.656,-13.281],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":24,"s":[0],"e":[-146]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[-146],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":72,"s":[0],"e":[-146]},{"t":96}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"arm right","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.009,0.01],[1.037,0.254],[0.237,0.013],[0.018,0.003],[0,0],[1.075,-1.386],[0,0],[0,0],[0.039,-0.055],[0,0],[0,0],[0.348,0.264],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.009,-0.009],[-0.483,-0.828],[-0.238,-0.059],[-0.016,-0.002],[0,0],[0,0],[-1.075,1.386],[0,0],[-0.043,0.051],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.798,-10.046],[8.014,-13.23],[7.877,-13.474],[7.851,-13.502],[5.51,-15.23],[4.795,-15.336],[4.746,-15.345],[3.928,-15.382],[1.879,-14.538],[0.749,-11.524],[-0.697,-4.047],[-0.822,-3.891],[-0.403,-0.141],[2.518,0.539],[5.47,-0.404],[5.551,-3.128],[7.043,-7.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":4,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/walking.json b/example/resource/walking.json deleted file mode 100755 index 344dd0666a..0000000000 --- a/example/resource/walking.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.2.0","fr":30,"ip":0,"op":23,"w":200,"h":200,"nm":"walking_lottie2","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Arm front","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.824],"y":[0.888]},"o":{"x":[0.253],"y":[0.288]},"n":["0p824_0p888_0p253_0p288"],"t":0,"s":[0],"e":[52.03]},{"i":{"x":[0.833],"y":[0.837]},"o":{"x":[0.188],"y":[0.296]},"n":["0p833_0p837_0p188_0p296"],"t":18.615,"s":[52.03],"e":[78]},{"i":{"x":[0.718],"y":[6.132]},"o":{"x":[0.158],"y":[1.651]},"n":["0p718_6p132_0p158_1p651"],"t":41.5,"s":[78],"e":[80]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[25.234,20.066,0],"e":[24.434,20.416,0],"to":[-0.13333334028721,0.05833333358169,0],"ti":[0.13333334028721,-0.05833333358169,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[25.234,20.066,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[100,109,100]},{"t":60.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-2.467,-3.971],[-1.325,0.482],[0.498,1.834],[0.999,3.289],[2.487,-1.104],[-0.843,-1.506]],"o":[[1.385,2.229],[1.27,-0.462],[-0.968,-3.563],[-0.592,-1.949],[-2.319,1.029],[2.566,4.585]],"v":[[6.977,-13.958],[11.185,-12.062],[12.237,-16.339],[8.878,-27.206],[3.03,-30.334],[0.844,-24.514]],"c":true}],"e":[{"i":[[-2.467,-3.971],[-1.325,0.482],[0.619,1.797],[1.209,3.191],[2.584,-0.786],[-0.866,-1.493]],"o":[[1.385,2.229],[1.27,-0.462],[-1.204,-3.493],[-0.721,-1.905],[-2.427,0.738],[2.628,4.531]],"v":[[7.114,-14.006],[11.185,-12.062],[12.237,-16.339],[8.366,-27.055],[3.03,-30.334],[0.844,-24.514]],"c":true}]},{"t":60.5}],"ix":2},"nm":"r_arm","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Arm front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Elbow front","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1.059]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1p059_0p167_0p167"],"t":0,"s":[0],"e":[19]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.062]},"n":["0p833_0p833_0p167_0p062"],"t":18.615,"s":[19],"e":[-22]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[31.234,33.516,0],"ix":2},"a":{"a":0,"k":[31.234,33.516,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-1.001,-0.7],[0,0],[-1.185,1.671],[1.212,0.847],[2.498,1.759],[1.008,-1.186]],"o":[[2.846,1.992],[0.466,0.328],[0.853,-1.204],[0,0],[-1.079,-0.76],[-1.119,1.316]],"v":[[8.434,-12.16],[16.389,-6.575],[20.191,-7.347],[19.529,-11.076],[12.238,-16.339],[7.809,-16.014]],"c":true}],"e":[{"i":[[-1.001,-0.7],[0,0],[-0.952,1.247],[1.212,0.847],[2.498,1.759],[1.008,-1.186]],"o":[[2.846,1.992],[0.466,0.328],[0.675,-0.885],[0,0],[-1.079,-0.76],[-1.119,1.316]],"v":[[8.434,-12.16],[17.463,-5.872],[20.511,-6.508],[19.98,-9.593],[12.019,-16],[7.809,-16.014]],"c":true}]},{"t":60.5}],"ix":2},"nm":"r_hand","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Elbow front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Arm Back","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.842],"y":[0.879]},"o":{"x":[0.249],"y":[0.253]},"n":["0p842_0p879_0p249_0p253"],"t":0,"s":[0],"e":[-60]},{"i":{"x":[0.838],"y":[0.908]},"o":{"x":[0.162],"y":[0.295]},"n":["0p838_0p908_0p162_0p295"],"t":18.615,"s":[-60],"e":[-91]},{"i":{"x":[0.756],"y":[-0.317]},"o":{"x":[0.167],"y":[-0.206]},"n":["0p756_-0p317_0p167_-0p206"],"t":41.419,"s":[-91],"e":[-79]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[23.609,20.141,0],"e":[25.809,21.041,0],"to":[0.36666667461395,0.15000000596046,0],"ti":[-0.36666667461395,-0.15000000596046,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[23.559,20.141,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[89,89,100]},{"t":60.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.098,1.659],[1.912,-1.556],[1.466,-1.268],[-0.759,-1.09],[-0.939,0.554],[-0.967,0.893]],"o":[[-0.896,-1.354],[-3.827,3.114],[-0.704,0.608],[0.656,0.942],[1.133,-0.669],[1.613,-1.489]],"v":[[4.838,-29.564],[-1.502,-30.049],[-12.756,-20.862],[-13.105,-17.24],[-9.45,-16.534],[3.942,-23.94]],"c":true},"ix":2},"nm":"l_arm","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Arm Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Elbow Back","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.137],"y":[0.186]},"n":["0p667_1_0p137_0p186"],"t":0,"s":[0],"e":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18.615,"s":[40],"e":[40]},{"i":{"x":[0.831],"y":[0.764]},"o":{"x":[0.333],"y":[0]},"n":["0p831_0p764_0p333_0"],"t":41.419,"s":[40],"e":[19]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[10.684,28.939,0],"ix":2},"a":{"a":0,"k":[10.684,28.939,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[105,105,100]},{"t":60.5}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[2.129,0.244],[0.078,-1.09],[0.214,-3.524],[-1.164,-0.086],[-0.234,1.66],[-0.414,3.179]],"o":[[-1.997,-0.229],[-0.259,3.607],[-0.088,1.443],[1.269,0.093],[0.418,-2.972],[0.177,-1.357]],"v":[[-10.343,-21.775],[-13.456,-19.237],[-14.202,-8.747],[-12.034,-5.997],[-9.281,-8.165],[-7.775,-18.559]],"c":true}],"e":[{"i":[[2.129,0.244],[0.078,-1.09],[0.214,-3.524],[-1.164,-0.086],[-0.234,1.66],[-0.414,3.179]],"o":[[-1.997,-0.229],[-0.259,3.607],[-0.088,1.443],[1.269,0.093],[0.418,-2.972],[0.177,-1.357]],"v":[[-10.343,-21.775],[-13.456,-19.237],[-14.278,-8.773],[-11.884,-6.006],[-8.659,-8.292],[-7.553,-18.455]],"c":true}]},{"t":60.5}],"ix":2},"nm":"l_hand","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Elbow Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Thigh Front","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.897]},"o":{"x":[0.238],"y":[0.242]},"n":["0p833_0p897_0p238_0p242"],"t":0,"s":[0],"e":[-42]},{"i":{"x":[0.836],"y":[0.904]},"o":{"x":[0.167],"y":[0.333]},"n":["0p836_0p904_0p167_0p333"],"t":18.615,"s":[-42],"e":[-58]},{"i":{"x":[0.845],"y":[21300043.174]},"o":{"x":[0.147],"y":[8734441.235]},"n":["0p845_21300043p174_0p147_8734441p235"],"t":41.5,"s":[-58],"e":[-58]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[21.834,43.741,0],"e":[21.834,43.441,0],"to":[0,-0.05000000074506,0],"ti":[0,0.05000000074506,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[21.834,43.741,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.955,-2.939],[1.994,-5.853],[-1.609,-0.871],[-0.614,1.175],[-2.762,5.173],[3.231,1.904]],"o":[[-1.914,5.892],[-0.437,1.283],[1.462,0.791],[2.948,-5.646],[1.085,-2.032],[-3.316,-1.954]],"v":[[-4.9,-4.622],[-10.708,12.773],[-9.005,17.391],[-4.688,16.242],[4.622,-1.503],[3.027,-8.251]],"c":true},"ix":2},"nm":"R_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Front","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Leg Front","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.127],"y":[0.19]},"n":["0p667_1_0p127_0p19"],"t":0,"s":[0],"e":[54]},{"i":{"x":[0.805],"y":[0.993]},"o":{"x":[0.333],"y":[0]},"n":["0p805_0p993_0p333_0"],"t":18.615,"s":[54],"e":[-3.419]},{"i":{"x":[0.752],"y":[0.1]},"o":{"x":[0.196],"y":[-0.057]},"n":["0p752_0p1_0p196_-0p057"],"t":41.5,"s":[-3.419],"e":[2.5]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[13.884,62.316,0],"e":[13.428,63.19,0],"to":[-0.07598020881414,0.14574256539345,0],"ti":[0.07598020881414,-0.14574256539345,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[13.884,62.316,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.857,1.296],[0.872,-1.201],[0,0],[-1.227,-0.977],[-0.619,0],[-0.562,0.702],[-3.613,4.33]],"o":[[-1.839,-1.283],[-3.081,4.247],[-0.979,1.229],[0.523,0.415],[0.836,0],[0,0],[0.907,-1.088]],"v":[[-5.65,11.629],[-10.708,12.773],[-20.055,25.4],[-19.605,29.391],[-17.837,30.014],[-15.611,28.941],[-4.676,16.291]],"c":true},"ix":2},"nm":"Leg front","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"R_foot","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"torso","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[502.643,499.348,0],"e":[502.643,490.047,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":21,"s":[502.643,490.047,0],"e":[502.643,499.348,0],"to":[0,0,0],"ti":[0,0,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[21.284,39.916,0],"ix":1},"s":{"a":0,"k":[1000,1000,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.025,0.287],[0,0],[0,0],[3.159,0.256],[1.038,-0.48],[0.387,-0.281],[0,0],[0,0],[-0.045,-0.383],[-4.037,-0.099]],"o":[[0.065,-0.274],[0,0],[0.141,0.154],[-0.549,-2.977],[-1.225,-0.098],[-0.329,0.116],[-2.963,3.919],[0,0],[-0.033,0.396],[0,0],[4.013,0.098]],"v":[[6.764,-3.965],[6.902,-4.809],[7.928,-12.659],[9.303,-25.73],[3.115,-31.324],[-0.32,-30.709],[-1.277,-30.224],[-4.482,-19.29],[-4.949,-5.766],[-4.926,-4.596],[0.872,1.323]],"c":true},"ix":2},"nm":"torso","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"torso","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Thigh Back","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.849]},"o":{"x":[0.251],"y":[0.192]},"n":["0p833_0p849_0p251_0p192"],"t":0,"s":[0],"e":[27.02]},{"i":{"x":[0.833],"y":[0.901]},"o":{"x":[0.167],"y":[0.182]},"n":["0p833_0p901_0p167_0p182"],"t":18.615,"s":[27.02],"e":[54.62]},{"i":{"x":[0.758],"y":[3.564]},"o":{"x":[0.167],"y":[0.956]},"n":["0p758_3p564_0p167_0p956"],"t":41.419,"s":[54.62],"e":[57]},{"t":60.5}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[21.834,43.916,0],"e":[21.584,43.116,0],"to":[-0.04166666790843,-0.13333334028721,0],"ti":[0.04166666790843,0.13333334028721,0]},{"t":60.5}],"ix":2},"a":{"a":0,"k":[21.834,43.916,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.774,1.349],[2.972,5.261],[2.734,-1.43],[-1.608,-2.234],[0,0],[-2.8,-3.572],[-1.541,0.746]],"o":[[-3.587,-6.252],[-1.143,-2.023],[-2.542,1.329],[1.299,1.805],[0,0],[0.815,1.04],[1.252,-0.607]],"v":[[16.137,12.221],[5.639,-5.891],[-1.698,-8.333],[-3.188,-1.209],[1.472,4.473],[9.661,14.867],[14.376,16.249]],"c":true},"ix":2},"nm":"l_thi","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Thigh Back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Leg Back","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.992]},"o":{"x":[0.116],"y":[0.359]},"n":["0p833_0p992_0p116_0p359"],"t":0,"s":[0],"e":[-14]},{"i":{"x":[0.752],"y":[0.621]},"o":{"x":[0.167],"y":[-0.004]},"n":["0p752_0p621_0p167_-0p004"],"t":41.419,"s":[-14],"e":[-1]},{"t":60.5}],"ix":10},"p":{"a":0,"k":[34.209,61.291,0],"ix":2},"a":{"a":0,"k":[34.209,61.291,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.449,5.274],[2.016,-0.941],[-0.516,-1.524],[0,0],[-1.238,0],[-0.282,0.085],[0.468,1.529]],"o":[[-0.424,-1.544],[-1.718,0.802],[1.65,4.878],[0.381,1.245],[0.282,0],[1.529,-0.468],[0,0]],"v":[[16.137,12.346],[11.679,10.269],[9.66,14.868],[14.551,29.374],[17.315,31.422],[18.165,31.296],[20.085,27.682]],"c":true},"ix":2},"nm":"l_foot","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.988235294819],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.283,48.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Leg back","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"head","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.334,16.966,0],"ix":2},"a":{"a":0,"k":[24.334,16.966,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.955,0.722],[0.719,3.946],[3.946,-0.716],[-0.708,-3.944]],"o":[[3.937,-0.71],[-0.708,-3.948],[-3.949,0.709],[0.716,3.945]],"v":[[1.297,7.139],[7.139,-1.293],[-1.294,-7.145],[-7.15,1.292]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.298,8.111],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1260,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"walking_1000","refId":"comp_0","sr":0.37999999523163,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[97.5,99,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[22.2,22.2,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":478.799993991852,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/yoga.json b/example/resource/yoga.json deleted file mode 100755 index 9003783dc2..0000000000 --- a/example/resource/yoga.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.0.6","fr":60,"ip":0,"op":361,"w":200,"h":200,"nm":"yoga","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[400,400,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.027,-1.297],[-1.295,2.036],[2.03,1.294],[1.295,-2.031]],"o":[[2.029,1.293],[1.292,-2.024],[-2.029,-1.297],[-1.298,2.028]],"v":[[-2.531,15.115],[3.49,13.779],[2.159,7.764],[-3.859,9.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[0,-3.063],"e":[0,-5.063],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[0,-5.063],"e":[0,-3.063],"to":[0,0],"ti":[0,0]},{"t":120}],"ix":2},"a":{"a":0,"k":[-0.188,20.375],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":120,"s":[0],"e":[35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[35],"e":[-35]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":300,"s":[-35],"e":[0]},{"t":360}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[8.091,-0.689],[5.568,-8.097],[5.265,-8.719],[0.277,-11.541],[0.275,-11.541],[-4.753,-8.612],[-4.978,-8.113],[-7.582,-0.54],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}],"e":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[9.091,-0.876],[7.725,-9.097],[7.421,-9.719],[0.09,-13.604],[0.088,-13.604],[-7.472,-9.706],[-7.696,-9.207],[-8.988,-0.759],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":45,"s":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[9.091,-0.876],[7.725,-9.097],[7.421,-9.719],[0.09,-13.604],[0.088,-13.604],[-7.472,-9.706],[-7.696,-9.207],[-8.988,-0.759],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}],"e":[{"i":[[1.024,0.29],[0,0],[-0.277,0.418],[0.714,0.476],[0,0],[0,0],[0.127,0.188],[2.398,0.001],[0,0],[0.529,-1.678],[0.058,-0.178],[0,0],[0,0],[-0.511,-0.763],[-0.319,-0.117],[0,0],[-0.182,-1.05],[-1.004,0],[-0.048,0.003],[0,0],[-0.039,0.005],[-3.297,-0.177],[0,0],[0,0],[-0.047,0],[-0.174,1.002]],"o":[[0,0],[0.465,-0.031],[0.478,-0.714],[0,0],[0,0],[-0.074,-0.227],[-0.58,-1.622],[0,0],[-2.451,0],[-0.091,0.155],[0,0],[0,0],[-0.764,0.509],[0.201,0.305],[0,0],[-1.026,0.29],[0.174,1.003],[0.047,0],[0,0],[0.041,-0.002],[0.33,-0.03],[0.006,0],[0,0],[0.048,0.003],[1.004,0],[0.183,-1.05]],"v":[[15.109,7.459],[13.649,7.047],[14.839,6.361],[14.409,4.207],[8.091,-0.689],[5.568,-8.097],[5.265,-8.719],[0.277,-11.541],[0.275,-11.541],[-4.753,-8.612],[-4.978,-8.113],[-7.582,-0.54],[-13.894,4.078],[-14.353,6.38],[-13.545,7.017],[-15.108,7.459],[-16.593,9.816],[-14.545,11.541],[-14.403,11.536],[-2.768,10.742],[-2.647,10.728],[2.75,10.741],[2.761,10.742],[14.401,11.536],[14.544,11.541],[16.592,9.816]],"c":true}]},{"t":120}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"body","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 3e8c2adb6729e42326f7d24a72cce29e02f5771d Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Fri, 16 Nov 2018 21:38:30 +0900 Subject: [PATCH 302/672] lottie/vector: extend freetype stroker to provide the contour open flag for each contour in an outline. Change-Id: Ibe4f8e4f45c90f5b03fd528c460e040fef13b375 --- src/vector/freetype/v_ft_raster.h | 1 + src/vector/freetype/v_ft_stroker.cpp | 5 ++--- src/vector/freetype/v_ft_stroker.h | 8 +------- src/vector/vraster.cpp | 27 +++++++++++++++++---------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/vector/freetype/v_ft_raster.h b/src/vector/freetype/v_ft_raster.h index e67f480495..aad2a8ab51 100644 --- a/src/vector/freetype/v_ft_raster.h +++ b/src/vector/freetype/v_ft_raster.h @@ -120,6 +120,7 @@ typedef struct SW_FT_Outline_ SW_FT_Vector* points; /* the outline's points */ char* tags; /* the points flags */ short* contours; /* the contour end points */ + char* contours_flag; /* the contour open flags */ int flags; /* outline masks */ diff --git a/src/vector/freetype/v_ft_stroker.cpp b/src/vector/freetype/v_ft_stroker.cpp index 7192d5309f..2a857079b0 100644 --- a/src/vector/freetype/v_ft_stroker.cpp +++ b/src/vector/freetype/v_ft_stroker.cpp @@ -1741,8 +1741,7 @@ void SW_FT_Stroker_Export(SW_FT_Stroker stroker, SW_FT_Outline* outline) * that we do support opened paths, and do not scale the outline. */ SW_FT_Error SW_FT_Stroker_ParseOutline(SW_FT_Stroker stroker, - const SW_FT_Outline* outline, - SW_FT_Bool opened) + const SW_FT_Outline* outline) { SW_FT_Vector v_last; SW_FT_Vector v_control; @@ -1805,7 +1804,7 @@ SW_FT_Error SW_FT_Stroker_ParseOutline(SW_FT_Stroker stroker, tags--; } - error = SW_FT_Stroker_BeginSubPath(stroker, &v_start, opened); + error = SW_FT_Stroker_BeginSubPath(stroker, &v_start, outline->contours_flag[n]); if (error) goto Exit; while (point < limit) { diff --git a/src/vector/freetype/v_ft_stroker.h b/src/vector/freetype/v_ft_stroker.h index d2b54e47b8..1514cf3d0a 100644 --- a/src/vector/freetype/v_ft_stroker.h +++ b/src/vector/freetype/v_ft_stroker.h @@ -228,9 +228,6 @@ * outline :: * The source outline. * - * opened :: - * A boolean. If~1, the outline is treated as an open path instead - * of a closed one. * * @return: * FreeType error code. 0~means success. @@ -239,15 +236,12 @@ * If `opened' is~0 (the default), the outline is treated as a closed * path, and the stroker generates two distinct `border' outlines. * - * If `opened' is~1, the outline is processed as an open path, and the - * stroker generates a single `stroke' outline. * * This function calls @SW_FT_Stroker_Rewind automatically. */ SW_FT_Error SW_FT_Stroker_ParseOutline( SW_FT_Stroker stroker, - const SW_FT_Outline* outline, - SW_FT_Bool opened ); + const SW_FT_Outline* outline); /************************************************************** diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index b5e58f4ea1..11015a3c90 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -17,7 +17,10 @@ public: { if (mPointSize) delete[] ft.points; if (mTagSize) delete[] ft.tags; - if (mSegmentSize) delete[] ft.contours; + if (mSegmentSize) { + delete[] ft.contours; + delete[] ft.contours_flag; + } } void reset(); void grow(int, int); @@ -38,7 +41,6 @@ public: SW_FT_Stroker_LineJoin ftJoin; SW_FT_Fixed ftWidth; SW_FT_Fixed ftMeterLimit; - SW_FT_Bool ftClosed; }; void FTOutline::reset() @@ -62,8 +64,12 @@ void FTOutline::grow(int points, int segments) } if (segment_size > mSegmentSize) { - if (mSegmentSize) delete [] ft.contours; + if (mSegmentSize) { + delete [] ft.contours; + delete [] ft.contours_flag; + } ft.contours = new short[segment_size]; + ft.contours_flag = new char[segment_size]; mSegmentSize = segment_size; } @@ -109,8 +115,6 @@ void FTOutline::convert(const VPath &path) void FTOutline::convert(CapStyle cap, JoinStyle join, float width, float meterLimit) { - ftClosed = (SW_FT_Bool)closed; - // map strokeWidth to freetype. It uses as the radius of the pen not the // diameter width = width / 2.0; @@ -156,8 +160,11 @@ void FTOutline::moveTo(const VPointF &pt) ft.contours[ft.n_contours] = ft.n_points - 1; ft.n_contours++; } + // mark the current contour as open + // will be updated if ther is a close tag at the end. + ft.contours_flag[ft.n_contours] = 1; + ft.n_points++; - closed = false; } void FTOutline::lineTo(const VPointF &pt) @@ -166,7 +173,6 @@ void FTOutline::lineTo(const VPointF &pt) ft.points[ft.n_points].y = TO_FT_COORD(pt.y()); ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; ft.n_points++; - closed = false; } void FTOutline::cubicTo(const VPointF &cp1, const VPointF &cp2, @@ -186,10 +192,12 @@ void FTOutline::cubicTo(const VPointF &cp1, const VPointF &cp2, ft.points[ft.n_points].y = TO_FT_COORD(ep.y()); ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; ft.n_points++; - closed = false; } void FTOutline::close() { + // mark the contour as a close path. + ft.contours_flag[ft.n_contours] = 0; + int index; if (ft.n_contours) { index = ft.contours[ft.n_contours - 1] + 1; @@ -207,7 +215,6 @@ void FTOutline::close() ft.points[ft.n_points].y = ft.points[index].y; ft.tags[ft.n_points] = SW_FT_CURVE_TAG_ON; ft.n_points++; - closed = true; } void FTOutline::end() @@ -256,7 +263,7 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) SW_FT_Stroker_Set(stroker, outRef.ftWidth, outRef.ftCap, outRef.ftJoin, outRef.ftMeterLimit); - SW_FT_Stroker_ParseOutline(stroker, &outRef.ft, !outRef.ftClosed); + SW_FT_Stroker_ParseOutline(stroker, &outRef.ft); SW_FT_Stroker_GetCounts(stroker, &points, &contors); outRef.grow(points, contors); From 15b256d1bf2e7282ea0d629bc622d4d8b7a5028f Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Fri, 16 Nov 2018 22:13:33 +0900 Subject: [PATCH 303/672] lottie: optimize VPath::length() api implementation. Change-Id: Ieb32e5e6103261fadbf4287d4e6f82353414caac --- src/vector/vpath.cpp | 20 ++++++++++++++++---- src/vector/vpath.h | 2 ++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 0f246d9000..183092266b 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -13,11 +13,16 @@ void VPath::VPathData::transform(const VMatrix &m) for (auto &i : m_points) { i = m.map(i); } + mLengthDirty = true; } float VPath::VPathData::length() const { - float len = 0.0; + if (!mLengthDirty) return mLength; + + mLengthDirty = false; + mLength = 0.0; + int i = 0; for (auto e : m_elements) { switch (e) { @@ -25,12 +30,12 @@ float VPath::VPathData::length() const i++; break; case VPath::Element::LineTo: { - len += VLine( m_points[i-1], m_points[i]).length(); + mLength += VLine( m_points[i-1], m_points[i]).length(); i++; break; } case VPath::Element::CubicTo: { - len += VBezier::fromPoints(m_points[i-1], m_points[i], + mLength += VBezier::fromPoints(m_points[i-1], m_points[i], m_points[i+1], m_points[i+2]).length(); i += 3; break; @@ -40,7 +45,7 @@ float VPath::VPathData::length() const } } - return len; + return mLength; } void VPath::VPathData::checkNewSegment() @@ -58,6 +63,7 @@ void VPath::VPathData::moveTo(float x, float y) m_elements.emplace_back(VPath::Element::MoveTo); m_points.emplace_back(x,y); m_segments++; + mLengthDirty = true; } void VPath::VPathData::lineTo(float x, float y) @@ -65,6 +71,7 @@ void VPath::VPathData::lineTo(float x, float y) checkNewSegment(); m_elements.emplace_back(VPath::Element::LineTo); m_points.emplace_back(x,y); + mLengthDirty = true; } void VPath::VPathData::cubicTo(float cx1, float cy1, float cx2, float cy2, @@ -75,6 +82,7 @@ void VPath::VPathData::cubicTo(float cx1, float cy1, float cx2, float cy2, m_points.emplace_back(cx1, cy1); m_points.emplace_back(cx2, cy2); m_points.emplace_back(ex, ey); + mLengthDirty = true; } void VPath::VPathData::close() @@ -87,6 +95,7 @@ void VPath::VPathData::close() } m_elements.push_back(VPath::Element::Close); mNewSegment = true; + mLengthDirty = true; } void VPath::VPathData::reset() @@ -96,6 +105,8 @@ void VPath::VPathData::reset() m_elements.clear(); m_points.clear(); m_segments = 0; + mLength = 0; + mLengthDirty = false; } int VPath::VPathData::segments() const @@ -672,6 +683,7 @@ void VPath::VPathData::addPath(const VPathData &path) std::copy(path.m_elements.begin(), path.m_elements.end(), back_inserter(m_elements)); m_segments += segment; + mLengthDirty = true; } V_END_NAMESPACE diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 6a22225329..bc743169bb 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -86,6 +86,8 @@ private: std::vector m_elements; int m_segments; VPointF mStartPoint; + mutable float mLength{0}; + mutable bool mLengthDirty{true}; bool mNewSegment; }; From f1d1ace6997dee9715ca54db55e96feb7740173d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 16 Nov 2018 19:37:30 +0900 Subject: [PATCH 304/672] lottie: support for individual trim operation. Change-Id: I421c073c0d0f907d07107de5eb0ee141a8d16ebe --- src/lottie/lottieitem.cpp | 87 +++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index d190483bdf..ee29113ca3 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -966,14 +966,87 @@ void LOTTrimItem::update() // when both path and trim are not dirty if (!(mDirty || pathDirty())) return; - //@TODO take the offset and trim type into account. - for (auto &i : mPathItems) { - VPathMesure pm; - pm.setStart(mCache.mStart); - pm.setEnd(mCache.mEnd); - pm.setOffset(mCache.mOffset); - i->updatePath(pm.trim(i->localPath())); + if (vCompare(std::fabs(mCache.mStart - mCache.mEnd) , 1)) return; + + if (vCompare(mCache.mStart, mCache.mEnd)) { + for (auto &i : mPathItems) { + i->updatePath(VPath()); + } + return; } + + + if (mData->type() == LOTTrimData::TrimType::Simultaneously) { + for (auto &i : mPathItems) { + VPathMesure pm; + pm.setStart(mCache.mStart); + pm.setEnd(mCache.mEnd); + pm.setOffset(mCache.mOffset); + i->updatePath(pm.trim(i->localPath())); + } + } else { // LOTTrimData::TrimType::Individually + float totalLength = 0.0; + for (auto &i : mPathItems) { + totalLength += i->localPath().length(); + } + float offset = totalLength * mCache.mOffset; + float start = totalLength * mCache.mStart; + float end = totalLength * mCache.mEnd; + start += offset; + end +=offset; + // normalize start, end value to 0 - totalLength + if (fabs(start) > totalLength) start = fmod(start, totalLength); + if (fabs(end) > totalLength) end = fmod(end, totalLength); + + if (start >= 0 && end >= 0) { + if (start > end) std::swap(start, end); + } else if ( start < 0 && end < 0) { + start += totalLength; + end += totalLength; + if (start > end) std::swap(start, end); + } else { + // one is +ve and one is -ve so the + // segment will be wrapped from end segment to start segment. + // we need to split it in two segment. + //@TODO + return; + } + + if (start < end ) { + float curLen = 0.0; + for (auto &i : mPathItems) { + if (curLen > end) { + // update with empty path. + i->updatePath(VPath()); + continue; + } + float len = i->localPath().length(); + + if (curLen < start && curLen + len < start) { + curLen += len; + // update with empty path. + i->updatePath(VPath()); + continue; + } else if (start <= curLen && end >= curLen + len) { + // inside segment + curLen += len; + continue; + } else { + float local_start = start > curLen ? start - curLen : 0; + local_start /= len; + float local_end = curLen + len < end ? len : end - curLen; + local_end /= len; + VPathMesure pm; + pm.setStart(local_start); + pm.setEnd(local_end); + VPath p = pm.trim(i->localPath()); + i->updatePath(p); + curLen += len; + } + } + } + } + } From 556836cdc5efc7b75eba6e15d4d975100163ca9a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 19 Nov 2018 14:19:10 +0900 Subject: [PATCH 305/672] lottie/vector: add support for clip during rle generation. Change-Id: Ifbd6c3e1b362369298dd6b9333af6f9a90731dbe --- src/vector/vraster.cpp | 59 ++++++++++++++++++++++++++---------------- src/vector/vraster.h | 5 ++-- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 11015a3c90..1c72f78284 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -249,9 +249,34 @@ struct RleTask { JoinStyle join; float width; float meterLimit; + VRect clip; VRle operator()(FTOutline &outRef, SW_FT_Stroker &stroker); + void render(FTOutline &outRef); }; +void RleTask::render(FTOutline &outRef) +{ + SW_FT_Raster_Params params; + + params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; + params.gray_spans = &rleGenerationCb; + params.user = &rle; + params.source = &outRef.ft; + + if (!clip.empty()) { + params.flags |= SW_FT_RASTER_FLAG_CLIP; + + params.clip_box.xMin = clip.left(); + params.clip_box.yMin = clip.top(); + params.clip_box.xMax = clip.right(); + params.clip_box.yMax = clip.bottom(); + } + // compute rle + sw_ft_grays_raster.raster_render(nullptr, ¶ms); + // update bounding box. + rle.boundingRect(); +} + VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) { rle.reset(); @@ -270,15 +295,6 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) SW_FT_Stroker_Export(stroker, &outRef.ft); - SW_FT_Raster_Params params; - - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; - params.gray_spans = &rleGenerationCb; - params.user = &rle; - params.source = &outRef; - - sw_ft_grays_raster.raster_render(nullptr, ¶ms); - } else { // Fill Task outRef.convert(path); int fillRuleFlag = SW_FT_OUTLINE_NONE; @@ -291,15 +307,10 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) break; } outRef.ft.flags = fillRuleFlag; - SW_FT_Raster_Params params; - - params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; - params.gray_spans = &rleGenerationCb; - params.user = &rle; - params.source = &outRef.ft; - - sw_ft_grays_raster.raster_render(nullptr, ¶ms); } + + render(outRef); + return std::move(rle); } @@ -365,7 +376,7 @@ public: } std::future strokeRle(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, - float width, float meterLimit) + float width, float meterLimit, const VRect &clip) { RleTask *task = new RleTask(); task->stroke = true; @@ -375,15 +386,17 @@ public: task->join = join; task->width = width; task->meterLimit = meterLimit; + task->clip = clip; return async(task); } - std::future fillRle(VPath &&path, VRle &&rle, FillRule fillRule) + std::future fillRle(VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) { RleTask *task = new RleTask(); task->path = std::move(path); task->rle = std::move(rle); task->fillRule = fillRule; + task->clip = clip; task->stroke = false; return async(task); } @@ -392,26 +405,26 @@ public: static RleTaskScheduler raster_scheduler; std::future VRaster::generateFillInfo(VPath &&path, VRle &&rle, - FillRule fillRule) + FillRule fillRule, const VRect &clip) { if (path.empty()) { std::promise promise; promise.set_value(VRle()); return promise.get_future(); } - return raster_scheduler.fillRle(std::move(path), std::move(rle), fillRule); + return raster_scheduler.fillRle(std::move(path), std::move(rle), fillRule, clip); } std::future VRaster::generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, - float meterLimit) + float meterLimit, const VRect &clip) { if (path.empty()) { std::promise promise; promise.set_value(VRle()); return promise.get_future(); } - return raster_scheduler.strokeRle(std::move(path), std::move(rle), cap, join, width, meterLimit); + return raster_scheduler.strokeRle(std::move(path), std::move(rle), cap, join, width, meterLimit, clip); } V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 1eaf4ddf8f..a25b0d2754 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -2,6 +2,7 @@ #define VRASTER_H #include #include "vglobal.h" +#include "vrect.h" V_BEGIN_NAMESPACE @@ -12,12 +13,12 @@ struct VRaster { static std::future generateFillInfo(VPath &&path, VRle &&rle, - FillRule fillRule = FillRule::Winding); + FillRule fillRule = FillRule::Winding, const VRect &clip = VRect()); static std::future generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, - float width, float meterLimit); + float width, float meterLimit, const VRect &clip = VRect()); }; V_END_NAMESPACE From bcfafd8a5b3c5e71adcdd83bb75e5d5cdb51890e Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 19 Nov 2018 14:41:13 +0900 Subject: [PATCH 306/672] lottie/performance: clip out path early during rle generation. Change-Id: I0e7c8f9b8408a56e9fd197fe53c49b0a87517608 --- src/lottie/lottieitem.cpp | 3 ++- src/vector/vdrawable.cpp | 6 +++--- src/vector/vdrawable.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index ee29113ca3..7c9bdc55b6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -116,8 +116,9 @@ bool LOTCompItem::render(const lottie::Surface &surface) */ mDrawableList.clear(); mRootLayer->renderList(mDrawableList); + VRect clip(0, 0, surface.width(), surface.height()); for (auto &e : mDrawableList) { - e->preprocess(); + e->preprocess(clip); } VPainter painter(&bitmap); diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index eda7352bfb..13b0a2d9a0 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -2,7 +2,7 @@ #include "vdasher.h" #include "vraster.h" -void VDrawable::preprocess() +void VDrawable::preprocess(const VRect &clip) { if (mFlag & (DirtyState::Path)) { if (mStroke.enable) { @@ -12,10 +12,10 @@ void VDrawable::preprocess() } mRleTask = VRaster::generateStrokeInfo( std::move(mPath), std::move(mRle), mStroke.cap, mStroke.join, - mStroke.width, mStroke.meterLimit); + mStroke.width, mStroke.meterLimit, clip); } else { mRleTask = VRaster::generateFillInfo( - std::move(mPath), std::move(mRle), mFillRule); + std::move(mPath), std::move(mRle), mFillRule, clip); } mRle = VRle(); mFlag &= ~DirtyFlag(DirtyState::Path); diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index c24bee4765..9d157f675b 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -26,7 +26,7 @@ public: void setStrokeInfo(CapStyle cap, JoinStyle join, float meterLimit, float strokeWidth); void setDashInfo(float *array, uint size); - void preprocess(); + void preprocess(const VRect &clip); VRle rle(); public: From 82c9493adf4e68c60be8d62bd0e058b92cce01af Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 16 Nov 2018 12:01:18 +0900 Subject: [PATCH 307/672] lottie: Use the max float value for gap to generate only 1 segment. Change-Id: Ifa8a2688a49f1675567ec5e11869c67d78a83f90 --- src/vector/vpathmesure.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index d588dc6300..81a4ebdaa4 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,6 +1,7 @@ #include "vpathmesure.h" #include "vbezier.h" #include "vdasher.h" +#include V_BEGIN_NAMESPACE @@ -9,7 +10,7 @@ VPath oneSegment(float start, float end, const VPath & path) if (start > end) { std::swap(start, end); } - float array[5] = {0.0f, start, end - start, 1000, 0.0f}; + float array[5] = {0.0f, start, end - start, std::numeric_limits::max(), 0.0f}; VDasher dasher(array, 5); return dasher.dashed(path); } From dcbdcac43be77c753ee78b9bb603c083a653a38c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 19 Nov 2018 16:23:49 +0900 Subject: [PATCH 308/672] lottie/vector: optimize when the rle bounding rect is inside the clip rect. Change-Id: I30c512af527fe8f34d3259b0ec9579aa50765716 --- src/vector/vrle.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 3d4393d344..7db043b2b7 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -134,8 +134,14 @@ void VRle::VRleData::operator*=(int alpha) void VRle::VRleData::opIntersect(const VRect &r, VRle::VRleSpanCb cb, void *userData) const { - VRect clip = r; + if (empty()) return; + if (r.contains(bbox())) { + cb(mSpans.size(), mSpans.data(), userData); + return; + } + + VRect clip = r; VRleHelper tresult, tmp_obj; std::array array; From 4eeb1e17af236ed2018238b33baeae21ce835803 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 21 Nov 2018 10:50:21 +0900 Subject: [PATCH 309/672] lottie/trim: fix regression, always modify the path in trim::update() call. Change-Id: I54e288bea3e2a84d574ebeb545dd36c033029233 --- src/lottie/lottieitem.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 7c9bdc55b6..a882a0ad4c 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -967,8 +967,6 @@ void LOTTrimItem::update() // when both path and trim are not dirty if (!(mDirty || pathDirty())) return; - if (vCompare(std::fabs(mCache.mStart - mCache.mEnd) , 1)) return; - if (vCompare(mCache.mStart, mCache.mEnd)) { for (auto &i : mPathItems) { i->updatePath(VPath()); From 746bbe8d4980360c92cc57d2104ac494a9fa3b81 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 21 Nov 2018 11:28:39 +0900 Subject: [PATCH 310/672] example: revise capi sample code. added missing feature implements - stroke & gradient Change-Id: I755d304648eb8faded8fae767b1414b7ce29c47f --- example/lottieview.cpp | 148 +++++++++++++++++++++++++++-------------- example/lottieview.h | 2 +- 2 files changed, 98 insertions(+), 52 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 623e154cbe..7072a991a5 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -18,90 +18,136 @@ animator(void *data , double pos) return EINA_TRUE; } -void LottieView::createVgNode(LOTNode *node, Efl_VG *parent) +void LottieView::createVgNode(LOTNode *node, Efl_VG *root) { - Efl_VG *shape = evas_vg_shape_add(parent); - // update the path + Efl_VG *shape = evas_vg_shape_add(root); + + //0: Path const float *data = node->mPath.ptPtr; - for(int i=0; i mPath.elmCount; i++) { + if (!data) return; + + for (int i = 0; i < node->mPath.elmCount; i++) { switch (node->mPath.elmPtr[i]) { - case 0: //moveTo - { + case 0: evas_vg_shape_append_move_to(shape, data[0], data[1]); data += 2; break; - } case 1: - { evas_vg_shape_append_line_to(shape, data[0], data[1]); data += 2; break; - } case 2: - { evas_vg_shape_append_cubic_to(shape, data[0], data[1], data[2], data[3], data[4], data[5]); data += 6; break; - } case 3: - { evas_vg_shape_append_close(shape); break; - } default: break; } } + //1: Stroke if (node->mStroke.enable) { + //Stroke Width evas_vg_shape_stroke_width_set(shape, node->mStroke.width); - //evas_vg_shape_stroke_cap_set(shape, int(node->mStroke.cap)); - //evas_vg_shape_stroke_join_set(shape, int(node->mStroke.join)); - //evas_vg_shape_stroke_meter_limit_set(shape, node->mStroke.meterLimit); - } - // update paint info - if (node->mBrushType == LOTBrushType::BrushSolid) { - int r = (node->mColor.r * node->mColor.a)/255; - int g = (node->mColor.g * node->mColor.a)/255; - int b = (node->mColor.b * node->mColor.a)/255; - int a = node->mColor.a; - if (node->mStroke.enable) { - evas_vg_shape_stroke_color_set(shape, r, g, b, a); - } else { - evas_vg_node_color_set(shape, r, g, b, a); - } - } else if (node->mBrushType == LOTBrushType::BrushGradient) { - Efl_VG *grad = nullptr; + //Stroke Cap + Efl_Gfx_Cap cap; + switch (node->mStroke.cap) { + case CapFlat: cap = EFL_GFX_CAP_BUTT; break; + case CapSquare: cap = EFL_GFX_CAP_SQUARE; break; + case CapRound: cap = EFL_GFX_CAP_ROUND; break; + default: cap = EFL_GFX_CAP_BUTT; break; + } + evas_vg_shape_stroke_cap_set(shape, cap); + + //Stroke Join + Efl_Gfx_Join join; + switch (node->mStroke.join) { + case JoinMiter: join = EFL_GFX_JOIN_MITER; break; + case JoinBevel: join = EFL_GFX_JOIN_BEVEL; break; + case JoinRound: join = EFL_GFX_JOIN_ROUND; break; + default: join = EFL_GFX_JOIN_MITER; break; + } + evas_vg_shape_stroke_join_set(shape, join); + + //Stroke Dash + if (node->mStroke.dashArraySize > 0) { + int size = (node->mStroke.dashArraySize / 2); + Efl_Gfx_Dash *dash = static_cast(malloc(sizeof(Efl_Gfx_Dash) * size)); + if (dash) { + for (int i = 0; i <= size; i+=2) { + dash[i].length = node->mStroke.dashArray[i]; + dash[i].gap = node->mStroke.dashArray[i + 1]; + } + evas_vg_shape_stroke_dash_set(shape, dash, size); + free(dash); + } + } + } + + //2: Fill Method + switch (node->mBrushType) { + case BrushSolid: { + float pa = ((float)node->mColor.a) / 255; + int r = (int)(((float) node->mColor.r) * pa); + int g = (int)(((float) node->mColor.g) * pa); + int b = (int)(((float) node->mColor.b) * pa); + int a = node->mColor.a; + if (node->mStroke.enable) + evas_vg_shape_stroke_color_set(shape, r, g, b, a); + else + evas_vg_node_color_set(shape, r, g, b, a); + break; + } + case BrushGradient: { + Efl_VG* grad = NULL; if (node->mGradient.type == GradientLinear) { - grad = evas_vg_gradient_linear_add(parent); + grad = evas_vg_gradient_linear_add(root); evas_vg_gradient_linear_start_set(grad, node->mGradient.start.x, node->mGradient.start.y); evas_vg_gradient_linear_end_set(grad, node->mGradient.end.x, node->mGradient.end.y); - } else { - grad = evas_vg_gradient_radial_add(parent); + + } + else if (node->mGradient.type == GradientRadial) { + grad = evas_vg_gradient_radial_add(root); evas_vg_gradient_radial_center_set(grad, node->mGradient.center.x, node->mGradient.center.y); - evas_vg_gradient_radial_radius_set(grad, node->mGradient.cradius); evas_vg_gradient_radial_focal_set(grad, node->mGradient.focal.x, node->mGradient.focal.y); + evas_vg_gradient_radial_radius_set(grad, node->mGradient.cradius); } - int stop_count = node->mGradient.stopCount; - if (stop_count) - { - Efl_Gfx_Gradient_Stop *stops = (Efl_Gfx_Gradient_Stop *)calloc(stop_count, sizeof(Efl_Gfx_Gradient_Stop)); - for (int i = 0; i mGradient.stopPtr[i].pos; - stops[i].r = (node->mGradient.stopPtr[i].r * node->mGradient.stopPtr[i].a)/255; - stops[i].g = (node->mGradient.stopPtr[i].g * node->mGradient.stopPtr[i].a)/255; - stops[i].b = (node->mGradient.stopPtr[i].b * node->mGradient.stopPtr[i].a)/255; - stops[i].a = node->mGradient.stopPtr[i].a; - } - evas_vg_gradient_stop_set(grad, stops, stop_count); - } - if (node->mStroke.enable) { - evas_vg_shape_stroke_fill_set(shape, grad); - } else { - evas_vg_shape_fill_set(shape, grad); + + if (grad) { + //Gradient Stop + Efl_Gfx_Gradient_Stop* stops = static_cast(malloc(sizeof(Efl_Gfx_Gradient_Stop) * node->mGradient.stopCount)); + if (stops) { + for (unsigned int i = 0; i < node->mGradient.stopCount; i++) { + stops[i].offset = node->mGradient.stopPtr[i].pos; + float pa = ((float)node->mGradient.stopPtr[i].a) / 255; + stops[i].r = (int)(((float)node->mGradient.stopPtr[i].r) * pa); + stops[i].g = (int)(((float)node->mGradient.stopPtr[i].g) * pa); + stops[i].b = (int)(((float)node->mGradient.stopPtr[i].b) * pa); + stops[i].a = node->mGradient.stopPtr[i].a; + } + evas_vg_gradient_stop_set(grad, stops, node->mGradient.stopCount); + free(stops); + } + if (node->mStroke.enable) + evas_vg_shape_stroke_fill_set(shape, grad); + else + evas_vg_shape_fill_set(shape, grad); } + break; } + default: + break; + } + + //3: Fill Rule + if (node->mFillRule == FillEvenOdd) + efl_gfx_shape_fill_rule_set(shape, EFL_GFX_FILL_RULE_ODD_EVEN); + else if (node->mFillRule == FillWinding) + efl_gfx_shape_fill_rule_set(shape, EFL_GFX_FILL_RULE_WINDING); } void LottieView::update(const std::vector &renderList) diff --git a/example/lottieview.h b/example/lottieview.h index deae8e5494..6c3c4ee9a0 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -49,7 +49,7 @@ public: void render(); void initializeBufferObject(Evas *evas); private: - void createVgNode(LOTNode *node, Efl_VG *parent); + void createVgNode(LOTNode *node, Efl_VG *root); void update(const std::vector &); void restart(); public: From 2235e1f7e827b520972e4fe0688dba36a1424c16 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 21 Nov 2018 15:37:28 +0900 Subject: [PATCH 311/672] lottie: refactor trim object handling 1. compute start and end with offset in the model before returning the segment. 2. modify pathmesure object to only handle start and end. Change-Id: I8db4c2f818e8ef8c777bf1618aa143a83dabb5c0 --- src/lottie/lottieitem.cpp | 43 ++++++-------------------- src/lottie/lottieitem.h | 4 +-- src/lottie/lottiemodel.h | 35 +++++++++++++++++++-- src/vector/vpathmesure.cpp | 62 ++++++++++++-------------------------- src/vector/vpathmesure.h | 2 -- 5 files changed, 61 insertions(+), 85 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index a882a0ad4c..009b3ba107 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -948,16 +948,12 @@ void LOTTrimItem::update(int frameNo, const VMatrix &/*parentMatrix*/, if (mCache.mFrameNo == frameNo) return; - float start = mData->start(frameNo); - float end = mData->end(frameNo); - float offset = mData->offset(frameNo); + LOTTrimData::Segment segment = mData->segment(frameNo); - if (!(vCompare(mCache.mStart, start) && vCompare(mCache.mEnd, end) && - vCompare(mCache.mOffset, offset))) { + if (!(vCompare(mCache.mSegment.start, segment.start) && + vCompare(mCache.mSegment.end, segment.end))) { mDirty = true; - mCache.mStart = start; - mCache.mEnd = end; - mCache.mOffset = offset; + mCache.mSegment = segment; } mCache.mFrameNo = frameNo; } @@ -967,7 +963,7 @@ void LOTTrimItem::update() // when both path and trim are not dirty if (!(mDirty || pathDirty())) return; - if (vCompare(mCache.mStart, mCache.mEnd)) { + if (vCompare(mCache.mSegment.start, mCache.mSegment.end)) { for (auto &i : mPathItems) { i->updatePath(VPath()); } @@ -978,9 +974,8 @@ void LOTTrimItem::update() if (mData->type() == LOTTrimData::TrimType::Simultaneously) { for (auto &i : mPathItems) { VPathMesure pm; - pm.setStart(mCache.mStart); - pm.setEnd(mCache.mEnd); - pm.setOffset(mCache.mOffset); + pm.setStart(mCache.mSegment.start); + pm.setEnd(mCache.mSegment.end); i->updatePath(pm.trim(i->localPath())); } } else { // LOTTrimData::TrimType::Individually @@ -988,28 +983,8 @@ void LOTTrimItem::update() for (auto &i : mPathItems) { totalLength += i->localPath().length(); } - float offset = totalLength * mCache.mOffset; - float start = totalLength * mCache.mStart; - float end = totalLength * mCache.mEnd; - start += offset; - end +=offset; - // normalize start, end value to 0 - totalLength - if (fabs(start) > totalLength) start = fmod(start, totalLength); - if (fabs(end) > totalLength) end = fmod(end, totalLength); - - if (start >= 0 && end >= 0) { - if (start > end) std::swap(start, end); - } else if ( start < 0 && end < 0) { - start += totalLength; - end += totalLength; - if (start > end) std::swap(start, end); - } else { - // one is +ve and one is -ve so the - // segment will be wrapped from end segment to start segment. - // we need to split it in two segment. - //@TODO - return; - } + float start = totalLength * mCache.mSegment.start; + float end = totalLength * mCache.mSegment.end; if (start < end ) { float curLen = 0.0; diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 9a5f1dc5e6..4f145978e4 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -466,9 +466,7 @@ private: } struct Cache { int mFrameNo{-1}; - float mStart{0}; - float mEnd{0}; - float mOffset{0}; + LOTTrimData::Segment mSegment{}; }; Cache mCache; std::vector mPathItems; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 226cee5e2d..01ab083244 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -677,14 +677,43 @@ public: class LOTTrimData : public LOTData { public: + struct Segment { + float start{0}; + float end{0}; + }; enum class TrimType { Simultaneously, Individually }; LOTTrimData():LOTData(LOTData::Type::Trim){} - float start(int frameNo) const {return mStart.value(frameNo)/100.0f;} - float end(int frameNo) const {return mEnd.value(frameNo)/100.0f;} - float offset(int frameNo) const {return fmod(mOffset.value(frameNo), 360.0f)/ 360.0f;} + Segment segment(int frameNo) const { + float start = mStart.value(frameNo)/100.0f; + float end = mEnd.value(frameNo)/100.0f; + float offset = fmod(mOffset.value(frameNo), 360.0f)/ 360.0f; + start += offset; + end += offset; + // normalize start, end value to 0 - 1 + if (fabs(start) > 1) start = fmod(start, 1); + if (fabs(end) > 1) end = fmod(end, 1); + Segment s; + if (start >= 0 && end >= 0) { + s.start = std::min(start, end); + s.end = std::max(start, end); + } else if (start < 0 && end < 0) { + start += 1; + end +=1; + s.start = std::min(start, end); + s.end = std::max(start, end); + } else { + // one of them is -ve so it a loop + if (start < 0) start +=1; + if (end < 0) end +=1; + s.start = std::max(start, end); + s.end = std::min(start, end); + } + return s; + + } LOTTrimData::TrimType type() const {return mTrimType;} public: LOTAnimatable mStart{0}; diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 81a4ebdaa4..2b7f40089c 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -5,16 +5,12 @@ V_BEGIN_NAMESPACE -VPath oneSegment(float start, float end, const VPath & path) -{ - if (start > end) { - std::swap(start, end); - } - float array[5] = {0.0f, start, end - start, std::numeric_limits::max(), 0.0f}; - VDasher dasher(array, 5); - return dasher.dashed(path); -} - +/* + * start and end value must be normalized to [0 - 1] + * Path mesure trims the path from [start --> end] + * if start > end it treates as a loop and trims as two segment + * [0-->end] and [start --> 1] + */ VPath VPathMesure::trim(const VPath &path) { if (vCompare(mStart, mEnd)) return VPath(); @@ -22,40 +18,20 @@ VPath VPathMesure::trim(const VPath &path) if ((vCompare(mStart, 0.0f) && (vCompare(mEnd, 1.0f))) || (vCompare(mStart, 1.0f) && (vCompare(mEnd, 0.0f)))) return path; - if (vIsZero(mOffset)) { - float length = path.length(); - return oneSegment(length * mStart, length * mEnd, path); - } else { - float length = path.length(); - float offset = length * mOffset; - float start = length * mStart; - float end = length * mEnd; - start += offset; - end +=offset; + float length = path.length(); - if (start < 0 && end < 0) { - return oneSegment(length + start, length + end, path); - } else if (start > 0 && end > 0) { - if (start > length && end > length) - return oneSegment(start - length, end - length, path); - else if (start < length && end < length) - return oneSegment(start, end, path); - else { - float len1 = start > end ? start - length : end - length; - float start2 = start < end ? start : end; - float gap1 = start2 - len1; - float array[5] = {len1, gap1, length - start2, 1000, 0.0f}; - VDasher dasher(array, 5); - return dasher.dashed(path); - } - } else { - float len1 = start > end ? start : end; - float start2 = start < end ? length + start : length + end; - float gap1 = start2 - len1; - float array[5] = {len1, gap1, length - start2, 1000, 0.0f}; - VDasher dasher(array, 5); - return dasher.dashed(path); - } + if (mStart < mEnd) { + float array[4] = {0.0f, length * mStart, //1st segment + (mEnd - mStart) * length, std::numeric_limits::max(), //2nd segment + }; + VDasher dasher(array, 4); + return dasher.dashed(path); + } else { + float array[4] = {length * mEnd, (mStart - mEnd) * length, //1st segment + (1 - mStart) * length, std::numeric_limits::max(), //2nd segment + }; + VDasher dasher(array, 4); + return dasher.dashed(path); } } diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 8202913df4..7c7b74532d 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -9,12 +9,10 @@ class VPathMesure { public: void setStart(float start){mStart = start;} void setEnd(float end){mEnd = end;} - void setOffset(float offset){mOffset = offset;} VPath trim(const VPath &path); private: float mStart{0.0f}; float mEnd{1.0f}; - float mOffset{0.0f}; }; V_END_NAMESPACE From b0ff909587d21d1b5326da12faf5b5fa7b83ad21 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 13 Nov 2018 11:36:34 +0900 Subject: [PATCH 312/672] lottie: Added renderTree() api to the lottie animation object. Change-Id: I137180d0d46036523357d3b7966dc441b57f9d0c --- example/lottieview.cpp | 44 ++++++++++++++- example/lottieview.h | 2 + inc/lottieanimation.h | 13 +++++ inc/lottiecommon.h | 51 +++++++++++++++++ src/lottie/lottieanimation.cpp | 16 ++++++ src/lottie/lottieitem.cpp | 100 +++++++++++++++++++++++++++++++++ src/lottie/lottieitem.h | 12 +++- 7 files changed, 235 insertions(+), 3 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 7072a991a5..e12653c24b 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -159,6 +159,46 @@ void LottieView::update(const std::vector &renderList) evas_object_vg_root_node_set(mVg, root); } +void LottieView::updateTree(const LOTLayerNode * node) +{ + Efl_VG *root = evas_vg_container_add(mVg); + update(node, root); + evas_object_vg_root_node_set(mVg, root); +} + +void LottieView::update(const LOTLayerNode * node, Efl_VG *parent) +{ + // if the layer is invisible return + if (!node->mVisible) return; + + // check if this layer is a container layer + bool hasMatte = false; + if (node->mLayerList.size) { + for (unsigned int i = 0; i < node->mLayerList.size; i++) { + if (hasMatte) { + hasMatte = false; + continue; + } + // if the layer has matte then + // the next layer has to be rendered using this layer + // as matte source + if (node->mLayerList.ptr[i]->mMatte != MatteNone) { + hasMatte = true; + printf("Matte is not supported Yet\n"); + continue; + } + update(node->mLayerList.ptr[i], parent); + } + } + + // check if this layer has drawable + if (node->mNodeList.size) { + for (unsigned int i = 0; i < node->mNodeList.size; i++) { + createVgNode(node->mNodeList.ptr[i], parent); + } + } +} + static void mImageDelCb(void *data, Evas *evas, Evas_Object *obj, void *) { LottieView *lottie = (LottieView *)data; @@ -280,8 +320,8 @@ void LottieView::seek(float pos) evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } } else { - const std::vector &renderList = mPlayer->renderList(mCurFrame, mw, mh); - update(renderList); + const LOTLayerNode *root = mPlayer->renderTree(mCurFrame, mw, mh); + updateTree(root); } } diff --git a/example/lottieview.h b/example/lottieview.h index 6c3c4ee9a0..cbb0815476 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -51,6 +51,8 @@ public: private: void createVgNode(LOTNode *node, Efl_VG *root); void update(const std::vector &); + void updateTree(const LOTLayerNode *); + void update(const LOTLayerNode *, Efl_VG *parent); void restart(); public: int mw; diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index 08edd48914..a569c6d12f 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -29,6 +29,7 @@ class AnimationImpl; struct LOTNode; +struct LOTLayerNode; namespace lottie { @@ -204,6 +205,18 @@ public: */ const std::vector &renderList(size_t frameNo, size_t width, size_t height) const; + /** + * @brief Returns root layer of the composition updated with + * content of the lottie resource at frame number {frameNo}. + * + * @param[in] frameNo Content corresponds to the frameno needs to be extracted. + * @param[in] width content viewbox width + * @param[in] height content viewbox height + * + * @return Root layer node. + */ + const LOTLayerNode * renderTree(size_t frameNo, size_t width, size_t height) const; + /** * @brief default destructor */ diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 48db67e10e..75ede5d277 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -77,6 +77,57 @@ typedef struct LOTGradientStop unsigned char r, g, b, a; } LOTGradientStop; +struct LOTNode; + +typedef enum +{ + MaskModeAdd = 0, + MaskModeSubstract, + MaskModeIntersect, + MaskModeDifference +} LOTMaskMode; + +typedef struct _LOTMask { + struct { + const float *ptPtr; + int ptCount; + const char* elmPtr; + int elmCount; + } mPath; + LOTMaskMode mMode; +}LOTMask; + +typedef enum +{ + MatteNone = 0, + MatteAlpha, + MatteAlphaInv, + MatteLuma, + MatteLumaInv +} LOTMatteType; + +typedef struct LOTLayerNode { + + struct { + LOTMask *ptr; + unsigned int size; + }mMaskList; + + struct { + LOTLayerNode **ptr; + unsigned int size; + }mLayerList; + + struct { + LOTNode **ptr; + unsigned int size; + }mNodeList; + + LOTMatteType mMatte; + int mVisible; + +}LOTLayerNode; + typedef struct LOTNode { #define ChangeFlagNone 0x0000 diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 2e9cd17e3e..7fdb861b27 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -22,6 +22,8 @@ public: const std::vector & renderList(size_t frameNo, const VSize &size); + const LOTLayerNode * + renderTree(size_t frameNo, const VSize &size); private: std::string mFilePath; std::shared_ptr mModel; @@ -37,6 +39,14 @@ const std::vector &AnimationImpl::renderList(size_t frameNo, const VS return mCompItem->renderList(); } +const LOTLayerNode *AnimationImpl::renderTree(size_t frameNo, const VSize &size) +{ + if (update(frameNo, size)) { + mCompItem->buildRenderTree(); + } + return mCompItem->renderTree(); +} + bool AnimationImpl::update(size_t frameNo, const VSize &size) { frameNo += mModel->startFrame(); @@ -232,6 +242,12 @@ Animation::renderList(size_t frameNo, size_t width, size_t height) const return d->renderList(frameNo, VSize(width, height)); } +const LOTLayerNode * +Animation::renderTree(size_t frameNo, size_t width, size_t height) const +{ + return d->renderTree(frameNo, VSize(width, height)); +} + std::future Animation::render(size_t frameNo, Surface surface) { return render_scheduler.render(d.get(), frameNo, std::move(surface)); diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 009b3ba107..648c120ad3 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -106,6 +106,16 @@ const std::vector &LOTCompItem::renderList() const return mRenderList; } +void LOTCompItem::buildRenderTree() +{ + mRootLayer->buildLayerNode(); +} + +const LOTLayerNode * LOTCompItem::renderTree() const +{ + return mRootLayer->layerNode(); +} + bool LOTCompItem::render(const lottie::Surface &surface) { VBitmap bitmap((uchar *)surface.buffer(), surface.width(), surface.height(), @@ -159,6 +169,45 @@ VRle LOTMaskItem::rle() return mRle; } +void LOTLayerItem::buildLayerNode() +{ + if (!mLayerCNode) { + mLayerCNode = std::make_unique(); + mLayerCNode->mMaskList.ptr = nullptr; + mLayerCNode->mMaskList.size = 0; + mLayerCNode->mLayerList.ptr = nullptr; + mLayerCNode->mLayerList.size = 0; + mLayerCNode->mNodeList.ptr = nullptr; + mLayerCNode->mNodeList.size = 0; + mLayerCNode->mMatte = MatteNone; + mLayerCNode->mVisible = 0; + } + mLayerCNode->mVisible = visible(); + // update matte + if (hasMatte()) { + switch (mLayerData->mMatteType) { + case MatteType::Alpha: + mLayerCNode->mMatte = MatteAlpha; + break; + case MatteType::AlphaInv: + mLayerCNode->mMatte = MatteAlphaInv; + break; + case MatteType::Luma: + mLayerCNode->mMatte = MatteLuma; + break; + case MatteType::LumaInv: + mLayerCNode->mMatte = MatteLumaInv; + break; + default: + mLayerCNode->mMatte = MatteNone; + break; + } + } + if (hasMask()) { + //TODO populate mask property + } +} + void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { VRle matteRle; @@ -351,6 +400,23 @@ void LOTCompLayerItem::updateStaticProperty() } } +void LOTCompLayerItem::buildLayerNode() +{ + LOTLayerItem::buildLayerNode(); + if (mLayers.size() != mLayersCNode.size()) { + for (const auto &layer : mLayers) { + layer->buildLayerNode(); + mLayersCNode.push_back(layer->layerNode()); + } + layerNode()->mLayerList.ptr = mLayersCNode.data(); + layerNode()->mLayerList.size = mLayersCNode.size(); + } else { + for (const auto &layer : mLayers) { + layer->buildLayerNode(); + } + } +} + void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) { VRle matteRle; @@ -443,6 +509,23 @@ void LOTSolidLayerItem::updateContent() } } +void LOTSolidLayerItem::buildLayerNode() +{ + LOTLayerItem::buildLayerNode(); + + mDrawableList.clear(); + renderList(mDrawableList); + + mCNodeList.clear(); + for (auto &i : mDrawableList) { + LOTDrawable *lotDrawable = static_cast(i); + lotDrawable->sync(); + mCNodeList.push_back(lotDrawable->mCNode.get()); + } + layerNode()->mNodeList.ptr = mCNodeList.data(); + layerNode()->mNodeList.size = mCNodeList.size(); +} + void LOTSolidLayerItem::renderList(std::vector &list) { if (!visible()) return; @@ -535,6 +618,23 @@ void LOTShapeLayerItem::updateContent() } } +void LOTShapeLayerItem::buildLayerNode() +{ + LOTLayerItem::buildLayerNode(); + + mDrawableList.clear(); + renderList(mDrawableList); + + mCNodeList.clear(); + for (auto &i : mDrawableList) { + LOTDrawable *lotDrawable = static_cast(i); + lotDrawable->sync(); + mCNodeList.push_back(lotDrawable->mCNode.get()); + } + layerNode()->mNodeList.ptr = mCNodeList.data(); + layerNode()->mNodeList.size = mCNodeList.size(); +} + void LOTShapeLayerItem::renderList(std::vector &list) { if (!visible()) return; diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 4f145978e4..a92dd8de5e 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -38,6 +38,8 @@ public: VSize size() const; const std::vector& renderList()const; void buildRenderList(); + void buildRenderTree(); + const LOTLayerNode * renderTree()const; bool render(const lottie::Surface &surface); private: VMatrix mScaleMatrix; @@ -68,7 +70,8 @@ public: virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } bool visible() const; - + virtual void buildLayerNode(); + LOTLayerNode * layerNode() const {return mLayerCNode.get();} protected: virtual void updateContent() = 0; inline VMatrix combinedMatrix() const {return mCombinedMatrix;} @@ -80,6 +83,7 @@ protected: VRle maskRle(const VRect &clipRect); bool hasMask() const {return !mMasks.empty();} protected: + std::unique_ptr mLayerCNode; std::vector mDrawableList; std::vector> mMasks; LOTLayerData *mLayerData{nullptr}; @@ -99,9 +103,11 @@ public: void renderList(std::vector &list)final; void updateStaticProperty() final; void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource) final; + void buildLayerNode() final; protected: void updateContent() final; private: + std::vector mLayersCNode; std::vector> mLayers; int mLastFrame; }; @@ -110,10 +116,12 @@ class LOTSolidLayerItem: public LOTLayerItem { public: LOTSolidLayerItem(LOTLayerData *layerData); + void buildLayerNode() final; protected: void updateContent() final; void renderList(std::vector &list) final; private: + std::vector mCNodeList; std::unique_ptr mRenderNode; }; @@ -125,8 +133,10 @@ public: LOTShapeLayerItem(LOTLayerData *layerData); static std::unique_ptr createContentItem(LOTData *contentData); void renderList(std::vector &list)final; + void buildLayerNode() final; protected: void updateContent() final; + std::vector mCNodeList; std::unique_ptr mRoot; }; From 01733cd6cda8a1195ab916d2e9a0c57affcccb41 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 13 Nov 2018 15:16:48 +0900 Subject: [PATCH 313/672] lottie: add lottie_animation_render_tree() c api . Change-Id: I23004c1c2a4aed7e285624e095295ee8e4b18894 --- inc/lottieanimation_capi.h | 13 +++++++++++++ src/binding/c/lottieanimation_capi.cpp | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index 86a7bfc675..89b94cdbee 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -36,6 +36,19 @@ LOT_EXPORT size_t lottie_animation_prepare_frame(Lottie_Animation *animation, LOT_EXPORT size_t lottie_animation_get_node_count(const Lottie_Animation *animation); LOT_EXPORT const LOTNode* lottie_animation_get_node(Lottie_Animation *animation, size_t idx); + +/* + * Get the render tree which contains the snapshot of the animation object at frame $frame_number + * frame_number, the content of the animation in that frame number + * width , width of the viewbox + * height , height of the viewbox + * + * PS : user has to traverse the tree for rendering. @see LOTLayerNode and @see LOTNode + */ +LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation *animation, + size_t frameNo, + size_t w, size_t h); + /* * Request to render the content of the frame $frame_number to buffer $buffer asynchronously. * frame_number, the frame number needs to be rendered. diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index a619389dbe..2d7efc3337 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -99,6 +99,16 @@ LOT_EXPORT const LOTNode* lottie_animation_get_node(const Lottie_Animation_S *an return animation->mAnimation->renderList(animation->mFrameNo, animation->mWidth, animation->mHeight)[idx]; } +LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation_S *animation, size_t frameNo, size_t w, size_t h) +{ + if (!animation) return nullptr; + + animation->mFrameNo = frameNo; + animation->mWidth = w; + animation->mHeight = h; + return animation->mAnimation->renderTree(frameNo, w, h); +} + LOT_EXPORT void lottie_animation_render_async(Lottie_Animation_S *animation, size_t frame_number, From 32a77c49d6c0e72be75aa6a645902ec7feea22f5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 26 Nov 2018 13:44:37 +0900 Subject: [PATCH 314/672] lottie/parser: Added warning message for no support of Merge Path Object. Change-Id: I1948f86d8370564e733fba82be9785fbad4766bb --- src/lottie/lottieparser.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 3f42d114f2..2c0493f2f9 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -915,6 +915,9 @@ std::shared_ptr LottieParserImpl::parseObjectTypeAttr() } else if (0 == strcmp(type, "rp")) { curLayerRef->mHasRepeater = true; return parseReapeaterObject(); + } else if (0 == strcmp(type, "mm")) { + vWarning << "Merge Path is not supported yet"; + return nullptr; } else { #ifdef DEBUG_PARSER vDebug << "The Object Type not yet handled = " << type; From 53e71eb670874f6a90570171bf377428f54fb8c7 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 22 Nov 2018 20:44:18 +0900 Subject: [PATCH 315/672] interface: fix to compatible with C language. C++ structure type declaration is more flexible than C's. C always need to declare "struct Name" to use. That's way we use typedef struct Name as a alias "Name". Here patch just reorder the structure declaration for C language. Change-Id: I43bc8d1fafb10e42cb22fcad4bc1115925a3cda2 --- inc/lottiecommon.h | 50 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 75ede5d277..0e89e01e86 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -77,8 +77,6 @@ typedef struct LOTGradientStop unsigned char r, g, b, a; } LOTGradientStop; -struct LOTNode; - typedef enum { MaskModeAdd = 0, @@ -87,7 +85,7 @@ typedef enum MaskModeDifference } LOTMaskMode; -typedef struct _LOTMask { +typedef struct LOTMask { struct { const float *ptPtr; int ptCount; @@ -106,28 +104,6 @@ typedef enum MatteLumaInv } LOTMatteType; -typedef struct LOTLayerNode { - - struct { - LOTMask *ptr; - unsigned int size; - }mMaskList; - - struct { - LOTLayerNode **ptr; - unsigned int size; - }mLayerList; - - struct { - LOTNode **ptr; - unsigned int size; - }mNodeList; - - LOTMatteType mMatte; - int mVisible; - -}LOTLayerNode; - typedef struct LOTNode { #define ChangeFlagNone 0x0000 @@ -173,4 +149,28 @@ typedef struct LOTNode { } LOTNode; + +typedef struct LOTLayerNode { + + struct { + LOTMask *ptr; + unsigned int size; + } mMaskList; + + struct { + struct LOTLayerNode **ptr; + unsigned int size; + } mLayerList; + + struct { + LOTNode **ptr; + unsigned int size; + } mNodeList; + + LOTMatteType mMatte; + int mVisible; + +} LOTLayerNode; + + #endif // _LOTTIE_COMMON_H_ From 79283c28b1e845a746a855ded2ea56930bbc28c0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 27 Nov 2018 11:28:27 +0900 Subject: [PATCH 316/672] lottie: Make path dirty only when it has changed from last frame. Change-Id: I827baef9bac182a25aa98479108307d03c45f5ce --- src/lottie/lottieitem.h | 13 ++++++++++++- src/lottie/lottiemodel.h | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index a92dd8de5e..5749f38d2b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -311,9 +311,20 @@ class LOTShapeItem: public LOTPathDataItem public: LOTShapeItem(LOTShapeData *data); private: + struct Cache { + int mFrameNo{-1}; + }; + Cache mCache; void updatePath(VPath& path, int frameNo) final; LOTShapeData *mData; - bool hasChanged(int) final { return true; } + bool hasChanged(int frameNo) final { + int prevFrame = mCache.mFrameNo; + mCache.mFrameNo = frameNo; + if (prevFrame == -1) return true; + if (prevFrame == frameNo) return false; + + return mData->mShape.changed(prevFrame, frameNo); + } }; class LOTPolystarItem: public LOTPathDataItem diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 01ab083244..da6502d6f7 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -226,6 +226,18 @@ public: return 0; } + bool changed(int prevFrame, int curFrame) { + int first = mKeyFrames.front().mStartFrame; + int last = mKeyFrames.back().mEndFrame; + + if ((first > prevFrame && first > curFrame) || + (last < prevFrame && last < curFrame)) { + return false; + } + + return true; + } + public: std::vector> mKeyFrames; }; @@ -243,6 +255,9 @@ public: float angle(int frameNo) const { return isStatic() ? 0 : mAnimInfo->angle(frameNo); } + bool changed(int prevFrame, int curFrame) { + return isStatic() ? false : mAnimInfo->changed(prevFrame, curFrame); + } public: T mValue; int mPropertyIndex; /* "ix" */ From 27a774b0e5cbfa9f60c382f2755ffb3845084bdc Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 27 Nov 2018 14:44:13 +0900 Subject: [PATCH 317/672] lottie: refactor pathChange computation without keeping cache. Change-Id: I14ed8b36e33dd5d4a20b632b26d329fde68ae55b --- src/lottie/lottieitem.cpp | 4 -- src/lottie/lottieitem.h | 134 ++++++++------------------------------ 2 files changed, 27 insertions(+), 111 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 648c120ad3..10008560a5 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -794,7 +794,6 @@ void LOTRectItem::updatePath(VPath& path, int frameNo) path.reset(); path.addRoundRect(r, roundness, mData->direction()); - updateCache(frameNo, pos, size, roundness); } LOTEllipseItem::LOTEllipseItem(LOTEllipseData *data) @@ -811,7 +810,6 @@ void LOTEllipseItem::updatePath(VPath& path, int frameNo) path.reset(); path.addOval(r, mData->direction()); - updateCache(frameNo, pos, size); } LOTShapeItem::LOTShapeItem(LOTShapeData *data) @@ -853,8 +851,6 @@ void LOTPolystarItem::updatePath(VPath& path, int frameNo) m.translate(pos.x(), pos.y()).rotate(rotation); m.rotate(rotation); path.transform(m); - updateCache(frameNo, pos, points, innerRadius, outerRadius, - innerRoundness, outerRoundness, rotation); } /* diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 5749f38d2b..93a9966248 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -222,11 +222,20 @@ public: bool staticPath() const { return mStaticPath; } protected: virtual void updatePath(VPath& path, int frameNo) = 0; - virtual bool hasChanged(int frameNo) = 0; + virtual bool hasChanged(int prevFrame, int curFrame) = 0; private: + bool hasChanged(int frameNo) { + int prevFrame = mFrameNo; + mFrameNo = frameNo; + if (prevFrame == -1) return true; + if (mStaticPath || + (prevFrame == frameNo)) return false; + return hasChanged(prevFrame, frameNo); + } VPath mLocalPath; VPath mTemp; VPath mFinalPath; + int mFrameNo{-1}; bool mPathChanged{true}; bool mNeedUpdate{true}; bool mStaticPath; @@ -240,34 +249,10 @@ protected: void updatePath(VPath& path, int frameNo) final; LOTRectData *mData; - struct Cache { - int mFrameNo{-1}; - float mRoundness; - VPointF mPos; - VPointF mSize; - }; - Cache mCache; - - void updateCache(int frameNo, VPointF pos, VPointF size, float roundness) { - mCache.mFrameNo = frameNo; - mCache.mPos = pos; - mCache.mSize = size; - mCache.mRoundness = roundness; - } - bool hasChanged(int frameNo) final { - if (mCache.mFrameNo != -1 && staticPath()) return false; - if (mCache.mFrameNo == frameNo) return false; - - VPointF pos = mData->mPos.value(frameNo); - VPointF size = mData->mSize.value(frameNo); - float roundness = mData->mRound.value(frameNo); - - if (vCompare(mCache.mPos.x(), pos.x()) && vCompare(mCache.mPos.y(), pos.y()) && - vCompare(mCache.mSize.x(), size.x()) && vCompare(mCache.mSize.y(), size.y()) && - vCompare(mCache.mRoundness, roundness)) - return false; - - return true; + bool hasChanged(int prevFrame, int curFrame) final { + return (mData->mPos.changed(prevFrame, curFrame) || + mData->mSize.changed(prevFrame, curFrame) || + mData->mRound.changed(prevFrame, curFrame)) ? true : false; } }; @@ -278,31 +263,9 @@ public: private: void updatePath(VPath& path, int frameNo) final; LOTEllipseData *mData; - - struct Cache { - int mFrameNo{-1}; - VPointF mPos; - VPointF mSize; - }; - Cache mCache; - - void updateCache(int frameNo, VPointF pos, VPointF size) { - mCache.mFrameNo = frameNo; - mCache.mPos = pos; - mCache.mSize = size; - } - bool hasChanged(int frameNo) final { - if (mCache.mFrameNo != -1 && staticPath()) return false; - if (mCache.mFrameNo == frameNo) return false; - - VPointF pos = mData->mPos.value(frameNo); - VPointF size = mData->mSize.value(frameNo); - - if (vCompare(mCache.mPos.x(), pos.x()) && vCompare(mCache.mPos.y(), pos.y()) && - vCompare(mCache.mSize.x(), size.x()) && vCompare(mCache.mSize.y(), size.y())) - return false; - - return true; + bool hasChanged(int prevFrame, int curFrame) final { + return (mData->mPos.changed(prevFrame, curFrame) || + mData->mSize.changed(prevFrame, curFrame)) ? true : false; } }; @@ -311,19 +274,10 @@ class LOTShapeItem: public LOTPathDataItem public: LOTShapeItem(LOTShapeData *data); private: - struct Cache { - int mFrameNo{-1}; - }; - Cache mCache; void updatePath(VPath& path, int frameNo) final; LOTShapeData *mData; - bool hasChanged(int frameNo) final { - int prevFrame = mCache.mFrameNo; - mCache.mFrameNo = frameNo; - if (prevFrame == -1) return true; - if (prevFrame == frameNo) return false; - - return mData->mShape.changed(prevFrame, frameNo); + bool hasChanged(int prevFrame, int curFrame) final { + return mData->mShape.changed(prevFrame, curFrame); } }; @@ -335,48 +289,14 @@ private: void updatePath(VPath& path, int frameNo) final; LOTPolystarData *mData; - struct Cache { - int mFrameNo{-1}; - VPointF mPos; - float mPoints{0}; - float mInnerRadius{0}; - float mOuterRadius{0}; - float mInnerRoundness{0}; - float mOuterRoundness{0}; - float mRotation{0}; - }; - Cache mCache; - - void updateCache(int frameNo, VPointF pos, float points, float innerRadius, float outerRadius, - float innerRoundness, float outerRoundness, float rotation) { - mCache.mFrameNo = frameNo; - mCache.mPos = pos; - mCache.mPoints = points; - mCache.mInnerRadius = innerRadius; - mCache.mOuterRadius = outerRadius; - mCache.mInnerRoundness = innerRoundness; - mCache.mOuterRoundness = outerRoundness; - mCache.mRotation = rotation; - } - bool hasChanged(int frameNo) final { - if (mCache.mFrameNo != -1 && staticPath()) return false; - if (mCache.mFrameNo == frameNo) return false; - - VPointF pos = mData->mPos.value(frameNo); - float points = mData->mPointCount.value(frameNo); - float innerRadius = mData->mInnerRadius.value(frameNo); - float outerRadius = mData->mOuterRadius.value(frameNo); - float innerRoundness = mData->mInnerRoundness.value(frameNo); - float outerRoundness = mData->mOuterRoundness.value(frameNo); - float rotation = mData->mRotation.value(frameNo); - - if (vCompare(mCache.mPos.x(), pos.x()) && vCompare(mCache.mPos.y(), pos.y()) && - vCompare(mCache.mPoints, points) && vCompare(mCache.mRotation, rotation) && - vCompare(mCache.mInnerRadius, innerRadius) && vCompare(mCache.mOuterRadius, outerRadius) && - vCompare(mCache.mInnerRoundness, innerRoundness) && vCompare(mCache.mOuterRoundness, outerRoundness)) - return false; - - return true; + bool hasChanged(int prevFrame, int curFrame) final { + return (mData->mPos.changed(prevFrame, curFrame) || + mData->mPointCount.changed(prevFrame, curFrame) || + mData->mInnerRadius.changed(prevFrame, curFrame) || + mData->mOuterRadius.changed(prevFrame, curFrame) || + mData->mInnerRoundness.changed(prevFrame, curFrame) || + mData->mOuterRoundness.changed(prevFrame, curFrame) || + mData->mRotation.changed(prevFrame, curFrame)) ? true : false; } }; From c47a31555d9e46389147d893d2e284a4a0293ac3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 29 Nov 2018 15:53:54 +0900 Subject: [PATCH 318/672] package: remove ldconfig command to ready for official binary install. Change-Id: I7823b8af97ab3e02bdebcfd90e29c1885899d276 --- packaging/lottie-player.spec | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index 596098bca6..d8b9655a89 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -56,11 +56,6 @@ mkdir -p %{buildroot}/%{_datadir}/license cp %{_builddir}/%{buildsubdir}/LICENSE %{buildroot}/%{_datadir}/license/%{name} -%post -p /sbin/ldconfig -echo "INFO: System should be restarted or execute: systemctl --user daemon-reload from user session to finish service installation." -%postun -p /sbin/ldconfig - - %files %defattr(-,root,root,-) %{_libdir}/liblottie-player.so.* From 2326939576d1fdf743e58f09f69ba690179aa3f0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 29 Nov 2018 15:36:11 +0900 Subject: [PATCH 319/672] lottie/vector: added unique(), refCount() and null() api to vpath class. Change-Id: Iff4ad6a37760b885ab390afe0b7748c924a646be --- src/vector/vcowptr.h | 7 +++++++ src/vector/vpath.h | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/vector/vcowptr.h b/src/vector/vcowptr.h index 64aa554964..39a16e4e37 100644 --- a/src/vector/vcowptr.h +++ b/src/vector/vcowptr.h @@ -67,6 +67,13 @@ public: auto operator-> () const noexcept -> const element_type* { return &read(); } + int refCount() const noexcept + { + assert(mModel); + + return mModel->mRef; + } + bool unique() const noexcept { assert(mModel); diff --git a/src/vector/vpath.h b/src/vector/vpath.h index bc743169bb..8cec2d744b 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -15,6 +15,7 @@ public: enum class Element : uchar { MoveTo, LineTo, CubicTo, Close }; bool empty() const; + bool null() const; void moveTo(const VPointF &p); void moveTo(float x, float y); void lineTo(const VPointF &p); @@ -49,10 +50,13 @@ public: const std::vector &elements() const; const std::vector & points() const; void clone(const VPath &srcPath); + bool unique() const { return d.unique();} + int refCount() const { return d.refCount();} private: struct VPathData { bool empty() const { return m_elements.empty(); } + bool null() const { return empty() && !m_elements.capacity();} void moveTo(float x, float y); void lineTo(float x, float y); void cubicTo(float cx1, float cy1, float cx2, float cy2, float ex, float ey); @@ -99,6 +103,14 @@ inline bool VPath::empty() const return d->empty(); } +/* + * path is empty as well as null(no memory for data allocated yet). + */ +inline bool VPath::null() const +{ + return d->null(); +} + inline void VPath::moveTo(const VPointF &p) { d.write().moveTo(p.x(), p.y()); From 9e307312f752f4c4c35b1bb8d566aaf4000f0470 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 29 Nov 2018 16:58:13 +0900 Subject: [PATCH 320/672] lottie/trim: return early when trim operation is not needed. Change-Id: Ie059e1af4df01cbd7c77117d9fe5e7e8b7c56919 --- src/lottie/lottieitem.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 10008560a5..e5f59aaaad 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1066,6 +1066,12 @@ void LOTTrimItem::update() return; } + if (vCompare(std::fabs(mCache.mSegment.start - mCache.mSegment.end) , 1)) { + for (auto &i : mPathItems) { + i->updatePath(i->localPath()); + } + return; + } if (mData->type() == LOTTrimData::TrimType::Simultaneously) { for (auto &i : mPathItems) { From 8706eca90527cf2a7f4e05b3a6d645d194b7fc5c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 29 Nov 2018 15:38:40 +0900 Subject: [PATCH 321/672] lottie/vector: take the fast path in addPath() api only when path is null. This patch is to avoid unnecessary allocation and deallocation when the path is empty but not null during addPath Change-Id: Iab3820419257fbbecaddc93d73e5868b1889e6c5 --- src/vector/vpath.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 8cec2d744b..f33610330a 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -228,7 +228,7 @@ inline void VPath::addPath(const VPath &path) { if (path.empty()) return; - if (empty()) { + if (null()) { *this = path; } else { d.write().addPath(path.d.read()); From 54e5e4cd44702b56f1e1cddbe049ee02a87add36 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 29 Nov 2018 17:04:01 +0900 Subject: [PATCH 322/672] lottie/vector: make dashoffset optional data in dash array. Change-Id: Ieb3358a05f3d671f30d57147e2c4db0482ea1a54 --- src/vector/vdasher.cpp | 5 ++--- src/vector/vdasher.h | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 987668e5e9..1e4ddd12ee 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -6,11 +6,10 @@ V_BEGIN_NAMESPACE VDasher::VDasher(const float *dashArray, int size) { - if (!(size % 2)) vCritical << "invalid dashArray format"; - mDashArray = reinterpret_cast(dashArray); mArraySize = size / 2; - mDashOffset = dashArray[size - 1]; + if (size % 2) + mDashOffset = dashArray[size - 1]; mIndex = 0; mCurrentLength = 0; mDiscard = false; diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 2e400603e4..5eeaad5e9c 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -24,12 +24,12 @@ private: float gap; }; const VDasher::Dash *mDashArray; - int mArraySize; + int mArraySize{0}; VPointF mCurPt; - int mIndex; /* index to the dash Array */ + int mIndex{0}; /* index to the dash Array */ float mCurrentLength; bool mDiscard; - float mDashOffset; + float mDashOffset{0}; VPath mResult; bool mStartNewSegment=true; }; From 0ec01abf04982cc2f1dcb49905bf883808573d0d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 29 Nov 2018 17:59:03 +0900 Subject: [PATCH 323/672] lottie/vector: remove @todo as the issue is fixed. Change-Id: Ieb62efbed8939e7f9776cbcfb6091f71851783a4 --- src/vector/vpath.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vector/vpath.h b/src/vector/vpath.h index f33610330a..be89db6a06 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -143,7 +143,6 @@ inline int VPath::segments() const inline float VPath::length() const { - // TODO re-calculate when there is a change return d->length(); } From 21967e1fdb3991d17906c19e9a551a8267637148 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 30 Nov 2018 15:12:36 +0900 Subject: [PATCH 324/672] lottie/parser: Asset id can be number for effect object. Change-Id: I6a8b447960a3d10e714125279b83efa27d21581a --- src/lottie/lottieparser.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 2c0493f2f9..3a563c4b3c 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -617,8 +617,12 @@ std::shared_ptr LottieParserImpl::parseAsset() RAPIDJSON_ASSERT(PeekType() == kNumberType); asset->mAssetType = GetInt(); } else if (0 == strcmp(key, "id")) { /* reference id*/ - RAPIDJSON_ASSERT(PeekType() == kStringType); - asset->mRefId = std::string(GetString()); + if (PeekType() == kStringType) { + asset->mRefId = std::string(GetString()); + } else { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + asset->mRefId = std::to_string(GetInt()); + } } else if (0 == strcmp(key, "layers")) { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); From ac54356b3cf03eadc1b1ebb86b0c7263a50eb45a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 3 Dec 2018 09:52:31 +0900 Subject: [PATCH 325/672] lottie/vector: optimize RleTask structure packing. Change-Id: I5c0be929f51b35720d5c53bdeabec75227274761 --- src/vector/vraster.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 1c72f78284..8f638b686d 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -238,18 +238,16 @@ static void rleGenerationCb(int count, const SW_FT_Span *spans, void *user) } struct RleTask { - RleTask() { receiver = sender.get_future(); } std::promise sender; - std::future receiver; - bool stroke; VPath path; VRle rle; - FillRule fillRule; - CapStyle cap; - JoinStyle join; float width; float meterLimit; VRect clip; + FillRule fillRule; + CapStyle cap; + JoinStyle join; + bool stroke; VRle operator()(FTOutline &outRef, SW_FT_Stroker &stroker); void render(FTOutline &outRef); }; @@ -363,7 +361,7 @@ public: std::future async(RleTask *task) { - auto receiver = std::move(task->receiver); + auto receiver = std::move(task->sender.get_future()); auto i = _index++; for (unsigned n = 0; n != _count; ++n) { From 7c6cbe8ae741eb498440d80fc420498241ce60d3 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 1 Dec 2018 21:20:44 +0900 Subject: [PATCH 326/672] lottie/vector: add boundingbox callback in freetype renderer. Change-Id: I50a56b109b89a3b0f1ddb4b4983e4d9ba2aaabc3 --- src/vector/freetype/v_ft_raster.cpp | 22 +++++++++++++++++++++- src/vector/freetype/v_ft_raster.h | 5 +++++ src/vector/vraster.cpp | 9 +++++++-- src/vector/vrle.cpp | 6 ++++++ src/vector/vrle.h | 7 +++++++ 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/vector/freetype/v_ft_raster.cpp b/src/vector/freetype/v_ft_raster.cpp index 7e668f3ddb..639eaaa9ff 100644 --- a/src/vector/freetype/v_ft_raster.cpp +++ b/src/vector/freetype/v_ft_raster.cpp @@ -311,6 +311,11 @@ typedef struct gray_TWorker_ { SW_FT_Outline outline; SW_FT_BBox clip_box; + int bound_left; + int bound_top; + int bound_right; + int bound_bottom; + SW_FT_Span gray_spans[SW_FT_MAX_GRAY_SPANS]; int num_gray_spans; @@ -361,6 +366,11 @@ static void gray_init_cells(RAS_ARG_ void* buffer, long byte_size) ras.area = 0; ras.cover = 0; ras.invalid = 1; + + ras.bound_left = INT_MAX; + ras.bound_top = INT_MAX; + ras.bound_right = INT_MIN; + ras.bound_bottom = INT_MIN; } /*************************************************************************/ @@ -906,6 +916,12 @@ static void gray_hline(RAS_ARG_ TCoord x, TCoord y, TPos area, TCoord acount) SW_FT_Span* span; int count; + // update bounding box. + if (x < ras.bound_left) ras.bound_left = x; + if (y < ras.bound_top) ras.bound_top = y; + if (y > ras.bound_bottom) ras.bound_bottom = y; + if (x + acount > ras.bound_right) ras.bound_right = x + acount; + /* see whether we can add this span to the current list */ count = ras.num_gray_spans; span = ras.gray_spans + count - 1; @@ -1396,7 +1412,11 @@ static int gray_raster_render(gray_PRaster raster, ras.render_span = (SW_FT_Raster_Span_Func)params->gray_spans; ras.render_span_data = params->user; - return gray_convert_glyph(RAS_VAR); + gray_convert_glyph(RAS_VAR); + params->bbox_cb(ras.bound_left, ras.bound_top, + ras.bound_right - ras.bound_left, + ras.bound_bottom - ras.bound_top + 1, params->user); + return 1; } /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ diff --git a/src/vector/freetype/v_ft_raster.h b/src/vector/freetype/v_ft_raster.h index aad2a8ab51..bab40efd90 100644 --- a/src/vector/freetype/v_ft_raster.h +++ b/src/vector/freetype/v_ft_raster.h @@ -285,6 +285,10 @@ typedef struct SW_FT_Outline_ const SW_FT_Span* spans, void* user ); + typedef void + (*SW_FT_BboxFunc)( int x, int y, int w, int h, + void* user); + #define SW_FT_Raster_Span_Func SW_FT_SpanFunc @@ -396,6 +400,7 @@ typedef struct SW_FT_Outline_ const void* source; int flags; SW_FT_SpanFunc gray_spans; + SW_FT_BboxFunc bbox_cb; void* user; SW_FT_BBox clip_box; diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 8f638b686d..ea254cad20 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -237,6 +237,12 @@ static void rleGenerationCb(int count, const SW_FT_Span *spans, void *user) rle->addSpan(rleSpan, count); } +static void bboxCb(int x, int y, int w, int h, void *user) +{ + VRle * rle = (VRle *)user; + rle->setBoundingRect({x, y, w, h}); +} + struct RleTask { std::promise sender; VPath path; @@ -258,6 +264,7 @@ void RleTask::render(FTOutline &outRef) params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; params.gray_spans = &rleGenerationCb; + params.bbox_cb = &bboxCb; params.user = &rle; params.source = &outRef.ft; @@ -271,8 +278,6 @@ void RleTask::render(FTOutline &outRef) } // compute rle sw_ft_grays_raster.raster_render(nullptr, ¶ms); - // update bounding box. - rle.boundingRect(); } VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 7db043b2b7..76682180af 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -51,6 +51,12 @@ VRect VRle::VRleData::bbox() const return mBbox; } +void VRle::VRleData::setBbox(const VRect &bbox) const +{ + mBboxDirty = false; + mBbox = bbox; +} + void VRle::VRleData::reset() { mSpans.clear(); diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 8790497582..a5f1d75130 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -21,6 +21,7 @@ public: void *userData); bool empty() const; VRect boundingRect() const; + void setBoundingRect(const VRect &bbox); void addSpan(const VRle::Span *span, int count); void reset(); @@ -48,6 +49,7 @@ private: void addSpan(const VRle::Span *span, int count); void updateBbox() const; VRect bbox() const; + void setBbox(const VRect &bbox) const; void reset(); void translate(const VPoint &p); void operator*=(int alpha); @@ -81,6 +83,11 @@ inline VRect VRle::boundingRect() const return d->bbox(); } +inline void VRle::setBoundingRect(const VRect & bbox) +{ + d->setBbox(bbox); +} + inline void VRle::invert() { d.write().invert(); From 9ee2b004d6fba334522f447047883cbf0dedd89e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 3 Dec 2018 15:52:47 +0900 Subject: [PATCH 327/672] example: introduce a usage of efl animation_view. Change-Id: I1dfa4ae4c3652b7eee6c3064fd7662a59552d15f --- example/efl_animview.cpp | 301 +++++++++++++++++++++++++++++++++++++++ example/meson.build | 6 + 2 files changed, 307 insertions(+) create mode 100644 example/efl_animview.cpp diff --git a/example/efl_animview.cpp b/example/efl_animview.cpp new file mode 100644 index 0000000000..8422dfbc59 --- /dev/null +++ b/example/efl_animview.cpp @@ -0,0 +1,301 @@ +#define EFL_BETA_API_SUPPORT 1 +#define EFL_EO_API_SUPPORT 1 + +#include + +#define WIDTH 400 +#define HEIGHT 400 + +Eo *slider = NULL; + +void +win_del(void *data, Eo *o, void *ev) +{ + elm_exit(); +} + +static void +btn_clicked_cb(void *data, Eo *obj, void *event_info) +{ + Eo *anim_view = (Eo *) data; + const char *text = elm_object_text_get(obj); + + if (!text) return; + + if (!strcmp("Play", text)) + elm_animation_view_play(anim_view); + else if (!strcmp("Pause", text)) + elm_animation_view_pause(anim_view); + else if (!strcmp("Resume", text)) + elm_animation_view_resume(anim_view); + else if (!strcmp("Play Back", text)) + elm_animation_view_play_back(anim_view); + else if (!strcmp("Stop", text)) + elm_animation_view_stop(anim_view); +} + +static void +check_changed_cb(void *data, Eo *obj, void *event_info) +{ + Eo *anim_view = (Eo *) data; + elm_animation_view_auto_repeat_set(anim_view, elm_check_state_get(obj)); +} + +static void +speed_changed_cb(void *data, Eo *obj, void *event_info) +{ + Eo *anim_view = (Eo *) data; + double speed = 1; + if (elm_check_state_get(obj)) speed = 0.25; + elm_animation_view_speed_set(anim_view, speed); +} + +static void +update_anim_view_state(Eo *anim_view, Eo *label) +{ + Elm_Animation_View_State state = elm_animation_view_state_get(anim_view); + + switch (state) + { + case ELM_ANIMATION_VIEW_STATE_NOT_READY: + elm_object_text_set(label, "State = Not Ready"); + break; + case ELM_ANIMATION_VIEW_STATE_PLAY: + elm_object_text_set(label, "State = Playing"); + break; + case ELM_ANIMATION_VIEW_STATE_PLAY_BACK: + elm_object_text_set(label, "State = Playing Back"); + break; + case ELM_ANIMATION_VIEW_STATE_PAUSE: + elm_object_text_set(label, "State = Paused"); + break; + case ELM_ANIMATION_VIEW_STATE_STOP: + elm_object_text_set(label, "State = Stopped"); + break; + } +} + +static void +_play_done(void *data, Eo *obj, void *ev) +{ + printf("done!\n"); +} + +static void +_play_updated(void *data, Eo *obj, void *ev) +{ + Eo *slider = (Eo *) data; + elm_slider_value_set(slider, elm_animation_view_keyframe_get(obj)); +} + +static void +_state_update(void *data, Eo *obj, void *ev) +{ + Eo *label = (Eo *) data; + update_anim_view_state(obj, label); +} + +static void +_play_repeated(void *data, Eo *obj, void *ev) +{ + printf("repeated!\n"); +} + +static void +_slider_drag_cb(void *data, Eo *obj, void *ev) +{ + Eo *anim_view = (Eo *) data; + elm_animation_view_keyframe_set(anim_view, elm_slider_value_get(obj)); +} + +static void +_slider_reset(void *data, Eo *obj, void *ev) +{ + Eo *slider = (Eo *) data; + elm_slider_value_set(slider, 0); +} + +Eo * +anim_view_test(Eo *parent, const char *path) +{ + Eo *box = elm_box_add(parent); + evas_object_size_hint_weight_set(box, 1, 1); + evas_object_show(box); + + //State Text + Eo *label = elm_label_add(box); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(label, 0.5, 0); + evas_object_show(label); + elm_box_pack_end(box, label); + + //Animation View + Eo *anim_view = elm_animation_view_add(box); + evas_object_size_hint_align_set(anim_view, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_animation_view_file_set(anim_view, path, NULL); + evas_object_size_hint_weight_set(anim_view, 1, 1); + evas_object_show(anim_view); + elm_box_pack_end(box, anim_view); + + //Controller Set: 0 + Eo *box2 = elm_box_add(box); + evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, 1); + elm_box_horizontal_set(box2, EINA_TRUE); + elm_box_pack_end(box, box2); + evas_object_show(box2); + + + //Loop + Eo *check = elm_check_add(box2); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(check, "Loop"); + evas_object_smart_callback_add(check, "changed", check_changed_cb, anim_view); + evas_object_show(check); + elm_box_pack_end(box2, check); + + //Speed: 0.5x + Eo *check2 = elm_check_add(box2); + evas_object_size_hint_weight_set(check2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(check2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(check2, "Speed: 0.25x"); + evas_object_smart_callback_add(check2, "changed", speed_changed_cb, anim_view); + evas_object_show(check2); + elm_box_pack_end(box2, check2); + + //Duration Text + Eo *label2 = elm_label_add(box2); + evas_object_size_hint_weight_set(label2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(label2, 0.5, 0); + evas_object_show(label2); + elm_box_pack_end(box2, label2); + char buf[50]; + snprintf(buf, sizeof(buf), "Duration: %1.2fs", elm_animation_view_duration_time_get(anim_view)); + elm_object_text_set(label2, buf); + + //Slider + Eo *slider = elm_slider_add(box); + elm_slider_indicator_show_set(slider, EINA_TRUE); + elm_slider_indicator_format_set(slider, "%1.2f"); + elm_slider_min_max_set(slider, 0, 1); + evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(slider, "changed", _slider_drag_cb, anim_view); + evas_object_show(slider); + elm_box_pack_end(box, slider); + + //Controller Set: 1 + Eo *box3 = elm_box_add(box); + evas_object_size_hint_weight_set(box3, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box3, EVAS_HINT_FILL, 1); + elm_box_horizontal_set(box3, EINA_TRUE); + elm_box_pack_end(box, box3); + evas_object_show(box3); + + Eo *btn; + + //Play Button + btn = elm_button_add(box3); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(btn, "Play"); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, anim_view); + elm_box_pack_end(box3, btn); + + //Play Back Button + btn = elm_button_add(box3); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(btn, "Play Back"); + evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, anim_view); + evas_object_show(btn); + elm_box_pack_end(box3, btn); + + //Stop Button + btn = elm_button_add(box3); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(btn, "Stop"); + evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, anim_view); + evas_object_show(btn); + elm_box_pack_end(box3, btn); + + //Controller Set: 2 + Eo *box4 = elm_box_add(box); + evas_object_size_hint_weight_set(box4, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box4, EVAS_HINT_FILL, 1); + elm_box_horizontal_set(box4, EINA_TRUE); + elm_box_pack_end(box, box4); + evas_object_show(box4); + + //Pause Button + btn = elm_button_add(box4); + elm_object_text_set(btn, "Pause"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, anim_view); + evas_object_show(btn); + elm_box_pack_end(box4, btn); + + //Resume Button + btn = elm_button_add(box4); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(btn, "Resume"); + evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, anim_view); + evas_object_show(btn); + elm_box_pack_end(box4, btn); + + evas_object_smart_callback_add(anim_view, "play,start", _state_update, label); + evas_object_smart_callback_add(anim_view, "play,stop", _state_update, label); + evas_object_smart_callback_add(anim_view, "play,pause", _state_update, label); + evas_object_smart_callback_add(anim_view, "play,resume", _state_update, label); + + evas_object_smart_callback_add(anim_view, "play,repeat", _play_repeated, label); + evas_object_smart_callback_add(anim_view, "play,done", _play_done, label); + + evas_object_smart_callback_add(anim_view, "play,update", _play_updated, slider); + evas_object_smart_callback_add(anim_view, "play,stop", _slider_reset, slider); + + update_anim_view_state(anim_view, label); + + return box; + +} + +int +main(int argc, char **argv) +{ + setenv("ECTOR_BACKEND", "default", 1); + setenv("ELM_ACCEL", "gl", 1); + + elm_init(argc, argv); + + Eo *win = elm_win_util_standard_add(NULL, "test"); + evas_object_smart_callback_add(win, "delete,request", win_del, 0); + elm_win_autodel_set(win, 1); + + char path[PATH_MAX]; + + if (argc == 1) + { + printf("Usage: efl_animview [input_file]\n"); + return 0; + } + else snprintf(path, sizeof(path), "%s/%s", DEMO_DIR, "heart.json"); + + Eo *content = anim_view_test(win, path); + + elm_win_resize_object_add(win, content); + + evas_object_resize(win, WIDTH, HEIGHT); + evas_object_show(win); + + elm_run(); + + elm_shutdown(); + + return 0; +} diff --git a/example/meson.build b/example/meson.build index 44a0f43c09..265c9fbc82 100644 --- a/example/meson.build +++ b/example/meson.build @@ -46,3 +46,9 @@ executable('vectorTest', 'vectortest.cpp', include_directories : inc, dependencies : [library_deps]) + +executable('efl_animview', + 'efl_animview.cpp', + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) From bf9add06d99792d231b971e806ec5bdac4867d4b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 4 Dec 2018 15:36:30 +0900 Subject: [PATCH 328/672] packaging: correct library group. Change-Id: I4fa8d090c6df0676a6456f0b268087b83ceed3bb --- packaging/lottie-player.spec | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index d8b9655a89..edd0f01196 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -2,7 +2,7 @@ Name: lottie-player Summary: lottie player library Version: 0.0.1 Release: 1 -Group: System/Libraries +Group: UI Framework/Services License: Apache-2.0 URL: http://www.tizen.org/ Source0: %{name}-%{version}.tar.gz @@ -68,6 +68,3 @@ cp %{_builddir}/%{buildsubdir}/LICENSE %{buildroot}/%{_datadir}/license/%{name} %{_libdir}/liblottie-player.so %{_libdir}/cmake/lottie-player/*.cmake %{_libdir}/pkgconfig/lottie-player.pc - - - From 3afcc781d9e7e1da539cf6077fc5369108e3a66e Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Dec 2018 15:37:49 +0900 Subject: [PATCH 329/672] lottie/render: handle AlphaInverse matte for composition layer. Change-Id: Ia477287d71dc15466e42a267e385af4cec683020 --- src/lottie/lottieitem.cpp | 7 +++++-- src/lottie/lottieitem.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index e5f59aaaad..456eb66e26 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -217,7 +217,6 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle for (auto &i : mDrawableList) { matteRle = matteRle + i->rle(); } - if (!inheritMatte.empty()) matteRle = matteRle & inheritMatte; } else { @@ -246,7 +245,7 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle if (rle.empty()) continue; if (!matteRle.empty()) { - if (mLayerData->mMatteType == MatteType::AlphaInv) { + if (matteType() == MatteType::AlphaInv) { rle = rle - matteRle; } else { rle = rle & matteRle; @@ -427,6 +426,10 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const matteRle = matteRle + i->rle(); } + if (matteType() == MatteType::AlphaInv ) { + matteRle = VRle::toRle(painter->clipBoundingRect()) - matteRle; + } + if (!inheritMatte.empty()) matteRle = matteRle & inheritMatte; } else { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 93a9966248..d87f37a3a4 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -69,6 +69,7 @@ public: virtual void updateStaticProperty(); virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } + MatteType matteType() const { return mLayerData->mMatteType;} bool visible() const; virtual void buildLayerNode(); LOTLayerNode * layerNode() const {return mLayerCNode.get();} From 66e7cf8ef26164b245fbb8de851c00c572d1352d Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 4 Dec 2018 21:59:31 +0900 Subject: [PATCH 330/672] lottieitem: fill rule must be valid for stroke and shape both. Change-Id: I709d41267c6b45337824f088a2d5848b1c241233 --- src/lottie/lottieitem.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 456eb66e26..beea1b8d1d 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1193,15 +1193,6 @@ void LOTDrawable::sync() mCNode->mStroke.meterLimit = mStroke.meterLimit; mCNode->mStroke.enable = 1; - switch (mFillRule) { - case FillRule::EvenOdd: - mCNode->mFillRule = LOTFillRule::FillEvenOdd; - break; - default: - mCNode->mFillRule = LOTFillRule::FillWinding; - break; - } - switch (mStroke.cap) { case CapStyle::Flat: mCNode->mStroke.cap = LOTCapStyle::CapFlat; @@ -1239,6 +1230,15 @@ void LOTDrawable::sync() mCNode->mStroke.enable = 0; } + switch (mFillRule) { + case FillRule::EvenOdd: + mCNode->mFillRule = LOTFillRule::FillEvenOdd; + break; + default: + mCNode->mFillRule = LOTFillRule::FillWinding; + break; + } + switch (mBrush.type()) { case VBrush::Type::Solid: mCNode->mBrushType = LOTBrushType::BrushSolid; From 39118e21c4c0cb8ef50e0937a05d7b9324613a96 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Dec 2018 10:07:34 +0900 Subject: [PATCH 331/672] lottie: Refactor task queue to accept move only task object instead of pointer to task object. Change-Id: Iaa94efcef94fd128681fd45efa91f6e5340f85a6 --- src/lottie/lottieanimation.cpp | 34 ++++++++++---------- src/vector/vraster.cpp | 58 +++++++++++++++++++--------------- src/vector/vtaskqueue.h | 19 +++++------ 3 files changed, 60 insertions(+), 51 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 7fdb861b27..831bb8e07f 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -114,17 +114,19 @@ class RenderTaskScheduler { void run(unsigned i) { + RenderTask task; while (true) { - RenderTask *task = nullptr; - + bool success = false; for (unsigned n = 0; n != _count * 32; ++n) { - if (_q[(i + n) % _count].try_pop(task)) break; + if (_q[(i + n) % _count].try_pop(task)) { + success = true; + break; + } } - if (!task && !_q[i].pop(task)) break; + if (!success && !_q[i].pop(task)) break; - auto result = task->playerImpl->render(task->frameNo, task->surface); - task->sender.set_value(result); - delete task; + auto result = task.playerImpl->render(task.frameNo, task.surface); + task.sender.set_value(result); } } @@ -143,16 +145,16 @@ public: for (auto &e : _threads) e.join(); } - std::future async(RenderTask *task) + std::future async(RenderTask &&task) { - auto receiver = std::move(task->receiver); + auto receiver = std::move(task.receiver); auto i = _index++; for (unsigned n = 0; n != _count; ++n) { - if (_q[(i + n) % _count].try_push(task)) return receiver; + if (_q[(i + n) % _count].try_push(std::move(task))) return receiver; } - _q[i % _count].push(task); + _q[i % _count].push(std::move(task)); return receiver; } @@ -160,11 +162,11 @@ public: std::future render(AnimationImpl *impl, size_t frameNo, Surface &&surface) { - RenderTask *task = new RenderTask(); - task->playerImpl = impl; - task->frameNo = frameNo; - task->surface = std::move(surface); - return async(task); + RenderTask task; + task.playerImpl = impl; + task.frameNo = frameNo; + task.surface = std::move(surface); + return async(std::move(task)); } }; static RenderTaskScheduler render_scheduler; diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index ea254cad20..cb2a7ae4a0 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -314,6 +314,8 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) render(outRef); + path = VPath(); + return std::move(rle); } @@ -333,16 +335,20 @@ class RleTaskScheduler { SW_FT_Stroker_New(&stroker); // Task Loop + RleTask task; while (true) { - RleTask *task = nullptr; + bool success = false; for (unsigned n = 0; n != _count * 32; ++n) { - if (_q[(i + n) % _count].try_pop(task)) break; + if (_q[(i + n) % _count].try_pop(task)) { + success = true; + break; + } } - if (!task && !_q[i].pop(task)) break; - task->sender.set_value((*task)(outlineRef, stroker)); - delete task; + if (!success && !_q[i].pop(task)) break; + + task.sender.set_value((task)(outlineRef, stroker)); } // cleanup @@ -364,16 +370,16 @@ public: for (auto &e : _threads) e.join(); } - std::future async(RleTask *task) + std::future async(RleTask &&task) { - auto receiver = std::move(task->sender.get_future()); + auto receiver = std::move(task.sender.get_future()); auto i = _index++; for (unsigned n = 0; n != _count; ++n) { - if (_q[(i + n) % _count].try_push(task)) return receiver; + if (_q[(i + n) % _count].try_push(std::move(task))) return receiver; } - _q[i % _count].push(task); + _q[i % _count].push(std::move(task)); return receiver; } @@ -381,27 +387,27 @@ public: std::future strokeRle(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit, const VRect &clip) { - RleTask *task = new RleTask(); - task->stroke = true; - task->path = std::move(path); - task->rle = std::move(rle); - task->cap = cap; - task->join = join; - task->width = width; - task->meterLimit = meterLimit; - task->clip = clip; - return async(task); + RleTask task; + task.stroke = true; + task.path = std::move(path); + task.rle = std::move(rle); + task.cap = cap; + task.join = join; + task.width = width; + task.meterLimit = meterLimit; + task.clip = clip; + return async(std::move(task)); } std::future fillRle(VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) { - RleTask *task = new RleTask(); - task->path = std::move(path); - task->rle = std::move(rle); - task->fillRule = fillRule; - task->clip = clip; - task->stroke = false; - return async(task); + RleTask task; + task.path = std::move(path); + task.rle = std::move(rle); + task.fillRule = fillRule; + task.clip = clip; + task.stroke = false; + return async(std::move(task)); } }; diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h index 5700eab487..ce02dadec6 100644 --- a/src/vector/vtaskqueue.h +++ b/src/vector/vtaskqueue.h @@ -6,27 +6,27 @@ template class TaskQueue { using lock_t = std::unique_lock; - std::deque _q; + std::deque _q; bool _done{false}; std::mutex _mutex; std::condition_variable _ready; public: - bool try_pop(Task *&task) + bool try_pop(Task &task) { lock_t lock{_mutex, std::try_to_lock}; if (!lock || _q.empty()) return false; - task = _q.front(); + task = std::move(_q.front()); _q.pop_front(); return true; } - bool try_push(Task *task) + bool try_push(Task &&task) { { lock_t lock{_mutex, std::try_to_lock}; if (!lock) return false; - _q.push_back(task); + _q.push_back(std::move(task)); } _ready.notify_one(); return true; @@ -41,24 +41,25 @@ public: _ready.notify_all(); } - bool pop(Task *&task) + bool pop(Task &task) { lock_t lock{_mutex}; while (_q.empty() && !_done) _ready.wait(lock); if (_q.empty()) return false; - task = _q.front(); + task = std::move(_q.front()); _q.pop_front(); return true; } - void push(Task *task) + void push(Task &&task) { { lock_t lock{_mutex}; - _q.push_back(task); + _q.push_back(std::move(task)); } _ready.notify_one(); } + }; #endif // VTASKQUEUE_H From d7fd9124a7aa1cc0cddf0c47150799fdf343f277 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 5 Dec 2018 17:08:05 +0900 Subject: [PATCH 332/672] lottie: Fix the issue when dash length is 0. AE can draw zero length dash. Change-Id: I286e0a5503952f7e4ee38e3cc05c8ac3392f7579 --- src/lottie/lottieitem.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index beea1b8d1d..64d15faa7f 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -999,6 +999,9 @@ void LOTStrokeItem::updateRenderNode() mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); if (mDashArraySize) { + /* AE draw the dash even if dash value is 0 */ + if (vCompare(mDashArray[0], 0.0f)) mDashArray[0]= 0.2; + for (int i = 0 ; i < mDashArraySize ; i++) mDashArray[i] *= scale; mDrawable->setDashInfo(mDashArray, mDashArraySize); From ebc6577274998c5d73bb8bdce1f380eadbcbba54 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 5 Dec 2018 18:37:44 +0900 Subject: [PATCH 333/672] lottie: Test for zero dash length after applying scale factor. the scale factor can be less which will make the dash to 0 again. Change-Id: I2aacaa342a09f010835c23beb7c2e476c2b11825 --- src/lottie/lottieitem.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 64d15faa7f..766a1745e1 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -999,11 +999,12 @@ void LOTStrokeItem::updateRenderNode() mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); if (mDashArraySize) { - /* AE draw the dash even if dash value is 0 */ - if (vCompare(mDashArray[0], 0.0f)) mDashArray[0]= 0.2; - for (int i = 0 ; i < mDashArraySize ; i++) mDashArray[i] *= scale; + + /* AE draw the dash even if dash value is 0 */ + if (vCompare(mDashArray[0], 0.0f)) mDashArray[0]= 0.1; + mDrawable->setDashInfo(mDashArray, mDashArraySize); } } From 973b74c0a206417c09a0c27b330ed7335e295890 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 6 Dec 2018 12:07:03 +0900 Subject: [PATCH 334/672] doc: specify api visibility scope. This lottie-player is a library for tizen platform developers. Change-Id: Iaf3d91fde40e64cf2e3e719b1a39d6cacd4e7bcc --- inc/lottieanimation.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index a569c6d12f..3a9c1f264e 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -44,6 +44,8 @@ public: * @param[in] bytesPerLine number of bytes in a surface scanline. * * @note Default surface format is ARGB32_Premultiplied. + * + * @internal */ Surface(uint32_t *buffer, size_t width, size_t height, size_t bytesPerLine); @@ -51,6 +53,9 @@ public: * @brief Returns width of the surface. * * @return surface width + * + * @internal + * */ size_t width() const {return mWidth;} @@ -58,6 +63,8 @@ public: * @brief Returns height of the surface. * * @return surface height + * + * @internal */ size_t height() const {return mHeight;} @@ -65,6 +72,8 @@ public: * @brief Returns number of bytes in the surface scanline. * * @return number of bytes in scanline. + * + * @internal */ size_t bytesPerLine() const {return mBytesPerLine;} @@ -72,6 +81,8 @@ public: * @brief Returns buffer attached tp the surface. * * @return buffer attaced to the Surface. + * + * @internal */ uint32_t *buffer() const {return mBuffer;} @@ -96,6 +107,8 @@ public: * * @return Animation object that can render the contents of the * lottie resource represented by file path. + * + * @internal */ static std::unique_ptr loadFromFile(const std::string &path); @@ -108,6 +121,8 @@ public: * * @return Animation object that can render the contents of the * lottie resource represented by JSON string data. + * + * @internal */ static std::unique_ptr loadFromData(std::string jsonData, const std::string &key); @@ -117,6 +132,8 @@ public: * * @return framerate of the lottie resource * + * @internal + * */ double frameRate() const; @@ -126,6 +143,8 @@ public: * @return frame count of the lottie resource. * * @note frame number starts with 0. + * + * @internal */ size_t totalFrame() const; @@ -135,6 +154,8 @@ public: * @param[out] width default width of the viewport. * @param[out] height default height of the viewport. * + * @internal + * */ void size(size_t &width, size_t &height) const; @@ -148,6 +169,8 @@ public: * * @see totalFrame() * @see frameRate() + * + * @internal */ double duration() const; @@ -161,6 +184,7 @@ public: * * @return frame numer maps to the position value [startFrame .... endFrame] * + * @internal */ size_t frameAtPos(double pos); @@ -180,7 +204,9 @@ public: * @return future that will hold the result when rendering finished. * * for Synchronus rendering @see renderSync + * * @see Surface + * @internal */ std::future render(size_t frameNo, Surface surface); @@ -190,6 +216,8 @@ public: * * @param[in] frameNo Content corresponds to the frameno needs to be drawn * @param[in] surface Surface in which content will be drawn + * + * @internal */ void renderSync(size_t frameNo, Surface surface); @@ -202,6 +230,8 @@ public: * @param[in] height content viewbox height * * @return render node list. + * + * @internal */ const std::vector &renderList(size_t frameNo, size_t width, size_t height) const; @@ -214,17 +244,23 @@ public: * @param[in] height content viewbox height * * @return Root layer node. + * + * @internal */ const LOTLayerNode * renderTree(size_t frameNo, size_t width, size_t height) const; /** * @brief default destructor + * + * @internal */ ~Animation(); private: /** * @brief default constructor + * + * @internal */ Animation(); From d7ce9bab3c1da08d0857430116eb55fd822010d7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 7 Dec 2018 10:06:22 +0900 Subject: [PATCH 335/672] lottie/parser: Fix issue with trasformation property parsing of repeater object. Change-Id: Id2f835cd7e14d99e3eb8cdfd1350d03c2ed83084 --- src/lottie/lottieparser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 3a563c4b3c..176db2d98b 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1166,6 +1166,7 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOffset); } else if (0 == strcmp(key, "tr")) { + EnterObject(); obj->mTransform = parseTransformObject(); } else if (0 == strcmp(key, "hd")) { obj->mHidden = GetBool(); From b15ad1e093db6bed4d2160fddea1b608a0a775e1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 7 Dec 2018 11:28:58 +0900 Subject: [PATCH 336/672] lottie/parser: support start and end opacity property in transform object. the start and end opacity property only exists for repater's transform object. Change-Id: I9bd7f59957ca4d90894bab5981c10c992508556c --- src/lottie/lottiemodel.cpp | 5 ----- src/lottie/lottiemodel.h | 6 +++++- src/lottie/lottieparser.cpp | 6 +++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 1b5cd98cb6..c9b6b62b9c 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -55,11 +55,6 @@ VMatrix LOTTransformData::matrix(int frameNo, bool autoOrient) const return computeMatrix(frameNo, autoOrient); } -float LOTTransformData::opacity(int frameNo) const -{ - return mOpacity.value(frameNo) / 100.f; -} - void LOTTransformData::cacheMatrix() { mCachedMatrix = computeMatrix(0); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index da6502d6f7..8ceb1c5dd5 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -444,7 +444,9 @@ class LOTTransformData : public LOTData public: LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} VMatrix matrix(int frameNo, bool autoOrient = false) const; - float opacity(int frameNo) const; + float opacity(int frameNo) const { return mOpacity.value(frameNo)/100;} + float startOpacity(int frameNo) const { return mStartOpacity.value(frameNo)/100;} + float endOpacity(int frameNo) const { return mEndOpacity.value(frameNo)/100;} void cacheMatrix(); bool staticMatrix() const {return mStaticMatrix;} bool ddd() const {return m3D ? true : false;} @@ -461,6 +463,8 @@ public: LOTAnimatable mOpacity{100}; /* "o" */ LOTAnimatable mSkew{0}; /* "sk" */ LOTAnimatable mSkewAxis{0}; /* "sa" */ + LOTAnimatable mStartOpacity{100}; /* "so" */ + LOTAnimatable mEndOpacity{100}; /* "eo" */ bool mStaticMatrix{true}; bool mSeparate{false}; VMatrix mCachedMatrix; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 176db2d98b..b63d1e9e07 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1222,7 +1222,11 @@ std::shared_ptr LottieParserImpl::parseTransformObject(bool dd parseProperty(obj->mSkewAxis); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); - } else if (0 == strcmp(key, "hd")) { + } else if (0 == strcmp(key, "so")) { + parseProperty(obj->mStartOpacity); + } else if (0 == strcmp(key, "eo")) { + parseProperty(obj->mEndOpacity); + } else if (0 == strcmp(key, "hd")) { obj->mHidden = GetBool(); } else if (0 == strcmp(key, "rx")) { parseProperty(obj->m3D->mRx); From 99aa016f8405cd573580c60f17fe19f2f0a986f8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Sep 2018 17:16:05 +0900 Subject: [PATCH 337/672] lottie/feature: Added support for handing lottie repeater objects. Change-Id: If65b81aab08baeecd3c16ff70a38587429bd8c61 --- src/lottie/lottieitem.cpp | 46 +++++++++++++++++++++----- src/lottie/lottieitem.h | 12 +++---- src/lottie/lottiemodel.cpp | 64 ++++++++++++++++++++++++++++--------- src/lottie/lottiemodel.h | 6 ++++ src/lottie/lottieparser.cpp | 5 ++- 5 files changed, 103 insertions(+), 30 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 766a1745e1..8170c1654c 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -563,7 +563,7 @@ LOTShapeLayerItem::createContentItem(LOTData *contentData) switch (contentData->type()) { case LOTData::Type::ShapeGroup: { return std::make_unique( - static_cast(contentData)); + static_cast(contentData)); break; } case LOTData::Type::Rect: { @@ -644,7 +644,7 @@ void LOTShapeLayerItem::renderList(std::vector &list) mRoot->renderList(list); } -LOTContentGroupItem::LOTContentGroupItem(LOTShapeGroupData *data) : mData(data) +LOTContentGroupItem::LOTContentGroupItem(LOTGroupData *data) : mData(data) { addChildren(mData); } @@ -672,7 +672,7 @@ void LOTContentGroupItem::update(int frameNo, const VMatrix &parentMatrix, float alpha = parentAlpha; DirtyFlag newFlag = flag; - if (mData) { + if (mData && mData->mTransform) { // update the matrix and the flag if ((flag & DirtyFlagBit::Matrix) || !mData->mTransform->staticMatrix()) { @@ -1139,14 +1139,44 @@ void LOTTrimItem::addPathItems(std::vector &list, int startOf } -LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) {} - -void LOTRepeaterItem::update(int /*frameNo*/, const VMatrix &/*parentMatrix*/, - float /*parentAlpha*/, const DirtyFlag &/*flag*/) +LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) { + assert(mData->mChildren.size() == 1); + LOTGroupData *root = reinterpret_cast(mData->mChildren[0].get()); + assert(root); + + for (int i= 0; i < mData->copies(0); i++) { + auto content = std::make_unique(static_cast(root)); + content->setParent(this); + mContents.push_back(std::move(content)); + } } -void LOTRepeaterItem::renderList(std::vector &/*list*/) {} +void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ + + DirtyFlag newFlag = flag; + + if (mData->hasMtrixChange(frameNo)) { + newFlag |= DirtyFlagBit::Matrix; + } + + float multiplier = mData->offset(frameNo); + float startOpacity = mData->mTransform->startOpacity(frameNo); + float endOpacity = mData->mTransform->endOpacity(frameNo); + float index = 0; + float copies = mData->copies(frameNo); + if (!vCompare(copies, 1)) copies -=1; + + newFlag |= DirtyFlagBit::Alpha; + for (const auto &content : mContents) { + float newAlpha = parentAlpha * lerp(startOpacity, endOpacity, index / copies); + VMatrix result = mData->mTransform->matrixForRepeater(frameNo, multiplier) * parentMatrix; + content->update(frameNo, result, newAlpha, newFlag); + multiplier += 1; + index +=1; + } +} static void updateGStops(LOTNode *n, const VGradient *grad) { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index d87f37a3a4..025146029b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -197,16 +197,17 @@ private: class LOTContentGroupItem: public LOTContentItem { public: - LOTContentGroupItem(LOTShapeGroupData *data); + LOTContentGroupItem(){} + LOTContentGroupItem(LOTGroupData *data); void addChildren(LOTGroupData *data); - void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); void applyTrim(); void processTrimItems(std::vector &list); void processPaintItems(std::vector &list); void renderList(std::vector &list) final; const VMatrix & matrix() const { return mMatrix;} -private: - LOTShapeGroupData *mData; +protected: + LOTGroupData *mData{nullptr}; std::vector> mContents; VMatrix mMatrix; }; @@ -416,12 +417,11 @@ private: bool mDirty{true}; }; -class LOTRepeaterItem : public LOTContentItem +class LOTRepeaterItem : public LOTContentGroupItem { public: LOTRepeaterItem(LOTRepeaterData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; - void renderList(std::vector &list) final; private: LOTRepeaterData *mData; }; diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index c9b6b62b9c..63b924edd3 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -3,26 +3,46 @@ #include #include +/* + * We process the iterator objects in the children list + * by iterating from back to front. when we find a repeater object + * we remove the objects from satrt till repeater object and then place + * under a new shape group object which we add it as children to the repeater + * object. + * Then we visit the childrens of the newly created shape group object to + * process the remaining repeater object(when children list contains more than one + * repeater). + * + */ class LottieRepeaterProcesser { public: - void visitChildren(LOTGroupData *obj) - { - for (const auto& child : obj->mChildren) { - if (child->mType == LOTData::Type::Repeater) { - LOTRepeaterData *repeater = - static_cast(child.get()); - std::shared_ptr sharedShapeGroup = - std::make_shared(); + void visitChildren(LOTGroupData *obj) { + for (auto i = obj->mChildren.rbegin(); i != obj->mChildren.rend(); ++i ) { + auto child = (*i).get(); + if (child->type() == LOTData::Type::Repeater) { + LOTRepeaterData *repeater = static_cast(child); + auto sharedShapeGroup = std::make_shared(); LOTShapeGroupData *shapeGroup = sharedShapeGroup.get(); + // 1. increment the reverse iterator to point to the + // object before the repeater + ++i; + // 2. move all the children till repater to the group + std::move(obj->mChildren.begin(), + i.base(), back_inserter(shapeGroup->mChildren)); + // 3. erase the objects from the original children list + obj->mChildren.erase(obj->mChildren.begin(), + i.base()); + // 4. Add the newly created group to the repeater object. repeater->mChildren.push_back(sharedShapeGroup); - // copy all the child of the object till repeater and - // move that in to a group and then add that group to - // the repeater object. - for (const auto& cpChild : obj->mChildren) { - if (cpChild == child) break; - shapeGroup->mChildren.push_back(cpChild); - } + + // 5. visit newly created group to process remaining repeater object. + visitChildren(shapeGroup); + // 6. exit the loop as the current iterators are invalid + break; + } else { + visit(child); } + } } @@ -47,6 +67,20 @@ void LOTCompositionData::processRepeaterObjects() visitor.visit(mRootLayer.get()); } +VMatrix LOTTransformData::matrixForRepeater(int frameNo, float multiplier) const +{ + VPointF scale = mScale.value(frameNo) / 100.f; + scale.setX(std::pow(scale.x(), multiplier)); + scale.setY(std::pow(scale.y(), multiplier)); + VMatrix m; + m.translate(mPosition.value(frameNo) * multiplier) + .rotate(mRotation.value(frameNo) * multiplier) + .scale(scale) + .translate(mAnchor.value(frameNo)); + return m; +} + + VMatrix LOTTransformData::matrix(int frameNo, bool autoOrient) const { if (mStaticMatrix) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 8ceb1c5dd5..a939979f68 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -444,6 +444,7 @@ class LOTTransformData : public LOTData public: LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} VMatrix matrix(int frameNo, bool autoOrient = false) const; + VMatrix matrixForRepeater(int frameNo, float multiplier) const; float opacity(int frameNo) const { return mOpacity.value(frameNo)/100;} float startOpacity(int frameNo) const { return mStartOpacity.value(frameNo)/100;} float endOpacity(int frameNo) const { return mEndOpacity.value(frameNo)/100;} @@ -745,6 +746,11 @@ class LOTRepeaterData : public LOTGroupData { public: LOTRepeaterData():LOTGroupData(LOTData::Type::Repeater){} + bool hasMtrixChange(int /*frameNo*/) const { + return !(mTransform->isStatic() && mOffset.isStatic()); + } + float copies(int frameNo) const {return mCopies.value(frameNo);} + float offset(int frameNo) const {return mOffset.value(frameNo);} public: LOTAnimatable mCopies{0}; LOTAnimatable mOffset{0}; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index b63d1e9e07..91e9f3996d 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1966,7 +1966,10 @@ public: void visit(LOTData *obj, std::string level) { switch (obj->mType) { case LOTData::Type::Repeater: { - vDebug << level << "{ Repeater:"; + auto r = static_cast(obj); + vDebug << level << "{ Repeater: a:" << !obj->isStatic() + << ", copies:" << r->copies(0) + << ", offset:" << r->offset(0); visitChildren(static_cast(obj), level); vDebug << level << "} Repeater"; break; From 6aaa82628f28259acaf43b19f0c07c2c211b1f10 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 10 Dec 2018 14:58:19 +0900 Subject: [PATCH 338/672] lottie: Process Dash info inside lottie library. Change-Id: I7ecec5a94db20b81d0fbb9f620f3eef845b1aaa0 --- src/lottie/lottieitem.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 8170c1654c..31ddb302eb 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1211,6 +1211,10 @@ void LOTDrawable::sync() if (mFlag & DirtyState::None) return; if (mFlag & DirtyState::Path) { + if (mStroke.mDash.size()) { + VDasher dasher(mStroke.mDash.data(), mStroke.mDash.size()); + mPath = dasher.dashed(mPath); + } const std::vector &elm = mPath.elements(); const std::vector & pts = mPath.points(); const float *ptPtr = reinterpret_cast(pts.data()); @@ -1256,10 +1260,6 @@ void LOTDrawable::sync() mCNode->mStroke.join = LOTJoinStyle::JoinMiter; break; } - - mCNode->mStroke.dashArray = mStroke.mDash.data(); - mCNode->mStroke.dashArraySize = mStroke.mDash.size(); - } else { mCNode->mStroke.enable = 0; } From 20910257baa5d8f3e9dac6df5df07efbf49e6932 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 4 Dec 2018 16:34:03 +0900 Subject: [PATCH 339/672] lottie: Add Mask information to the layer node. Change-Id: I312e178d10747f29b6a6cbde9862edf5541a6c53 --- src/lottie/lottieitem.cpp | 42 +++++++++++++++++++++++++++++++++++---- src/lottie/lottieitem.h | 2 ++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 31ddb302eb..2494d360c9 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -151,10 +151,13 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, opacity = opacity * parentAlpha; mCombinedAlpha = opacity; - VPath path = mLocalPath; - path.transform(parentMatrix); + mFinalPath.reset(); + mFinalPath.addPath(mLocalPath); + mFinalPath.transform(parentMatrix); - mRleTask = VRaster::generateFillInfo(std::move(path), std::move(mRle)); + VPath tmp = mFinalPath; + + mRleTask = VRaster::generateFillInfo(std::move(tmp), std::move(mRle)); mRle = VRle(); } @@ -204,7 +207,38 @@ void LOTLayerItem::buildLayerNode() } } if (hasMask()) { - //TODO populate mask property + mMasksCNode.clear(); + for (const auto &mask : mMasks) { + LOTMask cNode; + const std::vector &elm = mask->mFinalPath.elements(); + const std::vector & pts = mask->mFinalPath.points(); + const float *ptPtr = reinterpret_cast(pts.data()); + const char * elmPtr = reinterpret_cast(elm.data()); + cNode.mPath.ptPtr = ptPtr; + cNode.mPath.ptCount = pts.size(); + cNode.mPath.elmPtr = elmPtr; + cNode.mPath.elmCount = elm.size(); + switch (mask->maskMode()) { + case LOTMaskData::Mode::Add: + cNode.mMode = MaskModeAdd; + break; + case LOTMaskData::Mode::Substarct: + cNode.mMode = MaskModeSubstract; + break; + case LOTMaskData::Mode::Intersect: + cNode.mMode = MaskModeIntersect; + break; + case LOTMaskData::Mode::Difference: + cNode.mMode = MaskModeDifference; + break; + default: + cNode.mMode = MaskModeAdd; + break; + } + mMasksCNode.push_back(std::move(cNode)); + } + mLayerCNode->mMaskList.ptr = mMasksCNode.data(); + mLayerCNode->mMaskList.size = mMasksCNode.size(); } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 025146029b..695ac45107 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -84,6 +84,7 @@ protected: VRle maskRle(const VRect &clipRect); bool hasMask() const {return !mMasks.empty();} protected: + std::vector mMasksCNode; std::unique_ptr mLayerCNode; std::vector mDrawableList; std::vector> mMasks; @@ -161,6 +162,7 @@ public: float mCombinedAlpha; VMatrix mCombinedMatrix; VPath mLocalPath; + VPath mFinalPath; std::future mRleTask; VRle mRle; }; From d6dd8db1910b80a9f67aa8662b792244117f099a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 11 Dec 2018 18:39:14 +0900 Subject: [PATCH 340/672] lottie/vector: Fixed vpath::clone() implementation. Change-Id: I1c4a4f465508dcaa6831b3d42ca161260e3b6cef --- src/vector/vpath.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vector/vpath.h b/src/vector/vpath.h index be89db6a06..76e8df2e92 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -246,7 +246,8 @@ inline const std::vector &VPath::points() const inline void VPath::clone(const VPath &srcPath) { - d.write() = srcPath.d.read(); + reset(); + addPath(srcPath); } V_END_NAMESPACE From 07433e45cee3c2cf0eb72e08e4a048c0b5257824 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 11 Dec 2018 18:39:58 +0900 Subject: [PATCH 341/672] lottie/optimization: optimize reuse of vpath object to reduce memory alloc/dealloc Change-Id: Ide35d3e56a77924a9706340c71091865125b016b --- src/lottie/lottieitem.cpp | 23 ++++++++++++++++++++--- src/lottie/lottieitem.h | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 2494d360c9..9bb61e7fbd 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -151,8 +151,7 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, opacity = opacity * parentAlpha; mCombinedAlpha = opacity; - mFinalPath.reset(); - mFinalPath.addPath(mLocalPath); + mFinalPath.clone(mLocalPath); mFinalPath.transform(parentMatrix); VPath tmp = mFinalPath; @@ -787,6 +786,18 @@ void LOTContentGroupItem::processTrimItems( } } +/* + * LOTPathDataItem uses 3 path objects for path object reuse. + * mLocalPath - keeps track of the local path of the item before + * applying path operation and transformation. + * mTemp - keeps a referece to the mLocalPath and can be updated by the + * path operation objects(trim, merge path), + * mFinalPath - it takes a deep copy of the intermediate path(mTemp) each time + * when the path is dirty(so if path changes every frame we don't realloc just copy to the + * final path). + * NOTE: As path objects are COW objects we have to be carefull about the refcount so that + * we don't generate deep copy while modifying the path objects. + */ void LOTPathDataItem::update(int frameNo, const VMatrix &, float, const DirtyFlag &flag) { @@ -794,11 +805,17 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &, // 1. update the local path if needed if (hasChanged(frameNo)) { + // loose the reference to mLocalPath if any + // from the last frame update. + mTemp = VPath(); + updatePath(mLocalPath, frameNo); mPathChanged = true; mNeedUpdate = true; } - + // 2. keep a reference path in temp in case there is some + // path operation like trim which will update the path. + // we don't want to update the local path. mTemp = mLocalPath; // 3. compute the final path with parentMatrix diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 695ac45107..f2680c46c4 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -222,7 +222,7 @@ public: bool dirty() const {return mPathChanged;} const VPath &localPath() const {return mTemp;} const VPath &finalPath(); - void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true; mNeedUpdate = true;} + void updatePath(const VPath &path) {mTemp = path; mPathChanged = true; mNeedUpdate = true;} bool staticPath() const { return mStaticPath; } protected: virtual void updatePath(VPath& path, int frameNo) = 0; From 34c12f2d605b6b1b00038c38b6fc1ad28938ef8c Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Mon, 10 Dec 2018 22:10:46 +0900 Subject: [PATCH 342/672] lottie: refactor mask handling of layer to a separate LOTLayerMaskItem object. Change-Id: Ifdc588dd95dbd4f00f07d5f713c47212847941cd --- src/lottie/lottieitem.cpp | 85 +++++++++++++++++++++++++-------------- src/lottie/lottieitem.h | 23 +++++++++-- 2 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 9bb61e7fbd..dcf3f8bc27 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -138,8 +138,10 @@ bool LOTCompItem::render(const lottie::Surface &surface) } void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, - float parentAlpha, const DirtyFlag &/*flag*/) + float parentAlpha, const DirtyFlag &flag) { + if (flag.testFlag(DirtyFlagBit::None) && mData->isStatic()) return; + if (mData->mShape.isStatic()) { if (mLocalPath.empty()) { mData->mShape.value(frameNo).toPath(mLocalPath); @@ -205,19 +207,19 @@ void LOTLayerItem::buildLayerNode() break; } } - if (hasMask()) { + if (mLayerMask) { mMasksCNode.clear(); - for (const auto &mask : mMasks) { + for (const auto &mask : mLayerMask->mMasks) { LOTMask cNode; - const std::vector &elm = mask->mFinalPath.elements(); - const std::vector & pts = mask->mFinalPath.points(); + const std::vector &elm = mask.mFinalPath.elements(); + const std::vector & pts = mask.mFinalPath.points(); const float *ptPtr = reinterpret_cast(pts.data()); const char * elmPtr = reinterpret_cast(elm.data()); cNode.mPath.ptPtr = ptPtr; cNode.mPath.ptCount = pts.size(); cNode.mPath.elmPtr = elmPtr; cNode.mPath.elmCount = elm.size(); - switch (mask->maskMode()) { + switch (mask.maskMode()) { case LOTMaskData::Mode::Add: cNode.mMode = MaskModeAdd; break; @@ -259,8 +261,8 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle renderList(mDrawableList); VRle mask; - if (hasMask()) { - mask = maskRle(painter->clipBoundingRect()); + if (mLayerMask) { + mask = mLayerMask->maskRle(painter->clipBoundingRect()); if (!inheritMask.empty()) mask = mask & inheritMask; // if resulting mask is empty then return. @@ -288,43 +290,66 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle } } -VRle LOTLayerItem::maskRle(const VRect &clipRect) +LOTLayerMaskItem::LOTLayerMaskItem(LOTLayerData *layerData) { + mMasks.reserve(layerData->mMasks.size()); + + for (auto &i : layerData->mMasks) { + mMasks.emplace_back(i.get()); + mStatic &= i->isStatic(); + } +} + +void LOTLayerMaskItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ + if (flag.testFlag(DirtyFlagBit::None) && isStatic()) return; + + for (auto &i : mMasks) { + i.update(frameNo, parentMatrix, parentAlpha, flag); + } + mDirty = true; +} + +VRle LOTLayerMaskItem::maskRle(const VRect &clipRect) +{ + if (!mDirty) return mRle; + VRle rle; for (auto &i : mMasks) { - switch (i->maskMode()) { + switch (i.maskMode()) { case LOTMaskData::Mode::Add: { - rle = rle + i->rle(); + rle = rle + i.rle(); break; } case LOTMaskData::Mode::Substarct: { if (rle.empty() && !clipRect.empty()) rle = VRle::toRle(clipRect); - rle = rle - i->rle(); + rle = rle - i.rle(); break; } case LOTMaskData::Mode::Intersect: { - rle = rle & i->rle(); + rle = rle & i.rle(); break; } case LOTMaskData::Mode::Difference: { - rle = rle ^ i->rle(); + rle = rle ^ i.rle(); break; } default: break; } } - return rle; + + mRle = rle; + mDirty = false; + return mRle; } + LOTLayerItem::LOTLayerItem(LOTLayerData *layerData): mLayerData(layerData) { - if (mLayerData->mHasMask) { - for (auto &i : mLayerData->mMasks) { - mMasks.push_back(std::make_unique(i.get())); - } - } + if (mLayerData->mHasMask) + mLayerMask = std::make_unique(mLayerData); } void LOTLayerItem::updateStaticProperty() @@ -348,11 +373,6 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, m *= parentMatrix; float alpha = parentAlpha * opacity(frameNo()); - // 6. update the mask - if (hasMask()) { - for (auto &i : mMasks) i->update(frameNo(), m, alpha, mDirtyFlag); - } - // 3. update the dirty flag based on the change if (!mCombinedMatrix.fuzzyCompare(m)) { mDirtyFlag |= DirtyFlagBit::Matrix; @@ -363,13 +383,18 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, mCombinedMatrix = m; mCombinedAlpha = alpha; - // 4. if no parent property change and layer is static then nothing to do. + // 4. update the mask + if (mLayerMask) { + mLayerMask->update(frameNo(), m, alpha, mDirtyFlag); + } + + // 5. if no parent property change and layer is static then nothing to do. if ((flag() & DirtyFlagBit::None) && isStatic()) return; - // 5. update the content of the layer + // 6. update the content of the layer updateContent(); - // 6. reset the dirty flag + // 7. reset the dirty flag mDirtyFlag = DirtyFlagBit::None; } @@ -470,8 +495,8 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const } VRle mask; - if (hasMask()) { - mask = maskRle(painter->clipBoundingRect()); + if (mLayerMask) { + mask = mLayerMask->maskRle(painter->clipBoundingRect()); if (!inheritMask.empty()) mask = mask & inheritMask; // if resulting mask is empty then return. diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index f2680c46c4..737ce4398b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -53,6 +53,8 @@ private: std::vector mDrawableList; }; +class LOTLayerMaskItem; + typedef vFlag DirtyFlag; class LOTLayerItem { @@ -81,13 +83,11 @@ protected: inline bool isStatic() const {return mStatic;} float opacity(int frameNo) const; inline DirtyFlag flag() const {return mDirtyFlag;} - VRle maskRle(const VRect &clipRect); - bool hasMask() const {return !mMasks.empty();} protected: std::vector mMasksCNode; std::unique_ptr mLayerCNode; std::vector mDrawableList; - std::vector> mMasks; + std::unique_ptr mLayerMask; LOTLayerData *mLayerData{nullptr}; LOTLayerItem *mParentLayer{nullptr}; LOTLayerItem *mPrecompLayer{nullptr}; @@ -167,6 +167,23 @@ public: VRle mRle; }; +/* + * Handels mask property of a layer item + */ +class LOTLayerMaskItem +{ +public: + LOTLayerMaskItem(LOTLayerData *layerData); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); + bool isStatic() const {return mStatic;} + VRle maskRle(const VRect &clipRect); +public: + std::vector mMasks; + VRle mRle; + bool mStatic{true}; + bool mDirty{true}; +}; + class LOTDrawable : public VDrawable { public: From 6e60047a5609ba6b28e472a954935a2cd11c1956 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 11 Dec 2018 10:50:07 +0900 Subject: [PATCH 343/672] lottie: use testFlag() api to test the flag. Change-Id: I3ee5341c66562241f0d83ee396347804d5b0eb7d --- src/lottie/lottieitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index dcf3f8bc27..631dae19e0 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -389,7 +389,7 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, } // 5. if no parent property change and layer is static then nothing to do. - if ((flag() & DirtyFlagBit::None) && isStatic()) return; + if (flag().testFlag(DirtyFlagBit::None) && isStatic()) return; // 6. update the content of the layer updateContent(); From 98b3a182657af1c5f71c00e66c6cc442cdbdd9fb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Dec 2018 14:59:35 +0900 Subject: [PATCH 344/672] lottie/vector: Added a callback version of intersect() api. Change-Id: I54aebc5d2ee5df1421054b5e5d98077e2a9a2299 --- src/vector/vrle.cpp | 20 +++++++++++++++++--- src/vector/vrle.h | 11 ++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 76682180af..9637027023 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -304,8 +304,15 @@ void VRle::VRleData::opGeneric(const VRle::VRleData &a, const VRle::VRleData &b, mBboxDirty = false; } -void VRle::VRleData::opIntersect(const VRle::VRleData &obj1, - const VRle::VRleData &obj2) +static void rle_cb(int count, const VRle::Span *spans, void *userData) +{ + auto vector = static_cast *>(userData); + copyArrayToVector(spans, count, *vector); +} + +void opIntersectHelper(const VRle::VRleData &obj1, + const VRle::VRleData &obj2, + VRle::VRleSpanCb cb, void *userData) { VRleHelper result, source, clip; std::array array; @@ -327,13 +334,20 @@ void VRle::VRleData::opIntersect(const VRle::VRleData &obj1, while (source.size) { rleIntersectWithRle(&clip, 0, 0, &source, &result); if (result.size) { - copyArrayToVector(result.spans, result.size, mSpans); + cb(result.size, result.spans, userData); } result.size = 0; } +} + +void VRle::VRleData::opIntersect(const VRle::VRleData &obj1, + const VRle::VRleData &obj2) +{ + opIntersectHelper(obj1, obj2, rle_cb, &mSpans); updateBbox(); } + #define VMIN(a, b) ((a) < (b) ? (a) : (b)) #define VMAX(a, b) ((a) > (b) ? (a) : (b)) diff --git a/src/vector/vrle.h b/src/vector/vrle.h index a5f1d75130..16cb23746c 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -31,6 +31,7 @@ public: void operator*=(int alpha); void intersect(const VRect &r, VRleSpanCb cb, void *userData) const; + void intersect(const VRle &rle, VRleSpanCb cb, void *userData) const; VRle operator&(const VRle &o) const; VRle operator-(const VRle &o) const; @@ -64,7 +65,9 @@ private: mutable VRect mBbox; mutable bool mBboxDirty = true; }; - + friend void opIntersectHelper(const VRle::VRleData &obj1, + const VRle::VRleData &obj2, + VRle::VRleSpanCb cb, void *userData); vcow_ptr d; }; @@ -156,6 +159,12 @@ inline void VRle::intersect(const VRect &r, VRleSpanCb cb, void *userData) const d->opIntersect(r, cb, userData); } +inline void VRle::intersect(const VRle &r, VRleSpanCb cb, void *userData) const +{ + if (empty() || r.empty()) return; + opIntersectHelper(d.read(), r.d.read(), cb, userData); +} + V_END_NAMESPACE #endif // VRLE_H From 7e774a7bcdd00a60b54a82b3869d916c24be98c3 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Dec 2018 15:19:28 +0900 Subject: [PATCH 345/672] lottie/render: add new drawRle() api with rle clip support. Change-Id: Ibcc16085e0df06da65f8a9f2367189d25c618a11 --- src/vector/vpainter.cpp | 18 ++++++++++++++++++ src/vector/vpainter.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 1249e38590..3ff3e89b15 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -6,6 +6,7 @@ V_BEGIN_NAMESPACE class VPainterImpl { public: void drawRle(const VPoint &pos, const VRle &rle); + void drawRle(const VRle &rle, const VRle &clip); public: VRasterBuffer mBuffer; @@ -26,6 +27,17 @@ void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle) &mSpanData); } +void VPainterImpl::drawRle(const VRle &rle, const VRle &clip) +{ + if (rle.empty() || clip.empty()) return; + + if (!mSpanData.mUnclippedBlendFunc) return; + + rle.intersect(clip, mSpanData.mUnclippedBlendFunc, + &mSpanData); +} + + VPainter::~VPainter() { delete mImpl; @@ -61,6 +73,12 @@ void VPainter::drawRle(const VPoint &pos, const VRle &rle) mImpl->drawRle(pos, rle); } +void VPainter::drawRle(const VRle &rle, const VRle &clip) +{ + mImpl->drawRle(rle, clip); +} + + VRect VPainter::clipBoundingRect() const { return mImpl->mSpanData.mSystemClip; diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index 67942a21f6..cb3ec4e267 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -19,6 +19,7 @@ public: void end(); void setBrush(const VBrush &brush); void drawRle(const VPoint &pos, const VRle &rle); + void drawRle(const VRle &rle, const VRle &clip); VRect clipBoundingRect() const; private: From fb6bf7bef90771997f6c67c2297f9d03a4ada45a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Dec 2018 19:47:23 +0900 Subject: [PATCH 346/672] lottie/render: Added custome future/promise to optimize the heap allocation. As every future/promise shared data allocates in heap there was lot of heap allocation when we generate span info using RleThread pool. this custome future/promise will allocate 1 shared resource per drawable and will reuse for all subsequent span info request for that drawable. This reduced the number of heap allocation drastically and improves render performance. Change-Id: Ic480030e7c36ad7ab730683e71417de026220297 --- src/lottie/lottieitem.cpp | 9 +++++--- src/lottie/lottieitem.h | 2 +- src/vector/vdrawable.cpp | 13 +++++++---- src/vector/vdrawable.h | 3 ++- src/vector/vraster.cpp | 47 +++++++++++++++++++-------------------- src/vector/vraster.h | 42 ++++++++++++++++++++++++++++++---- 6 files changed, 79 insertions(+), 37 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 631dae19e0..621f64cab5 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -158,14 +158,17 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, VPath tmp = mFinalPath; - mRleTask = VRaster::generateFillInfo(std::move(tmp), std::move(mRle)); + if (!mRleFuture) mRleFuture = std::make_shared>(); + + mRleFuture->reuse(); + VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle)); mRle = VRle(); } VRle LOTMaskItem::rle() { - if (mRleTask.valid()) { - mRle = mRleTask.get(); + if (mRleFuture && mRleFuture->valid()) { + mRle = mRleFuture->get(); if (!vCompare(mCombinedAlpha, 1.0f)) mRle *= (mCombinedAlpha * 255); if (mData->mInv) mRle.invert(); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 737ce4398b..891e94caf9 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -163,7 +163,7 @@ public: VMatrix mCombinedMatrix; VPath mLocalPath; VPath mFinalPath; - std::future mRleTask; + RleShare mRleFuture; VRle mRle; }; diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 13b0a2d9a0..0eaad64230 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -5,16 +5,21 @@ void VDrawable::preprocess(const VRect &clip) { if (mFlag & (DirtyState::Path)) { + + if (!mRleFuture) mRleFuture = std::make_shared>(); + + mRleFuture->reuse(); + if (mStroke.enable) { if (mStroke.mDash.size()) { VDasher dasher(mStroke.mDash.data(), mStroke.mDash.size()); mPath = dasher.dashed(mPath); } - mRleTask = VRaster::generateStrokeInfo( + VRaster::generateStrokeInfo(mRleFuture, std::move(mPath), std::move(mRle), mStroke.cap, mStroke.join, mStroke.width, mStroke.meterLimit, clip); } else { - mRleTask = VRaster::generateFillInfo( + VRaster::generateFillInfo(mRleFuture, std::move(mPath), std::move(mRle), mFillRule, clip); } mRle = VRle(); @@ -24,8 +29,8 @@ void VDrawable::preprocess(const VRect &clip) VRle VDrawable::rle() { - if (mRleTask.valid()) { - mRle = mRleTask.get(); + if (mRleFuture && mRleFuture->valid()) { + mRle = mRleFuture->get(); } return mRle; } diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index 9d157f675b..d07ad7ec6e 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -4,6 +4,7 @@ #include "vbrush.h" #include "vpath.h" #include "vrle.h" +#include "vraster.h" class VDrawable { public: @@ -40,7 +41,7 @@ public: }; VBrush mBrush; VPath mPath; - std::future mRleTask; + RleShare mRleFuture; VRle mRle; StrokeInfo mStroke; DirtyFlag mFlag{DirtyState::All}; diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index cb2a7ae4a0..25185c33ee 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -244,7 +244,7 @@ static void bboxCb(int x, int y, int w, int h, void *user) } struct RleTask { - std::promise sender; + RleShare mRlePromise; VPath path; VRle rle; float width; @@ -348,7 +348,7 @@ class RleTaskScheduler { if (!success && !_q[i].pop(task)) break; - task.sender.set_value((task)(outlineRef, stroker)); + task.mRlePromise->set_value((task)(outlineRef, stroker)); } // cleanup @@ -370,21 +370,18 @@ public: for (auto &e : _threads) e.join(); } - std::future async(RleTask &&task) + void async(RleTask &&task) { - auto receiver = std::move(task.sender.get_future()); auto i = _index++; for (unsigned n = 0; n != _count; ++n) { - if (_q[(i + n) % _count].try_push(std::move(task))) return receiver; + if (_q[(i + n) % _count].try_push(std::move(task))) return; } _q[i % _count].push(std::move(task)); - - return receiver; } - std::future strokeRle(VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, + void strokeRle(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit, const VRect &clip) { RleTask task; @@ -396,10 +393,12 @@ public: task.width = width; task.meterLimit = meterLimit; task.clip = clip; - return async(std::move(task)); + task.mRlePromise = promise; + + async(std::move(task)); } - std::future fillRle(VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) + void fillRle(RleShare &promise, VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) { RleTask task; task.path = std::move(path); @@ -407,33 +406,33 @@ public: task.fillRule = fillRule; task.clip = clip; task.stroke = false; - return async(std::move(task)); + task.mRlePromise = promise; + + async(std::move(task)); } }; static RleTaskScheduler raster_scheduler; -std::future VRaster::generateFillInfo(VPath &&path, VRle &&rle, - FillRule fillRule, const VRect &clip) +void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, + FillRule fillRule, const VRect &clip) { if (path.empty()) { - std::promise promise; - promise.set_value(VRle()); - return promise.get_future(); + promise->set_value(VRle()); + return; } - return raster_scheduler.fillRle(std::move(path), std::move(rle), fillRule, clip); + return raster_scheduler.fillRle(promise, std::move(path), std::move(rle), fillRule, clip); } -std::future VRaster::generateStrokeInfo(VPath &&path, VRle &&rle, CapStyle cap, - JoinStyle join, float width, - float meterLimit, const VRect &clip) +void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, + JoinStyle join, float width, + float meterLimit, const VRect &clip) { if (path.empty()) { - std::promise promise; - promise.set_value(VRle()); - return promise.get_future(); + promise->set_value(VRle()); + return; } - return raster_scheduler.strokeRle(std::move(path), std::move(rle), cap, join, width, meterLimit, clip); + return raster_scheduler.strokeRle(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip); } V_END_NAMESPACE diff --git a/src/vector/vraster.h b/src/vector/vraster.h index a25b0d2754..d1594204d8 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -9,14 +9,48 @@ V_BEGIN_NAMESPACE class VPath; class VRle; +template +class VSharedState { +public: + void set_value(R value) { + if (_ready) return; + + { + std::lock_guard lock(_mutex); + _value = std::move(value); + _ready = true; + } + _cv.notify_one(); + } + R get(){ + std::unique_lock lock(_mutex); + while(!_ready) _cv.wait(lock); + _valid = false; + return std::move(_value); + } + bool valid() const {return _valid;} + void reuse() { + _ready = false; + _valid = true; + } +private: + R _value; + std::mutex _mutex; + std::condition_variable _cv; + bool _ready{false}; + bool _valid{true}; +}; + +using RleShare = std::shared_ptr>; + struct VRaster { - static std::future - generateFillInfo(VPath &&path, VRle &&rle, + static void + generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, FillRule fillRule = FillRule::Winding, const VRect &clip = VRect()); - static std::future - generateStrokeInfo(VPath &&path, VRle &&rle, + static void + generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, float width, float meterLimit, const VRect &clip = VRect()); }; From cbf5a3245eb6e5275da2dd353b5edfd5b2422e8a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 12 Dec 2018 15:30:16 +0900 Subject: [PATCH 347/672] lottie/render: optimize rendering by passing rle clip to painter instead of creating a new rle. Rle operations usually generate new rle which means memory allocation. by using drawRle() with clip version we can avoid the intermediate rle generation. Change-Id: I8b3010b1dfc296ee9288631d7b5df1ac4265210b --- src/lottie/lottieitem.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 621f64cab5..0ea95e1e3d 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -278,18 +278,27 @@ void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle for (auto &i : mDrawableList) { painter->setBrush(i->mBrush); VRle rle = i->rle(); - if (!mask.empty()) rle = rle & mask; + if (matteRle.empty()) { + if (mask.empty()) { + // no mask no matte + painter->drawRle(VPoint(), rle); + } else { + // only mask + painter->drawRle(rle, mask); + } - if (rle.empty()) continue; + } else { + if (!mask.empty()) rle = rle & mask; - if (!matteRle.empty()) { + if (rle.empty()) continue; if (matteType() == MatteType::AlphaInv) { rle = rle - matteRle; + painter->drawRle(VPoint(), rle); } else { - rle = rle & matteRle; + // render with matteRle as clip. + painter->drawRle(rle, matteRle); } } - painter->drawRle(VPoint(), rle); } } From 73f52824285ca5b3fa06a9e88b13ef6fbe7ad141 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 13 Dec 2018 17:47:10 +0900 Subject: [PATCH 348/672] remove redundant apis. Change-Id: Iacc975f28d6a87e9994be49d291ea67037263a82 --- inc/lottieanimation.h | 14 -------------- inc/lottieanimation_capi.h | 17 ----------------- src/binding/c/lottieanimation_capi.cpp | 26 -------------------------- src/lottie/lottieanimation.cpp | 16 ---------------- src/lottie/lottieitem.cpp | 18 ------------------ src/lottie/lottieitem.h | 2 -- 6 files changed, 93 deletions(-) diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index 3a9c1f264e..e115ebf611 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -221,20 +221,6 @@ public: */ void renderSync(size_t frameNo, Surface surface); - /** - * @brief Returns list of rendering nodes that that represents the - * content of the lottie resource at frame number {frameNo}. - * - * @param[in] frameNo Content corresponds to the frameno needs to be extracted. - * @param[in] width content viewbox width - * @param[in] height content viewbox height - * - * @return render node list. - * - * @internal - */ - const std::vector &renderList(size_t frameNo, size_t width, size_t height) const; - /** * @brief Returns root layer of the composition updated with * content of the lottie resource at frame number {frameNo}. diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index 89b94cdbee..d1c27ebd4d 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -20,23 +20,6 @@ LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation *animatio LOT_EXPORT size_t lottie_animation_get_totalframe(const Lottie_Animation *animation); LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation *animation); - -/* - * Request to update the content of the frame $frame_number in to Animation object. - * frame_number, the content of the animation in that frame number - * width , width of the viewbox - * height , height of the viewbox - * - * PS : user must call lottie_animation_get_node_count and lottie_animation_get_node - * to get the renderlist. - */ -LOT_EXPORT size_t lottie_animation_prepare_frame(Lottie_Animation *animation, - size_t frameNo, - size_t w, size_t h); -LOT_EXPORT size_t lottie_animation_get_node_count(const Lottie_Animation *animation); -LOT_EXPORT const LOTNode* lottie_animation_get_node(Lottie_Animation *animation, size_t idx); - - /* * Get the render tree which contains the snapshot of the animation object at frame $frame_number * frame_number, the content of the animation in that frame number diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 2d7efc3337..6c287b8f7e 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -73,32 +73,6 @@ LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation_S *anima return animation->mAnimation->frameRate(); } -LOT_EXPORT void lottie_animation_prepare_frame(Lottie_Animation_S *animation, size_t frameNo, size_t w, size_t h) -{ - if (!animation) return; - - animation->mFrameNo = frameNo; - animation->mWidth = w; - animation->mHeight = h; - animation->mArraySize = animation->mAnimation->renderList(frameNo, w, h).size(); -} - -LOT_EXPORT size_t lottie_animation_get_node_count(const Lottie_Animation_S *animation) -{ - if (!animation) return 0; - - return animation->mArraySize; -} - -LOT_EXPORT const LOTNode* lottie_animation_get_node(const Lottie_Animation_S *animation, size_t idx) -{ - if (!animation) return nullptr; - - if (idx >= animation->mArraySize) return nullptr; - - return animation->mAnimation->renderList(animation->mFrameNo, animation->mWidth, animation->mHeight)[idx]; -} - LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation_S *animation, size_t frameNo, size_t w, size_t h) { if (!animation) return nullptr; diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 831bb8e07f..5ba030b730 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -20,8 +20,6 @@ public: size_t frameAtPos(double pos) const {return mModel->frameAtPos(pos);} Surface render(size_t frameNo, const Surface &surface); - const std::vector & - renderList(size_t frameNo, const VSize &size); const LOTLayerNode * renderTree(size_t frameNo, const VSize &size); private: @@ -31,14 +29,6 @@ private: std::atomic mRenderInProgress; }; -const std::vector &AnimationImpl::renderList(size_t frameNo, const VSize &size) -{ - if (update(frameNo, size)) { - mCompItem->buildRenderList(); - } - return mCompItem->renderList(); -} - const LOTLayerNode *AnimationImpl::renderTree(size_t frameNo, const VSize &size) { if (update(frameNo, size)) { @@ -238,12 +228,6 @@ size_t Animation::frameAtPos(double pos) return d->frameAtPos(pos); } -const std::vector & -Animation::renderList(size_t frameNo, size_t width, size_t height) const -{ - return d->renderList(frameNo, VSize(width, height)); -} - const LOTLayerNode * Animation::renderTree(size_t frameNo, size_t width, size_t height) const { diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 0ea95e1e3d..411c454dee 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -88,24 +88,6 @@ bool LOTCompItem::update(int frameNo) return true; } -void LOTCompItem::buildRenderList() -{ - mDrawableList.clear(); - mRootLayer->renderList(mDrawableList); - - mRenderList.clear(); - for (auto &i : mDrawableList) { - LOTDrawable *lotDrawable = static_cast(i); - lotDrawable->sync(); - mRenderList.push_back(lotDrawable->mCNode.get()); - } -} - -const std::vector &LOTCompItem::renderList() const -{ - return mRenderList; -} - void LOTCompItem::buildRenderTree() { mRootLayer->buildLayerNode(); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 891e94caf9..7a1a5a2732 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -36,8 +36,6 @@ public: bool update(int frameNo); void resize(const VSize &size); VSize size() const; - const std::vector& renderList()const; - void buildRenderList(); void buildRenderTree(); const LOTLayerNode * renderTree()const; bool render(const lottie::Surface &surface); From 033801ec3ed520f1cb6aabcf78b8d344a7385df2 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 13 Dec 2018 14:44:58 +0900 Subject: [PATCH 349/672] updated doc. Change-Id: I712379928026a2101fdada48d7482ef6926a1040 --- inc/lottieanimation.h | 36 +++--- inc/lottieanimation_capi.h | 166 +++++++++++++++++++++---- inc/lottiecommon.h | 22 ++++ src/binding/c/lottieanimation_capi.cpp | 18 +-- 4 files changed, 189 insertions(+), 53 deletions(-) diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index e115ebf611..4586ac836b 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -101,12 +101,12 @@ class LOT_EXPORT Animation { public: /** - * @brief Constructs an animation object from filepath. + * @brief Constructs an animation object from file path. * * @param[in] path Lottie resource file path * * @return Animation object that can render the contents of the - * lottie resource represented by file path. + * Lottie resource represented by file path. * * @internal */ @@ -114,13 +114,13 @@ public: loadFromFile(const std::string &path); /** - * @brief Constructs an animation object from json string data. + * @brief Constructs an animation object from JSON string data. * * @param[in] jsonData The JSON string data. * @param[in] key the string that will be used to cache the JSON string data. * * @return Animation object that can render the contents of the - * lottie resource represented by JSON string data. + * Lottie resource represented by JSON string data. * * @internal */ @@ -128,9 +128,9 @@ public: loadFromData(std::string jsonData, const std::string &key); /** - * @brief Returns default framerate of the lottie resource. + * @brief Returns default framerate of the Lottie resource. * - * @return framerate of the lottie resource + * @return framerate of the Lottie resource * * @internal * @@ -138,9 +138,9 @@ public: double frameRate() const; /** - * @brief Returns total number of frames present in the lottie resource. + * @brief Returns total number of frames present in the Lottie resource. * - * @return frame count of the lottie resource. + * @return frame count of the Lottie resource. * * @note frame number starts with 0. * @@ -149,7 +149,7 @@ public: size_t totalFrame() const; /** - * @brief Returns default viewport size of the lottie resource. + * @brief Returns default viewport size of the Lottie resource. * * @param[out] width default width of the viewport. * @param[out] height default height of the viewport. @@ -160,12 +160,12 @@ public: void size(size_t &width, size_t &height) const; /** - * @brief Returns total animation duration of lottie resource in second. - * it uses totalFrame() and frameRate() to calcualte the duration. + * @brief Returns total animation duration of Lottie resource in second. + * it uses totalFrame() and frameRate() to calculate the duration. * duration = totalFrame() / frameRate(). * * @return total animation duration in second. - * @retval 0 if the lottie resource has no animation. + * @retval 0 if the Lottie resource has no animation. * * @see totalFrame() * @see frameRate() @@ -177,7 +177,7 @@ public: /** * @brief Returns frame number for a given position. * this function helps to map the position value retuned - * by the animator to a frame number in side the lottie resource. + * by the animator to a frame number in side the Lottie resource. * frame_number = lerp(start_frame, endframe, pos); * * @param[in] pos normalized position value [0 ... 1] @@ -198,7 +198,7 @@ public: * to draw into the screen. * * - * @param[in] frameNo Content corresponds to the frameno needs to be drawn + * @param[in] frameNo Content corresponds to the @p frameNo needs to be drawn * @param[in] surface Surface in which content will be drawn * * @return future that will hold the result when rendering finished. @@ -212,9 +212,9 @@ public: /** * @brief Renders the content to surface synchronously. - * for performance use the asyn rendering @see render + * for performance use the async rendering @see render * - * @param[in] frameNo Content corresponds to the frameno needs to be drawn + * @param[in] frameNo Content corresponds to the @p frameNo needs to be drawn * @param[in] surface Surface in which content will be drawn * * @internal @@ -223,9 +223,9 @@ public: /** * @brief Returns root layer of the composition updated with - * content of the lottie resource at frame number {frameNo}. + * content of the Lottie resource at frame number @p frameNo. * - * @param[in] frameNo Content corresponds to the frameno needs to be extracted. + * @param[in] frameNo Content corresponds to the @p frameNo needs to be extracted. * @param[in] width content viewbox width * @param[in] height content viewbox height * diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index d1c27ebd4d..6b5bd666c4 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -12,51 +12,165 @@ extern "C" { typedef struct Lottie_Animation_S Lottie_Animation; -LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *file); +/** + * @brief Constructs an animation object from file path. + * + * @param[in] path Lottie resource file path + * + * @return Animation object that can build the contents of the + * Lottie resource represented by file path. + * + * @see lottie_animation_destroy() + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *path); + +/** + * @brief Constructs an animation object from JSON string data. + * + * @param[in] data The JSON string data. + * @param[in] key the string that will be used to cache the JSON string data. + * + * @return Animation object that can build the contents of the + * Lottie resource represented by JSON string data. + * + * @ingroup Lottie_Animation + * @internal + */ LOT_EXPORT Lottie_Animation *lottie_animation_from_data(const char *data, const char *key); + +/** + * @brief Free given Animation object resource. + * + * @param[in] animation Animation object to free. + * + * @see lottie_animation_from_file() + * @see lottie_animation_from_data() + * + * @ingroup Lottie_Animation + * @internal + */ LOT_EXPORT void lottie_animation_destroy(Lottie_Animation *animation); -LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation *animation, size_t *w, size_t *h); + +/** + * @brief Returns default viewport size of the Lottie resource. + * + * @param[in] animation Animation object. + * @param[out] w default width of the viewport. + * @param[out] h default height of the viewport. + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation *animation, size_t *width, size_t *height); + +/** + * @brief Returns total animation duration of Lottie resource in second. + * it uses totalFrame() and frameRate() to calculate the duration. + * duration = totalFrame() / frameRate(). + * + * @param[in] animation Animation object. + * + * @return total animation duration in second. + * @c 0 if the Lottie resource has no animation. + * + * @see lottie_animation_get_totalframe() + * @see lottie_animation_get_framerate() + * + * @ingroup Lottie_Animation + * @internal + */ LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation *animation); + +/** + * @brief Returns total number of frames present in the Lottie resource. + * + * @param[in] animation Animation object. + * + * @return frame count of the Lottie resource.* + * + * @note frame number starts with 0. + * + * @see lottie_animation_get_duration() + * @see lottie_animation_get_framerate() + * + * @ingroup Lottie_Animation + * @internal + */ LOT_EXPORT size_t lottie_animation_get_totalframe(const Lottie_Animation *animation); + +/** + * @brief Returns default framerate of the Lottie resource. + * + * @param[in] animation Animation object. + * + * @return framerate of the Lottie resource + * + * @ingroup Lottie_Animation + * @internal + * + */ LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation *animation); -/* - * Get the render tree which contains the snapshot of the animation object at frame $frame_number - * frame_number, the content of the animation in that frame number - * width , width of the viewbox - * height , height of the viewbox +/** + * @brief Get the render tree which contains the snapshot of the animation object + * at frame = @c frame_num, the content of the animation in that frame number. * - * PS : user has to traverse the tree for rendering. @see LOTLayerNode and @see LOTNode + * @param[in] animation Animation object. + * @param[in] width requested snapshot viewport width. + * @param[in] height requested snapshot viewport height. + * + * @return Animation snapshot tree. + * + * @note: User has to traverse the tree for rendering. + * + * @see LOTLayerNode + * @see LOTNode + * + * @ingroup Lottie_Animation + * @internal */ LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation *animation, - size_t frameNo, - size_t w, size_t h); + size_t frame_num, + size_t width, size_t height); -/* - * Request to render the content of the frame $frame_number to buffer $buffer asynchronously. - * frame_number, the frame number needs to be rendered. - * buffer , surface buffer use for rendering - * width , width of the surface - * height , height of the surface - * bytes_per_line, stride of the surface in bytes. +/** + * @brief Request to render the content of the frame @p frame_num to buffer @p buffer asynchronously. * - * PS : user must call lottie_animation_render_flush to make sure render is finished. + * @param[in] animation Animation object. + * @param[in] frame_num the frame number needs to be rendered. + * @param[in] buffer surface buffer use for rendering. + * @param[in] width width of the surface + * @param[in] height height of the surface + * @param[in] bytes_per_line stride of the surface in bytes. + * + * @note user must call lottie_animation_render_flush() to make sure render is finished. + * + * @ingroup Lottie_Animation + * @internal */ LOT_EXPORT void lottie_animation_render_async(Lottie_Animation *animation, - size_t frame_number, + size_t frame_num, uint32_t *buffer, size_t width, size_t height, size_t bytes_per_line); - -/* - * Request to finish the current asyn renderer job for this animation object. - * if render is finished then this call returns immidiately - * if not it waits till render job finish and then return. - * user must use lottie_animation_render_async and lottie_animation_render_flush - * together to get the benefit of async rendering. +/** + * @brief Request to finish the current async renderer job for this animation object. + * If render is finished then this call returns immidiately. + * If not, it waits till render job finish and then return. + * + * @param[in] animation Animation object. + * + * @warning User must call lottie_animation_render_async() and lottie_animation_render_flush() + * in pair to get the benefit of async rendering. + * + * @ingroup Lottie_Animation + * @internal */ LOT_EXPORT void lottie_animation_render_flush(Lottie_Animation *animation); diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 0e89e01e86..2cd7f6ac74 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -24,6 +24,25 @@ #endif +/** + * @defgroup Lottie_Animation Lottie_Animation + * + * Lottie Animation is a modern style vector based animation design. Its animation + * resource(within json format) could be generated by Adobe After Effect using + * bodymovin plugin. You can find a good examples in Lottie Community which + * shares many free resources(see: www.lottiefiles.com). + * + * This Lottie_Animation is a common engine to manipulate, control Lottie + * Animation from the Lottie resource - json file. It provides a scene-graph + * node tree per frames by user demand as well as rasterized frame images. + * + */ + +/** + * @ingroup Lottie_Animation + */ + + /** * @brief Enumeration for Lottie Player error code. */ @@ -172,5 +191,8 @@ typedef struct LOTLayerNode { } LOTLayerNode; +/** + * @} + */ #endif // _LOTTIE_COMMON_H_ diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 6c287b8f7e..41528049b5 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -16,9 +16,9 @@ struct Lottie_Animation_S size_t mHeight{0}; }; -LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *file) +LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *path) { - if (auto animation = Animation::loadFromFile(file) ) { + if (auto animation = Animation::loadFromFile(path) ) { Lottie_Animation_S *handle = new Lottie_Animation_S(); handle->mAnimation = std::move(animation); return handle; @@ -44,11 +44,11 @@ LOT_EXPORT void lottie_animation_destroy(Lottie_Animation_S *animation) delete animation; } -LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation_S *animation, size_t *w, size_t *h) +LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation_S *animation, size_t *width, size_t *height) { if (!animation) return; - animation->mAnimation->size(*w, *h); + animation->mAnimation->size(*width, *height); } LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation_S *animation) @@ -73,14 +73,14 @@ LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation_S *anima return animation->mAnimation->frameRate(); } -LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation_S *animation, size_t frameNo, size_t w, size_t h) +LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation_S *animation, size_t frame_num, size_t width, size_t height) { if (!animation) return nullptr; - animation->mFrameNo = frameNo; - animation->mWidth = w; - animation->mHeight = h; - return animation->mAnimation->renderTree(frameNo, w, h); + animation->mFrameNo = frame_num; + animation->mWidth = width; + animation->mHeight = height; + return animation->mAnimation->renderTree(frame_num, width, height); } LOT_EXPORT void From e29b2b11078827ca1f8be28501a800bf9f87eaa3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 13 Dec 2018 18:09:50 +0900 Subject: [PATCH 350/672] updated gitignore. Change-Id: I4a67a4804ccf528b43c83139b7ddfbe4b88f9aa7 --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 927c02c5cd..3718fd9827 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ html latex *.swp tmp +.cproject +.project From b5ad232fa576c740cd9f4ea7f4ddd5105ae1f402 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 13 Dec 2018 20:06:30 +0900 Subject: [PATCH 351/672] capi: remove unused internal variables. Change-Id: I03a11a0c215bc489c282c22d52fb4f93665fca54 --- src/binding/c/lottieanimation_capi.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 41528049b5..80ec93e173 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -8,12 +8,7 @@ extern "C" { struct Lottie_Animation_S { std::unique_ptr mAnimation; - size_t mCurFrame{0}; std::future mRenderTask; - size_t mFrameNo{0}; - size_t mArraySize{0}; - size_t mWidth{0}; - size_t mHeight{0}; }; LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *path) @@ -77,9 +72,6 @@ LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation_S { if (!animation) return nullptr; - animation->mFrameNo = frame_num; - animation->mWidth = width; - animation->mHeight = height; return animation->mAnimation->renderTree(frame_num, width, height); } From 130eb558367e0177562654ffe8c16fd7e05b2969 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 13 Dec 2018 18:25:33 +0900 Subject: [PATCH 352/672] lottie/capi: remove usage of bool in c api interface. Change-Id: Ic9aba8f07d9ee8d085a237fa038e5ae98c0a9987 --- inc/lottieanimation_capi.h | 1 - inc/lottiecommon.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index 6b5bd666c4..c1378d7e97 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -3,7 +3,6 @@ #include #include -#include #include #ifdef __cplusplus diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 2cd7f6ac74..5815b8ce28 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -142,7 +142,7 @@ typedef struct LOTNode { } mColor; struct { - bool enable; + unsigned char enable; int width; LOTCapStyle cap; LOTJoinStyle join; From 0c3cb67811b2535648335bdd2a56307e0d52d75b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 14 Dec 2018 13:30:35 +0900 Subject: [PATCH 353/672] lottie/capi: added missing frame_at_pos() api and changed the render_flush() signature. Change-Id: I029beb82b81448122ee6d0c59f68f758cc600895 --- inc/lottieanimation_capi.h | 19 ++++++++++++++++++- src/binding/c/lottieanimation_capi.cpp | 16 ++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index c1378d7e97..5d3ae01942 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -135,6 +135,21 @@ LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation *a size_t frame_num, size_t width, size_t height); +/** + * @brief Maps position to frame number and returns it. + * + * @param[in] animation Animation object. + * @param[in] pos position in the range [ 0.0 .. 1.0 ]. + * + * @return mapped frame numbe in the range [ start_frame .. end_frame ]. + * @c 0 if the Lottie resource has no animation. + * + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT size_t lottie_animation_get_frame_at_pos(const Lottie_Animation *animation, float pos); + /** * @brief Request to render the content of the frame @p frame_num to buffer @p buffer asynchronously. * @@ -168,10 +183,12 @@ lottie_animation_render_async(Lottie_Animation *animation, * @warning User must call lottie_animation_render_async() and lottie_animation_render_flush() * in pair to get the benefit of async rendering. * + * @return the pixel buffer it finished rendering. + * * @ingroup Lottie_Animation * @internal */ -LOT_EXPORT void +LOT_EXPORT uint32_t * lottie_animation_render_flush(Lottie_Animation *animation); #ifdef __cplusplus diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 80ec93e173..427135c2b7 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -9,6 +9,7 @@ struct Lottie_Animation_S { std::unique_ptr mAnimation; std::future mRenderTask; + uint32_t *mBufferRef; }; LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *path) @@ -75,6 +76,14 @@ LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation_S return animation->mAnimation->renderTree(frame_num, width, height); } +LOT_EXPORT size_t +lottie_animation_get_frame_at_pos(const Lottie_Animation_S *animation, float pos) +{ + if (!animation) return 0; + + return animation->mAnimation->frameAtPos(pos); +} + LOT_EXPORT void lottie_animation_render_async(Lottie_Animation_S *animation, size_t frame_number, @@ -87,16 +96,19 @@ lottie_animation_render_async(Lottie_Animation_S *animation, lottie::Surface surface(buffer, width, height, bytes_per_line); animation->mRenderTask = animation->mAnimation->render(frame_number, surface); + animation->mBufferRef = buffer; } -LOT_EXPORT void +LOT_EXPORT uint32_t * lottie_animation_render_flush(Lottie_Animation_S *animation) { - if (!animation) return; + if (!animation) return nullptr; if (animation->mRenderTask.valid()) { animation->mRenderTask.get(); } + + return animation->mBufferRef; } } From c67093b41f30495a8a96bfe491d8e22bf63216b9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 14 Dec 2018 14:21:47 +0900 Subject: [PATCH 354/672] lottie/example: remove unused evas object from evasapp class. Change-Id: I84f8b0b624ba8c81af91cd6d0c2d1adb5fa82db4 --- example/evasapp.cpp | 7 ------- example/evasapp.h | 3 --- 2 files changed, 10 deletions(-) diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 3ce33cba0f..0c18666e73 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -68,19 +68,12 @@ EvasApp::setup() mBackground = evas_object_rectangle_add(mEvas); evas_object_color_set(mBackground, 70, 70, 70, 255); evas_object_show(mBackground); - - mVg = evas_object_vg_add(mEvas); - evas_object_show(mVg); - - mRoot = evas_vg_container_add(mVg); - evas_object_vg_root_node_set(mVg, mRoot); } void EvasApp::resize(int w, int h) { evas_object_resize(mBackground, w, h); - evas_object_resize(mVg, w, h); mw = w; mh = h; } diff --git a/example/evasapp.h b/example/evasapp.h index 18c6cb420c..1c3e7657a6 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -31,7 +31,6 @@ public: void run(); Ecore_Evas * ee() const{return mEcoreEvas;} Evas * evas() const {return mEvas;} - Efl_VG * root() const {return mRoot;} void addExitCb(appCb exitcb, void *data) {mExitCb = exitcb; mExitData = data;} void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;} void addKeyCb(appCb keycb, void *data) {mKeyCb = keycb; mKeyData = data;} @@ -42,8 +41,6 @@ public: int mh; Ecore_Evas *mEcoreEvas; Evas *mEvas; - Efl_VG *mRoot; - Evas_Object *mVg; Evas_Object *mBackground; appCb mResizeCb; void *mResizeData; From 7346cda225ece68bd53b2f9bea2b7e2d0b41e63a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 17 Dec 2018 12:03:14 +0900 Subject: [PATCH 355/672] lottie/example: add support for renderPost callback in evasapp class. Change-Id: I0632a881c7291ac0b87886bd713ff7216bac2ad5 --- example/evasapp.cpp | 9 +++++++++ example/evasapp.h | 3 +++ 2 files changed, 12 insertions(+) diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 0c18666e73..caeed16dec 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -43,6 +43,14 @@ on_pre_render(Ecore_Evas *ee) app->mRenderPreCb(app->mRenderPreData, nullptr); } +static void +on_post_render(Ecore_Evas *ee) +{ + EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app"); + if (app && app->mRenderPostCb) + app->mRenderPostCb(app->mRenderPostData, nullptr); +} + EvasApp::EvasApp(int w, int h) { if (!ecore_evas_init()) @@ -62,6 +70,7 @@ EvasApp::setup() ecore_evas_callback_delete_request_set(mEcoreEvas, _on_delete); ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, on_key_down, this); ecore_evas_callback_pre_render_set(mEcoreEvas, on_pre_render); + ecore_evas_callback_post_render_set(mEcoreEvas, on_post_render); ecore_evas_show(mEcoreEvas); mEvas = ecore_evas_get(mEcoreEvas); diff --git a/example/evasapp.h b/example/evasapp.h index 1c3e7657a6..a21ae77293 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -35,6 +35,7 @@ public: void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;} void addKeyCb(appCb keycb, void *data) {mKeyCb = keycb; mKeyData = data;} void addRenderPreCb(appCb renderPrecb, void *data) {mRenderPreCb = renderPrecb; mRenderPreData = data;} + void addRenderPostCb(appCb renderPostcb, void *data) {mRenderPostCb = renderPostcb; mRenderPostData = data;} static std::vector jsonFiles(const std::string &dir, bool recurse=false); public: int mw; @@ -50,5 +51,7 @@ public: void *mKeyData; appCb mRenderPreCb; void *mRenderPreData; + appCb mRenderPostCb; + void *mRenderPostData; }; #endif //EVASAPP_H From 820b61b3c0f5ce41c11d0af5db8d277005271a34 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 15 Dec 2018 15:17:45 +0900 Subject: [PATCH 356/672] lottie/example: build example only when elementary library is available. Change-Id: Ie096e8c4f857c2a7097a0202649d44081137a254 --- example/meson.build | 84 ++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/example/meson.build b/example/meson.build index 265c9fbc82..19d7fc03dd 100644 --- a/example/meson.build +++ b/example/meson.build @@ -5,50 +5,50 @@ common_source += files('lottieview.cpp') demo_sources = files('demo.cpp') demo_sources += common_source -demo_dep = [] -demo_dep+= dependency('elementary') - - -executable('demo', - demo_sources, - include_directories : inc, - link_with : lottie_player_lib, - dependencies : demo_dep) - -lottieview_test_src = files('lottieviewtest.cpp') -lottieview_test_src += common_source - -executable('lottieviewTest', - lottieview_test_src, - include_directories : inc, - link_with : lottie_player_lib, - dependencies : demo_dep) - -uxsample_test_src = files('uxsampletest.cpp') -uxsample_test_src += common_source - -executable('uxsampleTest', - uxsample_test_src, - include_directories : inc, - link_with : lottie_player_lib, - dependencies : demo_dep) - -lottieviewer_sources = files('lottieviewer.cpp') -lottieviewer_sources += common_source - -executable('lottieviewer', - lottieviewer_sources, - include_directories : inc, - link_with : lottie_player_lib, - dependencies : demo_dep) - executable('vectorTest', 'vectortest.cpp', include_directories : inc, dependencies : [library_deps]) -executable('efl_animview', - 'efl_animview.cpp', - include_directories : inc, - link_with : lottie_player_lib, - dependencies : demo_dep) +demo_dep = dependency('elementary', required : false) + +if (demo_dep.found()) + executable('demo', + demo_sources, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) + + lottieview_test_src = files('lottieviewtest.cpp') + lottieview_test_src += common_source + + executable('lottieviewTest', + lottieview_test_src, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) + + uxsample_test_src = files('uxsampletest.cpp') + uxsample_test_src += common_source + + executable('uxsampleTest', + uxsample_test_src, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) + + lottieviewer_sources = files('lottieviewer.cpp') + lottieviewer_sources += common_source + + executable('lottieviewer', + lottieviewer_sources, + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) + + executable('efl_animview', + 'efl_animview.cpp', + include_directories : inc, + link_with : lottie_player_lib, + dependencies : demo_dep) +endif From d1c3b19e01a2dbcbb1bd78252123fc92c32a4dd9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 18 Dec 2018 17:56:24 +0900 Subject: [PATCH 357/672] lottie/memoryleak: Destory the player handle properly in capi destroy() implementation. Change-Id: Ie3a2b8d619e6e7c038c4296789952ecb4653b12f --- src/binding/c/lottieanimation_capi.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 427135c2b7..7de388b142 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -36,8 +36,13 @@ LOT_EXPORT Lottie_Animation_S *lottie_animation_from_data(const char *data, cons LOT_EXPORT void lottie_animation_destroy(Lottie_Animation_S *animation) { - if (animation) + if (animation) { + if (animation->mRenderTask.valid()) { + animation->mRenderTask.get(); + } + animation->mAnimation = nullptr; delete animation; + } } LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation_S *animation, size_t *width, size_t *height) From d00a8fe714cf4fa30d76d907e47a49fc73cd3925 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Wed, 19 Dec 2018 20:48:15 +0900 Subject: [PATCH 358/672] lottie/render: Construct on first use of thread pool instance by moving into a singleton instance() api. Starting in C++11, scoped static initialization is now thread-safe Change-Id: Ia6933b439407e9dd635be67328eb750acf5b0367 --- src/lottie/lottieanimation.cpp | 11 ++++++++--- src/vector/vraster.cpp | 13 ++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 5ba030b730..1f099227e5 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -120,7 +120,6 @@ class RenderTaskScheduler { } } -public: RenderTaskScheduler() { for (unsigned n = 0; n != _count; ++n) { @@ -128,6 +127,13 @@ public: } } +public: + static RenderTaskScheduler& instance() + { + static RenderTaskScheduler singleton; + return singleton; + } + ~RenderTaskScheduler() { for (auto &e : _q) e.done(); @@ -159,7 +165,6 @@ public: return async(std::move(task)); } }; -static RenderTaskScheduler render_scheduler; /** * \breif Brief abput the Api. @@ -236,7 +241,7 @@ Animation::renderTree(size_t frameNo, size_t width, size_t height) const std::future Animation::render(size_t frameNo, Surface surface) { - return render_scheduler.render(d.get(), frameNo, std::move(surface)); + return RenderTaskScheduler::instance().render(d.get(), frameNo, std::move(surface)); } void Animation::renderSync(size_t frameNo, Surface surface) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 25185c33ee..91476d593b 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -355,13 +355,18 @@ class RleTaskScheduler { SW_FT_Stroker_Done(stroker); } -public: RleTaskScheduler() { for (unsigned n = 0; n != _count; ++n) { _threads.emplace_back([&, n] { run(n); }); } } +public: + static RleTaskScheduler& instance() + { + static RleTaskScheduler singleton; + return singleton; + } ~RleTaskScheduler() { @@ -412,8 +417,6 @@ public: } }; -static RleTaskScheduler raster_scheduler; - void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) { @@ -421,7 +424,7 @@ void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, promise->set_value(VRle()); return; } - return raster_scheduler.fillRle(promise, std::move(path), std::move(rle), fillRule, clip); + return RleTaskScheduler::instance().fillRle(promise, std::move(path), std::move(rle), fillRule, clip); } void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, @@ -432,7 +435,7 @@ void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, Ca promise->set_value(VRle()); return; } - return raster_scheduler.strokeRle(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip); + return RleTaskScheduler::instance().strokeRle(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip); } V_END_NAMESPACE From 9cfaaa8adb6540dcba0fc608712c19227b3c3464 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 24 Dec 2018 13:28:00 +0900 Subject: [PATCH 359/672] lottie: Fixed SVACE warning regarding missing break statement. Change-Id: I3afe3a350333b70722c7461c2c64345db10a8c4a --- src/vector/vbitmap.cpp | 1 + src/vector/vglobal.h | 4 ++++ src/vector/vmatrix.cpp | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 9be33204a3..fa4649016d 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -53,6 +53,7 @@ VBitmapData *VBitmapData::create(int width, int height, VBitmap::Format format) switch (format) { case VBitmap::Format::Alpha8: depth = 8; + VECTOR_FALLTHROUGH case VBitmap::Format::ARGB32: case VBitmap::Format::ARGB32_Premultiplied: depth = 32; diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 87438cf237..f1d3a07aee 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -33,7 +33,11 @@ typedef uint8_t uchar; #include "vdebug.h" +#if __GNUC__ >= 7 +#define EINA_FALLTHROUGH __attribute__ ((fallthrough)); +#else #define VECTOR_FALLTHROUGH +#endif #include class RefCount { diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 08be579e99..104fe70b3d 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -130,6 +130,7 @@ VMatrix &VMatrix::translate(float dx, float dy) break; case MatrixType::Project: m33 += dx * m13 + dy * m23; + VECTOR_FALLTHROUGH case MatrixType::Shear: case MatrixType::Rotate: mtx += dx * m11 + dy * m21; @@ -153,10 +154,12 @@ VMatrix &VMatrix::scale(float sx, float sy) case MatrixType::Project: m13 *= sx; m23 *= sy; + VECTOR_FALLTHROUGH case MatrixType::Rotate: case MatrixType::Shear: m12 *= sx; m21 *= sy; + VECTOR_FALLTHROUGH case MatrixType::Scale: m11 *= sx; m22 *= sy; @@ -185,6 +188,7 @@ VMatrix &VMatrix::shear(float sh, float sv) float tm23 = sh * m13; m13 += tm13; m23 += tm23; + VECTOR_FALLTHROUGH } case MatrixType::Rotate: case MatrixType::Shear: { @@ -249,6 +253,7 @@ VMatrix &VMatrix::rotate(float a, Axis axis) float tm23 = -sina * m13 + cosa * m23; m13 = tm13; m23 = tm23; + VECTOR_FALLTHROUGH } case MatrixType::Rotate: case MatrixType::Shear: { From b01514d76aff5cfba8ca7963c6c38e23548c9cf1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 24 Dec 2018 13:57:28 +0900 Subject: [PATCH 360/672] lottie: Fixed SVACE warning for uninitialized class member variable. Change-Id: I8c633cca49c05295499ef8ec640ec078bba369fd --- inc/lottieanimation.h | 8 ++++---- src/lottie/lottieanimation.cpp | 4 ++-- src/lottie/lottieitem.h | 31 +++++++++++++++---------------- src/lottie/lottiemodel.h | 20 ++++++++++---------- src/lottie/lottieparser.cpp | 4 ++-- src/vector/vbitmap.h | 2 +- src/vector/vbrush.h | 2 +- src/vector/vdebug.h | 4 ++-- src/vector/vdrawhelper.cpp | 2 +- src/vector/vdrawhelper.h | 12 ++++++------ 10 files changed, 44 insertions(+), 45 deletions(-) diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index 4586ac836b..829ba1d91c 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -91,10 +91,10 @@ public: */ Surface() = default; private: - uint32_t *mBuffer; - size_t mWidth; - size_t mHeight; - size_t mBytesPerLine; + uint32_t *mBuffer{nullptr}; + size_t mWidth{0}; + size_t mHeight{0}; + size_t mBytesPerLine{0}; }; class LOT_EXPORT Animation { diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 1f099227e5..fb5b495c17 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -90,8 +90,8 @@ struct RenderTask { RenderTask() { receiver = sender.get_future(); } std::promise sender; std::future receiver; - AnimationImpl *playerImpl; - size_t frameNo; + AnimationImpl *playerImpl{nullptr}; + size_t frameNo{0}; Surface surface; }; diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 7a1a5a2732..51ced32c70 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -93,7 +93,7 @@ protected: float mCombinedAlpha{0.0}; int mFrameNo{-1}; DirtyFlag mDirtyFlag{DirtyFlagBit::All}; - bool mStatic; + bool mStatic{false}; }; class LOTCompLayerItem: public LOTLayerItem @@ -109,7 +109,6 @@ protected: private: std::vector mLayersCNode; std::vector> mLayers; - int mLastFrame; }; class LOTSolidLayerItem: public LOTLayerItem @@ -333,10 +332,10 @@ protected: virtual void updateRenderNode(); inline float parentAlpha() const {return mParentAlpha;} public: - float mParentAlpha; + float mParentAlpha{1.0f}; VPath mPath; DirtyFlag mFlag; - int mFrameNo; + int mFrameNo{-1}; std::vector mPathItems; std::unique_ptr mDrawable; bool mStaticContent; @@ -353,7 +352,7 @@ protected: private: LOTFillData *mData; VColor mColor; - FillRule mFillRule; + FillRule mFillRule{FillRule::Winding}; }; class LOTGFillItem : public LOTPaintDataItem @@ -366,7 +365,7 @@ protected: private: LOTGFillData *mData; std::unique_ptr mGradient; - FillRule mFillRule; + FillRule mFillRule{FillRule::Winding}; }; class LOTStrokeItem : public LOTPaintDataItem @@ -378,13 +377,13 @@ protected: void updateRenderNode() final; private: LOTStrokeData *mData; - CapStyle mCap; - JoinStyle mJoin; - float mMiterLimit; + CapStyle mCap{CapStyle::Flat}; + JoinStyle mJoin{JoinStyle::Miter}; + float mMiterLimit{0}; VColor mColor; - float mWidth; + float mWidth{0}; float mDashArray[6]; - int mDashArraySize; + int mDashArraySize{0}; }; class LOTGStrokeItem : public LOTPaintDataItem @@ -397,13 +396,13 @@ protected: private: LOTGStrokeData *mData; std::unique_ptr mGradient; - CapStyle mCap; - JoinStyle mJoin; - float mMiterLimit; + CapStyle mCap{CapStyle::Flat}; + JoinStyle mJoin{JoinStyle::Miter}; + float mMiterLimit{0}; VColor mColor; - float mWidth; + float mWidth{0}; float mDashArray[6]; - int mDashArraySize; + int mDashArraySize{0}; }; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index a939979f68..c9e0c233c3 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -260,7 +260,7 @@ public: } public: T mValue; - int mPropertyIndex; /* "ix" */ + int mPropertyIndex{0}; /* "ix" */ std::unique_ptr> mAnimInfo; }; @@ -354,13 +354,13 @@ public: MatteType mMatteType{MatteType::None}; VRect mBound; - LayerType mLayerType; //lottie layer type (solid/shape/precomp) + LayerType mLayerType{LayerType::Null}; //lottie layer type (solid/shape/precomp) int mParentId{-1}; // Lottie the id of the parent in the composition int mId{-1}; // Lottie the group id used for parenting. long mInFrame{0}; long mOutFrame{0}; long mStartFrame{0}; - LottieBlendMode mBlendMode; + LottieBlendMode mBlendMode{LottieBlendMode::Normal}; float mTimeStreatch{1.0f}; std::string mPreCompRefId; LOTAnimatable mTimeRemap; /* "tm" */ @@ -372,7 +372,7 @@ public: bool mRoot{false}; bool mAutoOrient{false}; std::vector> mMasks; - LOTCompositionData *mCompRef; + LOTCompositionData *mCompRef{nullptr}; }; class LOTCompositionData : public LOTData @@ -402,7 +402,7 @@ public: VSize mSize; long mStartFrame{0}; long mEndFrame{0}; - float mFrameRate; + float mFrameRate{60}; LottieBlendMode mBlendMode; std::shared_ptr mRootLayer; std::unordered_map mColor; /* "c" */ LOTAnimatable mOpacity{100}; /* "o" */ LOTAnimatable mWidth{0}; /* "w" */ - CapStyle mCapStyle; /* "lc" */ - JoinStyle mJoinStyle; /* "lj" */ + CapStyle mCapStyle{CapStyle::Flat}; /* "lc" */ + JoinStyle mJoinStyle{JoinStyle::Miter}; /* "lj" */ float mMeterLimit{0}; /* "ml" */ LOTDashProperty mDash; bool mEnabled{true}; /* "fillEnabled" */ @@ -579,7 +579,7 @@ public: private: void populate(VGradientStops &stops, int frameNo); public: - int mGradientType; /* "t" Linear=1 , Radial = 2*/ + int mGradientType{1}; /* "t" Linear=1 , Radial = 2*/ LOTAnimatable mStartPoint; /* "s" */ LOTAnimatable mEndPoint; /* "e" */ LOTAnimatable mHighlightLength{0}; /* "h" */ @@ -611,8 +611,8 @@ public: int getDashInfo(int frameNo, float *array) const; public: LOTAnimatable mWidth; /* "w" */ - CapStyle mCapStyle; /* "lc" */ - JoinStyle mJoinStyle; /* "lj" */ + CapStyle mCapStyle{CapStyle::Flat}; /* "lc" */ + JoinStyle mJoinStyle{JoinStyle::Miter}; /* "lj" */ float mMeterLimit{0}; /* "ml" */ LOTDashProperty mDash; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 91e9f3996d..347469161b 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -250,8 +250,8 @@ public: protected: std::shared_ptr mComposition; - LOTCompositionData * compRef; - LOTLayerData * curLayerRef; + LOTCompositionData * compRef{nullptr}; + LOTLayerData * curLayerRef{nullptr}; std::vector> mLayersToUpdate; void SkipOut(int depth); }; diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index a5223d934d..717e415376 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -37,7 +37,7 @@ public: private: void detach(); void cleanUp(VBitmapData *x); - VBitmapData *d; + VBitmapData *d{nullptr}; }; V_END_NAMESPACE diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index 9a31715352..46433df2c3 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -65,7 +65,7 @@ public: public: VBrush::Type mType{Type::NoBrush}; VColor mColor; - const VGradient *mGradient; + const VGradient *mGradient{nullptr}; }; V_END_NAMESPACE diff --git a/src/vector/vdebug.h b/src/vector/vdebug.h index c1ae239e92..1b089e1351 100644 --- a/src/vector/vdebug.h +++ b/src/vector/vdebug.h @@ -78,8 +78,8 @@ private: void stringify(std::ostream& os, char* start, char const* const end); private: - size_t m_bytes_used; - size_t m_buffer_size; + size_t m_bytes_used{0}; + size_t m_buffer_size{0}; std::unique_ptr m_heap_buffer; bool m_logAll; char m_stack_buffer[256 - sizeof(bool) - 2 * sizeof(size_t) - diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 2deb2aaf33..d48ecda7f0 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -10,7 +10,7 @@ public: inline CacheInfo(VGradientStops s) : stops(std::move(s)) {} uint32_t buffer32[VGradient::colorTableSize]; VGradientStops stops; - bool alpha; + bool alpha{true}; }; typedef std::unordered_multimap> diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 51a068b324..51d6db304a 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -75,15 +75,15 @@ public: int bytesPerLine() const { return mBytesPerLine; } int bytesPerPixel() const { return mBytesPerPixel; } - VBitmap::Format mFormat; + VBitmap::Format mFormat{VBitmap::Format::ARGB32_Premultiplied}; VPainter::CompositionMode mCompositionMode; private: - int mWidth; - int mHeight; - int mBytesPerLine; - int mBytesPerPixel; - uchar *mBuffer; + int mWidth{0}; + int mHeight{0}; + int mBytesPerLine{0}; + int mBytesPerPixel{0}; + uchar *mBuffer{nullptr}; }; struct VGradientData { From a3a53fd3f1e7f82920e14664340a6ebbbb1c3a21 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 24 Dec 2018 14:52:55 +0900 Subject: [PATCH 361/672] lottie/vector: use snprintf instead of sprintf. Change-Id: I4eb54b33f54e513c297224719b7b470a1eea0529 --- src/vector/vdebug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index faa74b1c53..bd74c9e2e5 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -33,7 +33,7 @@ void format_timestamp(std::ostream& os, uint64_t timestamp) char buffer[32]; strftime(buffer, 32, "%Y-%m-%d %T.", gmtime); char microseconds[7]; - sprintf(microseconds, "%06llu", (long long unsigned int)timestamp % 1000000); + snprintf(microseconds, 7, "%06llu", (long long unsigned int)timestamp % 1000000); os << '[' << buffer << microseconds << ']'; } From 2af53f5ac7d9a6e1ddc320e2d5606364488a8593 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 12:20:40 +0900 Subject: [PATCH 362/672] vector: fix wrong naming. Change-Id: Iada0616b97642f419c5a99bd4ddd98437f4154a5 --- src/vector/vglobal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index f1d3a07aee..173a36f834 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -34,7 +34,7 @@ typedef uint8_t uchar; #include "vdebug.h" #if __GNUC__ >= 7 -#define EINA_FALLTHROUGH __attribute__ ((fallthrough)); +#define VECTOR_FALLTHROUGH __attribute__ ((fallthrough)); #else #define VECTOR_FALLTHROUGH #endif From 532e8faf5f011a85c7343b5fc969fab3c6958cea Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 17:23:25 +0900 Subject: [PATCH 363/672] Initialize member variables to resolve unnannoying report from static analizer tool(SVACE) Change-Id: I455c49b550afdadeff5d579704745da3a5753de3 --- src/lottie/lottiemodel.h | 2 +- src/vector/vbitmap.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index c9e0c233c3..b96f8693e2 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -403,7 +403,7 @@ public: long mStartFrame{0}; long mEndFrame{0}; float mFrameRate{60}; - LottieBlendMode mBlendMode; + LottieBlendMode mBlendMode{LottieBlendMode::Normal}; std::shared_ptr mRootLayer; std::unordered_map> mInterpolatorCache; diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index fa4649016d..9a5edf940e 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -35,6 +35,7 @@ VBitmapData::VBitmapData() height(0), depth(0), stride(0), + nBytes(0), format(VBitmap::Format::ARGB32), data(nullptr), cleanupFunction(0), From 1f1a5bbc16e70e36add2f09dd9e035fbf2104262 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 19:01:57 +0900 Subject: [PATCH 364/672] clean up copyright. Change-Id: I53d80c595c62717e8a8ec608f2388180e184aeca --- COPYING | 14 +++ LICENSE | 178 ------------------------------------ licenses/COPYING.FLR | 208 +++++++++++++++++++++++++++++++++++++++++++ licenses/COPYING.FTL | 166 ++++++++++++++++++++++++++++++++++ licenses/COPYING.PIX | 42 +++++++++ licenses/COPYING.RPD | 57 ++++++++++++ 6 files changed, 487 insertions(+), 178 deletions(-) create mode 100644 COPYING delete mode 100644 LICENSE create mode 100644 licenses/COPYING.FLR create mode 100644 licenses/COPYING.FTL create mode 100644 licenses/COPYING.PIX create mode 100644 licenses/COPYING.RPD diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000..b5de87c174 --- /dev/null +++ b/COPYING @@ -0,0 +1,14 @@ +Licensing + +lottie-player basically comes with Flora license(see: licenses/COPYING.FLR) +but some parts of shared code are covered by different licenses. Listed +below are the folder names and the license file covering it. Note that this +license would cover all of the source invovled in each folders, unless +specifically noted otherwise. So please refer to these mported project sources +for details. + +Dependencies and licenses: + +src/vector/freetype licenses/COPYING.FTL +src/vector/pixman licenses/COPYING.PIX +src/vector/lottie/rapidjson licenses/COPYING.RPD diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 4544429441..0000000000 --- a/LICENSE +++ /dev/null @@ -1,178 +0,0 @@ -Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/licenses/COPYING.FLR b/licenses/COPYING.FLR new file mode 100644 index 0000000000..d65d4d6063 --- /dev/null +++ b/licenses/COPYING.FLR @@ -0,0 +1,208 @@ +Copyright (C) 2018 Samsung Electronics Co., Ltd All rights reserved. + +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum + to the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works + as a whole, provided Your use, reproduction, and distribution of + the Work otherwise complies with the conditions stated in this License + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + 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. + diff --git a/licenses/COPYING.FTL b/licenses/COPYING.FTL new file mode 100644 index 0000000000..5f673ffad1 --- /dev/null +++ b/licenses/COPYING.FTL @@ -0,0 +1,166 @@ + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright � The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org diff --git a/licenses/COPYING.PIX b/licenses/COPYING.PIX new file mode 100644 index 0000000000..5826f3c735 --- /dev/null +++ b/licenses/COPYING.PIX @@ -0,0 +1,42 @@ +The following is the MIT license, agreed upon by most contributors. +Copyright holders of new code should use this license statement where +possible. They may also add themselves to the list below. + +/* + * Copyright 1987, 1988, 1989, 1998 The Open Group + * Copyright 1987, 1988, 1989 Digital Equipment Corporation + * Copyright 1999, 2004, 2008 Keith Packard + * Copyright 2000 SuSE, Inc. + * Copyright 2000 Keith Packard, member of The XFree86 Project, Inc. + * Copyright 2004, 2005, 2007, 2008, 2009, 2010 Red Hat, Inc. + * Copyright 2004 Nicholas Miell + * Copyright 2005 Lars Knoll & Zack Rusin, Trolltech + * Copyright 2005 Trolltech AS + * Copyright 2007 Luca Barbato + * Copyright 2008 Aaron Plattner, NVIDIA Corporation + * Copyright 2008 Rodrigo Kumpera + * Copyright 2008 André Tupinambá + * Copyright 2008 Mozilla Corporation + * Copyright 2008 Frederic Plourde + * Copyright 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright 2009, 2010 Nokia Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ diff --git a/licenses/COPYING.RPD b/licenses/COPYING.RPD new file mode 100644 index 0000000000..7ccc161c84 --- /dev/null +++ b/licenses/COPYING.RPD @@ -0,0 +1,57 @@ +Tencent is pleased to support the open source community by making RapidJSON available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. + +If you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License. +If you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms. Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license. +A copy of the MIT License is included in this file. + +Other dependencies and licenses: + +Open Source Software Licensed Under the BSD License: +-------------------------------------------------------------------- + +The msinttypes r29 +Copyright (c) 2006-2013 Alexander Chemeris +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Open Source Software Licensed Under the JSON License: +-------------------------------------------------------------------- + +json.org +Copyright (c) 2002 JSON.org +All Rights Reserved. + +JSON_checker +Copyright (c) 2002 JSON.org +All Rights Reserved. + + +Terms of the JSON License: +--------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Terms of the MIT License: +-------------------------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 0a325b079e9926cfa77dabeaea3e632a6fe574a5 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 19:18:29 +0900 Subject: [PATCH 365/672] Put samsung copyright header to all our own source code. Change-Id: I3cebcfef827425d16092ee7a26c39f7733572eb7 --- example/demo.cpp | 16 ++++++++++++++++ example/efl_animview.cpp | 16 ++++++++++++++++ example/evasapp.cpp | 16 ++++++++++++++++ example/evasapp.h | 16 ++++++++++++++++ example/lottieview.cpp | 16 ++++++++++++++++ example/lottieview.h | 16 ++++++++++++++++ example/lottieviewer.cpp | 16 ++++++++++++++++ example/lottieviewtest.cpp | 16 ++++++++++++++++ example/pathtest.cpp | 16 ++++++++++++++++ example/uxsampletest.cpp | 16 ++++++++++++++++ example/vectortest.cpp | 16 ++++++++++++++++ inc/lottieanimation.h | 16 ++++++++++++++++ inc/lottieanimation_capi.h | 16 ++++++++++++++++ inc/lottiecommon.h | 16 ++++++++++++++++ src/binding/c/lottieanimation_capi.cpp | 16 ++++++++++++++++ src/lottie/lottieanimation.cpp | 17 ++++++++++++++++- src/lottie/lottieitem.cpp | 16 ++++++++++++++++ src/lottie/lottieitem.h | 16 ++++++++++++++++ src/lottie/lottieloader.cpp | 16 ++++++++++++++++ src/lottie/lottieloader.h | 16 ++++++++++++++++ src/lottie/lottiemodel.cpp | 16 ++++++++++++++++ src/lottie/lottiemodel.h | 16 ++++++++++++++++ src/lottie/lottieparser.cpp | 16 ++++++++++++++++ src/lottie/lottieparser.h | 16 ++++++++++++++++ src/vector/vbezier.cpp | 16 ++++++++++++++++ src/vector/vbezier.h | 16 ++++++++++++++++ src/vector/vbitmap.cpp | 16 ++++++++++++++++ src/vector/vbitmap.h | 16 ++++++++++++++++ src/vector/vbrush.cpp | 16 ++++++++++++++++ src/vector/vbrush.h | 16 ++++++++++++++++ src/vector/vcompositionfunctions.cpp | 16 ++++++++++++++++ src/vector/vcowptr.h | 16 ++++++++++++++++ src/vector/vdasher.cpp | 16 ++++++++++++++++ src/vector/vdasher.h | 16 ++++++++++++++++ src/vector/vdebug.cpp | 16 ++++++++++++++++ src/vector/vdebug.h | 16 ++++++++++++++++ src/vector/vdrawable.cpp | 16 ++++++++++++++++ src/vector/vdrawable.h | 16 ++++++++++++++++ src/vector/vdrawhelper.cpp | 16 ++++++++++++++++ src/vector/vdrawhelper.h | 16 ++++++++++++++++ src/vector/vdrawhelper_neon.cpp | 16 ++++++++++++++++ src/vector/vdrawhelper_sse2.cpp | 16 ++++++++++++++++ src/vector/velapsedtimer.cpp | 16 ++++++++++++++++ src/vector/velapsedtimer.h | 16 ++++++++++++++++ src/vector/vglobal.h | 16 ++++++++++++++++ src/vector/vinterpolator.cpp | 16 ++++++++++++++++ src/vector/vinterpolator.h | 16 ++++++++++++++++ src/vector/vline.h | 16 ++++++++++++++++ src/vector/vmatrix.cpp | 16 ++++++++++++++++ src/vector/vmatrix.h | 16 ++++++++++++++++ src/vector/vpainter.cpp | 16 ++++++++++++++++ src/vector/vpainter.h | 16 ++++++++++++++++ src/vector/vpath.cpp | 16 ++++++++++++++++ src/vector/vpath.h | 16 ++++++++++++++++ src/vector/vpathmesure.cpp | 16 ++++++++++++++++ src/vector/vpathmesure.h | 16 ++++++++++++++++ src/vector/vpoint.h | 16 ++++++++++++++++ src/vector/vraster.cpp | 16 ++++++++++++++++ src/vector/vraster.h | 16 ++++++++++++++++ src/vector/vrect.cpp | 15 +++++++++++++++ src/vector/vrect.h | 16 ++++++++++++++++ src/vector/vregion.h | 16 ++++++++++++++++ src/vector/vrle.cpp | 16 ++++++++++++++++ src/vector/vrle.h | 16 ++++++++++++++++ src/vector/vstackallocator.h | 16 ++++++++++++++++ src/vector/vtaskqueue.h | 16 ++++++++++++++++ 66 files changed, 1055 insertions(+), 1 deletion(-) diff --git a/example/demo.cpp b/example/demo.cpp index 19a7180f85..bcc751609d 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "evasapp.h" #include "lottieview.h" #include diff --git a/example/efl_animview.cpp b/example/efl_animview.cpp index 8422dfbc59..5e80f06d9c 100644 --- a/example/efl_animview.cpp +++ b/example/efl_animview.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #define EFL_BETA_API_SUPPORT 1 #define EFL_EO_API_SUPPORT 1 diff --git a/example/evasapp.cpp b/example/evasapp.cpp index caeed16dec..e749e7cfe8 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "evasapp.h" #include diff --git a/example/evasapp.h b/example/evasapp.h index a21ae77293..9dfdda81d2 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef EVASAPP_H #define EVASAPP_H diff --git a/example/lottieview.cpp b/example/lottieview.cpp index e12653c24b..5dd3bbabbc 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include"lottieview.h" using namespace lottie; diff --git a/example/lottieview.h b/example/lottieview.h index cbb0815476..8655dafbed 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef LOTTIEVIEW_H #define LOTTIEVIEW_H diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index eaa9bfadcd..6a23b7ca55 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include #include "lottieview.h" #include diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 342d4d2ec5..e0c5e2eecf 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "evasapp.h" #include "lottieview.h" #include diff --git a/example/pathtest.cpp b/example/pathtest.cpp index 8fa1e0afb9..e68c9dd897 100644 --- a/example/pathtest.cpp +++ b/example/pathtest.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "evasapp.h" #include"vpath.h" #include diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index 0ff8f7b9b2..f10851766a 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include"evasapp.h" #include "lottieview.h" #include diff --git a/example/vectortest.cpp b/example/vectortest.cpp index 8e34f6783b..8501860678 100644 --- a/example/vectortest.cpp +++ b/example/vectortest.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include #include "vinterpolator.h" diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index 829ba1d91c..1d43b3ef2d 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef _LOTTIE_ANIMATION_H_ #define _LOTTIE_ANIMATION_H_ diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index 5d3ae01942..61d274d9c4 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef _LOTTIE_ANIMATION_CAPI_H_ #define _LOTTIE_ANIMATION_CAPI_H_ diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 5815b8ce28..4c7acac62b 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef _LOTTIE_COMMON_H_ #define _LOTTIE_COMMON_H_ diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 7de388b142..34428c1b7c 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "lottieanimation.h" #include "vdebug.h" diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index fb5b495c17..62bb4280db 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -1,5 +1,20 @@ -#include "lottieanimation.h" +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ +#include "lottieanimation.h" #include "lottieitem.h" #include "lottieloader.h" #include "lottiemodel.h" diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 411c454dee..d7c6a5aa04 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "lottieitem.h" #include #include diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 51ced32c70..1c74f7c89b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef LOTTIEITEM_H #define LOTTIEITEM_H diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index 6d2f4ccbdd..ca2067a009 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "lottieloader.h" #include "lottieparser.h" diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index 42b8e53f0b..e2520c8dcd 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef LOTTIELOADER_H #define LOTTIELOADER_H diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 63b924edd3..5603419fa1 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "lottiemodel.h" #include "vline.h" #include diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index b96f8693e2..ee55e2b498 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef LOTModel_H #define LOTModel_H diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 347469161b..f8043f3e36 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "lottieparser.h" diff --git a/src/lottie/lottieparser.h b/src/lottie/lottieparser.h index bde8f39332..f17c241fa4 100644 --- a/src/lottie/lottieparser.h +++ b/src/lottie/lottieparser.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef LOTTIEPARSER_H #define LOTTIEPARSER_H diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index de52839c66..2dc1b4ba49 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vbezier.h" #include "vline.h" #include diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index 12e9923bcf..9c15ec414f 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VBEZIER_H #define VBEZIER_H diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 9a5edf940e..190a7e46b8 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vbitmap.h" #include #include "vglobal.h" diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index 717e415376..29c403704a 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VBITMAP_H #define VBITMAP_H diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index def67978a3..83cc762121 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vbrush.h" V_BEGIN_NAMESPACE diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index 46433df2c3..65fb7647bf 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VBRUSH_H #define VBRUSH_H diff --git a/src/vector/vcompositionfunctions.cpp b/src/vector/vcompositionfunctions.cpp index b55cf66768..df52ce0e2c 100644 --- a/src/vector/vcompositionfunctions.cpp +++ b/src/vector/vcompositionfunctions.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vdrawhelper.h" /* diff --git a/src/vector/vcowptr.h b/src/vector/vcowptr.h index 39a16e4e37..a21b46b655 100644 --- a/src/vector/vcowptr.h +++ b/src/vector/vcowptr.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VCOWPTR_H #define VCOWPTR_H diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index 1e4ddd12ee..ef78f63b8f 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vdasher.h" #include "vbezier.h" #include "vline.h" diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 5eeaad5e9c..56d97f17a0 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VDASHER_H #define VDASHER_H #include "vpath.h" diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index bd74c9e2e5..54a08a7eb0 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vdebug.h" #include #include diff --git a/src/vector/vdebug.h b/src/vector/vdebug.h index 1b089e1351..797c011da0 100644 --- a/src/vector/vdebug.h +++ b/src/vector/vdebug.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VDEBUG_H #define VDEBUG_H #include diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 0eaad64230..40b1d65e2e 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vdrawable.h" #include "vdasher.h" #include "vraster.h" diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index d07ad7ec6e..dd9c5ca22b 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VDRAWABLE_H #define VDRAWABLE_H #include diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index d48ecda7f0..a9b50cfb6d 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vdrawhelper.h" #include #include diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 51d6db304a..ef66429654 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VDRAWHELPER_H #define VDRAWHELPER_H diff --git a/src/vector/vdrawhelper_neon.cpp b/src/vector/vdrawhelper_neon.cpp index 806a8b566f..f175a15a88 100644 --- a/src/vector/vdrawhelper_neon.cpp +++ b/src/vector/vdrawhelper_neon.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #if defined(__ARM_NEON__) #include "vdrawhelper.h" diff --git a/src/vector/vdrawhelper_sse2.cpp b/src/vector/vdrawhelper_sse2.cpp index c2133d31fa..3b29968f60 100644 --- a/src/vector/vdrawhelper_sse2.cpp +++ b/src/vector/vdrawhelper_sse2.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #if defined(__SSE2__) #include "vdrawhelper.h" diff --git a/src/vector/velapsedtimer.cpp b/src/vector/velapsedtimer.cpp index 59cdcedfb8..a0aec70644 100644 --- a/src/vector/velapsedtimer.cpp +++ b/src/vector/velapsedtimer.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "velapsedtimer.h" void VElapsedTimer::start() diff --git a/src/vector/velapsedtimer.h b/src/vector/velapsedtimer.h index 77dc0da45c..bf775aacd1 100644 --- a/src/vector/velapsedtimer.h +++ b/src/vector/velapsedtimer.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VELAPSEDTIMER_H #define VELAPSEDTIMER_H diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 173a36f834..4af77753f8 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VGLOBAL_H #define VGLOBAL_H diff --git a/src/vector/vinterpolator.cpp b/src/vector/vinterpolator.cpp index 58c2d14201..962333a91f 100644 --- a/src/vector/vinterpolator.cpp +++ b/src/vector/vinterpolator.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vinterpolator.h" #include diff --git a/src/vector/vinterpolator.h b/src/vector/vinterpolator.h index 0d3b60ea18..4bc4f34e37 100644 --- a/src/vector/vinterpolator.h +++ b/src/vector/vinterpolator.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VINTERPOLATOR_H #define VINTERPOLATOR_H diff --git a/src/vector/vline.h b/src/vector/vline.h index bd959c3c59..d063d5bc7a 100644 --- a/src/vector/vline.h +++ b/src/vector/vline.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VLINE_H #define VLINE_H diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 104fe70b3d..dd7fb973b6 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vmatrix.h" #include #include diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index f09acbd5d5..fcbf651083 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VMATRIX_H #define VMATRIX_H #include "vglobal.h" diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 3ff3e89b15..8b5af0c147 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vpainter.h" #include "vdrawhelper.h" diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index cb3ec4e267..bdbb398d75 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VPAINTER_H #define VPAINTER_H diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 183092266b..93d6cd98da 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vpath.h" #include #include diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 76e8df2e92..22b052bcfa 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VPATH_H #define VPATH_H #include diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index 2b7f40089c..cc780be683 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vpathmesure.h" #include "vbezier.h" #include "vdasher.h" diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 7c7b74532d..6ff63f5fa2 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VPATHMESURE_H #define VPATHMESURE_H diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index 22bd8890be..af47045def 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VPOINT_H #define VPOINT_H diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 91476d593b..589718517a 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vraster.h" #include #include diff --git a/src/vector/vraster.h b/src/vector/vraster.h index d1594204d8..086f716cfd 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VRASTER_H #define VRASTER_H #include diff --git a/src/vector/vrect.cpp b/src/vector/vrect.cpp index e69de29bb2..3787d2f212 100644 --- a/src/vector/vrect.cpp +++ b/src/vector/vrect.cpp @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ diff --git a/src/vector/vrect.h b/src/vector/vrect.h index 10e4929962..0a48d744e4 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VRECT_H #define VRECT_H #include "vglobal.h" diff --git a/src/vector/vregion.h b/src/vector/vregion.h index e341b3525a..508b6c3579 100644 --- a/src/vector/vregion.h +++ b/src/vector/vregion.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VREGION_H #define VREGION_H #include diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index 9637027023..fa66cbc54d 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #include "vrle.h" #include #include diff --git a/src/vector/vrle.h b/src/vector/vrle.h index 16cb23746c..ff0838c598 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VRLE_H #define VRLE_H diff --git a/src/vector/vstackallocator.h b/src/vector/vstackallocator.h index ce5c7b5c19..ef748536d7 100644 --- a/src/vector/vstackallocator.h +++ b/src/vector/vstackallocator.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VSTACK_ALLOCATOR_H #define VSTACK_ALLOCATOR_H diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h index ce02dadec6..d232149b82 100644 --- a/src/vector/vtaskqueue.h +++ b/src/vector/vtaskqueue.h @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + #ifndef VTASKQUEUE_H #define VTASKQUEUE_H From 5d066bcdbea654aacc7df21d813f1e6524589c44 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 19:22:29 +0900 Subject: [PATCH 366/672] fix typo. Change-Id: I6333c27d41d6f9e5eb64ce88c9a93678259a1706 --- COPYING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/COPYING b/COPYING index b5de87c174..0093fbab5e 100644 --- a/COPYING +++ b/COPYING @@ -4,7 +4,7 @@ lottie-player basically comes with Flora license(see: licenses/COPYING.FLR) but some parts of shared code are covered by different licenses. Listed below are the folder names and the license file covering it. Note that this license would cover all of the source invovled in each folders, unless -specifically noted otherwise. So please refer to these mported project sources +specifically noted otherwise. So please refer to these imported project sources for details. Dependencies and licenses: From f1fb448a0094532fb7ba9593a1fae91928e72ee0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 26 Dec 2018 18:54:11 +0900 Subject: [PATCH 367/672] lottie/parser: fixed SVACE warning regarding uninitialized member variable. Change-Id: I0a295b50349a34f08443386cbf540b507f0f67bf --- src/lottie/rapidjson/reader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/rapidjson/reader.h b/src/lottie/rapidjson/reader.h index 120c31115f..2056e21ca9 100644 --- a/src/lottie/rapidjson/reader.h +++ b/src/lottie/rapidjson/reader.h @@ -2197,7 +2197,7 @@ private: static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. ParseResult parseResult_; - IterativeParsingState state_; + IterativeParsingState state_{IterativeParsingStartState}; }; // class GenericReader //! Reader with UTF8 encoding and default allocator. From 0d0fcf763be421ccccf0db3f03c04c58694c8a41 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 20:08:11 +0900 Subject: [PATCH 368/672] remove sneaked inserting unicodes, zero-width no-break space. Change-Id: Ida61de8e5f014d53bc0e08556ce778f5c055e925 --- src/lottie/lottieloader.cpp | 2 +- src/vector/vraster.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index ca2067a009..d3474a9d80 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "lottieloader.h" +#include "lottieloader.h" #include "lottieparser.h" #include diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 589718517a..ff5133b69f 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "vraster.h" +#include "vraster.h" #include #include #include "v_ft_raster.h" From a24ca36be46b264ea2aae3bcdec09916cb6c97ad Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 20:11:49 +0900 Subject: [PATCH 369/672] Initialize member variables to resolve unnannoying report from static analizer tool(SVACE) Change-Id: I32dc2372f83ef1b8185bd5a2f14862eae7616206 --- src/vector/vdrawhelper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index ef66429654..e7a84b4b25 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -92,7 +92,7 @@ public: int bytesPerPixel() const { return mBytesPerPixel; } VBitmap::Format mFormat{VBitmap::Format::ARGB32_Premultiplied}; - VPainter::CompositionMode mCompositionMode; + VPainter::CompositionMode mCompositionMode{VPainter::CompositionMode::CompModeSrc}; private: int mWidth{0}; From e701a0bb203741a13b32ae2566a285ae6dbef0bd Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 26 Dec 2018 21:01:40 +0900 Subject: [PATCH 370/672] fix to packaging license files properly. Change-Id: I3107051f975c867e757cf6f0b60f2d415b712a03 --- packaging/lottie-player.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index edd0f01196..a21f6e2ea2 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -53,13 +53,13 @@ make %{?jobs:-j%jobs} %make_install mkdir -p %{buildroot}/%{_datadir}/license -cp %{_builddir}/%{buildsubdir}/LICENSE %{buildroot}/%{_datadir}/license/%{name} - +cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/%{_datadir}/license/COPYING +cp %{_builddir}/%{buildsubdir}/licenses/* %{buildroot}/%{_datadir}/license/ %files %defattr(-,root,root,-) %{_libdir}/liblottie-player.so.* -%{_datadir}/license/%{name} +%{_datadir}/license/COPYING* %manifest %{name}.manifest %files devel From 66259e78e5f67a5b249728f104e4881bce59d3d4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 27 Dec 2018 12:48:00 +0900 Subject: [PATCH 371/672] lottie/vector: move pixman code to separate pixman folder. Change-Id: Ic2d59825403814849f46cad8496a7b409b6d3fda --- src/vector/CMakeLists.txt | 10 +--------- src/vector/meson.build | 3 ++- src/vector/pixman/CMakeLists.txt | 17 +++++++++++++++++ src/vector/pixman/meson.build | 7 +++++++ src/vector/{ => pixman}/pixman-arm-neon-asm.S | 0 src/vector/{ => pixman}/pixman-arm-neon-asm.h | 0 src/vector/{ => pixman}/vregion.cpp | 0 src/vector/{ => pixman}/vregion.h | 0 8 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 src/vector/pixman/CMakeLists.txt create mode 100644 src/vector/pixman/meson.build rename src/vector/{ => pixman}/pixman-arm-neon-asm.S (100%) rename src/vector/{ => pixman}/pixman-arm-neon-asm.h (100%) rename src/vector/{ => pixman}/vregion.cpp (100%) rename src/vector/{ => pixman}/vregion.h (100%) diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 4c2acfcd54..573a33bec1 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory(freetype) +add_subdirectory(pixman) target_sources(lottie-player PRIVATE @@ -11,7 +12,6 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper_sse2.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdrawhelper_neon.cpp" - "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" "${CMAKE_CURRENT_LIST_DIR}/vrle.cpp" "${CMAKE_CURRENT_LIST_DIR}/vpath.cpp" "${CMAKE_CURRENT_LIST_DIR}/vpathmesure.cpp" @@ -24,14 +24,6 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vdrawable.cpp" ) -IF("${ARCH}" STREQUAL "arm") -SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") -target_sources(lottie-player - PRIVATE - "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" - ) -ENDIF("${ARCH}" STREQUAL "arm") - target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" diff --git a/src/vector/meson.build b/src/vector/meson.build index d56d49c9a8..3246e43282 100644 --- a/src/vector/meson.build +++ b/src/vector/meson.build @@ -1,7 +1,9 @@ subdir('freetype') +subdir('pixman') vector_dep = [freetype_dep] +vector_dep += pixman_dep source_file = files('vdasher.cpp') source_file += files('vbrush.cpp') @@ -13,7 +15,6 @@ source_file += files('vdrawhelper_sse2.cpp') source_file += files('vdrawable.cpp') -source_file += files('vregion.cpp') source_file += files('vrle.cpp') source_file += files('vpath.cpp') source_file += files('vpathmesure.cpp') diff --git a/src/vector/pixman/CMakeLists.txt b/src/vector/pixman/CMakeLists.txt new file mode 100644 index 0000000000..d38a0947dd --- /dev/null +++ b/src/vector/pixman/CMakeLists.txt @@ -0,0 +1,17 @@ +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" + ) + +IF("${ARCH}" STREQUAL "arm") +SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") +target_sources(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" + ) +ENDIF("${ARCH}" STREQUAL "arm") + +target_include_directories(lottie-player + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}" + ) diff --git a/src/vector/pixman/meson.build b/src/vector/pixman/meson.build new file mode 100644 index 0000000000..c45d81a7c3 --- /dev/null +++ b/src/vector/pixman/meson.build @@ -0,0 +1,7 @@ + +source_file = files('vregion.cpp') + +pixman_dep = declare_dependency( + include_directories : include_directories('.'), + sources : source_file + ) diff --git a/src/vector/pixman-arm-neon-asm.S b/src/vector/pixman/pixman-arm-neon-asm.S similarity index 100% rename from src/vector/pixman-arm-neon-asm.S rename to src/vector/pixman/pixman-arm-neon-asm.S diff --git a/src/vector/pixman-arm-neon-asm.h b/src/vector/pixman/pixman-arm-neon-asm.h similarity index 100% rename from src/vector/pixman-arm-neon-asm.h rename to src/vector/pixman/pixman-arm-neon-asm.h diff --git a/src/vector/vregion.cpp b/src/vector/pixman/vregion.cpp similarity index 100% rename from src/vector/vregion.cpp rename to src/vector/pixman/vregion.cpp diff --git a/src/vector/vregion.h b/src/vector/pixman/vregion.h similarity index 100% rename from src/vector/vregion.h rename to src/vector/pixman/vregion.h From 7c28a33532171341feb81b2425e49f6fb1afdbef Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 27 Dec 2018 14:40:16 +0900 Subject: [PATCH 372/672] add missing copyright. Change-Id: I244bb60e6315153a2bb15f67b648b9f62f5f6904 --- COPYING | 3 +- licenses/COPYING.LGPL | 489 ++++++++++++++++++++++++++++++++ licenses/COPYING.MPL | 373 ++++++++++++++++++++++++ src/vector/vdrawhelper_sse2.cpp | 16 -- src/vector/vinterpolator.cpp | 44 ++- 5 files changed, 896 insertions(+), 29 deletions(-) create mode 100644 licenses/COPYING.LGPL create mode 100644 licenses/COPYING.MPL diff --git a/COPYING b/COPYING index 0093fbab5e..bc076998d5 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ Licensing -lottie-player basically comes with Flora license(see: licenses/COPYING.FLR) +lottie-player basically comes with Flora license(licenses/COPYING.FLR) but some parts of shared code are covered by different licenses. Listed below are the folder names and the license file covering it. Note that this license would cover all of the source invovled in each folders, unless @@ -9,6 +9,7 @@ for details. Dependencies and licenses: +src/vector/ licenses/COPYING.LGPL, licenses/COPYING.FLR, licenses/COPYING.MPL src/vector/freetype licenses/COPYING.FTL src/vector/pixman licenses/COPYING.PIX src/vector/lottie/rapidjson licenses/COPYING.RPD diff --git a/licenses/COPYING.LGPL b/licenses/COPYING.LGPL new file mode 100644 index 0000000000..d72fb2d612 --- /dev/null +++ b/licenses/COPYING.LGPL @@ -0,0 +1,489 @@ +Copyright (C) EFL developers (see AUTHORS) + +This library is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 2.1 of the License. + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +Below is a copy of the GNU Lesser General Public License that is distributed +along with this library. If you do not have a copy below, write to the Free +Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent modules, +and to copy and distribute the resulting executable under terms of your +choice, provided that you also meet, for each linked independent module, +the terms and conditions of the license of that module. An independent +module is a module which is not derived from or based on this library. +If you modify this library, you may extend this exception to your version +of the library, but you are not obliged to do so. If you do not wish to +do so, delete this exception statement from your version. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/licenses/COPYING.MPL b/licenses/COPYING.MPL new file mode 100644 index 0000000000..14e2f777f6 --- /dev/null +++ b/licenses/COPYING.MPL @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/src/vector/vdrawhelper_sse2.cpp b/src/vector/vdrawhelper_sse2.cpp index 3b29968f60..c2133d31fa 100644 --- a/src/vector/vdrawhelper_sse2.cpp +++ b/src/vector/vdrawhelper_sse2.cpp @@ -1,19 +1,3 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - #if defined(__SSE2__) #include "vdrawhelper.h" diff --git a/src/vector/vinterpolator.cpp b/src/vector/vinterpolator.cpp index 962333a91f..94f454ad33 100644 --- a/src/vector/vinterpolator.cpp +++ b/src/vector/vinterpolator.cpp @@ -1,18 +1,38 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ * - * http://floralicense.org/license/ + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. * - * 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. - */ + * The Original Code is the Mozilla SMIL module. + * + * The Initial Developer of the Original Code is Brian Birtles. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Birtles + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ #include "vinterpolator.h" #include From 1c45c74a28112b6c48ac151d9d4ac675591094ea Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 27 Dec 2018 15:03:07 +0900 Subject: [PATCH 373/672] example: remove a resouce that may have a license. Change-Id: If7e5a70eb3547a686fccefa6c5b6725725aa862d --- example/resource/tigerobo_demo.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 example/resource/tigerobo_demo.json diff --git a/example/resource/tigerobo_demo.json b/example/resource/tigerobo_demo.json deleted file mode 100644 index 396f958205..0000000000 --- a/example/resource/tigerobo_demo.json +++ /dev/null @@ -1 +0,0 @@ -{"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"humo 30","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[523,264.5,0],"e":[525,246.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":1,"ty":4,"nm":"humo 29","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[225,202.5,0],"e":[227,184.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":2,"ty":4,"nm":"humo 28","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[231,284.5,0],"e":[233,266.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":3,"ty":4,"nm":"humo 27","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[451,324.5,0],"e":[453,306.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":4,"ty":4,"nm":"humo 26","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[265,262.5,0],"e":[267,244.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":5,"ty":4,"nm":"humo 25","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[345,186.5,0],"e":[341,182.5,0],"to":[-0.66666668653488,-0.66666668653488,0],"ti":[0.66666668653488,0.66666668653488,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":6,"ty":4,"nm":"humo 24","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[425,548.5,0],"e":[427,530.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":7,"ty":4,"nm":"humo 23","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[239,486.5,0],"e":[241,468.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":8,"ty":4,"nm":"humo 22","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[427,256.5,0],"e":[429,238.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":9,"ty":4,"nm":"humo 21","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[529,472.5,0],"e":[531,454.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":10,"ty":4,"nm":"humo 20","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[329,528.5,0],"e":[331,510.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":11,"ty":4,"nm":"humo 19","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[183,536.5,0],"e":[185,518.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[90.698,85.965,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":12,"ty":4,"nm":"humo 18","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[429,438.5,0],"e":[431,420.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":13,"ty":4,"nm":"humo 17","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[217,418.5,0],"e":[219,400.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":14,"ty":4,"nm":"humo 16","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[351,424.5,0],"e":[353,406.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":15,"ty":4,"nm":"humo 15","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[457,348.5,0],"e":[459,330.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":16,"ty":4,"nm":"humo 14","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[341,342.5,0],"e":[343,324.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":17,"ty":4,"nm":"humo 13","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[199,384.5,0],"e":[201,366.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":18,"ty":4,"nm":"humo 12","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[429,774.5,0],"e":[431,756.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":19,"ty":4,"nm":"humo 11","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[243,712.5,0],"e":[245,694.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":20,"ty":4,"nm":"humo 10","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[523,812.5,0],"e":[525,794.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":21,"ty":4,"nm":"humo 9","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[527,716.5,0],"e":[529,698.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":22,"ty":4,"nm":"humo 8","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[333,754.5,0],"e":[335,736.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":23,"ty":4,"nm":"humo 7","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[187,762.5,0],"e":[189,744.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[90.698,85.965,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":24,"ty":4,"nm":"humo 4","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[433,664.5,0],"e":[435,646.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":25,"ty":4,"nm":"humo 2","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":105,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":106.369,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[221,644.5,0],"e":[223,626.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":105,"s":[0,0,100],"e":[67,67,100]},{"t":109.10546875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":26,"ty":4,"nm":"humo 6","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[605,640.5,0],"e":[607,622.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":107.737,"s":[100,100,100],"e":[82.418,73.77,100]},{"t":113.2109375}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":27,"ty":4,"nm":"humo 5","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[527,610.5,0],"e":[529,592.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":28,"ty":4,"nm":"humo 3","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[335,610.5,0],"e":[337,592.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0},{"ddd":0,"ind":29,"ty":4,"nm":"humo","ks":{"o":{"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":103.632,"s":[0],"e":[100]},{"i":{"x":[0.667],"y":[0.667]},"o":{"x":[0.333],"y":[0.333]},"n":["0p667_0p667_0p333_0p333"],"t":105,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":113.211,"s":[100],"e":[0]},{"t":121.4208984375}]},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":110.474,"s":[127,628.5,0],"e":[129,610.5,0],"to":[0.33333334326744,-3,0],"ti":[-0.33333334326744,3,0]},{"t":129.6318359375}]},"a":{"k":[-218,172,0]},"s":{"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0.333]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_0p667_0p333_0p333"],"t":103.632,"s":[0,0,100],"e":[100,100,100]},{"t":107.7373046875}]}},"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"d":1,"ty":"el","s":{"k":[177,177]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","closed":true},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-215.5,169]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Ellipse 1"}],"bounds":{"l":-335,"t":50,"b":288,"r":-96},"ip":0,"op":1801,"st":0}]}],"v":"4.0.0","layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Shape Layer 2","parent":2,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[347.285,1375.72,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-349,-456.5],[351,-456.5]]}},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,228,100,255]},"o":{"k":100},"w":{"k":12},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-355,"t":-463,"b":-450,"r":357},"ip":339,"op":392,"st":0},{"ddd":0,"ind":1,"ty":0,"nm":"Humo","refId":"comp_0","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[345,456.5,0]},"a":{"k":[345,456.5,0]},"s":{"k":[100,100,100]}},"w":690,"h":913,"ip":95,"op":133,"st":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 2 Outlines","parent":3,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":339,"s":[35.965,-1024.97,0],"e":[35.965,-104.97,0],"to":[0,153.33332824707,0],"ti":[0,-153.33332824707,0]},{"t":359}]},"a":{"k":[345.25,456.75,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-345,456.5],[345,456.5],[345,-456.5],[-345,-456.5]]}},"nm":"Path 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[118,196,181,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[345.25,456.75]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":914,"r":691},"ip":332,"op":392,"st":332},{"ddd":0,"ind":3,"ty":3,"nm":"Null 1","ks":{"o":{"k":0},"r":{"k":0},"p":{"k":[{"i":{"x":0.043,"y":1},"o":{"x":0.333,"y":0},"n":"0p043_1_0p333_0","t":32,"s":[361,-177.5,0],"e":[361,662.5,0],"to":[0,140,0],"ti":[0,-140,0]},{"i":{"x":0.043,"y":0.043},"o":{"x":0.167,"y":0.167},"n":"0p043_0p043_0p167_0p167","t":46.526,"s":[361,662.5,0],"e":[361,662.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.043,"y":1},"o":{"x":0.167,"y":0},"n":"0p043_1_0p167_0","t":328,"s":[361,662.5,0],"e":[355,612.5,0],"to":[-1,-8.33333301544189,0],"ti":[1,8.33333301544189,0]},{"i":{"x":0.043,"y":0.043},"o":{"x":0.167,"y":0.167},"n":"0p043_0p043_0p167_0p167","t":338,"s":[355,612.5,0],"e":[355,612.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.043,"y":1},"o":{"x":0.167,"y":0},"n":"0p043_1_0p167_0","t":339,"s":[355,612.5,0],"e":[361,662.5,0],"to":[1,8.33333301544189,0],"ti":[-1,-8.33333301544189,0]},{"t":348}]},"a":{"k":[50,46,0]},"s":{"k":[100,100,100]}},"ip":0,"op":392,"st":0},{"ddd":0,"ind":4,"ty":4,"nm":"BrazoAdelante 2","parent":27,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[5],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[5],"e":[5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":328,"s":[5],"e":[-163]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":338,"s":[-163],"e":[-163]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":339,"s":[-163],"e":[-163.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":341,"s":[-163.5],"e":[-202]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":344,"s":[-202],"e":[-202]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":345,"s":[-202],"e":[-346]},{"t":350}]},"p":{"k":[235.426,251.527,0]},"a":{"k":[-94,-12,0]},"s":{"k":[-100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[2.088,-42.839],[-20.814,11.559]],"o":[[0,0],[-1.849,37.935],[2.623,-1.457]],"v":[[-93,-10.5],[-167.825,45.886],[-28.313,60.039]]}],"e":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":47.368,"s":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}],"e":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":52.421,"s":[{"i":[[0,0],[25.902,-66.596],[1.588,-3.414]],"o":[[0,0],[-5.399,13.881],[-1.265,2.72]],"v":[[-93,-10.5],[-158.187,44.722],[-184.017,118.691]]}],"e":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":59.158,"s":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}],"e":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[33.826,-39.59],[13.228,-27.467]],"o":[[0,0],[-17.895,20.944],[-7.869,16.339]],"v":[[-93,-10.5],[-174.997,53.289],[-163.246,156.646]]}],"e":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":97,"s":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}],"e":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":169,"s":[{"i":[[0,0],[17.611,-12.584],[14.326,-11.334]],"o":[[0,0],[-19.275,13.772],[-14.223,11.252]],"v":[[-93,-10.5],[-169.269,33.714],[-236.666,77.948]]}],"e":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":175,"s":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}],"e":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}],"e":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}],"e":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":339,"s":[{"i":[[0,0],[14.872,-14.281],[18.052,-11.681]],"o":[[-17.809,18.663],[-12.518,12.02],[-15.226,9.852]],"v":[[-93,-10.5],[-161.947,71.782],[-228.46,141.132]]}],"e":[{"i":[[0,0],[11.432,1.897],[18.052,-11.681]],"o":[[-8.408,-1.194],[-17.12,-2.841],[-15.226,9.852]],"v":[[-93,-10.5],[-116.02,-64.757],[-183.276,0.183]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":344,"s":[{"i":[[0,0],[11.432,1.897],[18.052,-11.681]],"o":[[-8.408,-1.194],[-17.12,-2.841],[-15.226,9.852]],"v":[[-93,-10.5],[-116.02,-64.757],[-183.276,0.183]]}],"e":[{"i":[[0,0],[5.31,-8.35],[13.228,-27.467]],"o":[[-17.809,18.663],[-9.313,14.644],[-7.869,16.339]],"v":[[-93,-10.5],[-136.793,52.616],[-171.067,119.824]]}]},{"t":350}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"w":{"k":18},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-247,"t":-74,"b":167,"r":-19},"ip":0,"op":392,"st":0},{"ddd":0,"ind":5,"ty":4,"nm":"BrazoAdelante","parent":27,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34.072,"s":[-11],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[-11],"e":[-11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":328,"s":[-11],"e":[173]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":338,"s":[173],"e":[173]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":339,"s":[173],"e":[179.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":341,"s":[179.5],"e":[218]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":344,"s":[218],"e":[218]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":345,"s":[218],"e":[362]},{"t":350}]},"p":{"k":[53.426,251.527,0]},"a":{"k":[-94,-12,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[2.088,-42.839],[-20.814,11.559]],"o":[[0,0],[-1.849,37.935],[2.623,-1.457]],"v":[[-93,-10.5],[-167.825,45.886],[-28.313,60.039]]}],"e":[{"i":[[0,0],[22.386,-50.058],[9.396,-23.317]],"o":[[0,0],[-14.653,32.765],[-1.121,2.783]],"v":[[-93,-10.5],[-163.19,32.525],[-193.548,113.492]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":47.368,"s":[{"i":[[0,0],[22.386,-50.058],[9.396,-23.317]],"o":[[0,0],[-14.653,32.765],[-1.121,2.783]],"v":[[-93,-10.5],[-163.19,32.525],[-193.548,113.492]]}],"e":[{"i":[[0,0],[28.408,-60.074],[5.656,-25.043]],"o":[[0,0],[-12.798,27.065],[-0.286,0.288]],"v":[[-93,-10.5],[-158.827,41.523],[-186.077,116.982]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":52.421,"s":[{"i":[[0,0],[28.408,-60.074],[5.656,-25.043]],"o":[[0,0],[-12.798,27.065],[-0.286,0.288]],"v":[[-93,-10.5],[-158.827,41.523],[-186.077,116.982]]}],"e":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":59.158,"s":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}],"e":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[12.063,-17.913],[15.145,-10.969]],"o":[[0,0],[-8.475,12.585],[-8.359,6.054]],"v":[[-93,-10.5],[-173.905,45.723],[-179.026,151.461]]}],"e":[{"i":[[0,0],[11.914,6.454],[4.094,11.817]],"o":[[0,0],[-21.73,-11.772],[-3.379,-9.752]],"v":[[-93,-10.5],[-174.944,-1.34],[-230.056,-73.408]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":97,"s":[{"i":[[0,0],[11.914,6.454],[4.094,11.817]],"o":[[0,0],[-21.73,-11.772],[-3.379,-9.752]],"v":[[-93,-10.5],[-174.944,-1.34],[-230.056,-73.408]]}],"e":[{"i":[[0,0],[7.545,-12.008],[3.492,-27.011]],"o":[[0,0],[-11.176,17.785],[-2.106,16.292]],"v":[[-93,-10.5],[-153.946,37.378],[-185.435,126.785]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":104,"s":[{"i":[[0,0],[7.545,-12.008],[3.492,-27.011]],"o":[[0,0],[-11.176,17.785],[-2.106,16.292]],"v":[[-93,-10.5],[-153.946,37.378],[-185.435,126.785]]}],"e":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":107,"s":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}],"e":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":169,"s":[{"i":[[0,0],[13.744,-16.082],[13.881,-28.048]],"o":[[0,0],[-13.647,15.968],[-7.286,14.723]],"v":[[-93,-10.5],[-151.165,44.031],[-199.615,115.879]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":175,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":339,"s":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-154.772,68.592],[-198.489,169.839]]}],"e":[{"i":[[0,0],[11.405,-17.818],[9.026,-19.807]],"o":[[0,0],[-9.622,15.031],[-6.812,14.949]],"v":[[-93,-10.5],[-143.839,-36.861],[-163.562,33.076]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":344,"s":[{"i":[[0,0],[11.405,-17.818],[9.026,-19.807]],"o":[[0,0],[-9.622,15.031],[-6.812,14.949]],"v":[[-93,-10.5],[-143.839,-36.861],[-163.562,33.076]]}],"e":[{"i":[[0,0],[11.405,-17.818],[5.483,-21.531]],"o":[[0,0],[-9.622,15.031],[-4.054,15.92]],"v":[[-93,-10.5],[-140.912,54.174],[-182.435,137.555]]}]},{"t":350}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"w":{"k":18},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-240,"t":-84,"b":180,"r":-19},"ip":0,"op":392,"st":0},{"ddd":0,"ind":6,"ty":4,"nm":"pierna2","parent":3,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[21],"e":[21]},{"t":320}]},"p":{"k":[104,36,0]},"a":{"k":[-54,200,0]},"s":{"k":[-100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[0.557,-14.911],[0,0],[0.492,-6.629]],"o":[[0,0],[-0.552,14.762],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-38.513,351.227],[-31.492,382.129]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":44,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[5.152,-10.933],[0,0],[3.901,1.373]],"o":[[0,0],[-5.975,12.679],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-99.78,262.123],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":49.895,"s":[{"i":[[0,0],[5.152,-10.933],[0,0],[3.901,1.373]],"o":[[0,0],[-5.975,12.679],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-99.78,262.123],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":58.315,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-88.86,272.741],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":95,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-88.86,272.741],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":98,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":180,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":320,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":327,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":345,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-114.539,359.89]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":349,"s":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.744,276.909],[-93.336,341.966],[-119.725,334.334]]}],"e":[{"i":[[0,0],[2.921,-10.677],[0,0],[3.901,1.373]],"o":[[0,0],[-3.698,13.52],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-76.506,279.626],[-93.336,341.966],[-119.725,334.334]]}]},{"t":353}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"w":{"k":24},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[2,2]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-130,"t":200,"b":397,"r":-17},"ip":0,"op":392,"st":0},{"ddd":0,"ind":7,"ty":4,"nm":"pierna1","parent":3,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":180,"s":[-22],"e":[-22]},{"t":320}]},"p":{"k":[-36,36,0]},"a":{"k":[-54,200,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":35,"s":[{"i":[[0,0],[0.557,-14.911],[0,0],[0.492,-6.629]],"o":[[0,0],[-0.552,14.762],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-38.513,351.227],[-31.492,382.129]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":44,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-100.81,263.421],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":49.895,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-100.81,263.421],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":58.315,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":90,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-91.538,267.167],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":95,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-91.538,267.167],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":98,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":180,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":320,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":327,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":328,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":338,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":345,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-115.922,364.195]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":349,"s":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-94.891,270.126],[-100.691,342.284],[-131.038,332.202]]}],"e":[{"i":[[0,0],[5.564,-13.846],[0,0],[-0.08,1.003]],"o":[[0,0],[-7.851,19.538],[0,0],[-0.258,0.121]],"v":[[-48,210.5],[-78.557,272.411],[-100.691,342.284],[-131.038,332.202]]}]},{"t":353}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"w":{"k":24},"lc":2,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[2,2]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-142,"t":200,"b":397,"r":-17},"ip":0,"op":392,"st":0},{"ddd":0,"ind":8,"ty":4,"nm":"soga2","ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.192]},"n":["0p833_1_0p167_0p192"],"t":195,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.771]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p771_0p167_0"],"t":207,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.333]},"n":["0p833_1_0p167_-0p333"],"t":218,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.646]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p646_0p167_0"],"t":234,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.479]},"n":["0p833_1_0p167_-0p479"],"t":251,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.521]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p521_0p167_0"],"t":274,"s":[4],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-0.604]},"n":["0p833_1_0p167_-0p604"],"t":297,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.396]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p396_0p167_0"],"t":326,"s":[4],"e":[0]},{"t":355}]},"p":{"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":339,"s":[349,-9.5,0],"e":[349,1020.5,0],"to":[0,171.66667175293,0],"ti":[0,-171.66667175293,0]},{"t":359}]},"a":{"k":[4,-470,0]},"s":{"k":[{"i":{"x":[0.71,0.667,0.667],"y":[2.818,0.683,0.667]},"o":{"x":[0.327,0.333,0.333],"y":[0,0,0.333]},"n":["0p71_2p818_0p327_0","0p667_0p683_0p333_0","0p667_0p667_0p333_0p333"],"t":178,"s":[100,100,100],"e":[100,103.032,100]},{"i":{"x":[0.684,0.667,0.667],"y":[0.571,1,0.667]},"o":{"x":[0.35,0.333,0.333],"y":[0.244,0.037,0.333]},"n":["0p684_0p571_0p35_0p244","0p667_1_0p333_0p037","0p667_0p667_0p333_0p333"],"t":187,"s":[100,103.032,100],"e":[100,105.926,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.667,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0.333,-0.011,0.333]},"n":["0p667_0p667_0p333_0p333","0p667_1_0p333_-0p011","0p667_0p667_0p333_0p333"],"t":188,"s":[100,105.926,100],"e":[100,100,100]},{"t":195}]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":0.907},"o":{"x":0.167,"y":0.093},"n":"0p833_0p907_0p167_0p093","t":178,"s":[{"i":[[-66,-112],[-2.006,-3.838]],"o":[[30.057,51.005],[0.404,-27.052]],"v":[[27.056,-684.284],[-128.296,-591.5]]}],"e":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}]},{"i":{"x":0.833,"y":0.907},"o":{"x":0.167,"y":0.093},"n":"0p833_0p907_0p167_0p093","t":181.6,"s":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}],"e":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.093},"n":"0p667_1_0p167_0p093","t":185.2,"s":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}],"e":[{"i":[[-66,-112],[-24.911,-56.32]],"o":[[30.258,51.347],[41.26,93.283]],"v":[[31.287,-883.879],[45.12,-247.626]]}]},{"t":196}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,228,100,255]},"o":{"k":100},"w":{"k":12},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[-2,-468]},"a":{"k":[38,-468]},"s":{"k":[100,100]},"r":{"k":-0.315},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-175,"t":-901,"b":-199,"r":22},"ip":178,"op":392,"st":178},{"ddd":0,"ind":9,"ty":4,"nm":"soga1","ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.192]},"n":["0p833_1_0p167_0p192"],"t":17,"s":[0],"e":[4]},{"i":{"x":[0.833],"y":[0.771]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p771_0p167_0"],"t":29,"s":[4],"e":[0]},{"t":40}]},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":43,"s":[349,-9.5,0],"e":[349,-669.5,0],"to":[0,-110,0],"ti":[0,110,0]},{"t":48}]},"a":{"k":[4,-470,0]},"s":{"k":[{"i":{"x":[0.71,0.667,0.667],"y":[2.818,0.683,0.667]},"o":{"x":[0.327,0.333,0.333],"y":[0,0,0.333]},"n":["0p71_2p818_0p327_0","0p667_0p683_0p333_0","0p667_0p667_0p333_0p333"],"t":0,"s":[100,100,100],"e":[100,103.032,100]},{"i":{"x":[0.684,0.667,0.667],"y":[0.571,1,0.667]},"o":{"x":[0.35,0.333,0.333],"y":[0.244,0.037,0.333]},"n":["0p684_0p571_0p35_0p244","0p667_1_0p333_0p037","0p667_0p667_0p333_0p333"],"t":9,"s":[100,103.032,100],"e":[100,105.926,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.667,1,0.667]},"o":{"x":[0.333,0.333,0.333],"y":[0.333,-0.011,0.333]},"n":["0p667_0p667_0p333_0p333","0p667_1_0p333_-0p011","0p667_0p667_0p333_0p333"],"t":10,"s":[100,105.926,100],"e":[100,100,100]},{"t":17}]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-66,-112],[-2.006,-3.838]],"o":[[30.057,51.005],[0.404,-27.052]],"v":[[27.056,-684.284],[-128.296,-591.5]]}],"e":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[{"i":[[-66,-112],[51.478,27.937]],"o":[[30.161,51.182],[-47.833,-97.428]],"v":[[28.059,-572.924],[-107.292,-348.374]]}],"e":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":4,"s":[{"i":[[-66,-112],[49.042,10.909]],"o":[[30.192,51.235],[-19.237,-36.215]],"v":[[28.361,-539.406],[-73.543,-206.356]]}],"e":[{"i":[[-66,-112],[-24.911,-56.32]],"o":[[30.258,51.347],[41.26,93.283]],"v":[[29,-468.5],[42.834,167.753]]}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":10,"s":[{"i":[[-66,-112],[-24.911,-56.32]],"o":[[30.258,51.347],[41.26,93.283]],"v":[[29,-468.5],[42.834,167.753]]}],"e":[{"i":[[-66,-112],[25.688,-48.885]],"o":[[30.051,50.995],[-47.447,90.293]],"v":[[29,-468.5],[30.901,155.478]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":17,"s":[{"i":[[-66,-112],[25.688,-48.885]],"o":[[30.051,50.995],[-47.447,90.293]],"v":[[29,-468.5],[30.901,155.478]]}],"e":[{"i":[[-6.865,-129.819],[-5.015,-61.4]],"o":[[3.001,56.753],[6.182,104.767]],"v":[[29,-468.5],[61.711,168.533]]}]},{"t":26}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[255,228,100,255]},"o":{"k":100},"w":{"k":12},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[-2,-468]},"a":{"k":[38,-468]},"s":{"k":[100,100]},"r":{"k":-0.315},"o":{"k":100}}],"nm":"Shape 1"}],"bounds":{"l":-175,"t":-727,"b":184,"r":32},"ip":0,"op":392,"st":0},{"ddd":0,"ind":10,"ty":4,"nm":"cinturon Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[154.614,381.64,0],"e":[148.614,381.64,0],"to":[-1,0,0],"ti":[1,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[148.614,381.64,0],"e":[148.614,381.64,0],"to":[0,0,0],"ti":[0,0,0]},{"t":203}]},"a":{"k":[135.816,27.219,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[4.458,8.019],[0.102,0.508],[3.178,-0.133],[9.962,-2.038],[4.699,-0.091],[6.772,-0.032],[0.677,2.124],[-2.913,6.244],[0.065,0.573],[0.251,0.011],[0.084,-0.093],[-2.252,-8.338],[-7.826,0],[-7.885,0.457]],"o":[[-0.292,-0.526],[-3.07,0.221],[13.784,3.005],[-4.635,0.948],[-6.77,0.131],[-2.291,0.01],[-2.119,-6.64],[-0.095,-0.563],[-0.251,-0.011],[-0.076,0.095],[-5.833,6.396],[7.184,0.206],[8.919,0],[2.335,-8.201]],"v":[[24.428,-12.627],[23.844,-14.182],[14.462,-13.655],[16.284,10.388],[2.053,10.882],[-18.254,11.35],[-23.076,7.679],[-21.827,-12.163],[-22.06,-13.868],[-22.82,-13.898],[-23.052,-13.615],[-24.426,13.862],[-1.922,14.182],[23.272,13.47]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[151.502,36.84]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-4.833,5.006],[1.889,7.582],[34.937,-5.227],[-7.975,2.094],[0,0],[2.817,-4.753],[16.837,-2.105],[1,1.5],[-0.227,1.042],[1.21,-0.129],[2.468,-9.213]],"o":[[-0.976,-9.147],[-8.65,4.552],[0.229,0.429],[3.165,-0.831],[0.704,4.996],[-3.149,5.313],[-8,1],[-2.819,-4.229],[-1.189,0.14],[3.754,8.906],[54.014,-4.622]],"v":[[43.011,0.704],[38.654,-24.579],[-29.598,-4.914],[0.877,-7.783],[36.877,-18.283],[37.86,0.24],[-18.123,17.217],[-35.623,17.217],[-38.985,-3.654],[-42.58,-3.249],[-43.011,24.579]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[228.371,24.973]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[26.523,6.306],[3.97,6.178],[-1.151,7.37],[-0.038,0.157],[1.094,0.417],[0.322,-6.619],[-70.153,-3.009],[0.09,4.544]],"o":[[-6.778,-1.612],[-4.227,-6.578],[0.026,-0.169],[-1.23,-0.443],[-1.302,4.488],[9.167,2.953],[-0.964,-4.231],[-1.201,17.219]],"v":[[-29.223,8.969],[-49.223,-1.031],[-50.044,-25.192],[-49.944,-25.676],[-53.436,-26.969],[-58.22,5.169],[58.22,23.114],[56.478,9.751]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[58.469,27.219]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-0.069,0.392],[20.132,6.372],[0.081,-2.018],[-4.347,1.326]],"o":[[-41.001,-3.228],[-0.252,1.618],[33.803,7.328],[0.049,-0.398]],"v":[[46.578,7.281],[-45.964,-9.792],[-46.578,-4.19],[46.399,8.466]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[181,181,180,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[64.022,14.551]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":0,"t":0,"b":52,"r":272},"ip":0,"op":392,"st":0},{"ddd":0,"ind":11,"ty":4,"nm":"sombra2 Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[226.199,246.234,0],"e":[226.199,246.234,0],"to":[0,0,0],"ti":[0,0,0]},{"t":203}]},"a":{"k":[67.207,242.402,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[11.581,37.177],[7.499,22.499],[-14.999,47.998],[111.021,5.799],[-21.635,-29.988],[1.671,-20.697],[4.63,-12.66],[6.476,-13.375],[0,-7.762],[-7.046,-10.276],[-4.879,-13.197],[-2.096,-15.063],[5.352,-25.547],[11.103,-14.442],[-1.791,2.641]],"o":[[-11.463,-36.799],[-8.527,-25.58],[15.435,-49.389],[34.592,12.743],[11.975,16.597],[-1.09,13.497],[-5.106,13.961],[-3.427,7.08],[0,12.5],[7.933,11.572],[5.269,14.255],[3.624,26.035],[-3.629,17.319],[7.561,-1.883],[29.499,-43.499]],"v":[[55.26,85.7],[13.845,-13.113],[48.343,-91.109],[-66.957,-242.152],[21.136,-180.517],[38.974,-122.972],[29.083,-83.669],[8.727,-43.706],[-7.773,-10.706],[18.382,33.065],[38.028,69.576],[49.306,113.537],[44.09,191.066],[22.97,242.152],[37.458,235.373]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[67.207,242.402]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":485,"r":130},"ip":0,"op":392,"st":0},{"ddd":0,"ind":12,"ty":4,"nm":"sombra1 Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[53.95,252.823,0],"e":[45.95,252.823,0],"to":[-1.33333337306976,0,0],"ti":[1.33333337306976,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[45.95,252.823,0],"e":[45.95,252.823,0],"to":[0,0,0],"ti":[0,0,0]},{"t":203}]},"a":{"k":[43.227,239.454,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[7.54,7.922],[2.986,8.339],[0.489,12.039],[-10.286,25.557],[-2.708,6.188],[-0.303,0.908],[3.837,23.364],[5.189,-35.029],[-20.452,-33.608],[-29.116,-2.506],[4.179,1.251]],"o":[[-6.143,-6.454],[-4.047,-11.306],[-1.131,-27.837],[2.523,-6.269],[-0.148,-0.737],[7.694,-23.107],[-7.57,34.982],[-5.548,37.452],[3.686,6.057],[-4.266,-1.02],[-10.283,-3.078]],"v":[[-2.251,107.236],[-15.458,84.581],[-22.895,49.483],[-5.434,-31.254],[2.443,-49.926],[2.639,-52.4],[6.436,-124.928],[-36.413,-14.484],[-16.217,113.112],[41.96,124.928],[26.044,122.628]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[44.243,353.729]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-6.857,-9.273],[-4.454,46.763],[-28.129,22.408],[-15.079,-39.2]],"o":[[-0.273,-6.831],[4,-42],[-65.14,28.707],[10.583,27.511]],"v":[[12.412,103.204],[-15.338,-4.796],[41.791,-103.204],[-26.712,44.802]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[42.041,103.454]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"}],"bounds":{"l":5,"t":0,"b":479,"r":87},"ip":0,"op":392,"st":0},{"ddd":0,"ind":13,"ty":4,"nm":"nariz Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[171.093,181.694,0],"e":[155.093,181.694,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[155.093,181.694,0],"e":[155.093,181.694,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":203,"s":[155.093,181.694,0],"e":[155.093,165.694,0],"to":[0,-2.66666674613953,0],"ti":[0,2.66666674613953,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[155.093,165.694,0],"e":[155.093,165.694,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.762},"o":{"x":0.333,"y":0},"n":"0p833_0p762_0p333_0","t":245,"s":[155.093,165.694,0],"e":[155.093,181.694,0],"to":[0,2.66666674613953,0],"ti":[0,-2.66666674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":251,"s":[155.093,181.694,0],"e":[155.093,181.694,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":300,"s":[155.093,181.694,0],"e":[155.093,165.694,0],"to":[0,-2.66666674613953,0],"ti":[0,2.66666674613953,0]},{"t":306}]},"a":{"k":[12.25,20.917,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.333,-20.667],[-12,20.667],[12,20.084],[8.397,0.917],[4.667,-18.92]]}},"nm":"Path 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[12.25,20.917]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":42,"r":25},"ip":0,"op":392,"st":0},{"ddd":0,"ind":15,"ty":4,"nm":"boca 2 Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":180},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[171.791,213.118,0],"e":[155.791,213.118,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[155.791,213.118,0],"e":[155.791,213.118,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":203,"s":[155.791,213.118,0],"e":[155.791,196.618,0],"to":[0,-2.75,0],"ti":[0,2.75,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[155.791,196.618,0],"e":[155.791,196.618,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.77},"o":{"x":0.333,"y":0},"n":"0p833_0p77_0p333_0","t":245,"s":[155.791,196.618,0],"e":[155.791,213.118,0],"to":[0,2.75,0],"ti":[0,-2.75,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":251,"s":[155.791,213.118,0],"e":[155.791,213.118,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":300,"s":[155.791,213.118,0],"e":[155.791,196.618,0],"to":[0,-2.75,0],"ti":[0,2.75,0]},{"t":306}]},"a":{"k":[9.584,2.955,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-1.821,-0.618],[-4.666,1.712],[1.82,-0.668],[4.255,1.445]],"o":[[4.712,1.6],[1.8,-0.66],[-4.209,1.544],[-1.838,-0.624]],"v":[[-7.513,1.105],[7.534,0.855],[6.737,-2.037],[-6.716,-1.787]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[188,188,166,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[9.584,2.956]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":1,"t":0,"b":6,"r":19},"ip":170,"op":392,"st":0},{"ddd":0,"ind":16,"ty":4,"nm":"boca Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[171.791,213.118,0],"e":[155.791,213.118,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"t":56.6318359375}]},"a":{"k":[9.584,2.955,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-1.821,-0.618],[-4.666,1.712],[1.82,-0.668],[4.255,1.445]],"o":[[4.712,1.6],[1.8,-0.66],[-4.209,1.544],[-1.838,-0.624]],"v":[[-7.513,1.105],[7.534,0.855],[6.737,-2.037],[-6.716,-1.787]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[188,188,166,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[9.584,2.956]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":1,"t":0,"b":6,"r":19},"ip":0,"op":169,"st":0},{"ddd":0,"ind":17,"ty":4,"nm":"lineas Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[167.676,176.027,0],"e":[159.676,176.027,0],"to":[-1.33333337306976,0,0],"ti":[1.33333337306976,0,0]},{"t":56.6318359375}]},"a":{"k":[56.5,168.25,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[-0.178,-0.379],[-0.277,-0.737],[-0.329,-1.044],[-0.315,-1.306],[-0.269,-1.515],[-0.209,-1.663],[-0.137,-1.754],[-0.089,-1.784],[-0.015,-1.759],[0.072,-1.675],[0.153,-1.532],[0.238,-1.328],[0.281,-1.064],[0.299,-0.734],[0.229,-0.353],[0,0],[-0.163,0.383],[-0.145,0.749],[-0.097,1.063],[-0.047,1.316],[-0.022,1.508],[0.012,1.648],[0.04,1.73],[0.095,1.756],[0.101,1.727],[0.102,1.645],[0.14,1.505],[0.125,1.314],[0.143,1.065],[0.138,0.755],[0.087,0.409]],"o":[[0,0],[0.179,0.378],[0.299,0.733],[0.334,1.041],[0.325,1.304],[0.288,1.51],[0.214,1.663],[0.138,1.753],[0.069,1.785],[0.018,1.759],[-0.059,1.676],[-0.153,1.533],[-0.215,1.33],[-0.273,1.065],[-0.3,0.738],[-0.257,0.334],[0,0],[0.137,-0.391],[0.136,-0.754],[0.083,-1.065],[0.046,-1.315],[-0.011,-1.509],[-0.038,-1.647],[-0.047,-1.729],[-0.053,-1.757],[-0.107,-1.728],[-0.135,-1.642],[-0.143,-1.505],[-0.151,-1.311],[-0.155,-1.062],[-0.128,-0.761],[-0.078,-0.411]],"v":[[-2.857,-28],[-2.584,-27.419],[-1.855,-25.754],[-0.903,-23.085],[0.097,-19.553],[1.022,-15.314],[1.797,-10.542],[2.377,-5.407],[2.733,-0.088],[2.839,5.243],[2.702,10.409],[2.331,15.235],[1.735,19.541],[0.955,23.146],[0.059,25.856],[-0.797,27.487],[-1.19,28],[-0.941,27.413],[-0.514,25.687],[-0.175,22.945],[0.021,19.362],[0.095,15.111],[0.06,10.362],[-0.058,5.283],[-0.262,0.041],[-0.509,-5.199],[-0.824,-10.271],[-1.189,-15.011],[-1.591,-19.252],[-2.017,-22.833],[-2.425,-25.589],[-2.737,-27.369]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[65.107,308.25]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[-0.768,-1.855],[-0.504,-1.302],[-0.286,-0.728],[-0.272,-0.819],[-0.564,-1.903],[-0.496,-2.102],[-0.252,-1.082],[-0.127,-0.548],[-0.098,-0.558],[-0.374,-2.274],[-0.111,-1.143],[-0.108,-1.13],[-0.082,-1.109],[-0.034,-1.08],[-0.013,-1.978],[0.13,-1.723],[0.286,-1.385],[0.179,-0.989],[0,0],[-0.023,2.004],[-0.049,1.385],[0.037,1.704],[0.031,1.946],[0.131,2.119],[0.122,1.086],[0.117,1.11],[0.123,1.123],[0.206,1.116],[0.328,2.208],[0.365,2.098],[0.468,1.887],[0.341,1.674],[0.343,1.354],[0.226,0.977]],"o":[[0,0],[0.38,0.929],[0.256,0.649],[0.28,0.732],[0.526,1.644],[0.62,1.892],[0.245,1.052],[0.126,0.542],[0.119,0.549],[0.368,2.239],[0.199,1.135],[0.109,1.143],[0.113,1.13],[0.072,1.109],[0.06,2.162],[-0.099,1.983],[-0.128,1.723],[-0.224,1.389],[-0.367,1.978],[0,0],[0.017,-1.002],[0.09,-1.381],[-0.061,-1.706],[-0.162,-1.946],[-0.083,-1.06],[-0.143,-1.086],[-0.122,-1.109],[-0.126,-1.121],[-0.334,-2.243],[-0.306,-2.213],[-0.419,-2.084],[-0.431,-1.899],[-0.321,-1.675],[-0.34,-1.354],[-0.442,-1.959]],"v":[[-5.551,-36],[-4.317,-33.094],[-2.963,-29.738],[-2.149,-27.669],[-1.376,-25.32],[0.285,-19.988],[1.841,-13.96],[2.586,-10.757],[2.966,-9.123],[3.254,-7.455],[4.369,-0.668],[4.762,2.762],[5.087,6.174],[5.379,9.534],[5.475,12.827],[5.551,19.058],[5.179,24.636],[4.681,29.322],[4.053,32.904],[3.449,36],[3.459,32.839],[3.536,29.239],[3.458,24.582],[3.311,19.088],[2.837,12.973],[2.594,9.748],[2.203,6.453],[1.834,3.104],[1.399,-0.262],[0.404,-6.957],[-0.738,-13.417],[-1.879,-19.447],[-3.019,-24.829],[-4.051,-29.392],[-4.882,-32.914]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[49.801,36.25]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[1.538,7.677],[29.495,3.814],[-31.333,-2],[-20.77,5.833]],"o":[[-25.462,12.677],[8.322,3.066],[19.959,1.273],[2,-5]],"v":[[53.75,-9.417],[-56.25,-5.583],[-0.25,7.751],[54.25,3.583]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[228,229,225,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[56.5,234.833]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"}],"bounds":{"l":0,"t":0,"b":337,"r":112},"ip":0,"op":392,"st":0},{"ddd":0,"ind":18,"ty":4,"nm":"ceja2 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[0],"e":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[21],"e":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":169,"s":[21],"e":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":172,"s":[4],"e":[4]},{"t":203}]},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.947,"s":[36.186,48.205,0],"e":[31.186,38.205,0],"to":[-0.83333331346512,-1.66666662693024,0],"ti":[0.83333331346512,1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.315,"s":[31.186,38.205,0],"e":[31.186,38.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[31.186,38.205,0],"e":[43.686,45.205,0],"to":[2.08333325386047,1.16666662693024,0],"ti":[-2.08333325386047,-1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[43.686,45.205,0],"e":[43.686,45.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":169,"s":[43.686,45.205,0],"e":[42.186,55.205,0],"to":[-0.25,1.66666662693024,0],"ti":[0.25,-1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":172,"s":[42.186,55.205,0],"e":[42.186,55.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":203,"s":[42.186,55.205,0],"e":[37.186,36.205,0],"to":[-0.83333331346512,-3.16666674613953,0],"ti":[0.83333331346512,3.16666674613953,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[37.186,36.205,0],"e":[37.186,36.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":245,"s":[37.186,36.205,0],"e":[37.186,40.205,0],"to":[0,0.66666668653488,0],"ti":[0,-0.66666668653488,0]},{"t":252}]},"a":{"k":[10.864,3.231,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-1.926,0.183],[-5.777,1.019],[1.892,-0.334],[5.577,-0.529]],"o":[[5.843,-0.554],[1.903,-0.335],[-5.513,0.971],[-1.909,0.181]],"v":[[-8.688,2.798],[8.711,0.245],[7.913,-2.648],[-8.688,-0.202]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[10.864,3.232]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":7,"r":21},"ip":0,"op":392,"st":0},{"ddd":0,"ind":19,"ty":4,"nm":"ceja1 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[0],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":100,"s":[-23],"e":[-23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":169,"s":[-23],"e":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":172,"s":[-3],"e":[-3]},{"t":203}]},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.947,"s":[157.81,49.205,0],"e":[156.31,56.205,0],"to":[-0.25,1.16666662693024,0],"ti":[0.25,-1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.315,"s":[156.31,56.205,0],"e":[156.31,56.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[156.31,56.205,0],"e":[147.31,44.705,0],"to":[-1.5,-1.91666662693024,0],"ti":[1.5,1.91666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[147.31,44.705,0],"e":[147.31,44.705,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":169,"s":[147.31,44.705,0],"e":[150.31,53.205,0],"to":[0.5,1.41666662693024,0],"ti":[-0.5,-1.41666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":172,"s":[150.31,53.205,0],"e":[150.31,53.205,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":203,"s":[150.31,53.205,0],"e":[153.31,34.705,0],"to":[0.5,-3.08333325386047,0],"ti":[-0.5,3.08333325386047,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[153.31,34.705,0],"e":[153.31,34.705,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":245,"s":[153.31,34.705,0],"e":[153.31,38.705,0],"to":[0,0.66666668653488,0],"ti":[0,-0.66666668653488,0]},{"t":252}]},"a":{"k":[10.864,3.231,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[1.909,0.181],[5.513,0.971],[-1.903,-0.335],[-5.843,-0.554]],"o":[[-5.577,-0.529],[-1.892,-0.334],[5.777,1.019],[1.926,0.183]],"v":[[8.688,-0.202],[-7.913,-2.648],[-8.711,0.245],[8.688,2.798]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[10.864,3.232]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":1,"t":0,"b":7,"r":21},"ip":0,"op":392,"st":0},{"ddd":0,"ind":20,"ty":4,"nm":"ppdos 5 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":350,"s":[98.363,52.265,0],"e":[98.363,53.265,0],"to":[0,0.16666667163372,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":351,"s":[98.363,53.265,0],"e":[98.363,45.265,0],"to":[0,-1.16666662693024,0],"ti":[0,1.08333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":353,"s":[98.363,45.265,0],"e":[98.363,46.765,0],"to":[0,-1.08333337306976,0],"ti":[0,-0.25,0]},{"t":354}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":350,"op":354,"st":134},{"ddd":0,"ind":21,"ty":4,"nm":"ppdos 4 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":300,"s":[98.363,52.265,0],"e":[98.363,53.265,0],"to":[0,0.16666667163372,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":301,"s":[98.363,53.265,0],"e":[98.363,45.265,0],"to":[0,-1.16666662693024,0],"ti":[0,1.08333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":303,"s":[98.363,45.265,0],"e":[98.363,46.765,0],"to":[0,-1.08333337306976,0],"ti":[0,-0.25,0]},{"t":304}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":300,"op":304,"st":84},{"ddd":0,"ind":22,"ty":4,"nm":"ppdos 3 Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":245,"s":[98.363,52.265,0],"e":[98.363,53.265,0],"to":[0,0.16666667163372,0],"ti":[0,1.16666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":246,"s":[98.363,53.265,0],"e":[98.363,45.265,0],"to":[0,-1.16666662693024,0],"ti":[0,1.08333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":248,"s":[98.363,45.265,0],"e":[98.363,46.765,0],"to":[0,-1.08333337306976,0],"ti":[0,-0.25,0]},{"t":249}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":245,"op":249,"st":29},{"ddd":0,"ind":23,"ty":4,"nm":"ppdos Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":53.544,"s":[98.363,53.265,0],"e":[98.363,67.265,0],"to":[0,2.33333325386047,0],"ti":[0,-2.33333325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":54.947,"s":[98.363,67.265,0],"e":[98.363,67.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.913,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,-1.33333337306976,0],"ti":[0,1.33333337306976,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":58.315,"s":[98.363,59.265,0],"e":[98.363,59.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":98,"s":[98.363,59.265,0],"e":[98.363,49.265,0],"to":[0,-1.66666662693024,0],"ti":[0,1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":100,"s":[98.363,49.265,0],"e":[98.363,49.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":129,"s":[98.363,49.265,0],"e":[98.363,67.265,0],"to":[0,3,0],"ti":[0,-1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":130.403,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,1.66666662693024,0],"ti":[0,3,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":134,"s":[98.363,59.265,0],"e":[98.363,49.265,0],"to":[0,-3,0],"ti":[0,1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":136,"s":[98.363,49.265,0],"e":[98.363,49.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":165,"s":[98.363,49.265,0],"e":[98.363,67.265,0],"to":[0,3,0],"ti":[0,-1.66666662693024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":166.403,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,1.66666662693024,0],"ti":[0,2.16666674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":170,"s":[98.363,59.265,0],"e":[98.363,54.265,0],"to":[0,-2.16666674613953,0],"ti":[0,0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":172,"s":[98.363,54.265,0],"e":[98.363,54.265,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":198,"s":[98.363,54.265,0],"e":[98.363,67.265,0],"to":[0,2.16666674613953,0],"ti":[0,-0.83333331346512,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":199.403,"s":[98.363,67.265,0],"e":[98.363,59.265,0],"to":[0,0.83333331346512,0],"ti":[0,3.41666674613953,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":203,"s":[98.363,59.265,0],"e":[98.363,46.765,0],"to":[0,-3.41666674613953,0],"ti":[0,2.08333325386047,0]},{"t":205}]},"a":{"k":[70.798,11.321,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[14,2.667]],"o":[[-13.333,3.333],[0,0]],"v":[[18.417,-1.667],[-18.417,-1.167]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.516,20.726]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-14,2.667]],"o":[[13.333,3.333],[0,0]],"v":[[-18.417,-2],[18.417,-0.667]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[21.515,20.226]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":{"i":[[0,0],[-7.597,2.757],[-4.408,0.408],[-3.243,-2.494],[2.285,-4.019],[2.034,0.148],[3.471,0.067],[6.927,-0.841]],"o":[[-3.754,-7.91],[4.248,-1.542],[4.195,-0.389],[3.189,2.454],[-1.197,2.108],[-3.464,-0.251],[-6.962,-0.136],[0,0]],"v":[[-18.246,9.821],[-9.816,-7.281],[3.449,-9.432],[15.595,-5.19],[19.715,7.596],[13.923,9.05],[3.492,8.834],[-17.413,9.39]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 2"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[119.345,10.072]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.472,0.067],[7.597,2.757],[4.408,0.408],[3.243,-2.494],[-2.285,-4.019],[-2.034,0.148]],"o":[[3.754,-7.91],[-4.248,-1.542],[-4.195,-0.389],[-3.189,2.454],[1.197,2.108],[3.464,-0.251]],"v":[[18.246,9.788],[9.816,-7.314],[-3.449,-9.466],[-15.595,-5.223],[-19.715,7.563],[-13.923,9.017]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[22.25,10.105]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"}],"bounds":{"l":1,"t":0,"b":22,"r":140},"ip":0,"op":208,"st":0},{"ddd":0,"ind":24,"ty":4,"nm":"ojos Outlines","parent":25,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":203,"s":[96.998,69.17,0],"e":[96.998,50.67,0],"to":[0,-3.08333325386047,0],"ti":[0,3.08333325386047,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[96.998,50.67,0],"e":[96.998,50.67,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":245,"s":[96.998,50.67,0],"e":[96.998,56.67,0],"to":[0,1,0],"ti":[0,-1,0]},{"t":251}]},"a":{"k":[54.75,7.583,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,-4.05],[2.255,0],[0,4.05],[-2.255,0]],"o":[[0,4.05],[-2.255,0],[0,-4.05],[2.255,0]],"v":[[4.084,0],[0.001,7.333],[-4.084,0],[0.001,-7.333]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[105.166,7.583]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,-4.05],[2.347,0],[0,4.05],[-2.347,0]],"o":[[0,4.05],[-2.347,0],[0,-4.05],[2.347,0]],"v":[[4.25,0],[0,7.333],[-4.25,0],[0,-7.333]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[45,45,40,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[4.5,7.583]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"}],"bounds":{"l":0,"t":0,"b":15,"r":110},"ip":0,"op":392,"st":0},{"ddd":0,"ind":25,"ty":4,"nm":"cara Outlines","parent":27,"ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":52.421,"s":[170.301,131.511,0],"e":[154.301,131.511,0],"to":[-2.66666674613953,0,0],"ti":[2.66666674613953,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56.632,"s":[154.301,131.511,0],"e":[154.301,131.511,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":203,"s":[154.301,131.511,0],"e":[154.301,113.011,0],"to":[0,-3.08333325386047,0],"ti":[0,3.08333325386047,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":209,"s":[154.301,113.011,0],"e":[154.301,113.011,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.795},"o":{"x":0.167,"y":0},"n":"0p833_0p795_0p167_0","t":245,"s":[154.301,113.011,0],"e":[154.301,131.511,0],"to":[0,3.08333325386047,0],"ti":[0,-3.08333325386047,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":251,"s":[154.301,131.511,0],"e":[154.301,131.511,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":300,"s":[154.301,131.511,0],"e":[154.301,113.011,0],"to":[0,-3.08333325386047,0],"ti":[0,3.08333325386047,0]},{"t":306}]},"a":{"k":[96.872,47.987,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[4.26,23.649],[27.288,-4.915],[7.148,-11.997],[-0.901,-1.213],[-21.667,-2.667],[0.859,-17.168],[11.413,-6.272],[14.407,3.502],[4.936,3.643],[0.478,-0.363],[-18.438,3.321]],"o":[[-4.259,-23.65],[-16.14,2.907],[0.997,1.131],[15.294,-12.521],[16.012,1.971],[-0.673,13.46],[-12.872,7.074],[-6.406,-1.558],[-0.455,0.399],[10.827,11.445],[27.289,-4.915]],"v":[[46.587,-8.899],[-10.535,-42.821],[-46.943,-18.628],[-46.943,-18.628],[10.684,-35.816],[41.024,-1.479],[21.017,31.517],[-22.983,37.517],[-42.02,28.833],[-42.02,28.833],[4.891,42.822]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[214,185,127,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[142.647,47.986]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[13.484,5.205],[5.549,11.207],[-22.328,-4.021],[-10.734,7.643]],"o":[[-9.166,-3.537],[2.948,18.724],[15.124,2.724],[-18.322,3.073]],"v":[[-8.854,7.057],[-41.135,-19.952],[0.688,19.028],[41.135,10.651]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[214,185,127,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[45.518,71.78]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 2"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-3.793,-5.121],[-0.311,0.291],[17.302,3.116],[7.033,-20.317],[-10.618,2.939],[-14.023,-8.9]],"o":[[0.303,-0.296],[-6.721,-13.26],[-25.017,-4.506],[7.104,-9.639],[15.537,-4.3],[5.266,3.341]],"v":[[45.805,14.068],[46.729,13.189],[8.884,-13.641],[-46.73,14.565],[-15.112,-3.503],[32.056,1.171]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[214,185,127,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[52.748,18.806]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 3"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[-4.26,-23.649],[-27.289,4.915],[4.261,23.65],[27.288,-4.915]],"o":[[4.26,23.649],[27.288,-4.915],[-4.259,-23.65],[-27.288,4.915]],"v":[[-49.409,8.899],[7.714,42.822],[49.409,-8.899],[-7.714,-42.821]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[139.825,47.987]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 4"},{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[4.26,-23.649],[27.289,4.915],[-4.261,23.65],[-27.288,-4.915]],"o":[[-4.26,23.649],[-27.288,-4.915],[4.259,-23.65],[27.288,4.915]],"v":[[49.41,8.899],[-7.714,42.822],[-49.409,-8.899],[7.714,-42.821]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[239,208,139,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[53.919,47.987]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 5"}],"bounds":{"l":3,"t":4,"b":92,"r":190},"ip":0,"op":392,"st":0},{"ddd":0,"ind":26,"ty":3,"nm":"Null 2","parent":3,"ks":{"o":{"k":0},"r":{"k":0},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":320,"s":[28,14,0],"e":[28,24,0],"to":[0,1.66666662693024,0],"ti":[0,-1.66666662693024,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":327,"s":[28,24,0],"e":[28,24,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":328,"s":[28,24,0],"e":[28,10,0],"to":[0,-2.33333325386047,0],"ti":[0,0.66666668653488,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":338,"s":[28,10,0],"e":[28,20,0],"to":[0,-0.66666668653488,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":349,"s":[28,20,0],"e":[28,10,0],"to":[0,0,0],"ti":[0,1.66666662693024,0]},{"t":352}]},"a":{"k":[47.458,43.75,0]},"s":{"k":[118,96,100]}},"ip":0,"op":392,"st":0},{"ddd":0,"ind":27,"ty":4,"nm":"cuerpo Outlines","parent":26,"ks":{"o":{"k":100},"r":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":170,"s":[0],"e":[0]},{"t":185}]},"p":{"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":44,"s":[47.855,-150.191,0],"e":[47.855,-127.274,0],"to":[0,3.81944441795349,0],"ti":[0,-3.81944441795349,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":48.211,"s":[47.855,-127.274,0],"e":[47.855,-127.274,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":51.579,"s":[47.855,-127.274,0],"e":[47.855,-152.274,0],"to":[0,-4.16666650772095,0],"ti":[0,3.81944441795349,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.38},"n":"0p667_1_0p167_0p38","t":56.632,"s":[47.855,-152.274,0],"e":[47.855,-150.191,0],"to":[0,-3.81944441795349,0],"ti":[0,-0.34722220897675,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":60,"s":[47.855,-150.191,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":90,"s":[47.855,-150.191,0],"e":[47.855,-138.733,0],"to":[0,1.90972220897675,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":95,"s":[47.855,-138.733,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,1.90972220897675,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":99,"s":[47.855,-150.191,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"n":"0p667_0p667_0p167_0p167","t":170,"s":[47.855,-150.191,0],"e":[47.855,-150.191,0],"to":[0,0,0],"ti":[0,0,0]},{"t":185}]},"a":{"k":[143.895,251.344,0]},"s":{"k":[84.746,104.167,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,39.257],[17.501,45.498],[-110.998,-2.883],[15.67,-50.146],[-8.527,-25.58],[-11.463,-36.799],[29.499,-43.499],[11.804,19.397],[-5.548,37.452]],"o":[[0,-22.499],[-18.803,-48.88],[115.494,3],[-14.999,47.997],[7.5,22.499],[11.581,37.177],[-13.447,19.83],[-20.451,-33.609],[6,-40.498]],"v":[[-89.342,-21.722],[-124.842,-89.719],[0.654,-248.211],[123.648,-95.218],[89.149,-17.222],[130.564,81.591],[114.146,231.264],[-112.147,229.866],[-132.342,102.27]]}},"nm":"Path 1"},{"ty":"mm","mm":4,"nm":"Merge Paths 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[255,254,230,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[143.895,251.344]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":9,"t":3,"b":497,"r":283},"ip":0,"op":392,"st":0},{"ddd":0,"ind":28,"ty":1,"nm":"Medium Gray-Cyan Solid 1","ks":{"o":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[21],"e":[100]},{"t":49}]},"r":{"k":0},"p":{"k":[339,808.5,0]},"a":{"k":[327,796.5,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":32,"s":[69,69,100],"e":[53,53,100]},{"t":49}]}},"hasMask":true,"masksProperties":[{"cl":true,"inv":false,"mode":"a","pt":{"k":{"i":[[125.369,0],[0,-28.719],[-125.369,0],[0,28.719]],"o":[[-125.369,0],[0,28.719],[125.369,0],[0,-28.719]],"v":[[331,748],[104,800],[331,852],[558,800]]}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"sw":690,"sh":913,"sc":"#5eac9d","ip":0,"op":392,"st":0},{"ddd":0,"ind":29,"ty":4,"nm":"Layer 1 Outlines","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[345,456.5,0]},"a":{"k":[345.25,456.75,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-345,456.5],[345,456.5],[345,-456.5],[-345,-456.5]]}},"nm":"Path 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[118,196,181,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[345.25,456.75]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100}}],"nm":"Group 1"}],"bounds":{"l":0,"t":0,"b":914,"r":691},"ip":0,"op":1801,"st":0}],"ip":0,"op":392,"fr":30,"w":690,"h":913} \ No newline at end of file From ee39d4dc562be734576a57d11e7e033e8af571be Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 27 Dec 2018 16:23:44 +0900 Subject: [PATCH 374/672] updated licenses info Change-Id: Idcee492bb9f823ab2a3c7c28a150bd406ce8aa4f --- COPYING | 4 +- example/demo.cpp | 4 +- example/efl_animview.cpp | 4 +- example/evasapp.cpp | 4 +- example/evasapp.h | 4 +- example/lottieview.cpp | 4 +- example/lottieviewer.cpp | 4 +- example/lottieviewtest.cpp | 4 +- example/pathtest.cpp | 4 +- example/uxsampletest.cpp | 4 +- example/vectortest.cpp | 4 +- licenses/COPYING.FLR | 208 -------------- licenses/COPYING.LGPL | 81 ++++-- licenses/COPYING.MPL | 373 ------------------------- packaging/lottie-player.spec | 2 +- src/binding/c/lottieanimation_capi.cpp | 4 +- src/lottie/lottieanimation.cpp | 4 +- src/lottie/lottieitem.cpp | 4 +- src/lottie/lottieitem.h | 4 +- src/lottie/lottieloader.cpp | 4 +- src/lottie/lottieloader.h | 4 +- src/lottie/lottiemodel.cpp | 4 +- src/lottie/lottiemodel.h | 4 +- src/lottie/lottieparser.cpp | 4 +- src/lottie/lottieparser.h | 4 +- src/vector/vbezier.cpp | 4 +- src/vector/vbezier.h | 4 +- src/vector/vbitmap.cpp | 4 +- src/vector/vbitmap.h | 4 +- src/vector/vbrush.cpp | 4 +- src/vector/vbrush.h | 4 +- src/vector/vcompositionfunctions.cpp | 4 +- src/vector/vcowptr.h | 4 +- src/vector/vdasher.cpp | 4 +- src/vector/vdasher.h | 4 +- src/vector/vdebug.cpp | 4 +- src/vector/vdebug.h | 4 +- src/vector/vdrawable.cpp | 4 +- src/vector/vdrawable.h | 4 +- src/vector/vdrawhelper.cpp | 5 +- src/vector/vdrawhelper.h | 4 +- src/vector/vdrawhelper_neon.cpp | 16 -- src/vector/velapsedtimer.cpp | 4 +- src/vector/velapsedtimer.h | 4 +- src/vector/vglobal.h | 4 +- src/vector/vinterpolator.h | 4 +- src/vector/vline.h | 4 +- src/vector/vmatrix.cpp | 4 +- src/vector/vmatrix.h | 4 +- src/vector/vpainter.cpp | 4 +- src/vector/vpainter.h | 4 +- src/vector/vpath.cpp | 4 +- src/vector/vpath.h | 4 +- src/vector/vpathmesure.cpp | 4 +- src/vector/vpathmesure.h | 4 +- src/vector/vpoint.h | 4 +- src/vector/vraster.cpp | 4 +- src/vector/vraster.h | 4 +- src/vector/vrect.cpp | 4 +- src/vector/vrect.h | 4 +- src/vector/vrle.cpp | 4 +- src/vector/vrle.h | 4 +- src/vector/vstackallocator.h | 4 +- src/vector/vtaskqueue.h | 4 +- 64 files changed, 172 insertions(+), 745 deletions(-) delete mode 100644 licenses/COPYING.FLR delete mode 100644 licenses/COPYING.MPL diff --git a/COPYING b/COPYING index bc076998d5..d630e2d6fc 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ Licensing -lottie-player basically comes with Flora license(licenses/COPYING.FLR) +lottie-player basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) but some parts of shared code are covered by different licenses. Listed below are the folder names and the license file covering it. Note that this license would cover all of the source invovled in each folders, unless @@ -9,7 +9,7 @@ for details. Dependencies and licenses: -src/vector/ licenses/COPYING.LGPL, licenses/COPYING.FLR, licenses/COPYING.MPL +src/vector/ licenses/COPYING.LGPL src/vector/freetype licenses/COPYING.FTL src/vector/pixman licenses/COPYING.PIX src/vector/lottie/rapidjson licenses/COPYING.RPD diff --git a/example/demo.cpp b/example/demo.cpp index bcc751609d..d76a3f74ac 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/efl_animview.cpp b/example/efl_animview.cpp index 5e80f06d9c..0eefd94fbb 100644 --- a/example/efl_animview.cpp +++ b/example/efl_animview.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/evasapp.cpp b/example/evasapp.cpp index e749e7cfe8..6bf4bed93d 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/evasapp.h b/example/evasapp.h index 9dfdda81d2..e4359a7b12 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 5dd3bbabbc..c98235a690 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 6a23b7ca55..3cf0019ccd 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index e0c5e2eecf..4cc75a5101 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/pathtest.cpp b/example/pathtest.cpp index e68c9dd897..c1189c829b 100644 --- a/example/pathtest.cpp +++ b/example/pathtest.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index f10851766a..e4c40883a2 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/example/vectortest.cpp b/example/vectortest.cpp index 8501860678..8cf9bceaa3 100644 --- a/example/vectortest.cpp +++ b/example/vectortest.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/licenses/COPYING.FLR b/licenses/COPYING.FLR deleted file mode 100644 index d65d4d6063..0000000000 --- a/licenses/COPYING.FLR +++ /dev/null @@ -1,208 +0,0 @@ -Copyright (C) 2018 Samsung Electronics Co., Ltd All rights reserved. - -Flora License - -Version 1.1, April, 2013 - -http://floralicense.org/license/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by -the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and -all other entities that control, are controlled by, or are -under common control with that entity. For the purposes of -this definition, "control" means (i) the power, direct or indirect, -to cause the direction or management of such entity, -whether by contract or otherwise, or (ii) ownership of fifty percent (50%) -or more of the outstanding shares, or (iii) beneficial ownership of -such entity. - -"You" (or "Your") shall mean an individual or Legal Entity -exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but -not limited to compiled object code, generated documentation, -and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, -made available under the License, as indicated by a copyright notice -that is included in or attached to the work (an example is provided -in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial -revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this License, -Derivative Works shall not include works that remain separable from, -or merely link (or bind by name) to the interfaces of, the Work and -Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original -version of the Work and any modifications or additions to that Work or -Derivative Works thereof, that is intentionally submitted to Licensor -for inclusion in the Work by the copyright owner or by an individual or -Legal Entity authorized to submit on behalf of the copyright owner. -For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or -its representatives, including but not limited to communication on -electronic mailing lists, source code control systems, and issue -tracking systems that are managed by, or on behalf of, the Licensor -for the purpose of discussing and improving the Work, but excluding -communication that is conspicuously marked or otherwise designated -in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -"Tizen Certified Platform" shall mean a software platform that complies -with the standards set forth in the Tizen Compliance Specification -and passes the Tizen Compliance Tests as defined from time to time -by the Tizen Technical Steering Group and certified by the Tizen -Association or its designated agent. - -2. Grant of Copyright License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the -Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have made, -use, offer to sell, sell, import, and otherwise transfer the Work -solely as incorporated into a Tizen Certified Platform, where such -license applies only to those patent claims licensable by such -Contributor that are necessarily infringed by their Contribution(s) -alone or by combination of their Contribution(s) with the Work solely -as incorporated into a Tizen Certified Platform to which such -Contribution(s) was submitted. If You institute patent litigation -against any entity (including a cross-claim or counterclaim -in a lawsuit) alleging that the Work or a Contribution incorporated -within the Work constitutes direct or contributory patent infringement, -then any patent licenses granted to You under this License for that -Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof pursuant to the copyright license -above, in any medium, with or without modifications, and in Source or -Object form, provided that You meet the following conditions: - - 1. You must give any other recipients of the Work or Derivative Works - a copy of this License; and - 2. You must cause any modified files to carry prominent notices stating - that You changed the files; and - 3. You must retain, in the Source form of any Derivative Works that - You distribute, all copyright, patent, trademark, and attribution - notices from the Source form of the Work, excluding those notices - that do not pertain to any part of the Derivative Works; and - 4. If the Work includes a "NOTICE" text file as part of its distribution, - then any Derivative Works that You distribute must include a readable - copy of the attribution notices contained within such NOTICE file, - excluding those notices that do not pertain to any part of - the Derivative Works, in at least one of the following places: - within a NOTICE text file distributed as part of the Derivative Works; - within the Source form or documentation, if provided along with the - Derivative Works; or, within a display generated by the Derivative Works, - if and wherever such third-party notices normally appear. - The contents of the NOTICE file are for informational purposes only - and do not modify the License. You may add Your own attribution notices - within Derivative Works that You distribute, alongside or as an addendum - to the NOTICE text from the Work, provided that such additional attribution - notices cannot be construed as modifying the License. You may add Your own - copyright statement to Your modifications and may provide additional or - different license terms and conditions for use, reproduction, or - distribution of Your modifications, or for any such Derivative Works - as a whole, provided Your use, reproduction, and distribution of - the Work otherwise complies with the conditions stated in this License - and your own copyright statement or terms and conditions do not conflict - the conditions stated in the License including section 3. - -5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work -by You to the Licensor shall be under the terms and conditions of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any -risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising as a -result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing -the Work or Derivative Works thereof, You may choose to offer, -and charge a fee for, acceptance of support, warranty, indemnity, -or other liability obligations and/or rights consistent with this -License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf -of any other Contributor, and only if You agree to indemnify, -defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason -of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Flora License to your work - -To apply the Flora License to your work, attach the following -boilerplate notice, with the fields enclosed by brackets "[]" -replaced with your own identifying information. (Don't include -the brackets!) The text should be enclosed in the appropriate -comment syntax for the file format. We also recommend that a -file or class name and description of purpose be included on the -same "printed page" as the copyright notice for easier -identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Flora License, Version 1.1 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://floralicense.org/license/ - - 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. - diff --git a/licenses/COPYING.LGPL b/licenses/COPYING.LGPL index d72fb2d612..9a30e8ce81 100644 --- a/licenses/COPYING.LGPL +++ b/licenses/COPYING.LGPL @@ -1,19 +1,13 @@ -Copyright (C) EFL developers (see AUTHORS) + GNU LESSER GENERAL PUBLIC LICENSE -This library is free software; you can redistribute it and/or modify it -under the terms of the GNU Lesser General Public License as published by the -Free Software Foundation; either version 2.1 of the License. + The Qt GUI Toolkit is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + Contact: Nokia Corporation (qt-info@nokia.com) -This library is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. + You may use, distribute and copy the Qt GUI Toolkit under the terms of + GNU Lesser General Public License version 2.1, which is displayed below. + +------------------------------------------------------------------------- -Below is a copy of the GNU Lesser General Public License that is distributed -along with this library. If you do not have a copy below, write to the Free -Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA - GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 @@ -224,21 +218,6 @@ with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent modules, -and to copy and distribute the resulting executable under terms of your -choice, provided that you also meet, for each linked independent module, -the terms and conditions of the license of that module. An independent -module is a module which is not derived from or based on this library. -If you modify this library, you may extend this exception to your version -of the library, but you are not obliged to do so. If you do not wish to -do so, delete this exception statement from your version. - 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so @@ -487,3 +466,49 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/licenses/COPYING.MPL b/licenses/COPYING.MPL deleted file mode 100644 index 14e2f777f6..0000000000 --- a/licenses/COPYING.MPL +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index a21f6e2ea2..3e0bc7d2d4 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -3,7 +3,7 @@ Summary: lottie player library Version: 0.0.1 Release: 1 Group: UI Framework/Services -License: Apache-2.0 +License: LGPL-v2.1 URL: http://www.tizen.org/ Source0: %{name}-%{version}.tar.gz BuildRequires: cmake diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 34428c1b7c..ea8f14c023 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 62bb4280db..8d8032ebc6 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index d7c6a5aa04..4c5a0109d3 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 1c74f7c89b..3c5702e009 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index d3474a9d80..7fdedf460a 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index e2520c8dcd..5a0a2fb9a3 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 5603419fa1..03a02bd443 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index ee55e2b498..810268095b 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index f8043f3e36..66871c0b25 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/lottie/lottieparser.h b/src/lottie/lottieparser.h index f17c241fa4..deb2aaff59 100644 --- a/src/lottie/lottieparser.h +++ b/src/lottie/lottieparser.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index 2dc1b4ba49..97a33de36b 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index 9c15ec414f..3b220c179e 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 190a7e46b8..4de4aa14df 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index 29c403704a..6c5492599e 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index 83cc762121..95000654fd 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index 65fb7647bf..66dcb0eac6 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vcompositionfunctions.cpp b/src/vector/vcompositionfunctions.cpp index df52ce0e2c..76482d516a 100644 --- a/src/vector/vcompositionfunctions.cpp +++ b/src/vector/vcompositionfunctions.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vcowptr.h b/src/vector/vcowptr.h index a21b46b655..d81f33bac0 100644 --- a/src/vector/vcowptr.h +++ b/src/vector/vcowptr.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index ef78f63b8f..cc4a8b8f66 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 56d97f17a0..2586707e4f 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 54a08a7eb0..9dbee5b7ef 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdebug.h b/src/vector/vdebug.h index 797c011da0..d3b2fa04cf 100644 --- a/src/vector/vdebug.h +++ b/src/vector/vdebug.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 40b1d65e2e..2a9083c9b8 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index dd9c5ca22b..b4ce28c7c2 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index a9b50cfb6d..1d0920ea46 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - #include "vdrawhelper.h" #include #include diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index e7a84b4b25..170587725a 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vdrawhelper_neon.cpp b/src/vector/vdrawhelper_neon.cpp index f175a15a88..806a8b566f 100644 --- a/src/vector/vdrawhelper_neon.cpp +++ b/src/vector/vdrawhelper_neon.cpp @@ -1,19 +1,3 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. - */ - #if defined(__ARM_NEON__) #include "vdrawhelper.h" diff --git a/src/vector/velapsedtimer.cpp b/src/vector/velapsedtimer.cpp index a0aec70644..8f1ed8c218 100644 --- a/src/vector/velapsedtimer.cpp +++ b/src/vector/velapsedtimer.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/velapsedtimer.h b/src/vector/velapsedtimer.h index bf775aacd1..bd4510a928 100644 --- a/src/vector/velapsedtimer.h +++ b/src/vector/velapsedtimer.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 4af77753f8..f05b2fd0cb 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vinterpolator.h b/src/vector/vinterpolator.h index 4bc4f34e37..d585dbc6fe 100644 --- a/src/vector/vinterpolator.h +++ b/src/vector/vinterpolator.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vline.h b/src/vector/vline.h index d063d5bc7a..c2eca98f55 100644 --- a/src/vector/vline.h +++ b/src/vector/vline.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index dd7fb973b6..909dff3d20 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index fcbf651083..2379964977 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 8b5af0c147..e4ca0ebdd6 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index bdbb398d75..8b86b9735f 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 93d6cd98da..d1333b72be 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 22b052bcfa..894c3764b4 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index cc780be683..a347f7cf69 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 6ff63f5fa2..1fe4b897f0 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index af47045def..a98a7740be 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index ff5133b69f..a901a2d010 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vraster.h b/src/vector/vraster.h index 086f716cfd..fbddc46cd3 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vrect.cpp b/src/vector/vrect.cpp index 3787d2f212..4886d604e3 100644 --- a/src/vector/vrect.cpp +++ b/src/vector/vrect.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vrect.h b/src/vector/vrect.h index 0a48d744e4..4b09020fd6 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index fa66cbc54d..af228c4961 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vrle.h b/src/vector/vrle.h index ff0838c598..ef9f047ea5 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vstackallocator.h b/src/vector/vstackallocator.h index ef748536d7..64eb929676 100644 --- a/src/vector/vstackallocator.h +++ b/src/vector/vstackallocator.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h index d232149b82..9046b31e18 100644 --- a/src/vector/vtaskqueue.h +++ b/src/vector/vtaskqueue.h @@ -1,11 +1,11 @@ /* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the LGPL License, Version 2.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * https://www.gnu.org/licenses/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, From 0165427d9b8965713ceb87c0796d1a66bb1ac074 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 28 Dec 2018 18:13:12 +0900 Subject: [PATCH 375/672] updated licenses info. Change-Id: Ib157ad848a98c34e6e7d67c4672b36447966addc --- example/demo.cpp | 28 ++++++------ example/efl_animview.cpp | 28 ++++++------ example/evasapp.cpp | 28 ++++++------ example/evasapp.h | 28 ++++++------ example/lottieview.cpp | 28 ++++++------ example/lottieview.h | 28 ++++++------ example/lottieviewer.cpp | 28 ++++++------ example/lottieviewtest.cpp | 28 ++++++------ example/pathtest.cpp | 28 ++++++------ example/uxsampletest.cpp | 28 ++++++------ example/vectortest.cpp | 28 ++++++------ inc/lottieanimation.h | 28 ++++++------ inc/lottieanimation_capi.h | 28 ++++++------ inc/lottiecommon.h | 28 ++++++------ src/binding/c/lottieanimation_capi.cpp | 28 ++++++------ src/lottie/lottieanimation.cpp | 28 ++++++------ src/lottie/lottieitem.cpp | 28 ++++++------ src/lottie/lottieitem.h | 28 ++++++------ src/lottie/lottieloader.cpp | 28 ++++++------ src/lottie/lottieloader.h | 28 ++++++------ src/lottie/lottiemodel.cpp | 28 ++++++------ src/lottie/lottiemodel.h | 28 ++++++------ src/lottie/lottieparser.cpp | 29 ++++++------ src/lottie/lottieparser.h | 28 ++++++------ src/vector/pixman/vregion.h | 28 ++++++------ src/vector/vbezier.cpp | 28 ++++++------ src/vector/vbezier.h | 28 ++++++------ src/vector/vbitmap.cpp | 28 ++++++------ src/vector/vbitmap.h | 28 ++++++------ src/vector/vbrush.cpp | 28 ++++++------ src/vector/vbrush.h | 28 ++++++------ src/vector/vcompositionfunctions.cpp | 28 ++++++------ src/vector/vcowptr.h | 28 ++++++------ src/vector/vdasher.cpp | 28 ++++++------ src/vector/vdasher.h | 28 ++++++------ src/vector/vdebug.cpp | 28 ++++++------ src/vector/vdebug.h | 28 ++++++------ src/vector/vdrawable.cpp | 28 ++++++------ src/vector/vdrawable.h | 28 ++++++------ src/vector/vdrawhelper.cpp | 63 ++++++++++++++++++++------ src/vector/vdrawhelper.h | 28 ++++++------ src/vector/velapsedtimer.cpp | 28 ++++++------ src/vector/velapsedtimer.h | 28 ++++++------ src/vector/vglobal.h | 28 ++++++------ src/vector/vinterpolator.h | 28 ++++++------ src/vector/vline.h | 28 ++++++------ src/vector/vmatrix.cpp | 28 ++++++------ src/vector/vmatrix.h | 28 ++++++------ src/vector/vpainter.cpp | 28 ++++++------ src/vector/vpainter.h | 28 ++++++------ src/vector/vpath.cpp | 28 ++++++------ src/vector/vpath.h | 28 ++++++------ src/vector/vpathmesure.cpp | 28 ++++++------ src/vector/vpathmesure.h | 28 ++++++------ src/vector/vpoint.h | 28 ++++++------ src/vector/vraster.cpp | 28 ++++++------ src/vector/vraster.h | 28 ++++++------ src/vector/vrect.cpp | 28 ++++++------ src/vector/vrect.h | 28 ++++++------ src/vector/vrle.cpp | 28 ++++++------ src/vector/vrle.h | 28 ++++++------ src/vector/vstackallocator.h | 28 ++++++------ src/vector/vtaskqueue.h | 28 ++++++------ 63 files changed, 980 insertions(+), 820 deletions(-) diff --git a/example/demo.cpp b/example/demo.cpp index d76a3f74ac..0af0b763fd 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "evasapp.h" diff --git a/example/efl_animview.cpp b/example/efl_animview.cpp index 0eefd94fbb..a1f0acaf46 100644 --- a/example/efl_animview.cpp +++ b/example/efl_animview.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define EFL_BETA_API_SUPPORT 1 diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 6bf4bed93d..c9170b8deb 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "evasapp.h" diff --git a/example/evasapp.h b/example/evasapp.h index e4359a7b12..9639664d2b 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef EVASAPP_H diff --git a/example/lottieview.cpp b/example/lottieview.cpp index c98235a690..ff130ca006 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include"lottieview.h" diff --git a/example/lottieview.h b/example/lottieview.h index 8655dafbed..3622505026 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LOTTIEVIEW_H diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 3cf0019ccd..92f90bb418 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 4cc75a5101..8eb4dbb057 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "evasapp.h" diff --git a/example/pathtest.cpp b/example/pathtest.cpp index c1189c829b..454f4b7649 100644 --- a/example/pathtest.cpp +++ b/example/pathtest.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "evasapp.h" diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index e4c40883a2..73d8ce8653 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include"evasapp.h" diff --git a/example/vectortest.cpp b/example/vectortest.cpp index 8cf9bceaa3..8038b585a3 100644 --- a/example/vectortest.cpp +++ b/example/vectortest.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index 1d43b3ef2d..1d3efce171 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _LOTTIE_ANIMATION_H_ diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index 61d274d9c4..ded215b1ec 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _LOTTIE_ANIMATION_CAPI_H_ diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index 4c7acac62b..df6552adc2 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _LOTTIE_COMMON_H_ diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index ea8f14c023..084b994f28 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "lottieanimation.h" diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 8d8032ebc6..540b4d8ab4 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "lottieanimation.h" diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 4c5a0109d3..c70f9c4e49 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "lottieitem.h" diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 3c5702e009..cb6f0bf617 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LOTTIEITEM_H diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index 7fdedf460a..ac2da78900 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "lottieloader.h" diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index 5a0a2fb9a3..1f6f3d5258 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LOTTIELOADER_H diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 03a02bd443..4139dfe9c9 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "lottiemodel.h" diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 810268095b..23e6171270 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LOTModel_H diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 66871c0b25..57324531fd 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1,20 +1,21 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "lottieparser.h" diff --git a/src/lottie/lottieparser.h b/src/lottie/lottieparser.h index deb2aaff59..3c63f65c23 100644 --- a/src/lottie/lottieparser.h +++ b/src/lottie/lottieparser.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LOTTIEPARSER_H diff --git a/src/vector/pixman/vregion.h b/src/vector/pixman/vregion.h index 508b6c3579..ecb17f2537 100644 --- a/src/vector/pixman/vregion.h +++ b/src/vector/pixman/vregion.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VREGION_H diff --git a/src/vector/vbezier.cpp b/src/vector/vbezier.cpp index 97a33de36b..e8b931c4a5 100644 --- a/src/vector/vbezier.cpp +++ b/src/vector/vbezier.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vbezier.h" diff --git a/src/vector/vbezier.h b/src/vector/vbezier.h index 3b220c179e..b07e7824da 100644 --- a/src/vector/vbezier.h +++ b/src/vector/vbezier.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VBEZIER_H diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 4de4aa14df..a72d56e958 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vbitmap.h" diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index 6c5492599e..bdf2e7687a 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VBITMAP_H diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index 95000654fd..c1a3dc9abb 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vbrush.h" diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index 66dcb0eac6..f6a07d4992 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VBRUSH_H diff --git a/src/vector/vcompositionfunctions.cpp b/src/vector/vcompositionfunctions.cpp index 76482d516a..c160419b5b 100644 --- a/src/vector/vcompositionfunctions.cpp +++ b/src/vector/vcompositionfunctions.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vdrawhelper.h" diff --git a/src/vector/vcowptr.h b/src/vector/vcowptr.h index d81f33bac0..dcc283ad1e 100644 --- a/src/vector/vcowptr.h +++ b/src/vector/vcowptr.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VCOWPTR_H diff --git a/src/vector/vdasher.cpp b/src/vector/vdasher.cpp index cc4a8b8f66..d1135cc47f 100644 --- a/src/vector/vdasher.cpp +++ b/src/vector/vdasher.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vdasher.h" diff --git a/src/vector/vdasher.h b/src/vector/vdasher.h index 2586707e4f..41769f407b 100644 --- a/src/vector/vdasher.h +++ b/src/vector/vdasher.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VDASHER_H diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 9dbee5b7ef..bd7a3210ba 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vdebug.h" diff --git a/src/vector/vdebug.h b/src/vector/vdebug.h index d3b2fa04cf..052dd8fcdb 100644 --- a/src/vector/vdebug.h +++ b/src/vector/vdebug.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VDEBUG_H diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index 2a9083c9b8..d23dabb114 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vdrawable.h" diff --git a/src/vector/vdrawable.h b/src/vector/vdrawable.h index b4ce28c7c2..5b0eac1f3b 100644 --- a/src/vector/vdrawable.h +++ b/src/vector/vdrawable.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VDRAWABLE_H diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 1d0920ea46..c682edbfb3 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -1,18 +1,55 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "vdrawhelper.h" #include #include diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 170587725a..7dc288da1a 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VDRAWHELPER_H diff --git a/src/vector/velapsedtimer.cpp b/src/vector/velapsedtimer.cpp index 8f1ed8c218..0dedda37a9 100644 --- a/src/vector/velapsedtimer.cpp +++ b/src/vector/velapsedtimer.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "velapsedtimer.h" diff --git a/src/vector/velapsedtimer.h b/src/vector/velapsedtimer.h index bd4510a928..108fd66549 100644 --- a/src/vector/velapsedtimer.h +++ b/src/vector/velapsedtimer.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VELAPSEDTIMER_H diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index f05b2fd0cb..3ff804d995 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VGLOBAL_H diff --git a/src/vector/vinterpolator.h b/src/vector/vinterpolator.h index d585dbc6fe..77aaaae26e 100644 --- a/src/vector/vinterpolator.h +++ b/src/vector/vinterpolator.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VINTERPOLATOR_H diff --git a/src/vector/vline.h b/src/vector/vline.h index c2eca98f55..f466e31772 100644 --- a/src/vector/vline.h +++ b/src/vector/vline.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VLINE_H diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index 909dff3d20..f2dc2570b6 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vmatrix.h" diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 2379964977..2d49f494bd 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VMATRIX_H diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index e4ca0ebdd6..e8f54b251e 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vpainter.h" diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index 8b86b9735f..d4fbe9f22e 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VPAINTER_H diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index d1333b72be..300420616a 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vpath.h" diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 894c3764b4..598f10ab72 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VPATH_H diff --git a/src/vector/vpathmesure.cpp b/src/vector/vpathmesure.cpp index a347f7cf69..2aa4227d97 100644 --- a/src/vector/vpathmesure.cpp +++ b/src/vector/vpathmesure.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vpathmesure.h" diff --git a/src/vector/vpathmesure.h b/src/vector/vpathmesure.h index 1fe4b897f0..de3e824052 100644 --- a/src/vector/vpathmesure.h +++ b/src/vector/vpathmesure.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VPATHMESURE_H diff --git a/src/vector/vpoint.h b/src/vector/vpoint.h index a98a7740be..1a84cb17cb 100644 --- a/src/vector/vpoint.h +++ b/src/vector/vpoint.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VPOINT_H diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index a901a2d010..2f98798f7a 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vraster.h" diff --git a/src/vector/vraster.h b/src/vector/vraster.h index fbddc46cd3..f710c19765 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VRASTER_H diff --git a/src/vector/vrect.cpp b/src/vector/vrect.cpp index 4886d604e3..c044a53e4b 100644 --- a/src/vector/vrect.cpp +++ b/src/vector/vrect.cpp @@ -1,15 +1,17 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ diff --git a/src/vector/vrect.h b/src/vector/vrect.h index 4b09020fd6..b38746f2df 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VRECT_H diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index af228c4961..bcf1c4919f 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vrle.h" diff --git a/src/vector/vrle.h b/src/vector/vrle.h index ef9f047ea5..b91e935b7a 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VRLE_H diff --git a/src/vector/vstackallocator.h b/src/vector/vstackallocator.h index 64eb929676..5989133978 100644 --- a/src/vector/vstackallocator.h +++ b/src/vector/vstackallocator.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VSTACK_ALLOCATOR_H diff --git a/src/vector/vtaskqueue.h b/src/vector/vtaskqueue.h index 9046b31e18..62c04360dc 100644 --- a/src/vector/vtaskqueue.h +++ b/src/vector/vtaskqueue.h @@ -1,17 +1,19 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the LGPL License, Version 2.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/ - * - * 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. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VTASKQUEUE_H From ea21c77dfecbd4027bbac2dff2fdfda57b86a99c Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 2 Jan 2019 18:10:36 +0900 Subject: [PATCH 376/672] packaging: packaging licensing properly. As fedora guidelines, %license is the reserved keyword to install copyright files. We don't need to copy them manually. Change-Id: I21d353f0fdecb86e1a662f8e336db8d84753da87 --- packaging/lottie-player.spec | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packaging/lottie-player.spec b/packaging/lottie-player.spec index 3e0bc7d2d4..f2bf9e4679 100644 --- a/packaging/lottie-player.spec +++ b/packaging/lottie-player.spec @@ -52,15 +52,11 @@ make %{?jobs:-j%jobs} %install %make_install -mkdir -p %{buildroot}/%{_datadir}/license -cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/%{_datadir}/license/COPYING -cp %{_builddir}/%{buildsubdir}/licenses/* %{buildroot}/%{_datadir}/license/ - %files %defattr(-,root,root,-) %{_libdir}/liblottie-player.so.* -%{_datadir}/license/COPYING* %manifest %{name}.manifest +%license COPYING licenses/COPYING* %files devel %defattr(-,root,root,-) From b279733f824391ce4f40062d909223fa999e1dc1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 3 Jan 2019 15:17:55 +0900 Subject: [PATCH 377/672] lottie/parser: parse precomp layer's with and height attribute. Change-Id: Ib975f753424acae422889b2ade611d664fe07392 --- src/lottie/lottiemodel.h | 2 ++ src/lottie/lottieparser.cpp | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 23e6171270..47faccf225 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -363,6 +363,7 @@ public: LottieColor solidColor() const noexcept{return mSolidLayer.mColor;} bool autoOrient() const noexcept{return mAutoOrient;} int timeRemap(int frameNo) const; + VSize layerSize() const {return mLayerSize;} public: struct SolidLayer { int mWidth{0}; @@ -378,6 +379,7 @@ public: long mInFrame{0}; long mOutFrame{0}; long mStartFrame{0}; + VSize mLayerSize; LottieBlendMode mBlendMode{LottieBlendMode::Normal}; float mTimeStreatch{1.0f}; std::string mPreCompRefId; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 57324531fd..06d76d192e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -804,6 +804,10 @@ std::shared_ptr LottieParserImpl::parseLayer() layer->mTransform = parseTransformObject(ddd); } else if (0 == strcmp(key, "shapes")) { parseShapesAttr(layer); + } else if (0 == strcmp(key, "w")) { + layer->mLayerSize.setWidth(GetInt()); + } else if (0 == strcmp(key, "h")) { + layer->mLayerSize.setHeight(GetInt()); } else if (0 == strcmp(key, "sw")) { layer->mSolidLayer.mWidth = GetInt(); } else if (0 == strcmp(key, "sh")) { @@ -1944,7 +1948,10 @@ public: << "Composition:: a: " << !obj->isStatic() << ", v: " << obj->mVersion << ", stFm: " << obj->startFrame() - << ", endFm: " << obj->endFrame()<< "\n"; + << ", endFm: " << obj->endFrame() + << ", W: " << obj->size().width() + << ", H: " << obj->size().height() + << "\n"; level.append("\t"); visit(obj->mRootLayer.get(), level); level.erase(level.end() - 1, level.end()); @@ -1965,6 +1972,8 @@ public: << ", ts:" << obj->mTimeStreatch << ", ao:" << obj->autoOrient() << ", ddd:" << obj->mTransform->ddd() + << ", W:" << obj->layerSize().width() + << ", H:" << obj->layerSize().height() << "\n"; visitChildren(static_cast(obj), level); vDebug << level From 1787aaf4abdabd23730e4c8519ccb95a85cc25e2 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 3 Jan 2019 16:41:15 +0900 Subject: [PATCH 378/672] lottie/render: Added Clipper for nested composition layer. Change-Id: Ic9a9b390863dc05a0391a3f17acc80ab912d172a --- src/lottie/lottieitem.cpp | 40 +++++++++++++++++++++++++++++++++++++++ src/lottie/lottieitem.h | 14 ++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index c70f9c4e49..3a9bfbdf10 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -458,6 +458,11 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) // 3. keep the layer in back-to-front order. // as lottie model keeps the data in front-toback-order. std::reverse(mLayers.begin(), mLayers.end()); + + // 4. check if its a nested composition + if (!layerModel->layerSize().empty()) { + mClipper = std::make_unique(layerModel->layerSize()); + } } void LOTCompLayerItem::updateStaticProperty() @@ -518,6 +523,14 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const mask = inheritMask; } + if (mClipper) { + if (mask.empty()) { + mask = mClipper->rle(); + } else { + mask = mClipper->rle() & mask; + } + } + LOTLayerItem *matteLayer = nullptr; for (const auto &layer : mLayers) { if (!matteLayer && layer->hasMatte()) { @@ -536,8 +549,35 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const } } +void LOTClipperItem::update(const VMatrix &matrix) +{ + mPath.reset(); + mPath.addRect(VRectF(0,0, mSize.width(), mSize.height())); + mPath.transform(matrix); + + VPath tmp = mPath; + + if (!mRleFuture) mRleFuture = std::make_shared>(); + + mRleFuture->reuse(); + VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle)); + mRle = VRle(); +} + +VRle LOTClipperItem::rle() +{ + if (mRleFuture && mRleFuture->valid()) { + mRle = mRleFuture->get(); + } + return mRle; +} + void LOTCompLayerItem::updateContent() { + if (mClipper && flag().testFlag(DirtyFlagBit::Matrix)) { + mClipper->update(combinedMatrix()); + } + for (const auto &layer : mLayers) { layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(), combinedMatrix(), combinedAlpha()); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index cb6f0bf617..47c816cb1e 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -71,6 +71,19 @@ private: class LOTLayerMaskItem; +class LOTClipperItem +{ +public: + LOTClipperItem(VSize size): mSize(size){} + void update(const VMatrix &matrix); + VRle rle(); +public: + VSize mSize; + VPath mPath; + RleShare mRleFuture; + VRle mRle; +}; + typedef vFlag DirtyFlag; class LOTLayerItem { @@ -127,6 +140,7 @@ protected: private: std::vector mLayersCNode; std::vector> mLayers; + std::unique_ptr mClipper; }; class LOTSolidLayerItem: public LOTLayerItem From 15429d2a7115207c79104412a7c7eab0616bfcde Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 3 Jan 2019 16:57:50 +0900 Subject: [PATCH 379/672] lottie/capi: updated cliper info in layernode. Change-Id: I338dc65c6ccf2a1952f2c457ba9168faa242e08c --- inc/lottiecommon.h | 7 +++++++ src/lottie/lottieitem.cpp | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index df6552adc2..d35fcdf881 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -194,6 +194,13 @@ typedef struct LOTLayerNode { unsigned int size; } mMaskList; + struct { + const float *ptPtr; + int ptCount; + const char* elmPtr; + int elmCount; + } mClipPath; + struct { struct LOTLayerNode **ptr; unsigned int size; diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 3a9bfbdf10..886b8c0011 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -188,6 +188,10 @@ void LOTLayerItem::buildLayerNode() mLayerCNode->mNodeList.size = 0; mLayerCNode->mMatte = MatteNone; mLayerCNode->mVisible = 0; + mLayerCNode->mClipPath.ptPtr = nullptr; + mLayerCNode->mClipPath.elmPtr = nullptr; + mLayerCNode->mClipPath.ptCount = 0; + mLayerCNode->mClipPath.elmCount = 0; } mLayerCNode->mVisible = visible(); // update matte @@ -477,6 +481,16 @@ void LOTCompLayerItem::updateStaticProperty() void LOTCompLayerItem::buildLayerNode() { LOTLayerItem::buildLayerNode(); + if (mClipper) { + const std::vector &elm = mClipper->mPath.elements(); + const std::vector & pts = mClipper->mPath.points(); + const float *ptPtr = reinterpret_cast(pts.data()); + const char * elmPtr = reinterpret_cast(elm.data()); + layerNode()->mClipPath.ptPtr = ptPtr; + layerNode()->mClipPath.elmPtr = elmPtr; + layerNode()->mClipPath.ptCount = 2 * pts.size(); + layerNode()->mClipPath.elmCount = elm.size(); + } if (mLayers.size() != mLayersCNode.size()) { for (const auto &layer : mLayers) { layer->buildLayerNode(); From 2c2836c86961780920213b556e4b610b9a85329f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 4 Jan 2019 13:22:33 +0900 Subject: [PATCH 380/672] lottie/vector: refactor VBitmap class to use shared_ptr for refcount implementation. Change-Id: I2a5bca2cd6a86a1f3ac69eb7799ee46b784f61cf --- src/lottie/lottieitem.cpp | 6 +- src/vector/vbitmap.cpp | 293 +++++++++++++------------------------ src/vector/vbitmap.h | 43 +++--- src/vector/vdrawhelper.cpp | 3 +- 4 files changed, 121 insertions(+), 224 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 886b8c0011..11a6489c38 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -118,9 +118,9 @@ const LOTLayerNode * LOTCompItem::renderTree() const bool LOTCompItem::render(const lottie::Surface &surface) { - VBitmap bitmap((uchar *)surface.buffer(), surface.width(), surface.height(), - surface.bytesPerLine(), VBitmap::Format::ARGB32_Premultiplied, - nullptr, nullptr); + VBitmap bitmap(reinterpret_cast(surface.buffer()), + surface.width(), surface.height(), + surface.bytesPerLine(), VBitmap::Format::ARGB32_Premultiplied); /* schedule all preprocess task for this frame at once. */ diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index a72d56e958..6fdbbd4064 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -22,228 +22,135 @@ V_BEGIN_NAMESPACE -struct VBitmapData { - ~VBitmapData(); - VBitmapData(); - static VBitmapData *create(int width, int height, VBitmap::Format format); - RefCount ref; - int width; - int height; - int depth; - int stride; - int nBytes; - VBitmap::Format format; - uchar * data; - VBitmapCleanupFunction cleanupFunction; - void * cleanupInfo; - uint ownData : 1; - uint roData : 1; +struct VBitmap::Impl { + uchar * mData{nullptr}; + uint mWidth{0}; + uint mHeight{0}; + uint mStride{0}; + uint mBytes{0}; + VBitmap::Format mFormat{VBitmap::Format::Invalid}; + bool mOwnData; + bool mRoData; + + Impl() = delete ; + + Impl(uint width, uint height, VBitmap::Format format): + mOwnData(true), + mRoData(false) + { + uint depth = Impl::depth(format); + uint stride = ((width * depth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4) + + mWidth = width; + mHeight = height; + mFormat = format; + mStride = stride; + mBytes = mStride * mHeight; + mData = reinterpret_cast(::operator new(mBytes)); + + if (!mData) { + // handle malloc failure + ; + } + } + + Impl(uchar *data, uint w, uint h, uint bytesPerLine, VBitmap::Format format): + mOwnData(false), + mRoData(false) + { + mWidth = w; + mHeight = h; + mFormat = format; + mStride = bytesPerLine; + mBytes = mStride * mHeight; + mData = data; + } + + ~Impl() + { + if (mOwnData && mData) ::operator delete(mData); + } + + uint stride() const {return mStride;} + uint width() const {return mWidth;} + uint height() const {return mHeight;} + VBitmap::Format format() const {return mFormat;} + uchar* data() { return mData;} + + static uint depth(VBitmap::Format format) + { + uint depth = 1; + switch (format) { + case VBitmap::Format::Alpha8: + depth = 8; + break; + case VBitmap::Format::ARGB32: + case VBitmap::Format::ARGB32_Premultiplied: + depth = 32; + break; + default: + break; + } + return depth; + } + void fill(uint /*pixel*/) + { + //@TODO + } }; -VBitmapData::~VBitmapData() +VBitmap::VBitmap(uint width, uint height, VBitmap::Format format) { - if (cleanupFunction) cleanupFunction(cleanupInfo); - if (data && ownData) free(data); - data = 0; + if (width <=0 || height <=0 || format == Format::Invalid) return; + + mImpl = std::make_shared(width, height, format); + } -VBitmapData::VBitmapData() - : ref(0), - width(0), - height(0), - depth(0), - stride(0), - nBytes(0), - format(VBitmap::Format::ARGB32), - data(nullptr), - cleanupFunction(0), - cleanupInfo(0), - ownData(true), - roData(false) +VBitmap::VBitmap(uchar *data, uint width, uint height, uint bytesPerLine, + VBitmap::Format format) { + if (!data || + width <=0 || height <=0 || + bytesPerLine <=0 || + format == Format::Invalid) return; + + mImpl = std::make_shared(data, width, height, bytesPerLine, format); } -VBitmapData *VBitmapData::create(int width, int height, VBitmap::Format format) +uint VBitmap::stride() const { - if ((width <= 0) || (height <= 0) || format == VBitmap::Format::Invalid) - return nullptr; - - int depth = 1; - switch (format) { - case VBitmap::Format::Alpha8: - depth = 8; - VECTOR_FALLTHROUGH - case VBitmap::Format::ARGB32: - case VBitmap::Format::ARGB32_Premultiplied: - depth = 32; - break; - default: - break; - } - - const int stride = ((width * depth + 31) >> 5) - << 2; // bytes per scanline (must be multiple of 4) - - VBitmapData *d = new VBitmapData; - - d->width = width; - d->height = height; - d->depth = depth; - d->format = format; - d->stride = stride; - d->nBytes = d->stride * height; - d->data = (uchar *)malloc(d->nBytes); - - if (!d->data) { - delete d; - return 0; - } - - return d; + return mImpl ? mImpl->stride() : 0; } -inline void VBitmap::cleanUp(VBitmapData *d) +uint VBitmap::width() const { - delete d; + return mImpl ? mImpl->width() : 0; } -void VBitmap::detach() +uint VBitmap::height() const { - if (d) { - if (d->ref.isShared() || d->roData) *this = copy(); - } + return mImpl ? mImpl->height() : 0; } -VBitmap::~VBitmap() +uchar *VBitmap::data() { - if (!d) return; - - if (!d->ref.deref()) cleanUp(d); + return mImpl ? mImpl->data() : nullptr; } -VBitmap::VBitmap() : d(nullptr) {} - -VBitmap::VBitmap(const VBitmap &other) +bool VBitmap::valid() const { - d = other.d; - if (d) d->ref.ref(); -} - -VBitmap::VBitmap(VBitmap &&other) : d(other.d) -{ - other.d = nullptr; -} - -VBitmap &VBitmap::operator=(const VBitmap &other) -{ - if (!d) { - d = other.d; - if (d) d->ref.ref(); - } else { - if (!d->ref.deref()) cleanUp(d); - other.d->ref.ref(); - d = other.d; - } - - return *this; -} - -inline VBitmap &VBitmap::operator=(VBitmap &&other) -{ - if (d && !d->ref.deref()) cleanUp(d); - d = other.d; - return *this; -} - -VBitmap::VBitmap(int w, int h, VBitmap::Format format) {} -VBitmap::VBitmap(uchar *data, int w, int h, int bytesPerLine, - VBitmap::Format format, VBitmapCleanupFunction f, - void *cleanupInfo) -{ - d = new VBitmapData; - d->data = data; - d->format = format; - d->width = w; - d->height = h; - d->stride = bytesPerLine; - d->cleanupFunction = nullptr; - d->cleanupInfo = nullptr; - d->ownData = false; - d->roData = false; - d->ref.setOwned(); -} - -VBitmap VBitmap::copy(const VRect &r) const -{ - // TODO implement properly. - return *this; -} - -int VBitmap::stride() const -{ - return d ? d->stride : 0; -} - -int VBitmap::width() const -{ - return d ? d->width : 0; -} - -int VBitmap::height() const -{ - return d ? d->height : 0; -} - -uchar *VBitmap::bits() -{ - if (!d) return 0; - detach(); - - // In case detach ran out of memory... - if (!d) return 0; - - return d->data; -} - -const uchar *VBitmap::bits() const -{ - return d ? d->data : 0; -} - -bool VBitmap::isNull() const -{ - return !d; -} - -uchar *VBitmap::scanLine(int i) -{ - if (!d) return 0; - - detach(); - - // In case detach() ran out of memory - if (!d) return 0; - - return d->data + i * d->stride; -} - -const uchar *VBitmap::scanLine(int i) const -{ - if (!d) return 0; - - // assert(i >= 0 && i < height()); - return d->data + i * d->stride; + return mImpl ? true : false; } VBitmap::Format VBitmap::format() const { - if (!d) return VBitmap::Format::Invalid; - return d->format; + return mImpl ? mImpl->format() : VBitmap::Format::Invalid; } void VBitmap::fill(uint pixel) { - if (!d) return; + if (mImpl) mImpl->fill(pixel); } V_END_NAMESPACE diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index bdf2e7687a..8b162c2c6f 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -23,39 +23,30 @@ V_BEGIN_NAMESPACE -struct VBitmapData; -typedef void (*VBitmapCleanupFunction)(void *); class VBitmap { public: - enum class Format { Invalid, Alpha8, ARGB32, ARGB32_Premultiplied, Last }; - ~VBitmap(); - VBitmap(); - VBitmap(const VBitmap &other); - VBitmap(VBitmap &&other); - VBitmap &operator=(const VBitmap &); - VBitmap &operator=(VBitmap &&other); + enum class Format: uchar { + Invalid, + Alpha8, + ARGB32, + ARGB32_Premultiplied + }; - VBitmap(int w, int h, VBitmap::Format format); - VBitmap(uchar *data, int w, int h, int bytesPerLine, VBitmap::Format format, - VBitmapCleanupFunction f = nullptr, void *cleanupInfo = nullptr); + VBitmap() = default; + VBitmap(uint w, uint h, VBitmap::Format format); + VBitmap(uchar *data, uint w, uint h, uint bytesPerLine, VBitmap::Format format); - VBitmap copy(const VRect &rect = VRect()) const; - void fill(uint pixel); - - int width() const; - int height() const; - uchar * bits(); - const uchar * bits() const; - uchar * scanLine(int); - const uchar * scanLine(int) const; - int stride() const; - bool isNull() const; + uint stride() const; + uint width() const; + uint height() const; VBitmap::Format format() const; + bool valid() const; + uchar * data(); + void fill(uint pixel); private: - void detach(); - void cleanUp(VBitmapData *x); - VBitmapData *d{nullptr}; + struct Impl; + std::shared_ptr mImpl; }; V_END_NAMESPACE diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index c682edbfb3..7e57fdec0f 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -201,14 +201,13 @@ void VRasterBuffer::clear() VBitmap::Format VRasterBuffer::prepare(VBitmap *image) { - mBuffer = (uchar *)image->bits(); + mBuffer = image->data(); mWidth = image->width(); mHeight = image->height(); mBytesPerPixel = 4; mBytesPerLine = image->stride(); mFormat = image->format(); - // drawHelper = qDrawHelper + format; return mFormat; } From 2ea45401909e1127ffef351f04f2f1a8f4a3d627 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 3 Jan 2019 14:27:29 +0900 Subject: [PATCH 381/672] lottie: reuse rendertask object to optimize memory allocation. Change-Id: I028f1ea5abec38511bf8413d00d94e425a1ae8db --- src/lottie/lottieanimation.cpp | 61 +++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 540b4d8ab4..c49db2d395 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -25,6 +25,16 @@ using namespace lottie; +struct RenderTask { + RenderTask() { receiver = sender.get_future(); } + std::promise sender; + std::future receiver; + AnimationImpl *playerImpl{nullptr}; + size_t frameNo{0}; + Surface surface; +}; +using SharedRenderTask = std::shared_ptr; + class AnimationImpl { public: @@ -36,13 +46,14 @@ public: size_t totalFrame() const {return mModel->frameDuration();} size_t frameAtPos(double pos) const {return mModel->frameAtPos(pos);} Surface render(size_t frameNo, const Surface &surface); - + std::future renderAsync(size_t frameNo, Surface &&surface); const LOTLayerNode * renderTree(size_t frameNo, const VSize &size); private: std::string mFilePath; std::shared_ptr mModel; std::unique_ptr mCompItem; + SharedRenderTask mTask; std::atomic mRenderInProgress; }; @@ -103,27 +114,19 @@ void AnimationImpl::init(const std::shared_ptr &model) * one it steals the task from it and executes. if it couldn't find one then it * just waits for new task on its own queue. */ -struct RenderTask { - RenderTask() { receiver = sender.get_future(); } - std::promise sender; - std::future receiver; - AnimationImpl *playerImpl{nullptr}; - size_t frameNo{0}; - Surface surface; -}; #include class RenderTaskScheduler { const unsigned _count{std::thread::hardware_concurrency()}; std::vector _threads; - std::vector> _q{_count}; + std::vector> _q{_count}; std::atomic _index{0}; void run(unsigned i) { - RenderTask task; while (true) { bool success = false; + SharedRenderTask task; for (unsigned n = 0; n != _count * 32; ++n) { if (_q[(i + n) % _count].try_pop(task)) { success = true; @@ -132,8 +135,8 @@ class RenderTaskScheduler { } if (!success && !_q[i].pop(task)) break; - auto result = task.playerImpl->render(task.frameNo, task.surface); - task.sender.set_value(result); + auto result = task->playerImpl->render(task->frameNo, task->surface); + task->sender.set_value(result); } } @@ -158,9 +161,9 @@ public: for (auto &e : _threads) e.join(); } - std::future async(RenderTask &&task) + std::future async(SharedRenderTask task) { - auto receiver = std::move(task.receiver); + auto receiver = std::move(task->receiver); auto i = _index++; for (unsigned n = 0; n != _count; ++n) { @@ -171,18 +174,24 @@ public: return receiver; } - - std::future render(AnimationImpl *impl, size_t frameNo, - Surface &&surface) - { - RenderTask task; - task.playerImpl = impl; - task.frameNo = frameNo; - task.surface = std::move(surface); - return async(std::move(task)); - } }; + +std::future AnimationImpl::renderAsync(size_t frameNo, Surface &&surface) +{ + if (!mTask) { + mTask = std::make_shared(); + } else { + mTask->sender = std::promise(); + mTask->receiver = mTask->sender.get_future(); + } + mTask->playerImpl = this; + mTask->frameNo = frameNo; + mTask->surface = std::move(surface); + + return RenderTaskScheduler::instance().async(mTask); +} + /** * \breif Brief abput the Api. * Description about the setFilePath Api @@ -258,7 +267,7 @@ Animation::renderTree(size_t frameNo, size_t width, size_t height) const std::future Animation::render(size_t frameNo, Surface surface) { - return RenderTaskScheduler::instance().render(d.get(), frameNo, std::move(surface)); + return d->renderAsync(frameNo, std::move(surface)); } void Animation::renderSync(size_t frameNo, Surface surface) From 9f7171c42cd217403c6332cf1ed589d08477b97f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 7 Jan 2019 10:20:05 +0900 Subject: [PATCH 382/672] lottie/example : build example only when the dependancy is resolved. Change-Id: Ifbdd6aa4fd1f9626af2211c1873cecb3ec6065c3 --- example/meson.build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example/meson.build b/example/meson.build index 19d7fc03dd..9a89b6009d 100644 --- a/example/meson.build +++ b/example/meson.build @@ -46,9 +46,12 @@ if (demo_dep.found()) link_with : lottie_player_lib, dependencies : demo_dep) +if (meson.get_compiler('cpp').has_header('elementary-1/elm_animation_view.h')) executable('efl_animview', 'efl_animview.cpp', include_directories : inc, link_with : lottie_player_lib, dependencies : demo_dep) endif + +endif From ba07a1040dc41435ceb4947f2f2952e54b5a5ce6 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 4 Jan 2019 15:21:30 +0900 Subject: [PATCH 383/672] lottie/vector: added intersected() and size() api to vrect class. Change-Id: Ibb4c764e8a12bc3b95cbd601b42c73b777793afd --- src/vector/CMakeLists.txt | 1 + src/vector/meson.build | 2 +- src/vector/vrect.cpp | 49 +++++++++++++++++++++++++++++++++++++++ src/vector/vrect.h | 9 +++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 573a33bec1..96c55d6421 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -4,6 +4,7 @@ add_subdirectory(pixman) target_sources(lottie-player PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/vrect.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdasher.cpp" "${CMAKE_CURRENT_LIST_DIR}/vbrush.cpp" "${CMAKE_CURRENT_LIST_DIR}/vbitmap.cpp" diff --git a/src/vector/meson.build b/src/vector/meson.build index 3246e43282..338b87e903 100644 --- a/src/vector/meson.build +++ b/src/vector/meson.build @@ -14,7 +14,7 @@ source_file += files('vdrawhelper.cpp') source_file += files('vdrawhelper_sse2.cpp') source_file += files('vdrawable.cpp') - +source_file += files('vrect.cpp') source_file += files('vrle.cpp') source_file += files('vpath.cpp') source_file += files('vpathmesure.cpp') diff --git a/src/vector/vrect.cpp b/src/vector/vrect.cpp index c044a53e4b..60d21162d8 100644 --- a/src/vector/vrect.cpp +++ b/src/vector/vrect.cpp @@ -15,3 +15,52 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "vrect.h" + +VRect VRect::operator&(const VRect &r) const +{ + if (empty()) + return VRect(); + + int l1 = x1; + int r1 = x1; + if (x2 - x1 + 1 < 0) + l1 = x2; + else + r1 = x2; + + int l2 = r.x1; + int r2 = r.x1; + if (r.x2 - r.x1 + 1 < 0) + l2 = r.x2; + else + r2 = r.x2; + + if (l1 > r2 || l2 > r1) + return VRect(); + + int t1 = y1; + int b1 = y1; + if (y2 - y1 + 1 < 0) + t1 = y2; + else + b1 = y2; + + int t2 = r.y1; + int b2 = r.y1; + if (r.y2 - r.y1 + 1 < 0) + t2 = r.y2; + else + b2 = r.y2; + + if (t1 > b2 || t2 > b1) + return VRect(); + + VRect tmp; + tmp.x1 = std::max(l1, l2); + tmp.x2 = std::min(r1, r2); + tmp.y1 = std::max(t1, t2); + tmp.y2 = std::min(b1, b2); + return tmp; +} diff --git a/src/vector/vrect.h b/src/vector/vrect.h index b38746f2df..2fa937e360 100644 --- a/src/vector/vrect.h +++ b/src/vector/vrect.h @@ -38,6 +38,7 @@ public: V_CONSTEXPR int height() const {return y2-y1;} V_CONSTEXPR int x() const {return x1;} V_CONSTEXPR int y() const {return y1;} + VSize size() const {return {width(), height()};} void setLeft(int l) { x1 = l; } void setTop(int t) { y1 = t; } void setRight(int r) { x2 = r; } @@ -54,6 +55,9 @@ public: const VRect &) noexcept; friend VDebug & operator<<(VDebug &os, const VRect &o); + VRect intersected(const VRect &r) const; + VRect operator&(const VRect &r) const; + private: int x1{0}; int y1{0}; @@ -61,6 +65,11 @@ private: int y2{0}; }; +inline VRect VRect::intersected(const VRect &r) const +{ + return *this & r; +} + inline bool VRect::intersects(const VRect &r) { return (right() > r.left() && left() < r.right() && bottom() > r.top() && From b853ddc2906c17867ceeb10271f7d2c172c6b0a6 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 7 Jan 2019 14:07:02 +0900 Subject: [PATCH 384/672] lottie/vector: don't use startFrame() of a layer when it has time remap. Change-Id: I62230a2f5d9447bf7fa7ff3c9ebeed7aaa90dfa3 --- src/lottie/lottieitem.cpp | 5 ++--- src/lottie/lottiemodel.h | 7 ++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 11a6489c38..667142cea5 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -591,10 +591,9 @@ void LOTCompLayerItem::updateContent() if (mClipper && flag().testFlag(DirtyFlagBit::Matrix)) { mClipper->update(combinedMatrix()); } - + int mappedFrame = mLayerData->timeRemap(frameNo()); for (const auto &layer : mLayers) { - layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(), - combinedMatrix(), combinedAlpha()); + layer->update( mappedFrame, combinedMatrix(), combinedAlpha()); } } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 47faccf225..16a75d5795 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -441,7 +441,12 @@ public: */ inline int LOTLayerData::timeRemap(int frameNo) const { - frameNo = mTimeRemap.isStatic() ? frameNo : + /* + * only consider startFrame() when there is no timeRemap. + * when a layer has timeremap bodymovin updates the startFrame() + * of all child layer so we don't have to take care of it. + */ + frameNo = mTimeRemap.isStatic() ? frameNo - startFrame(): mCompRef->frameAtTime(mTimeRemap.value(frameNo)); /* Apply time streatch if it has any. * Time streatch is just a factor by which the animation will speedup or slow From 1ed84cbc12a83b878a88ab6b71ef943521a80baa Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 9 Jan 2019 13:29:44 +0900 Subject: [PATCH 385/672] lottie/vector: add depth() and const data() api to VBitmap class. Change-Id: I22f16b7c9e9b38c3c115d6b16f093bfbf492afb1 --- src/vector/vbitmap.cpp | 16 ++++++++++++++-- src/vector/vbitmap.h | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 6fdbbd4064..25c79193bc 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -28,6 +28,7 @@ struct VBitmap::Impl { uint mHeight{0}; uint mStride{0}; uint mBytes{0}; + uint mDepth{0}; VBitmap::Format mFormat{VBitmap::Format::Invalid}; bool mOwnData; bool mRoData; @@ -38,8 +39,8 @@ struct VBitmap::Impl { mOwnData(true), mRoData(false) { - uint depth = Impl::depth(format); - uint stride = ((width * depth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4) + mDepth = depth(format); + uint stride = ((width * mDepth + 31) >> 5) << 2; // bytes per scanline (must be multiple of 4) mWidth = width; mHeight = height; @@ -64,6 +65,7 @@ struct VBitmap::Impl { mStride = bytesPerLine; mBytes = mStride * mHeight; mData = data; + mDepth = depth(format); } ~Impl() @@ -133,11 +135,21 @@ uint VBitmap::height() const return mImpl ? mImpl->height() : 0; } +uint VBitmap::depth() const +{ + return mImpl ? mImpl->mDepth : 0; +} + uchar *VBitmap::data() { return mImpl ? mImpl->data() : nullptr; } +uchar *VBitmap::data() const +{ + return mImpl ? mImpl->data() : nullptr; +} + bool VBitmap::valid() const { return mImpl ? true : false; diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index 8b162c2c6f..f99b8f20e1 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -39,9 +39,11 @@ public: uint stride() const; uint width() const; uint height() const; + uint depth() const; VBitmap::Format format() const; bool valid() const; uchar * data(); + uchar * data() const; void fill(uint pixel); private: From dedd6a4ddf1ef722f1871f5033fdd4f1fc0180e5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 9 Jan 2019 16:52:47 +0900 Subject: [PATCH 386/672] lottie/vector: added destIn and destOut comp function. Change-Id: I50a0cf16f5a8438006c8e82074f72da46c87a108 --- src/vector/vcompositionfunctions.cpp | 72 +++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/src/vector/vcompositionfunctions.cpp b/src/vector/vcompositionfunctions.cpp index c160419b5b..02459fe5ab 100644 --- a/src/vector/vcompositionfunctions.cpp +++ b/src/vector/vcompositionfunctions.cpp @@ -55,6 +55,37 @@ void comp_func_solid_SourceOver(uint32_t *dest, int length, uint32_t color, for (i = 0; i < length; ++i) dest[i] = color + BYTE_MUL(dest[i], ialpha); } +/* + result = d * sa + dest = d * sa * ca + d * cia + = d * (sa * ca + cia) +*/ +static void comp_func_solid_DestinationIn(uint *dest, int length, uint color, uint const_alpha) +{ + uint a = vAlpha(color); + if (const_alpha != 255) { + a = BYTE_MUL(a, const_alpha) + 255 - const_alpha; + } + for (int i = 0; i < length; ++i) { + dest[i] = BYTE_MUL(dest[i], a); + } +} + +/* + result = d * sia + dest = d * sia * ca + d * cia + = d * (sia * ca + cia) +*/ +static void comp_func_solid_DestinationOut(uint *dest, int length, uint color, uint const_alpha) +{ + uint a = vAlpha(~color); + if (const_alpha != 255) + a = BYTE_MUL(a, const_alpha) + 255 - const_alpha; + for (int i = 0; i < length; ++i) { + dest[i] = BYTE_MUL(dest[i], a); + } +} + void comp_func_Source(uint32_t *dest, const uint32_t *src, int length, uint32_t const_alpha) { @@ -99,10 +130,47 @@ void comp_func_SourceOver(uint32_t *dest, const uint32_t *src, int length, } } +void comp_func_DestinationIn(uint *dest, const uint *src, int length, uint const_alpha) +{ + if (const_alpha == 255) { + for (int i = 0; i < length; ++i) { + dest[i] = BYTE_MUL(dest[i], vAlpha(src[i])); + } + } else { + uint cia = 255 - const_alpha; + for (int i = 0; i < length; ++i) { + uint a = BYTE_MUL(vAlpha(src[i]), const_alpha) + cia; + dest[i] = BYTE_MUL(dest[i], a); + } + } +} + +void comp_func_DestinationOut(uint *dest, const uint *src, int length, uint const_alpha) +{ + if (const_alpha == 255) { + for (int i = 0; i < length; ++i) { + dest[i] = BYTE_MUL(dest[i], vAlpha(~src[i])); + } + } else { + uint cia = 255 - const_alpha; + for (int i = 0; i < length; ++i) { + uint sia = BYTE_MUL(vAlpha(~src[i]), const_alpha) + cia; + dest[i] = BYTE_MUL(dest[i], sia); + } + } +} + CompositionFunctionSolid COMP_functionForModeSolid_C[] = { - comp_func_solid_Source, comp_func_solid_SourceOver}; + comp_func_solid_Source, + comp_func_solid_SourceOver, + comp_func_solid_DestinationIn, + comp_func_solid_DestinationOut + }; CompositionFunction COMP_functionForMode_C[] = {comp_func_Source, - comp_func_SourceOver}; + comp_func_SourceOver, + comp_func_DestinationIn, + comp_func_DestinationOut + }; void vInitBlendFunctions() {} From 0651051a98b37b1573692e9eb5d87f387ababc64 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 4 Jan 2019 15:23:56 +0900 Subject: [PATCH 387/672] lottie/render: added drawBitmap api to painter class. Change-Id: I07fc5f90c9988e02182f69672eeef9608aa51a2a --- src/vector/vpainter.cpp | 90 ++++++++++++++++++++++++++++++++++++++++- src/vector/vpainter.h | 12 +++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index e8f54b251e..39b19f64b4 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -25,7 +25,8 @@ class VPainterImpl { public: void drawRle(const VPoint &pos, const VRle &rle); void drawRle(const VRle &rle, const VRle &clip); - + void setCompositionMode(VPainter::CompositionMode mode) { mSpanData.mCompositionMode = mode;} + void drawBitmapUntransform(const VRect &target, const VBitmap &bitmap, const VRect &source); public: VRasterBuffer mBuffer; VSpanData mSpanData; @@ -55,6 +56,54 @@ void VPainterImpl::drawRle(const VRle &rle, const VRle &clip) &mSpanData); } +static void fillRect(const VRect &r, VSpanData *data) +{ + int x1, x2, y1, y2; + + x1 = std::max(r.x(), 0); + x2 = std::min(r.x() + r.width(), data->mRasterBuffer->width()); + y1 = std::max(r.y(), 0); + y2 = std::min(r.y() + r.height(), data->mRasterBuffer->height()); + + if (x2 <= x1 || y2 <= y1) + return; + + const int nspans = 256; + VRle::Span spans[nspans]; + + int y = y1; + while (y < y2) { + int n = std::min(nspans, y2 - y); + int i = 0; + while (i < n) { + spans[i].x = x1; + spans[i].len = x2 - x1; + spans[i].y = y + i; + spans[i].coverage = 255; + ++i; + } + + data->mUnclippedBlendFunc(n, spans, data); + y += n; + } +} + +void VPainterImpl::drawBitmapUntransform(const VRect &target, + const VBitmap &bitmap, + const VRect &source) +{ + mSpanData.initTexture(&bitmap, 255, VBitmapData::Plain, source); + if (!mSpanData.mUnclippedBlendFunc) + return; + mSpanData.dx = -target.x(); + mSpanData.dy = -target.y(); + + VRect rr = source.translated(target.x(), target.y()); + + fillRect(rr, &mSpanData); +} + + VPainter::~VPainter() { @@ -86,6 +135,11 @@ void VPainter::setBrush(const VBrush &brush) mImpl->mSpanData.setup(brush); } +void VPainter::setCompositionMode(CompositionMode mode) +{ + mImpl->setCompositionMode(mode); +} + void VPainter::drawRle(const VPoint &pos, const VRle &rle) { mImpl->drawRle(pos, rle); @@ -102,4 +156,38 @@ VRect VPainter::clipBoundingRect() const return mImpl->mSpanData.mSystemClip; } +void VPainter::drawBitmap(const VPoint &point, const VBitmap &bitmap, const VRect &source) +{ + if (!bitmap.valid()) return; + + drawBitmap(VRect(point.x(), point.y(), bitmap.width(), bitmap.height()), + bitmap, source); +} + +void VPainter::drawBitmap(const VRect &target, const VBitmap &bitmap, const VRect &source) +{ + if (!bitmap.valid()) return; + + if (target.size() == source.size()) { + mImpl->drawBitmapUntransform(target, bitmap, source); + } else { + // @TODO scaling + } +} + +void VPainter::drawBitmap(const VPoint &point, const VBitmap &bitmap) +{ + if (!bitmap.valid()) return; + + drawBitmap(VRect(point.x(), point.y(), bitmap.width(), bitmap.height()), + bitmap, VRect(0, 0, bitmap.width(), bitmap.height())); +} + +void VPainter::drawBitmap(const VRect &rect, const VBitmap &bitmap) +{ + if (!bitmap.valid()) return; + + drawBitmap(rect, bitmap, VRect(0, 0, bitmap.width(), bitmap.height())); +} + V_END_NAMESPACE diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index d4fbe9f22e..389c94d7e5 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -29,17 +29,27 @@ class VBitmap; class VPainterImpl; class VPainter { public: - enum CompositionMode { CompModeSrc, CompModeSrcOver }; + enum CompositionMode { + CompModeSrc, + CompModeSrcOver, + CompModeDestIn, + CompModeDestOut + }; ~VPainter(); VPainter(); VPainter(VBitmap *buffer); bool begin(VBitmap *buffer); void end(); void setBrush(const VBrush &brush); + void setCompositionMode(CompositionMode mode); void drawRle(const VPoint &pos, const VRle &rle); void drawRle(const VRle &rle, const VRle &clip); VRect clipBoundingRect() const; + void drawBitmap(const VPoint &point, const VBitmap &bitmap, const VRect &source); + void drawBitmap(const VRect &target, const VBitmap &bitmap, const VRect &source); + void drawBitmap(const VPoint &point, const VBitmap &bitmap); + void drawBitmap(const VRect &rect, const VBitmap &bitmap); private: VPainterImpl *mImpl; }; From a8cdb9b2fca2557325aafbb0840b46fb31b1b487 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 9 Jan 2019 17:01:46 +0900 Subject: [PATCH 388/672] lottie/vector: image fill support in drawhelper Change-Id: I678b1af37c4939d0006b33ddcb2b40f59d426169 --- src/vector/vdrawhelper.cpp | 77 +++++++++++++++++++++++++++++++++----- src/vector/vdrawhelper.h | 32 +++++++++++++--- 2 files changed, 94 insertions(+), 15 deletions(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 7e57fdec0f..46d2657490 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -55,6 +55,7 @@ #include #include #include +#include class VGradientCache { public: @@ -186,14 +187,6 @@ bool VGradientCache::generateGradientColorTable(const VGradientStops &stops, flo static VGradientCache VGradientCacheInstance; -void VRasterBuffer::init() -{ - mBuffer = nullptr; - mWidth = 0; - mHeight = 0; - mCompositionMode = VPainter::CompModeSrcOver; -} - void VRasterBuffer::clear() { memset(mBuffer, 0, mHeight * mBytesPerLine); @@ -529,7 +522,7 @@ static inline Operator getOperator(const VSpanData * data, break; } - op.mode = data->mRasterBuffer->mCompositionMode; + op.mode = data->mCompositionMode; if (op.mode == VPainter::CompModeSrcOver && solidSource) op.mode = VPainter::CompModeSrc; @@ -594,6 +587,47 @@ static void blendGradientARGB(int count, const VRle::Span *spans, } } +static void blend_untransformed_argb(int count, const VRle::Span *spans, void *userData) +{ + VSpanData *data = reinterpret_cast(userData); + if (data->mBitmap.format != VBitmap::Format::ARGB32_Premultiplied + && data->mBitmap.format != VBitmap::Format::ARGB32) { + //@TODO other formats not yet handled. + return; + } + + Operator op = getOperator(data, spans, count); + + const int image_width = data->mBitmap.width; + const int image_height = data->mBitmap.height; + + int xoff = data->dx; + int yoff = data->dy; + + while (count--) { + int x = spans->x; + int length = spans->len; + int sx = xoff + x; + int sy = yoff + spans->y; + if (sy >= 0 && sy < image_height && sx < image_width) { + if (sx < 0) { + x -= sx; + length += sx; + sx = 0; + } + if (sx + length > image_width) + length = image_width - sx; + if (length > 0) { + const int coverage = (spans->coverage * data->mBitmap.const_alpha) >> 8; + const uint *src = (const uint *)data->mBitmap.scanLine(sy) + sx; + uint *dest = data->buffer(x, spans->y); + op.func(dest, src, length, coverage); + } + } + ++spans; + } +} + void VSpanData::setup(const VBrush &brush, VPainter::CompositionMode /*mode*/, int /*alpha*/) { @@ -660,6 +694,26 @@ void VSpanData::setupMatrix(const VMatrix &matrix) // && fabs(dy) < 1e4; } +void VSpanData::initTexture(const VBitmap *bitmap, int alpha, VBitmapData::Type type, const VRect &sourceRect) +{ + mType = VSpanData::Type::Texture; + + mBitmap.imageData = bitmap->data(); + mBitmap.width = bitmap->width(); + mBitmap.height = bitmap->height(); + mBitmap.bytesPerLine = bitmap->stride(); + mBitmap.format = bitmap->format(); + mBitmap.x1 = sourceRect.x(); + mBitmap.y1 = sourceRect.y(); + mBitmap.x2 = std::min(mBitmap.x1 + sourceRect.width(), mBitmap.width); + mBitmap.y2 = std::min(mBitmap.y1 + sourceRect.height(), mBitmap.height); + + mBitmap.const_alpha = alpha; + mBitmap.type = type; + + updateSpanFunc(); +} + void VSpanData::updateSpanFunc() { switch (mType) { @@ -674,9 +728,12 @@ void VSpanData::updateSpanFunc() mUnclippedBlendFunc = &blendGradientARGB; break; } - default: + case VSpanData::Type::Texture: { + //@TODO update proper image function. + mUnclippedBlendFunc = &blend_untransformed_argb; break; } + } } #if !defined(__SSE2__) && !defined(__ARM_NEON__) diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 7dc288da1a..52852bf795 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -74,8 +74,6 @@ struct Operator { class VRasterBuffer { public: - VRasterBuffer() { init(); } - void init(); VBitmap::Format prepare(VBitmap *image); void clear(); @@ -94,8 +92,6 @@ public: int bytesPerPixel() const { return mBytesPerPixel; } VBitmap::Format mFormat{VBitmap::Format::ARGB32_Premultiplied}; - VPainter::CompositionMode mCompositionMode{VPainter::CompositionMode::CompModeSrc}; - private: int mWidth{0}; int mHeight{0}; @@ -118,12 +114,35 @@ struct VGradientData { bool mColorTableAlpha; }; +struct VBitmapData +{ + const uchar *imageData; + const uchar *scanLine(int y) const { return imageData + y*bytesPerLine; } + + int width; + int height; + // clip rect + int x1; + int y1; + int x2; + int y2; + uint bytesPerLine; + VBitmap::Format format; + bool hasAlpha; + enum Type { + Plain, + Tiled + }; + Type type; + int const_alpha; +}; + struct VSpanData { class Pinnable { protected: ~Pinnable() = default; }; - enum class Type { None, Solid, LinearGradient, RadialGradient }; + enum class Type { None, Solid, LinearGradient, RadialGradient, Texture }; void updateSpanFunc(); void init(VRasterBuffer *image); @@ -141,7 +160,9 @@ struct VSpanData { { return (uint *)(mRasterBuffer->scanLine(y + mPos.y())) + x + mPos.x(); } + void initTexture(const VBitmap *image, int alpha, VBitmapData::Type type, const VRect &sourceRect); + VPainter::CompositionMode mCompositionMode{VPainter::CompositionMode::CompModeSrcOver}; VRasterBuffer * mRasterBuffer; ProcessRleSpan mBlendFunc; ProcessRleSpan mUnclippedBlendFunc; @@ -152,6 +173,7 @@ struct VSpanData { union { uint32_t mSolid; VGradientData mGradient; + VBitmapData mBitmap; }; float m11, m12, m13, m21, m22, m23, m33, dx, dy; // inverse xform matrix }; From fd97df6735c42deecdbc89c00fff43b3c4335f31 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 10 Jan 2019 16:31:39 +0900 Subject: [PATCH 389/672] lottie/vector: added updateLuma() api to convert RGBA value to HSL Change-Id: Icacfe4ffdf957d10e7bd654878895b856e045136 --- src/vector/vbitmap.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++ src/vector/vbitmap.h | 1 + 2 files changed, 47 insertions(+) diff --git a/src/vector/vbitmap.cpp b/src/vector/vbitmap.cpp index 25c79193bc..370c69c873 100644 --- a/src/vector/vbitmap.cpp +++ b/src/vector/vbitmap.cpp @@ -19,6 +19,7 @@ #include "vbitmap.h" #include #include "vglobal.h" +#include "vdrawhelper.h" V_BEGIN_NAMESPACE @@ -99,6 +100,35 @@ struct VBitmap::Impl { { //@TODO } + + void updateLuma() { + if (mFormat != VBitmap::Format::ARGB32_Premultiplied) return; + + for (uint col = 0 ; col < mHeight ; col++) { + uint *pixel = (uint *) (mData + mStride * col); + for (uint row = 0 ; row < mWidth; row++) { + int alpha = vAlpha(*pixel); + if (alpha == 0) { + pixel++; + continue; + } + + int red = vRed(*pixel); + int green = vGreen(*pixel); + int blue = vBlue(*pixel); + + if (alpha != 255) { + //un multiply + red = (red * 255) / alpha; + green = (green * 255) / alpha; + blue = (blue * 255) / alpha; + } + int luminosity = (0.299*red + 0.587*green + 0.114*blue); + *pixel = luminosity << 24; + pixel++; + } + } + } }; VBitmap::VBitmap(uint width, uint height, VBitmap::Format format) @@ -165,4 +195,20 @@ void VBitmap::fill(uint pixel) if (mImpl) mImpl->fill(pixel); } +/* + * This is special function which converts + * RGB value to Luminosity and stores it in + * the Alpha component of the pixel. + * After this conversion the bitmap data is no more + * in RGB space. but the Alpha component contains the + * Luminosity value of the pixel in HSL color space. + * NOTE: this api has its own special usecase + * make sure you know what you are doing before using + * this api. + */ +void VBitmap::updateLuma() +{ + if (mImpl) mImpl->updateLuma(); +} + V_END_NAMESPACE diff --git a/src/vector/vbitmap.h b/src/vector/vbitmap.h index f99b8f20e1..e40c52ae0b 100644 --- a/src/vector/vbitmap.h +++ b/src/vector/vbitmap.h @@ -46,6 +46,7 @@ public: uchar * data() const; void fill(uint pixel); + void updateLuma(); private: struct Impl; std::shared_ptr mImpl; From fcfd0610f86bf2a3f96dbb8a1c9f717d6582e284 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 11 Jan 2019 10:16:07 +0900 Subject: [PATCH 390/672] lottie/render: Refactor matte rendering to support luma matte. Change-Id: I25d0855815fb3b4a3c5786c2b85692eac8220eb6 --- src/lottie/lottieitem.cpp | 107 +++++++++++++++++++++++--------------- src/lottie/lottieitem.h | 7 ++- 2 files changed, 71 insertions(+), 43 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 667142cea5..b57833a7a6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -132,7 +132,7 @@ bool LOTCompItem::render(const lottie::Surface &surface) } VPainter painter(&bitmap); - mRootLayer->render(&painter, {}, {}, nullptr); + mRootLayer->render(&painter, {}, {}); return true; } @@ -250,20 +250,8 @@ void LOTLayerItem::buildLayerNode() } } -void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) +void LOTLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &matteRle) { - VRle matteRle; - if (matteSource) { - mDrawableList.clear(); - matteSource->renderList(mDrawableList); - for (auto &i : mDrawableList) { - matteRle = matteRle + i->rle(); - } - if (!inheritMatte.empty()) - matteRle = matteRle & inheritMatte; - } else { - matteRle = inheritMatte; - } mDrawableList.clear(); renderList(mDrawableList); @@ -505,26 +493,8 @@ void LOTCompLayerItem::buildLayerNode() } } -void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &inheritMatte, LOTLayerItem *matteSource) +void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &matteRle) { - VRle matteRle; - if (matteSource) { - mDrawableList.clear(); - matteSource->renderList(mDrawableList); - for (auto &i : mDrawableList) { - matteRle = matteRle + i->rle(); - } - - if (matteType() == MatteType::AlphaInv ) { - matteRle = VRle::toRle(painter->clipBoundingRect()) - matteRle; - } - - if (!inheritMatte.empty()) - matteRle = matteRle & inheritMatte; - } else { - matteRle = inheritMatte; - } - VRle mask; if (mLayerMask) { mask = mLayerMask->maskRle(painter->clipBoundingRect()); @@ -547,22 +517,77 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const LOTLayerItem *matteLayer = nullptr; for (const auto &layer : mLayers) { - if (!matteLayer && layer->hasMatte()) { + if (layer->hasMatte()) { + if (matteLayer) { + vWarning << "two consecutive layer has matter : not supported"; + } matteLayer = layer.get(); continue; } - if (matteLayer) { - if (matteLayer->visible() && layer->visible()) - matteLayer->render(painter, mask, matteRle, layer.get()); - matteLayer = nullptr; - } else { - if (layer->visible()) - layer->render(painter, mask, matteRle, nullptr); + if (layer->visible()) { + if (matteLayer) { + if (matteLayer->visible()) + renderMatteLayer(painter, mask, matteRle, matteLayer, layer.get()); + } else { + layer->render(painter, mask, matteRle); + } } + + matteLayer = nullptr; } } +void LOTCompLayerItem::renderMatteLayer(VPainter *painter, + const VRle &mask, + const VRle &matteRle, + LOTLayerItem *layer, + LOTLayerItem *src) +{ + VSize size = painter->clipBoundingRect().size(); + // Decide if we can use fast matte. + // 1. draw src layer to matte buffer + VPainter srcPainter; + VBitmap srcBitmap(size.width(), size.height(), VBitmap::Format::ARGB32_Premultiplied); + srcPainter.begin(&srcBitmap); + src->render(&srcPainter, mask, matteRle); + srcPainter.end(); + + // 2. draw layer to layer buffer + VPainter layerPainter; + VBitmap layerBitmap(size.width(), size.height(), VBitmap::Format::ARGB32_Premultiplied); + layerPainter.begin(&layerBitmap); + layer->render(&layerPainter, mask, matteRle); + + // 2.1update composition mode + switch (layer->matteType()) { + case MatteType::Alpha: + case MatteType::Luma: { + layerPainter.setCompositionMode(VPainter::CompositionMode::CompModeDestIn); + break; + } + case MatteType::AlphaInv: + case MatteType::LumaInv: { + layerPainter.setCompositionMode(VPainter::CompositionMode::CompModeDestOut); + break; + } + default: + break; + } + + //2.2 update srcBuffer if the matte is luma type + if (layer->matteType() == MatteType::Luma || + layer->matteType() == MatteType::LumaInv) { + srcBitmap.updateLuma(); + } + + // 2.3 draw src buffer as mask + layerPainter.drawBitmap(VPoint(), srcBitmap); + layerPainter.end(); + // 3. draw the result buffer into painter + painter->drawBitmap(VPoint(), layerBitmap); +} + void LOTClipperItem::update(const VMatrix &matrix) { mPath.reset(); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 47c816cb1e..339473e51e 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -98,7 +98,7 @@ public: VMatrix matrix(int frameNo) const; virtual void renderList(std::vector &){} virtual void updateStaticProperty(); - virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource); + virtual void render(VPainter *painter, const VRle &mask, const VRle &matteRle); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } MatteType matteType() const { return mLayerData->mMatteType;} bool visible() const; @@ -133,10 +133,13 @@ public: LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; void updateStaticProperty() final; - void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource) final; + void render(VPainter *painter, const VRle &mask, const VRle &matteRle) final; void buildLayerNode() final; protected: void updateContent() final; +private: + void renderMatteLayer(VPainter *painter, const VRle &inheritMask, const VRle &matteRle, + LOTLayerItem *layer, LOTLayerItem *src); private: std::vector mLayersCNode; std::vector> mLayers; From 9b57e426c659ea5df3337918e964dffca7e9fe4b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 11 Jan 2019 15:01:52 +0900 Subject: [PATCH 391/672] lottie/parser: fix a crash when the color string is empty. Change-Id: Ic9b17764b322e5d6528759dad8e29e1accea9c2a --- example/resource/starts_transparent.json | 1 + src/lottie/lottieparser.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 example/resource/starts_transparent.json diff --git a/example/resource/starts_transparent.json b/example/resource/starts_transparent.json new file mode 100644 index 0000000000..2735edf4bc --- /dev/null +++ b/example/resource/starts_transparent.json @@ -0,0 +1 @@ +{"v":"4.5.6","fr":30,"ip":0,"op":91,"w":800,"h":800,"ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":3,"nm":"Master","ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,461.657,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ip":0,"op":600,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"Star_03","parent":0,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[100],"e":[0]},{"t":84}]},"r":{"a":1,"k":[{"i":{"x":[0.006],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p006_1_0p167_0p167"],"t":14,"s":[-720],"e":[-1149]},{"t":90}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":14,"s":[-72.808,4.062,0],"e":[2.192,-72.938,0],"to":[7.80815124511719,-75.0615844726562,0],"ti":[0,0,0]},{"t":84}]},"a":{"a":0,"k":[231.37,449.226,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,0.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167","0p667_0p667_0p167_0p167"],"t":14,"s":[0,0,100],"e":[100,100,100]},{"t":54}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-36.571,-9.612],[-27.799,-1.99],[-36.683,5.428]],"c":false}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.95,-9.308],[-4.935,-1.817],[3.838,5.731]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":14,"s":[100],"h":1},{"t":34,"s":[0],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[247.846,433.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Eyes_Closed","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":34,"s":[{"i":[[0.013,-0.202],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.096,-0.1],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.733,-0.323]],"c":true}],"e":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":44,"s":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":54,"s":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":62,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":68,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":71,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":74,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":77,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":80,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":83,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":86,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":89,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":92,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":95,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":98,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":101,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":104,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":107,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"t":110}]},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":34,"s":[{"i":[[0.023,-0.016],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[0.014,-0.036],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.014,-0.105]],"c":true}],"e":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":44,"s":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":54,"s":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":62,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":68,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":71,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":74,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":77,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":80,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":83,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":86,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":89,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":92,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":95,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":98,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":101,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":104,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":107,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"t":110}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":14,"s":[0],"h":1},{"t":34,"s":[100],"h":1}]},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[242.997,431.73],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Eyes_Open","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":54,"s":[{"i":[[0,0],[0.109,-0.906],[13.65,0.572],[1.781,12.531],[0,0],[-24,-0.295]],"o":[[0,0],[-1.541,12.793],[-13.007,-0.545],[-0.128,-0.903],[0,0],[22.624,0.278]],"v":[[23.024,-8.94],[22.994,-8.863],[-2.946,14.608],[-28.522,-7.528],[-28.716,-8.86],[-2.671,14.6]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,14.608],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":62,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,14.608],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,17.108],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":65,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,17.108],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":68,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":71,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":74,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":77,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":80,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":83,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":86,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":89,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":92,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":95,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":98,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":101,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":104,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":107,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"t":110}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":14,"s":[0],"h":1},{"t":54,"s":[100],"h":1}]},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":14,"s":[0],"h":1},{"t":54,"s":[100],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[233.421,461.195],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Open Smile","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-13.602,0.167],[-0.817,13.364]],"o":[[1.145,13.34],[13.603,-0.166],[0,0]],"v":[[-25.719,-11.551],[0.292,12.014],[25.719,-12.182]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":14,"s":[45],"e":[0]},{"t":34}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":14,"s":[55],"e":[100]},{"t":34}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":14,"s":[100],"h":1},{"t":54,"s":[0],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[230.43,463.945],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Smile","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.322,1.475],[0,0],[4.634,9.335],[0,0],[3.041,-0.007],[0,0],[-4.62,-2.413],[0,0],[1.789,10.268],[0,0],[-7.447,7.297],[0,0]],"o":[[0,0],[-10.319,-1.474],[0,0],[-2.319,-4.67],[0,0],[6.08,-0.016],[0,0],[9.237,4.826],[0,0],[-1.79,-10.269],[0,0],[7.447,-7.294]],"v":[[30.878,-26.746],[4.089,-30.567],[-23.103,-50.22],[-35.144,-74.456],[-43.549,-81.447],[-43.189,60.499],[-26.405,64.095],[-2.419,76.628],[11.128,66.733],[6.486,40.071],[16.773,8.136],[36.102,-10.803]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[275.242,440.626],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Body_shader","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-4.636,-9.336],[0,0],[-10.32,-1.474],[0,0],[7.448,-7.294],[0,0],[-1.789,-10.269],[0,0],[9.237,4.826],[0,0],[9.213,-4.873],[0,0],[-1.735,10.277],[0,0],[7.482,7.258],[0,0],[-10.314,1.526],[0,0],[-4.59,9.36]],"o":[[4.59,-9.359],[0,0],[4.634,9.335],[0,0],[10.322,1.475],[0,0],[-7.446,7.297],[0,0],[1.788,10.269],[0,0],[-9.237,-4.826],[0,0],[-9.215,4.873],[0,0],[1.736,-10.28],[0,0],[-7.482,-7.256],[0,0],[10.315,-1.525],[0,0]],"v":[[-8.533,-73.371],[8.244,-73.413],[20.285,-49.178],[47.477,-29.525],[74.265,-25.704],[79.489,-9.76],[60.16,9.178],[49.874,41.114],[54.515,67.775],[40.969,77.671],[16.983,65.137],[-16.569,65.22],[-40.491,77.876],[-54.088,68.051],[-49.58,41.366],[-60.029,9.483],[-79.455,-9.358],[-74.312,-25.327],[-47.543,-29.285],[-20.447,-49.076]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.83,0.44,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[231.695,439.583],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Body","np":2,"mn":"ADBE Vector Group"}],"ip":14,"op":90,"st":14,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Star_02","parent":0,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":79,"s":[100],"e":[0]},{"t":89}]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":7,"s":[-720],"e":[-1509]},{"t":107}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":7,"s":[-55.808,-64.938,0],"e":[-234.808,76.062,0],"to":[-20,-147.83332824707,0],"ti":[-2,-323.166656494141,0]},{"t":90}]},"a":{"a":0,"k":[231.37,449.226,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,0.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167","0p667_0p667_0p167_0p167"],"t":7,"s":[0,0,100],"e":[100,100,100]},{"t":47}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-36.571,-9.612],[-27.799,-1.99],[-36.683,5.428]],"c":false}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.95,-9.308],[-4.935,-1.817],[3.838,5.731]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":7,"s":[100],"h":1},{"t":27,"s":[0],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[247.846,433.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Eyes_Closed","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":27,"s":[{"i":[[0.013,-0.202],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.096,-0.1],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.733,-0.323]],"c":true}],"e":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":37,"s":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":47,"s":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":55,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":61,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":64,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":67,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":70,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":73,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":76,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":79,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":82,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":85,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":88,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":91,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":94,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":97,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":100,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"t":103}]},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":27,"s":[{"i":[[0.023,-0.016],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[0.014,-0.036],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.014,-0.105]],"c":true}],"e":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":37,"s":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":47,"s":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":55,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":61,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":64,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":67,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":70,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":73,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":76,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":79,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":82,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":85,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":88,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":91,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":94,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":97,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":100,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"t":103}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":7,"s":[0],"h":1},{"t":27,"s":[100],"h":1}]},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[242.997,431.73],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Eyes_Open","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":47,"s":[{"i":[[0,0],[0.109,-0.906],[13.65,0.572],[1.781,12.531],[0,0],[-24,-0.295]],"o":[[0,0],[-1.541,12.793],[-13.007,-0.545],[-0.128,-0.903],[0,0],[22.624,0.278]],"v":[[23.024,-8.94],[22.994,-8.863],[-2.946,14.608],[-28.522,-7.528],[-28.716,-8.86],[-2.671,14.6]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,14.608],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":55,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,14.608],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,17.108],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":58,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,17.108],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":61,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":64,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":67,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":70,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":73,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":76,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":79,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":82,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":85,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":88,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":91,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":94,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":97,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":100,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"t":103}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":7,"s":[0],"h":1},{"t":47,"s":[100],"h":1}]},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":7,"s":[0],"h":1},{"t":47,"s":[100],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[233.421,461.195],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Open Smile","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-13.602,0.167],[-0.817,13.364]],"o":[[1.145,13.34],[13.603,-0.166],[0,0]],"v":[[-25.719,-11.551],[0.292,12.014],[25.719,-12.182]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":7,"s":[45],"e":[0]},{"t":27}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":7,"s":[55],"e":[100]},{"t":27}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":7,"s":[100],"h":1},{"t":47,"s":[0],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[230.43,463.945],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Smile","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.322,1.475],[0,0],[4.634,9.335],[0,0],[3.041,-0.007],[0,0],[-4.62,-2.413],[0,0],[1.789,10.268],[0,0],[-7.447,7.297],[0,0]],"o":[[0,0],[-10.319,-1.474],[0,0],[-2.319,-4.67],[0,0],[6.08,-0.016],[0,0],[9.237,4.826],[0,0],[-1.79,-10.269],[0,0],[7.447,-7.294]],"v":[[30.878,-26.746],[4.089,-30.567],[-23.103,-50.22],[-35.144,-74.456],[-43.549,-81.447],[-43.189,60.499],[-26.405,64.095],[-2.419,76.628],[11.128,66.733],[6.486,40.071],[16.773,8.136],[36.102,-10.803]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[275.242,440.626],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Body_shader","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-4.636,-9.336],[0,0],[-10.32,-1.474],[0,0],[7.448,-7.294],[0,0],[-1.789,-10.269],[0,0],[9.237,4.826],[0,0],[9.213,-4.873],[0,0],[-1.735,10.277],[0,0],[7.482,7.258],[0,0],[-10.314,1.526],[0,0],[-4.59,9.36]],"o":[[4.59,-9.359],[0,0],[4.634,9.335],[0,0],[10.322,1.475],[0,0],[-7.446,7.297],[0,0],[1.788,10.269],[0,0],[-9.237,-4.826],[0,0],[-9.215,4.873],[0,0],[1.736,-10.28],[0,0],[-7.482,-7.256],[0,0],[10.315,-1.525],[0,0]],"v":[[-8.533,-73.371],[8.244,-73.413],[20.285,-49.178],[47.477,-29.525],[74.265,-25.704],[79.489,-9.76],[60.16,9.178],[49.874,41.114],[54.515,67.775],[40.969,77.671],[16.983,65.137],[-16.569,65.22],[-40.491,77.876],[-54.088,68.051],[-49.58,41.366],[-60.029,9.483],[-79.455,-9.358],[-74.312,-25.327],[-47.543,-29.285],[-20.447,-49.076]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.83,0.44,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[231.695,439.583],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Body","np":2,"mn":"ADBE Vector Group"}],"ip":7,"op":90,"st":7,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"Star_01","parent":0,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66,"s":[100],"e":[0]},{"t":75}]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[-720],"e":[60]},{"t":90}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[31.192,-0.938,0],"e":[223.192,87.062,0],"to":[27,-133.83332824707,0],"ti":[-7,-196.16667175293,0]},{"t":90}]},"a":{"a":0,"k":[231.37,449.226,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,0.667]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167","0p667_0p667_0p167_0p167"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"t":40}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-36.571,-9.612],[-27.799,-1.99],[-36.683,5.428]],"c":false}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.95,-9.308],[-4.935,-1.817],[3.838,5.731]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":20,"s":[0],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[247.846,433.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Eyes_Closed","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0.013,-0.202],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.096,-0.1],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.733,-0.323]],"c":true}],"e":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0.054,-2.972],[2.972,0.054],[-0.054,2.973],[-2.976,-0.054]],"o":[[-0.054,2.976],[-2.972,-0.054],[0.054,-2.973],[2.971,0.054]],"v":[[-18.385,0.097],[-23.869,5.385],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":48,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":54,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":57,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":60,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":63,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":66,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":69,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":72,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":75,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":78,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":81,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":84,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":87,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":90,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":93,"s":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.769,-0.053],[-29.155,-0.099],[-23.671,-5.385]],"c":true}],"e":[{"i":[[0.049,-2.972],[2.972,0.054],[0.096,-0.006],[-2.976,-0.054]],"o":[[0.013,-0.015],[-2.972,-0.054],[0.083,-2.972],[2.971,0.054]],"v":[[-18.385,0.097],[-23.644,-0.884],[-29.155,-0.099],[-23.671,-5.385]],"c":true}]},{"t":96}]},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":20,"s":[{"i":[[0.023,-0.016],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[0.014,-0.036],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.014,-0.105]],"c":true}],"e":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0.003,-2.973],[2.973,0.003],[-0.003,2.973],[-2.976,-0.003]],"o":[[-0.003,2.976],[-2.974,-0.003],[0.003,-2.973],[2.971,0.003]],"v":[[5.386,0.004],[-0.006,5.385],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":48,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":54,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":57,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":60,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":63,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":66,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":69,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":72,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":75,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":78,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":81,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":84,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":87,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"n":"0p667_1_0p167_0","t":90,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":93,"s":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.02,-0.021],[-5.386,-0.006],[0.007,-5.386]],"c":true}],"e":[{"i":[[0.116,-2.97],[2.973,0.003],[0.014,0.057],[-2.976,-0.003]],"o":[[0.054,0.078],[-2.974,-0.003],[-0.236,-3.255],[2.971,0.003]],"v":[[5.386,0.004],[0.145,-0.852],[-5.386,-0.006],[0.007,-5.386]],"c":true}]},{"t":96}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":20,"s":[100],"h":1}]},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[242.997,431.73],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Eyes_Open","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":40,"s":[{"i":[[0,0],[0.109,-0.906],[13.65,0.572],[1.781,12.531],[0,0],[-24,-0.295]],"o":[[0,0],[-1.541,12.793],[-13.007,-0.545],[-0.128,-0.903],[0,0],[22.624,0.278]],"v":[[23.024,-8.94],[22.994,-8.863],[-2.946,14.608],[-28.522,-7.528],[-28.716,-8.86],[-2.671,14.6]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,14.608],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":48,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,14.608],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,17.108],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":51,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,17.108],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":54,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":57,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":60,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":63,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":66,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":69,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":72,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":75,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":78,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":81,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":84,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":87,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":90,"s":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}],"e":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":93,"s":[{"i":[[0,0],[0.123,-0.904],[13.118,0.071],[1.781,12.531],[-0.771,0.001],[-13.559,-0.008]],"o":[[0.771,-0.001],[-1.708,12.576],[-13.016,-0.067],[-0.128,-0.903],[0,0],[13.343,0.006]],"v":[[21.337,-9.257],[22.625,-7.808],[-2.946,14.608],[-28.522,-7.528],[-27.263,-9.176],[-2.671,-5.545]],"c":true}],"e":[{"i":[[0,0],[0.125,-0.904],[13.019,-0.021],[1.781,12.531],[-0.913,0.001],[-11.625,0.045]],"o":[[0.913,-0.002],[-1.74,12.536],[-13.018,0.021],[-0.128,-0.903],[0,0],[11.625,-0.045]],"v":[[21.024,-9.315],[22.557,-7.613],[-2.946,17.295],[-28.522,-7.528],[-26.994,-9.235],[-2.671,-9.275]],"c":true}]},{"t":96}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":40,"s":[100],"h":1}]},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":40,"s":[100],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[233.421,461.195],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Open Smile","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-13.602,0.167],[-0.817,13.364]],"o":[[1.145,13.34],[13.603,-0.166],[0,0]],"v":[[-25.719,-11.551],[0.292,12.014],[25.719,-12.182]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[45],"e":[0]},{"t":20}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[55],"e":[100]},{"t":20}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[0.79,0.56,0.22,1]},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":40,"s":[0],"h":1}]},"w":{"a":0,"k":2.641},"lc":2,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[230.43,463.945],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Smile","np":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.322,1.475],[0,0],[4.634,9.335],[0,0],[3.041,-0.007],[0,0],[-4.62,-2.413],[0,0],[1.789,10.268],[0,0],[-7.447,7.297],[0,0]],"o":[[0,0],[-10.319,-1.474],[0,0],[-2.319,-4.67],[0,0],[6.08,-0.016],[0,0],[9.237,4.826],[0,0],[-1.79,-10.269],[0,0],[7.447,-7.294]],"v":[[30.878,-26.746],[4.089,-30.567],[-23.103,-50.22],[-35.144,-74.456],[-43.549,-81.447],[-43.189,60.499],[-26.405,64.095],[-2.419,76.628],[11.128,66.733],[6.486,40.071],[16.773,8.136],[36.102,-10.803]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[275.242,440.626],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Body_shader","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-4.636,-9.336],[0,0],[-10.32,-1.474],[0,0],[7.448,-7.294],[0,0],[-1.789,-10.269],[0,0],[9.237,4.826],[0,0],[9.213,-4.873],[0,0],[-1.735,10.277],[0,0],[7.482,7.258],[0,0],[-10.314,1.526],[0,0],[-4.59,9.36]],"o":[[4.59,-9.359],[0,0],[4.634,9.335],[0,0],[10.322,1.475],[0,0],[-7.446,7.297],[0,0],[1.788,10.269],[0,0],[-9.237,-4.826],[0,0],[-9.215,4.873],[0,0],[1.736,-10.28],[0,0],[-7.482,-7.256],[0,0],[10.315,-1.525],[0,0]],"v":[[-8.533,-73.371],[8.244,-73.413],[20.285,-49.178],[47.477,-29.525],[74.265,-25.704],[79.489,-9.76],[60.16,9.178],[49.874,41.114],[54.515,67.775],[40.969,77.671],[16.983,65.137],[-16.569,65.22],[-40.491,77.876],[-54.088,68.051],[-49.58,41.366],[-60.029,9.483],[-79.455,-9.358],[-74.312,-25.327],[-47.543,-29.285],[-20.447,-49.076]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.83,0.44,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[231.695,439.583],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Body","np":2,"mn":"ADBE Vector Group"}],"ip":0,"op":90,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":4,"ty":4,"nm":"Fireworks_08","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.733,3.212],[3.516,3.448],[1.007,-0.109],[-0.831,-1.602],[-1.804,-0.048],[-1.498,2.82],[1.857,2.598],[1.894,4.895],[-2.186,3.33],[0.394,3.963],[4.488,1.512],[0.67,2.591],[-1.061,1.667],[3.352,6.121],[-0.017,5.733],[-0.824,5.056],[1.288,6.795],[2.266,9.62],[0.775,2.384],[-2.086,5.33]],"o":[[4.912,0.354],[3.734,-3.212],[-0.723,-0.709],[-1.794,0.194],[0.831,1.602],[3.192,0.085],[1.498,-2.82],[-3.052,-4.27],[-1.438,-3.716],[2.186,-3.33],[-0.468,-4.712],[-2.536,-0.855],[-0.495,-1.913],[3.747,-5.888],[-2.754,-5.028],[0.015,-5.123],[1.113,-6.827],[-1.84,-9.71],[-0.575,-2.44],[-1.769,-5.444],[0,0]],"v":[[19.657,33.614],[33.618,30.114],[35.047,17.054],[32.352,15.881],[30.503,20.092],[35.067,22.494],[42.924,17.911],[42.323,8.835],[30.752,-1.506],[33.523,-12.651],[37.839,-23.525],[28.4,-33.073],[22.087,-37.425],[23.799,-42.917],[27.536,-62.474],[17.953,-76.278],[24.534,-89.921],[16.335,-108.508],[24.585,-136.227],[21.753,-143.18],[24.179,-159.818]],"c":false}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.67,0.87,0.87,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":46.381,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68.762,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":70,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":103,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":104,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":643,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":644,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":676.381,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":698.762,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":700,"s":[0],"e":[0]},{"t":733}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":25,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":67,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":70,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":103,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":104,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":643,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":644,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":655,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":697,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":700,"s":[100],"e":[100]},{"t":733}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":14,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":24,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68.762,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":70,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":103,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":104,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":643,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":644,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":654,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":698.762,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":700,"s":[100],"e":[100]},{"t":733}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":14,"op":450,"st":24,"bm":0,"sr":1},{"ddd":0,"ind":5,"ty":4,"nm":"Fireworks_07","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.987,2.255],[-3.851,-0.605],[-3.81,0.826],[0.199,3.894],[-0.057,1.725],[-3.528,0.655],[-3.35,1.286],[-0.385,4.173],[-1.666,2.264],[-4.338,1.184],[0.652,6.571],[-0.575,1.771],[-4.258,0.478],[-2.004,3.788],[0.798,2.901],[-1.515,4.958],[-6.098,3.216],[-0.018,8.318],[-2.756,4.522]],"o":[[-1.536,-4.314],[3.393,-1.919],[3.852,0.605],[3.811,-0.825],[-0.088,-1.723],[0.118,-3.586],[3.529,-0.654],[3.912,-1.503],[0.258,-2.799],[2.666,-3.621],[6.371,-1.74],[-0.183,-1.853],[1.322,-4.076],[4.258,-0.479],[1.407,-2.659],[-1.374,-4.999],[2.015,-6.594],[7.358,-3.88],[0.011,-5.295],[0,0]],"v":[[168.47,147.842],[172.892,135.992],[184.314,134.937],[195.915,135.611],[203.185,127.697],[202.336,122.605],[209.757,115.984],[220.374,114.415],[227.58,104.899],[228.797,96.697],[241.534,93.832],[249.311,77.395],[249.402,71.854],[260.021,65.997],[271.274,60.989],[271.241,52.188],[269.636,36.947],[284.659,23.584],[299.994,5.52],[299.485,-10.017]],"c":false}},"nm":"Path 6","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.32,0.61,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":41.048,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.096,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":101,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":102,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":641,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":642,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":671.048,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690.096,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":698,"s":[0],"e":[0]},{"t":731}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":23.904,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":101,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":102,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":641,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":642,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":653.904,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":692,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":698,"s":[100],"e":[100]},{"t":731}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":12,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":22,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.096,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":68,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":101,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":102,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":641,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":642,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":652,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690.096,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":698,"s":[100],"e":[100]},{"t":731}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":12,"op":450,"st":22,"bm":0,"sr":1},{"ddd":0,"ind":6,"ty":4,"nm":"Fireworks_06","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-5.281,4.43],[-0.914,3.014],[5.89,1.428],[1.278,-0.706],[-0.398,-2.024],[-1.595,-1.307],[-5.767,2.717],[-1.596,6.171],[3.096,3.922],[3.061,0.395],[-0.362,-3.113],[-0.844,-0.845],[-5.948,1.68],[-4.203,4.531],[-0.402,6.099],[7.253,2.417],[1.355,-3.406],[-1.315,-1.81],[-5.511,1.088],[-3.533,4.367],[0.195,7.031],[5.769,4.024],[2.472,-0.019],[1.072,-2.228],[-1.583,-1.944],[-2.424,-0.639],[-4.257,7.616],[6.316,6.022],[2.637,-1.208],[-1.496,-2.496],[-2.893,0.316],[-2.212,1.892],[-0.927,3.55],[2.473,2.71]],"o":[[6.373,2.623],[2.413,-2.024],[1.757,-5.8],[-1.419,-0.345],[-1.805,0.998],[0.397,2.024],[4.929,4.043],[5.767,-2.716],[1.252,-4.838],[-1.912,-2.422],[-3.109,-0.402],[0.138,1.187],[4.367,4.372],[5.948,-1.679],[4.157,-4.48],[0.503,-7.629],[-3.478,-1.159],[-0.826,2.079],[3.303,4.544],[5.511,-1.089],[4.423,-5.47],[-0.195,-7.031],[-2.027,-1.414],[-2.472,0.019],[-1.087,2.258],[1.582,1.944],[8.437,2.224],[4.257,-7.617],[-2.098,-2.001],[-2.645,1.213],[1.495,2.497],[2.892,-0.316],[2.788,-2.385],[0.926,-3.551],[0,0]],"v":[[155.107,26.434],[174.284,22.087],[179.759,14.55],[171.698,0.45],[167.431,0.768],[165.247,6.125],[168.605,11.174],[186.637,13.021],[198.146,-1.482],[195.964,-15.777],[188.107,-20.228],[181.374,-15.649],[183.12,-12.598],[200.404,-8.883],[215.596,-19.099],[223.786,-35.098],[211.8,-52.728],[202.231,-49.982],[203.534,-43.686],[218.597,-38.425],[232.409,-47.474],[239.401,-66.919],[230.087,-85.004],[223.214,-87.454],[217.117,-83.941],[218.253,-76.909],[224.63,-73.166],[247.016,-82.674],[243.387,-106.723],[235.556,-109.098],[233.618,-101.608],[241.18,-98.275],[248.909,-102.043],[254.954,-111.038],[252.759,-121.366]],"c":false}},"nm":"Path 7","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0,0.73,0.73,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":40,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.001,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":99,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":100,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":639,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":640,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":670,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690.001,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":696,"s":[0],"e":[0]},{"t":729}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":22,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":99,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":100,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":639,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":640,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":652,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":692,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":696,"s":[100],"e":[100]},{"t":729}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":20,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60.001,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":66,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":99,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":100,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":639,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":640,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":650,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690.001,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":696,"s":[100],"e":[100]},{"t":729}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":10,"op":450,"st":20,"bm":0,"sr":1},{"ddd":0,"ind":7,"ty":4,"nm":"Fireworks_05","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.131,7.797],[-5.227,7.109],[-8.766,-1.006],[-2.056,-1.844],[1.011,-2.57],[2.071,-1.017],[11.297,8.656],[-0.667,11.76],[-11.746,0.887],[-2.541,-1.671],[0.36,-3.02],[2.745,-1.724],[12.069,6.836],[4.344,10.921],[-2.995,9.212],[-2.692,2.073],[-2.84,0.366],[-3.616,-4.508],[6.115,-4.567],[7.593,0.777],[7.683,3.722],[3.783,5.39],[0.942,5.093],[-3.631,7.488],[-8.288,0.753]],"o":[[-8.772,0.947],[-4.13,-7.797],[5.226,-7.109],[2.743,0.315],[2.056,1.843],[-0.844,2.146],[-12.773,6.277],[-9.35,-7.164],[0.667,-11.759],[3.033,-0.229],[2.541,1.671],[-0.384,3.219],[-11.744,7.379],[-10.227,-5.792],[-3.581,-9.002],[1.05,-3.231],[2.268,-1.747],[5.732,-0.739],[4.777,5.954],[-6.116,4.567],[-8.493,-0.868],[-5.926,-2.871],[-2.976,-4.239],[-1.513,-8.184],[3.631,-7.489],[0,0]],"v":[[21.947,19.676],[-0.004,7.853],[1.987,-17.173],[25.207,-27.138],[32.799,-24.171],[34.978,-16.7],[29.978,-12.152],[-10.184,-17.613],[-25.547,-47.891],[-3.824,-71.879],[4.928,-69.965],[8.88,-62.255],[3.165,-54.794],[-36.376,-57.061],[-59.814,-82.497],[-60.73,-110.966],[-55.446,-119.498],[-47.461,-122.373],[-31.596,-117.55],[-35.706,-97.459],[-57.634,-93.077],[-82.148,-100.034],[-97.524,-112.094],[-103.116,-126.461],[-100.635,-150.883],[-81.46,-165.113]],"c":false}},"nm":"Path 4","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0,0.73,0.73,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":34.667,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":51.334,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":97,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":98,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":637,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":638,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":664.667,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":681.334,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":694,"s":[0],"e":[0]},{"t":727}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":19.666,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":97,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":98,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":637,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":638,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":649.666,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":683,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":694,"s":[100],"e":[100]},{"t":727}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":18,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":51.334,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":64,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":97,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":98,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":637,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":638,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":648,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":681.334,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":694,"s":[100],"e":[100]},{"t":727}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":8,"op":450,"st":18,"bm":0,"sr":1},{"ddd":0,"ind":8,"ty":4,"nm":"Fireworks_04","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.913,5.269],[1.635,5.641],[2.07,9.641],[-1.235,6.159],[3.608,2.85],[2.872,6.752],[1.643,6.444],[3.337,2.11],[2.014,7.467],[0.352,3.318],[3.517,3.226],[3.39,3.021],[1.953,8.137]],"o":[[-4.197,-3.313],[1.002,-5.787],[-2.745,-9.471],[-1.319,-6.142],[0.904,-4.508],[-5.759,-4.546],[-2.603,-6.119],[-0.976,-3.826],[-6.538,-4.133],[-0.869,-3.222],[-0.503,-4.746],[-3.347,-3.069],[-6.248,-5.568],[0,0]],"v":[[-57.252,23.762],[-62.715,9.49],[-58.964,-7.44],[-80.304,-26.391],[-74.597,-44.016],[-79.12,-56.32],[-97.537,-67.369],[-96.248,-86.954],[-103.868,-95.641],[-120.542,-110.88],[-121.281,-120.84],[-127.589,-133.348],[-138.641,-141.284],[-149.101,-163.655]],"c":false}},"nm":"Path 3","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.32,0.61,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":33.144,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.286,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":95,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":96,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":635,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":636,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":663.144,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":680.286,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":692,"s":[0],"e":[0]},{"t":725}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":17.714,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":52,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":95,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":96,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":635,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":636,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":647.714,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":682,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":692,"s":[100],"e":[100]},{"t":725}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":16,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50.286,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":62,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":95,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":96,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":635,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":636,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":646,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":680.286,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":692,"s":[100],"e":[100]},{"t":725}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":6,"op":450,"st":16,"bm":0,"sr":1},{"ddd":0,"ind":9,"ty":4,"nm":"Fireworks_03","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[6.04,1.773],[1.254,-6.169],[-0.817,-1.005],[-1.139,2.006],[1.203,1.968],[4.066,-0.354],[1.495,-3.798],[3.934,-5.435],[5.091,0.029],[3.978,-3.177],[-1.497,-5.865],[2.314,-2.52],[2.526,-0.02],[4.235,-7.851],[6.161,-3.967],[5.996,-2.631],[6.393,-6.106],[8.746,-9.115],[2.019,-2.488],[7.167,-1.468]],"o":[[-3.035,-5.515],[-6.041,-1.772],[-0.258,1.269],[1.455,1.789],[1.14,-2.005],[-2.128,-3.483],[-4.066,0.354],[-2.458,6.242],[-2.986,4.125],[-5.092,-0.03],[-4.729,3.778],[0.846,3.314],[-1.708,1.861],[-8.921,0.074],[-3.479,6.449],[-5.505,3.545],[-8.096,3.552],[-9.136,8.724],[-2.218,2.313],[-4.609,5.682],[0,0]],"v":[[-89.377,35.497],[-102.837,22.955],[-117.839,30.501],[-117.223,34.207],[-111.421,33.263],[-112.017,26.697],[-122.395,21.455],[-131.712,28.41],[-134.761,48.01],[-148.642,52.786],[-163.307,55.715],[-166.986,72.477],[-167.266,82.274],[-174.347,84.255],[-197.923,93.843],[-206.068,113.718],[-225.276,116.143],[-239.515,137.858],[-274.982,148.278],[-280.472,156.15],[-300.005,165.113]],"c":false}},"nm":"Path 2","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[0.91,0.32,0.61,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":4,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":33.524,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53.048,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":93,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":94,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":633,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":634,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":663.524,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":683.048,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690,"s":[0],"e":[0]},{"t":723}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":4,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":15.952,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":55,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":93,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":94,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":633,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":634,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":645.952,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":685,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690,"s":[100],"e":[100]},{"t":723}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":4,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":14,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53.048,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":60,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":93,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":94,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":633,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":634,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":644,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":683.048,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":690,"s":[100],"e":[100]},{"t":723}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":4,"op":450,"st":14,"bm":0,"sr":1},{"ddd":0,"ind":10,"ty":4,"nm":"Fireworks_02","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-7.933,14.672],[0.349,16.675],[5.473,5.656],[4.908,1.164],[4.876,-2.608],[-1.549,-5.308],[-6.55,-0.009],[-1.872,0.928],[-0.997,4.469],[2.661,12.031],[2.233,3.641],[3.652,2.818],[8.412,2.835]],"o":[[11.892,-11.695],[7.932,-14.672],[-0.166,-7.869],[-3.508,-3.625],[-5.381,-1.276],[-4.876,2.608],[1.834,6.288],[2.089,0.003],[4.103,-2.034],[2.684,-12.026],[-0.923,-4.171],[-2.412,-3.933],[-7.029,-5.423],[0,0]],"v":[[119.191,30.962],[149.872,-8.329],[162.384,-56.202],[155.159,-78.093],[141.943,-85.036],[125.763,-83.813],[119.055,-70.028],[134.91,-60.892],[141.017,-62.022],[147.861,-73.389],[147.896,-110.061],[143.478,-122.026],[133.96,-131.966],[110.582,-144.469]],"c":false}},"nm":"Path 5","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":27.715,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":43.429,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":58,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":91,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":92,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":631,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":632,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":657.715,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":673.429,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":688,"s":[0],"e":[0]},{"t":721}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":13.571,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":45,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":58,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":91,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":92,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":631,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":632,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":643.571,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":675,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":688,"s":[100],"e":[100]},{"t":721}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":2,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":12,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":43.429,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":58,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":91,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":92,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":631,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":632,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":642,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":673.429,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":688,"s":[100],"e":[100]},{"t":721}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":2,"op":450,"st":12,"bm":0,"sr":1},{"ddd":0,"ind":11,"ty":4,"nm":"Fireworks_01","parent":0,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-41,-125.553,0]},"a":{"a":0,"k":[312.5,177.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[11.69,6.335],[-0.042,3.716],[-1.247,1.266],[-2.612,-1.139],[1.105,-2.627],[5.141,2.153],[1.829,8.959],[3.076,2.136],[3.312,2.666],[6.996,6.602],[3.62,1.755],[1.41,3.485],[2.977,4.448],[4.619,1.026],[4.136,2.297],[3.748,5.272],[6.456,0.411]],"o":[[-11.36,6.845],[-3.267,-1.77],[0.02,-1.777],[2,-2.029],[2.611,1.139],[-2.791,6.636],[-9.286,-3.889],[-0.75,-3.67],[-3.493,-2.425],[-7.686,-6.189],[-2.926,-2.762],[-3.383,-1.641],[-2.008,-4.961],[-2.632,-3.932],[-4.619,-1.026],[-5.656,-3.142],[-3.749,-5.273],[0,0]],"v":[[-87.104,119.435],[-125.246,120.525],[-131.776,112.185],[-129.676,107.427],[-121.832,105.665],[-118.75,112.73],[-140.586,115.83],[-152.583,96.072],[-157.893,86.484],[-169.572,81.55],[-177.838,56.291],[-188.771,51.385],[-196.302,43.331],[-200.687,27.987],[-212.76,21.213],[-226.362,17.374],[-239.172,3.039],[-254.425,-7.871]],"c":false}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"st","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":24.762,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":39.524,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":89,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":90,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":629,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":630,"s":[100],"e":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":654.762,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":669.524,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":686,"s":[0],"e":[0]},{"t":719}]},"w":{"a":0,"k":4.829},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":11.477,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":41,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":90,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":629,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":630,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p667_1_0p167_0p167"],"t":641.477,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":671,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":686,"s":[100],"e":[100]},{"t":719}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":10,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":39.524,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_1_0p167_0p167"],"t":90,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":629,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":630,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":640,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":669.524,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":686,"s":[100],"e":[100]},{"t":719}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim"},{"ty":"tr","p":{"a":0,"k":[312.078,177.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"mn":"ADBE Vector Group"}],"ip":0,"op":450,"st":10,"bm":0,"sr":1},{"ddd":0,"ind":12,"ty":4,"nm":"Fireworks","parent":0,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":53,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":90,"s":[0],"e":[100]},{"t":93}]},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[7.784,-100.71,0],"e":[7.784,99.29,0],"to":[0,33.3333320617676,0],"ti":[0,-33.3333320617676,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":56,"s":[7.784,99.29,0],"e":[7.784,99.29,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":89,"s":[7.784,99.29,0],"e":[7.784,-100.71,0],"to":[0,-33.3333320617676,0],"ti":[0,33.3333320617676,0]},{"t":90}]},"a":{"a":0,"k":[225.631,140.499,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.091,10.526],[-8.034,1.938],[-1.091,-10.526],[8.034,-1.938]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.91,0.32,0.61,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[218.951,244.775],"e":[-64.365,214.365],"to":[-47.2194023132324,-5.068359375],"ti":[47.2194023132324,5.068359375]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":50,"s":[-64.365,214.365],"e":[-64.365,214.365],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[-64.365,214.365],"e":[-64.365,214.365],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[-64.365,214.365],"e":[218.951,244.775],"to":[47.2194023132324,5.068359375],"ti":[-47.2194023132324,-5.068359375]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[-1996],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[-1996]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15.834,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.032,-3.369],[3.65,7.414],[-10.032,3.37],[-3.65,-7.414]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[217.823,241.687],"e":[62.624,26.913],"to":[-25.8665370941162,-35.7955741882324],"ti":[25.8665370941162,35.7955741882324]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":33,"s":[62.624,26.913],"e":[62.624,26.913],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[62.624,26.913],"e":[62.624,26.913],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[62.624,26.913],"e":[217.823,241.687],"to":[25.8665370941162,35.7955741882324],"ti":[-25.8665370941162,-35.7955741882324]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[1909],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[1909]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10.45,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":33,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.439,-9.079],[7.591,3.266],[-5.438,9.079],[-7.591,-3.265]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.91,0.32,0.61,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[216.419,243.707],"e":[310.345,5.738],"to":[15.654296875,-39.6614570617676],"ti":[-15.654296875,39.6614570617676]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":44,"s":[310.345,5.738],"e":[310.345,5.738],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[310.345,5.738],"e":[310.345,5.738],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[310.345,5.738],"e":[216.419,243.707],"to":[-15.654296875,39.6614570617676],"ti":[15.654296875,-39.6614570617676]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[-1082],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[-1082]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.934,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":44,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.032,-3.369],[3.649,7.414],[-10.032,3.37],[-3.65,-7.414]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.91,0.32,0.61,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[220.852,243.393],"e":[503.969,162.999],"to":[47.1861991882324,-13.3990888595581],"ti":[-47.1861991882324,13.3990888595581]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[503.969,162.999],"e":[503.969,162.999],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[503.969,162.999],"e":[220.852,243.393],"to":[-47.1861991882324,13.3990888595581],"ti":[47.1861991882324,-13.3990888595581]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[-1636],"e":[0]},{"i":{"x":[0],"y":[0]},"o":{"x":[0.167],"y":[0.167]},"n":["0_0_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[-1636]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":17.733,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.635,-8.958],[7.518,3.43],[-5.635,8.958],[-7.518,-3.431]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.65,0.86,0.87,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[216.978,239.574],"e":[167.638,-20.883],"to":[-8.22330760955811,-43.4095039367676],"ti":[8.22330760955811,43.4095039367676]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":34,"s":[167.638,-20.883],"e":[167.638,-20.883],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[167.638,-20.883],"e":[167.638,-20.883],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[167.638,-20.883],"e":[216.978,239.574],"to":[8.22330760955811,43.4095039367676],"ti":[-8.22330760955811,-43.4095039367676]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[791],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[791]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":10.767,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[12.714,-4.27],[4.625,9.396],[-12.714,4.27],[-4.625,-9.396]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[1,0.77,0.07,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[216.807,247.359],"e":[306.713,-26.422],"to":[14.984375,-45.6302070617676],"ti":[-14.984375,45.6302070617676]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":35,"s":[306.713,-26.422],"e":[306.713,-26.422],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[306.713,-26.422],"e":[306.713,-26.422],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[306.713,-26.422],"e":[216.807,247.359],"to":[-14.984375,45.6302070617676],"ti":[14.984375,-45.6302070617676]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[-1349],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[-1349]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":11.084,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":35,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.462,-5.529],[5.988,12.166],[-16.462,5.529],[-5.99,-12.166]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.89,0.91,0.92,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[220.337,243.096],"e":[496.388,105.69],"to":[46.0084648132324,-22.9010410308838],"ti":[-46.0084648132324,22.9010410308838]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":50,"s":[496.388,105.69],"e":[496.388,105.69],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[496.388,105.69],"e":[496.388,105.69],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[496.388,105.69],"e":[220.337,243.096],"to":[-46.0084648132324,22.9010410308838],"ti":[46.0084648132324,-22.9010410308838]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[1085],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[1085]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15.834,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.21,-15.799],[12.976,3.938],[-7.209,15.799],[-12.976,-3.938]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.89,0.91,0.92,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[216.862,239.004],"e":[502.475,218.079],"to":[47.6022148132324,-3.48763012886047],"ti":[-47.6022148132324,3.48763012886047]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":28,"s":[502.475,218.079],"e":[502.475,218.079],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[502.475,218.079],"e":[502.475,218.079],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[502.475,218.079],"e":[216.862,239.004],"to":[-47.6022148132324,3.48763012886047],"ti":[47.6022148132324,-3.48763012886047]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[544],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[544]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8.867,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":28,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.889,12.659],[-8.563,10.515],[-11.889,-12.659],[8.562,-10.516]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.89,0.91,0.92,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[219.276,237.668],"e":[218.221,-27.157],"to":[-0.17578125,-44.1373710632324],"ti":[0.17578125,44.1373710632324]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":42,"s":[218.221,-27.157],"e":[218.221,-27.157],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[218.221,-27.157],"e":[218.221,-27.157],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[218.221,-27.157],"e":[219.276,237.668],"to":[0.17578125,44.1373710632324],"ti":[-0.17578125,-44.1373710632324]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[-1017],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[-1017]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13.301,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":42,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.889,12.66],[-8.562,10.516],[-11.889,-12.66],[8.562,-10.515]],"c":true}},"nm":"Path 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.89,0.91,0.92,1]},"o":{"a":0,"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[219.081,240.186],"e":[-48.224,-10.22],"to":[-44.55078125,-41.734375],"ti":[44.55078125,41.734375]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":25,"s":[-48.224,-10.22],"e":[-48.224,-10.22],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":0},"o":{"x":0.167,"y":0.167},"n":"0_0_0p167_0p167","t":56,"s":[-48.224,-10.22],"e":[-48.224,-10.22],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":89,"s":[-48.224,-10.22],"e":[219.081,240.186],"to":[44.55078125,41.734375],"ti":[-44.55078125,-41.734375]},{"t":90}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[1408],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0]},"n":["0p833_0p833_0p167_0"],"t":89,"s":[0],"e":[1408]},{"t":90}],"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":7.917,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":25,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":56,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":89,"s":[0],"e":[100]},{"t":90}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"mn":"ADBE Vector Group"}],"ip":0,"op":450,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":13,"ty":1,"nm":"White Solid 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,398,0]},"a":{"a":0,"k":[400,400,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"sw":800,"sh":800,"sc":"","ip":0,"op":600,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 06d76d192e..16e9232c2b 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -677,8 +677,13 @@ void LottieParserImpl::parseLayers(LOTCompositionData *comp) LottieColor LottieParserImpl::toColor(const char *str) { LottieColor color; + int len = strlen(str); - RAPIDJSON_ASSERT(strlen(str) == 7); + // some resource has empty color string + // return a default color for those cases. + if (!len) return color; + + RAPIDJSON_ASSERT(len == 7); RAPIDJSON_ASSERT(str[0] == '#'); char tmp[3] = {'\0', '\0', '\0'}; From ab741851b56d7d8327d318aa565a74225622c750 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 11 Jan 2019 14:13:15 +0900 Subject: [PATCH 392/672] copying: fix wrong path. Change-Id: I47ad76591dd8b5cba24361f110028a476723feb0 --- COPYING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/COPYING b/COPYING index d630e2d6fc..cd07ce46dc 100644 --- a/COPYING +++ b/COPYING @@ -12,4 +12,4 @@ Dependencies and licenses: src/vector/ licenses/COPYING.LGPL src/vector/freetype licenses/COPYING.FTL src/vector/pixman licenses/COPYING.PIX -src/vector/lottie/rapidjson licenses/COPYING.RPD +src/lottie/rapidjson licenses/COPYING.RPD From 6208d0701651e3db28b6ca9105c7a177b36801e1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 14 Jan 2019 10:17:55 +0900 Subject: [PATCH 393/672] lottie/vector: create a wraper library of stb_image loader Change-Id: If3ebb5d399d81c4435419c6f728f2f73b0cb7faa --- COPYING | 2 + licenses/COPYING.STB | 17 + src/vector/stb/CMakeLists.txt | 0 src/vector/stb/meson.build | 7 + src/vector/stb/stb_image.cpp | 60 + src/vector/stb/stb_image.h | 7462 +++++++++++++++++++++++++++++++++ 6 files changed, 7548 insertions(+) create mode 100644 licenses/COPYING.STB create mode 100644 src/vector/stb/CMakeLists.txt create mode 100644 src/vector/stb/meson.build create mode 100644 src/vector/stb/stb_image.cpp create mode 100644 src/vector/stb/stb_image.h diff --git a/COPYING b/COPYING index cd07ce46dc..550e1e9b7b 100644 --- a/COPYING +++ b/COPYING @@ -12,4 +12,6 @@ Dependencies and licenses: src/vector/ licenses/COPYING.LGPL src/vector/freetype licenses/COPYING.FTL src/vector/pixman licenses/COPYING.PIX +src/vector/stb licenses/COPYING.STB src/lottie/rapidjson licenses/COPYING.RPD + diff --git a/licenses/COPYING.STB b/licenses/COPYING.STB new file mode 100644 index 0000000000..1da71ca8db --- /dev/null +++ b/licenses/COPYING.STB @@ -0,0 +1,17 @@ + MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/vector/stb/CMakeLists.txt b/src/vector/stb/CMakeLists.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/vector/stb/meson.build b/src/vector/stb/meson.build new file mode 100644 index 0000000000..a7a59c0060 --- /dev/null +++ b/src/vector/stb/meson.build @@ -0,0 +1,7 @@ + +lottie_image_loader_sources = ['stb_image.cpp'] + +lottie_image_loader_lib = shared_library( 'lottie-image-loader', + lottie_image_loader_sources, + install : true) + diff --git a/src/vector/stb/stb_image.cpp b/src/vector/stb/stb_image.cpp new file mode 100644 index 0000000000..d5bf5c4e2d --- /dev/null +++ b/src/vector/stb/stb_image.cpp @@ -0,0 +1,60 @@ +/* + * configure stb_image about + * the image we will support + */ +#define STB_IMAGE_IMPLEMENTATION + +#define STBI_ONLY_JPEG +#define STBI_ONLY_PNG +#define STBI_NO_HDR +#define STBI_NO_LINEAR +#define STBI_NO_GIF +#define STBI_NO_PIC + +#include "stb_image.h" + +#ifdef _WIN32 +#ifdef LOT_BUILD +#ifdef DLL_EXPORT +#define LOT_EXPORT __declspec(dllexport) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT __declspec(dllimport) +#endif +#else +#ifdef __GNUC__ +#if __GNUC__ >= 4 +#define LOT_EXPORT __attribute__((visibility("default"))) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * exported function wrapper from the library + */ + +LOT_EXPORT unsigned char * +lottie_image_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + return stbi_load(filename, x, y, comp, req_comp); +} + +LOT_EXPORT void +lottie_image_free(unsigned char *data) +{ + stbi_image_free(data); +} + +#ifdef __cplusplus +} +#endif diff --git a/src/vector/stb/stb_image.h b/src/vector/stb/stb_image.h new file mode 100644 index 0000000000..d9c21bc813 --- /dev/null +++ b/src/vector/stb/stb_image.h @@ -0,0 +1,7462 @@ +/* stb_image - v2.19 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine + John-Mark Allen + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar + Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex + Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 + Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus + Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo + Christian Floisand Kevin Schmidt github:darealshinji + Blazej Dariusz Roszkowski github:Michaelangel007 +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy to use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// make more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// + + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) || !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v >= 0 && v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->history = (stbi_uc *) stbi__malloc(g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "tranparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to teh color that was there the previous frame. + memset( g->out, 0x00, 4 * g->w * g->h ); + memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent) + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispoase of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); + if (delays) { + *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + (void) stbi__get32be(s); + (void) stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ From 33805af1dff734a8488ec956b6c5634dc6fd77d3 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 14 Jan 2019 10:50:04 +0900 Subject: [PATCH 394/672] lottie/stb: fixed warning regarding unused function. Change-Id: I4558829cc73135bcf5d454e97e13db5925df1655 --- src/vector/stb/stb_image.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vector/stb/stb_image.h b/src/vector/stb/stb_image.h index d9c21bc813..d284fd090d 100644 --- a/src/vector/stb/stb_image.h +++ b/src/vector/stb/stb_image.h @@ -1070,6 +1070,7 @@ static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) } } +#ifndef STBI_NO_GIF static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) { int slice; @@ -1081,6 +1082,7 @@ static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int byt bytes += slice_size; } } +#endif static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) { From 4d4fa29212b5b8445507161b6c1655c4dfb78784 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 15 Jan 2019 09:52:31 +0900 Subject: [PATCH 395/672] lottie/parser: added support for image asset parsing. Change-Id: Ib7a4ec1b7d6d7f5c9357e451c3908d88c671bc37 --- src/lottie/lottieloader.cpp | 11 ++++++-- src/lottie/lottiemodel.h | 17 ++++++++++--- src/lottie/lottieparser.cpp | 50 +++++++++++++++++++++++++++++++------ src/lottie/lottieparser.h | 2 +- 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index ac2da78900..6b540f8102 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -21,7 +21,7 @@ #include #include - +#include using namespace std; class LottieFileCache { @@ -56,6 +56,13 @@ void LottieFileCache::add(const std::string &key, std::shared_ptr valu mHash[key] = std::move(value); } +static std::string dirname(const std::string &path) +{ + const char *ptr = strrchr(path.c_str(), '/'); + int len = int(ptr + 1 - path.c_str()); // +1 to include '/' + return std::string(path, 0, len); +} + bool LottieLoader::load(const std::string &path) { LottieFileCache &fileCache = LottieFileCache::get(); @@ -73,7 +80,7 @@ bool LottieLoader::load(const std::string &path) std::stringstream buf; buf << f.rdbuf(); - LottieParser parser(const_cast(buf.str().data())); + LottieParser parser(const_cast(buf.str().data()), dirname(path).c_str()); mModel = parser.model(); fileCache.add(path, mModel); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 16a75d5795..08f254e512 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -339,9 +339,19 @@ public: class LOTLayerData; struct LOTAsset { - int mAssetType; //lottie asset type (precomp/char/image) - std::string mRefId; // ref id - std::vector> mLayers; + enum class Type { + Precomp, + Image, + Char + }; + + Type mAssetType{Type::Precomp}; + std::string mRefId; // ref id + std::vector> mLayers; + // image asset data + int mWidth{0}; + int mHeight{0}; + std::string mImagePath; }; class LOTLayerData : public LOTGroupData @@ -393,6 +403,7 @@ public: bool mAutoOrient{false}; std::vector> mMasks; LOTCompositionData *mCompRef{nullptr}; + std::shared_ptr mAsset; }; class LOTCompositionData : public LOTData diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 16e9232c2b..643c3cba45 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -173,7 +173,9 @@ protected: class LottieParserImpl : protected LookaheadParserHandler { public: - LottieParserImpl(char *str) : LookaheadParserHandler(str) {} + LottieParserImpl(char *str, const char *dir_path) + :LookaheadParserHandler(str), + mDirPath(dir_path){} public: bool EnterObject(); @@ -270,6 +272,7 @@ protected: LOTCompositionData * compRef{nullptr}; LOTLayerData * curLayerRef{nullptr}; std::vector> mLayersToUpdate; + std::string mDirPath; void SkipOut(int depth); }; @@ -557,7 +560,11 @@ void LottieParserImpl::resolveLayerRefs() LOTLayerData *layer = i.get(); auto search = compRef->mAssets.find(layer->mPreCompRefId); if (search != compRef->mAssets.end()) { - layer->mChildren = search->second.get()->mLayers; + if (layer->mLayerType == LayerType::Image) { + layer->mAsset = search->second; + } else if (layer->mLayerType == LayerType::Precomp) { + layer->mChildren = search->second.get()->mLayers; + } } } } @@ -628,11 +635,23 @@ std::shared_ptr LottieParserImpl::parseAsset() RAPIDJSON_ASSERT(PeekType() == kObjectType); std::shared_ptr sharedAsset = std::make_shared(); LOTAsset * asset = sharedAsset.get(); + std::string filename; + std::string relativePath; EnterObject(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "ty")) { /* Type of layer: Shape. Value 4.*/ + if (0 == strcmp(key, "w")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); - asset->mAssetType = GetInt(); + asset->mWidth = GetInt(); + } else if (0 == strcmp(key, "h")) { + RAPIDJSON_ASSERT(PeekType() == kNumberType); + asset->mHeight = GetInt(); + } else if (0 == strcmp(key, "p")) { /* image name */ + asset->mAssetType = LOTAsset::Type::Image; + RAPIDJSON_ASSERT(PeekType() == kStringType); + filename = std::string(GetString()); + } else if (0 == strcmp(key, "u")) { /* relative image path */ + RAPIDJSON_ASSERT(PeekType() == kStringType); + relativePath = std::string(GetString()); } else if (0 == strcmp(key, "id")) { /* reference id*/ if (PeekType() == kStringType) { asset->mRefId = std::string(GetString()); @@ -641,6 +660,7 @@ std::shared_ptr LottieParserImpl::parseAsset() asset->mRefId = std::to_string(GetInt()); } } else if (0 == strcmp(key, "layers")) { + asset->mAssetType = LOTAsset::Type::Precomp; RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { @@ -654,6 +674,10 @@ std::shared_ptr LottieParserImpl::parseAsset() Skip(key); } } + // its an image asset + if (!filename.empty()) { + asset->mImagePath = mDirPath + relativePath + filename; + } return sharedAsset; } @@ -1978,8 +2002,20 @@ public: << ", ao:" << obj->autoOrient() << ", ddd:" << obj->mTransform->ddd() << ", W:" << obj->layerSize().width() - << ", H:" << obj->layerSize().height() - << "\n"; + << ", H:" << obj->layerSize().height(); + + if (obj->mLayerType == LayerType::Image) + vDebug << level + << "\t{ " + << "ImageInfo:" + << " W :" << obj->mAsset->mWidth + << ", H :" << obj->mAsset->mHeight + << ", Path :"<mAsset->mImagePath + <<" }" + << "\n"; + else { + vDebug<< level; + } visitChildren(static_cast(obj), level); vDebug << level << "} " @@ -2121,7 +2157,7 @@ LottieParser::~LottieParser() delete d; } -LottieParser::LottieParser(char *str) : d(new LottieParserImpl(str)) +LottieParser::LottieParser(char *str, const char *dir_path) : d(new LottieParserImpl(str, dir_path)) { d->parseComposition(); } diff --git a/src/lottie/lottieparser.h b/src/lottie/lottieparser.h index 3c63f65c23..d892c24507 100644 --- a/src/lottie/lottieparser.h +++ b/src/lottie/lottieparser.h @@ -25,7 +25,7 @@ class LottieParserImpl; class LottieParser { public: ~LottieParser(); - LottieParser(char* str); + LottieParser(char* str, const char *dir_path=""); std::shared_ptr model(); private: LottieParserImpl *d; From bc2b2b8936cd3cb139b0d6ccb4b92892be3ea70f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 15 Jan 2019 13:33:17 +0900 Subject: [PATCH 396/672] lottie/example : added segmented animation support in lottieview Change-Id: I7af3109576217e3b92a6a6d9fd9492b5fb4c6bcb --- example/demo.cpp | 2 ++ example/lottieview.cpp | 16 +++++----------- example/lottieview.h | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/example/demo.cpp b/example/demo.cpp index 0af0b763fd..78f3fdd195 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -58,6 +58,8 @@ main(void) view->setPos(0, 0); view->setSize(800, 800); view->show(); + view->setMinProgress(0.5); + view->setMaxProgress(0.0); view->play(); view->loop(true); view->setRepeatMode(LottieView::RepeatMode::Reverse); diff --git a/example/lottieview.cpp b/example/lottieview.cpp index ff130ca006..a09417ac7d 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -24,11 +24,9 @@ static Eina_Bool animator(void *data , double pos) { LottieView *view = static_cast(data); - float nextPos = pos + view->mStartPos; - if (nextPos > 1.0) nextPos = 1.0; - view->seek(nextPos); - if (nextPos == 1.0) { + view->seek(pos); + if (pos == 1.0) { view->mAnimator = NULL; view->finished(); return EINA_FALSE; @@ -307,10 +305,8 @@ void LottieView::seek(float pos) { if (!mPlayer) return; - if (mPalying && mReverse) - pos = 1.0 - pos; - mPos = pos; + mPos = mapProgress(pos); // check if the pos maps to the current frame if (mCurFrame == mPlayer->frameAtPos(mPos)) return; @@ -427,9 +423,8 @@ void LottieView::play() { if (!mPlayer) return; - mStartPos = mPos; if (mAnimator) ecore_animator_del(mAnimator); - mAnimator = ecore_animator_timeline_add(mPlayer->duration()/mSpeed, animator, this); + mAnimator = ecore_animator_timeline_add(duration()/mSpeed, animator, this); mReverse = false; mCurCount = mRepeatCount; mPalying = true; @@ -460,8 +455,7 @@ void LottieView::restart() else mReverse = false; - mStartPos = 0; if (mAnimator) ecore_animator_del(mAnimator); - mAnimator = ecore_animator_timeline_add(mPlayer->duration()/mSpeed, animator, this); + mAnimator = ecore_animator_timeline_add(duration()/mSpeed, animator, this); } } diff --git a/example/lottieview.h b/example/lottieview.h index 3622505026..8dc839223c 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -35,6 +35,7 @@ #include "lottieanimation.h" #include "lottieanimation_capi.h" #include +#include class LottieView { public: @@ -66,7 +67,34 @@ public: void stop(); void render(); void initializeBufferObject(Evas *evas); + void setMinProgress(float progress) + { + //clamp it to [0,1] + mMinProgress = progress; + } + void setMaxProgress(float progress) + { + //clamp it to [0,1] + mMaxprogress = progress; + } private: + float mapProgress(float progress) { + //clamp it to the segment + progress = (mMinProgress + (mMaxprogress - mMinProgress) * progress); + + // currently playing and in reverse mode + if (mPalying && mReverse) + progress = mMaxprogress > mMinProgress ? + mMaxprogress - progress : mMinProgress - progress; + + + return progress; + } + float duration() const { + // usually we run the animation for mPlayer->duration() + // but now run animation for segmented duration. + return mPlayer->duration() * fabs(mMaxprogress - mMinProgress); + } void createVgNode(LOTNode *node, Efl_VG *root); void update(const std::vector &); void updateTree(const LOTLayerNode *); @@ -92,11 +120,14 @@ public: bool mRenderMode; bool mAsyncRender; bool mDirty; - float mStartPos; float mPos; float mFrameRate; long mTotalFrame; std::future mRenderTask; + + //keep a segment of the animation default is [0, 1] + float mMinProgress{0}; + float mMaxprogress{1}; }; class LottieViewCApi From 20ffc1f859c7a24892f7713c20f20a0cbeeaf34e Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 14 Jan 2019 10:31:03 +0900 Subject: [PATCH 397/672] lottie/vector: added image loading support in vector. Change-Id: I37fd0c436ec396b186f78dfe1f0c0304204a942b --- CMakeLists.txt | 5 ++ src/vector/CMakeLists.txt | 1 + src/vector/meson.build | 6 ++ src/vector/vimageloader.cpp | 116 ++++++++++++++++++++++++++++++++++++ src/vector/vimageloader.h | 25 ++++++++ 5 files changed, 153 insertions(+) create mode 100644 src/vector/vimageloader.cpp create mode 100644 src/vector/vimageloader.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e9b01d454..34e994ca0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,11 @@ target_link_libraries(lottie-player "${CMAKE_THREAD_LIBS_INIT}" ) +# for dlopen, dlsym and dlclose dependancy +target_link_libraries(lottie-player + PRIVATE + ${CMAKE_DL_LIBS}) + target_link_libraries(lottie-player PUBLIC "-Wl,--no-undefined" diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 96c55d6421..cbf9c9869e 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -23,6 +23,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vbezier.cpp" "${CMAKE_CURRENT_LIST_DIR}/vraster.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdrawable.cpp" + "${CMAKE_CURRENT_LIST_DIR}/vimageloader.cpp" ) target_include_directories(lottie-player diff --git a/src/vector/meson.build b/src/vector/meson.build index 338b87e903..ed8b471eed 100644 --- a/src/vector/meson.build +++ b/src/vector/meson.build @@ -1,6 +1,7 @@ subdir('freetype') subdir('pixman') +subdir('stb') vector_dep = [freetype_dep] vector_dep += pixman_dep @@ -24,6 +25,11 @@ source_file += files('vdebug.cpp') source_file += files('vinterpolator.cpp') source_file += files('vbezier.cpp') source_file += files('vraster.cpp') +source_file += files('vimageloader.cpp') + +# dl dependancy for dlopen, dlsym, dlclose symbol +cc = meson.get_compiler('cpp') +vector_dep += cc.find_library('dl', required : true) vector_dep += declare_dependency( include_directories : include_directories('.'), sources : source_file diff --git a/src/vector/vimageloader.cpp b/src/vector/vimageloader.cpp new file mode 100644 index 0000000000..28a774ab35 --- /dev/null +++ b/src/vector/vimageloader.cpp @@ -0,0 +1,116 @@ +#include "vimageloader.h" +#include "vdebug.h" +#include +#include + +using lottie_image_load_f = unsigned char* (*)(char const *filename, int *x, int *y, int *comp, int req_comp); +using lottie_image_free_f = void (*)(unsigned char *); + +struct VImageLoader::Impl +{ + void *dl_handle{nullptr}; + lottie_image_load_f lottie_image_load{nullptr}; + lottie_image_free_f lottie_image_free{nullptr}; + + Impl() + { + #ifdef __APPLE__ + dl_handle = dlopen("liblottie-image-loader.dylib", RTLD_LAZY); + #else + dl_handle = dlopen("liblottie-image-loader.so", RTLD_LAZY); + #endif + if (!dl_handle) + vWarning<<"Failed to dlopen liblottie-image-loader library"; + lottie_image_load = (lottie_image_load_f) dlsym(dl_handle, "lottie_image_load"); + if (!lottie_image_load) + vWarning<<"Failed to find symbol lottie_image_load in liblottie-image-loader library"; + lottie_image_free = (lottie_image_free_f) dlsym(dl_handle, "lottie_image_free"); + if (!lottie_image_free) + vWarning<<"Failed to find symbol lottie_image_free in liblottie-image-loader library"; + } + ~Impl() + { + if (dl_handle) dlclose(dl_handle); + } + VBitmap load(const char *fileName) + { + if (!lottie_image_load) return VBitmap(); + + int width, height, n; + unsigned char *data = lottie_image_load(fileName, &width, &height, &n, 4); + + if (!data) { + return VBitmap(); + } + + // premultiply alpha + if (n == 4) + convertToBGRAPremul(data, width, height); + else + convertToBGRA(data, width, height); + + // create a bitmap of same size. + VBitmap result = VBitmap(width, height, VBitmap::Format::ARGB32_Premultiplied); + + // copy the data to bitmap buffer + memcpy(result.data(), data, width * height * 4); + + // free the image data + lottie_image_free(data); + + return result; + } + /* + * convert from RGBA to BGRA and premultiply + */ + void convertToBGRAPremul(unsigned char *bits, int width, int height) + { + int pixelCount = width * height; + unsigned char *pix = bits; + for (int i = 0; i < pixelCount; i++) { + unsigned char r = pix[0]; + unsigned char g = pix[1]; + unsigned char b = pix[2]; + unsigned char a = pix[3]; + + r = (r * a) / 255; + g = (g * a) / 255; + b = (b * a) / 255; + + pix[0] = b; + pix[1] = g; + pix[2] = r; + + pix += 4; + } + } + /* + * convert from RGBA to BGRA + */ + void convertToBGRA(unsigned char *bits, int width, int height) + { + int pixelCount = width * height; + unsigned char *pix = bits; + for (int i = 0; i < pixelCount; i++) { + unsigned char r = pix[0]; + unsigned char b = pix[2]; + pix[0] = b; + pix[2] = r; + pix += 4; + } + } +}; + +VImageLoader::VImageLoader(): + mImpl(std::make_unique()) +{ + +} + +VImageLoader::~VImageLoader() {} + +VBitmap VImageLoader::load(const char *fileName) +{ + return mImpl->load(fileName); +} + diff --git a/src/vector/vimageloader.h b/src/vector/vimageloader.h new file mode 100644 index 0000000000..64bd8654ad --- /dev/null +++ b/src/vector/vimageloader.h @@ -0,0 +1,25 @@ +#ifndef VIMAGELOADER_H +#define VIMAGELOADER_H + +#include + +#include "vbitmap.h" + +class VImageLoader +{ +public: + static VImageLoader& instance() + { + static VImageLoader singleton; + return singleton; + } + + VBitmap load(const char *fileName); + ~VImageLoader(); +private: + VImageLoader(); + struct Impl; + std::unique_ptr mImpl; +}; + +#endif // VIMAGELOADER_H From 08a316ab66e042ed5999129359f4ad78e7058a83 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 15 Jan 2019 15:52:04 +0900 Subject: [PATCH 398/672] lottie/vector: Added texture and transformation support in brush. Change-Id: I4e433a8f09342051a9ec062f45184709e578fd98 --- src/vector/vbrush.cpp | 15 ++++++++++++++- src/vector/vbrush.h | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/vector/vbrush.cpp b/src/vector/vbrush.cpp index c1a3dc9abb..ca2df7b77d 100644 --- a/src/vector/vbrush.cpp +++ b/src/vector/vbrush.cpp @@ -85,7 +85,7 @@ VBrush::VBrush(int r, int g, int b, int a) { } -VBrush::VBrush(const VGradient *gradient) : mType(VBrush::Type::NoBrush) +VBrush::VBrush(const VGradient *gradient) { if (!gradient) return; @@ -98,4 +98,17 @@ VBrush::VBrush(const VGradient *gradient) : mType(VBrush::Type::NoBrush) } } +VBrush::VBrush(const VBitmap &texture) +{ + if (!texture.valid()) return; + + mType = VBrush::Type::Texture; + mTexture = texture; +} + +void VBrush::setMatrix(const VMatrix &m) +{ + mMatrix = m; +} + V_END_NAMESPACE diff --git a/src/vector/vbrush.h b/src/vector/vbrush.h index f6a07d4992..348e2ec877 100644 --- a/src/vector/vbrush.h +++ b/src/vector/vbrush.h @@ -23,6 +23,7 @@ #include "vglobal.h" #include "vmatrix.h" #include "vpoint.h" +#include "vbitmap.h" V_BEGIN_NAMESPACE @@ -78,12 +79,15 @@ public: VBrush(const VColor &color); VBrush(const VGradient *gradient); VBrush(int r, int g, int b, int a); + VBrush(const VBitmap &texture); inline VBrush::Type type() const { return mType; } - + void setMatrix(const VMatrix &m); public: VBrush::Type mType{Type::NoBrush}; VColor mColor; const VGradient *mGradient{nullptr}; + VBitmap mTexture; + VMatrix mMatrix; }; V_END_NAMESPACE From f5ddeec76de3a36eb58301de6bc530ffe67dc9c7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 15 Jan 2019 15:54:12 +0900 Subject: [PATCH 399/672] lottie/vector: Added transform image rendering support in the render backend. Change-Id: I84ae9229446b1f46a91b28544641c62dee96a23f --- src/vector/vdrawhelper.cpp | 137 +++++++++++++++++++++++++++++++++++-- src/vector/vdrawhelper.h | 2 + 2 files changed, 132 insertions(+), 7 deletions(-) diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 46d2657490..3a254836f0 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -587,6 +587,111 @@ static void blendGradientARGB(int count, const VRle::Span *spans, } } +template +constexpr const T& clamp( const T& v, const T& lo, const T& hi) +{ + return v < lo ? lo : hi < v ? hi : v; +} + +static const int buffer_size = 1024; +static const int fixed_scale = 1 << 16; +static void blend_transformed_argb(int count, const VRle::Span *spans, void *userData) +{ + VSpanData *data = reinterpret_cast(userData); + if (data->mBitmap.format != VBitmap::Format::ARGB32_Premultiplied + && data->mBitmap.format != VBitmap::Format::ARGB32) { + //@TODO other formats not yet handled. + return; + } + + Operator op = getOperator(data, spans, count); + uint buffer[buffer_size]; + + const int image_x1 = data->mBitmap.x1; + const int image_y1 = data->mBitmap.y1; + const int image_x2 = data->mBitmap.x2 - 1; + const int image_y2 = data->mBitmap.y2 - 1; + + if (data->fast_matrix) { + // The increment pr x in the scanline + int fdx = (int)(data->m11 * fixed_scale); + int fdy = (int)(data->m12 * fixed_scale); + + while (count--) { + uint *target = data->buffer(spans->x, spans->y); + + const float cx = spans->x + float(0.5); + const float cy = spans->y + float(0.5); + + int x = int((data->m21 * cy + + data->m11 * cx + data->dx) * fixed_scale); + int y = int((data->m22 * cy + + data->m12 * cx + data->dy) * fixed_scale); + + int length = spans->len; + const int coverage = (spans->coverage * data->mBitmap.const_alpha) >> 8; + while (length) { + int l = std::min(length, buffer_size); + const uint *end = buffer + l; + uint *b = buffer; + while (b < end) { + int px = clamp(x >> 16, image_x1, image_x2); + int py = clamp(y >> 16, image_y1, image_y2); + *b = reinterpret_cast(data->mBitmap.scanLine(py))[px]; + + x += fdx; + y += fdy; + ++b; + } + op.func(target, buffer, l, coverage); + target += l; + length -= l; + } + ++spans; + } + } else { + const float fdx = data->m11; + const float fdy = data->m12; + const float fdw = data->m13; + while (count--) { + uint *target = data->buffer(spans->x, spans->y); + + const float cx = spans->x + float(0.5); + const float cy = spans->y + float(0.5); + + float x = data->m21 * cy + data->m11 * cx + data->dx; + float y = data->m22 * cy + data->m12 * cx + data->dy; + float w = data->m23 * cy + data->m13 * cx + data->m33; + + int length = spans->len; + const int coverage = (spans->coverage * data->mBitmap.const_alpha) >> 8; + while (length) { + int l = std::min(length, buffer_size); + const uint *end = buffer + l; + uint *b = buffer; + while (b < end) { + const float iw = w == 0 ? 1 : 1 / w; + const float tx = x * iw; + const float ty = y * iw; + const int px = clamp(int(tx) - (tx < 0), image_x1, image_x2); + const int py = clamp(int(ty) - (ty < 0), image_y1, image_y2); + + *b = reinterpret_cast(data->mBitmap.scanLine(py))[px]; + x += fdx; + y += fdy; + w += fdw; + + ++b; + } + op.func(target, buffer, l, coverage); + target += l; + length -= l; + } + ++spans; + } + } +} + static void blend_untransformed_argb(int count, const VRle::Span *spans, void *userData) { VSpanData *data = reinterpret_cast(userData); @@ -631,6 +736,8 @@ static void blend_untransformed_argb(int count, const VRle::Span *spans, void *u void VSpanData::setup(const VBrush &brush, VPainter::CompositionMode /*mode*/, int /*alpha*/) { + transformType = VMatrix::MatrixType::None; + switch (brush.type()) { case VBrush::Type::NoBrush: mType = VSpanData::Type::None; @@ -667,6 +774,13 @@ void VSpanData::setup(const VBrush &brush, VPainter::CompositionMode /*mode*/, setupMatrix(brush.mGradient->mMatrix); break; } + case VBrush::Type::Texture: { + mType = VSpanData::Type::Texture; + initTexture(&brush.mTexture, 255, VBitmapData::Plain, + VRect(0, 0, brush.mTexture.width(), brush.mTexture.height())); + setupMatrix(brush.mMatrix); + break; + } default: break; } @@ -685,13 +799,18 @@ void VSpanData::setupMatrix(const VMatrix &matrix) m33 = inv.m33; dx = inv.mtx; dy = inv.mty; + transformType = inv.type(); - // const bool affine = inv.isAffine(); - // fast_matrix = affine - // && m11 * m11 + m21 * m21 < 1e4 - // && m12 * m12 + m22 * m22 < 1e4 - // && fabs(dx) < 1e4 - // && fabs(dy) < 1e4; + const bool affine = inv.isAffine(); + const float f1 = m11 * m11 + m21 * m21; + const float f2 = m12 * m12 + m22 * m22; + fast_matrix = affine + && f1 < 1e4 + && f2 < 1e4 + && f1 > (1.0 / 65536) + && f2 > (1.0 / 65536) + && fabs(dx) < 1e4 + && fabs(dy) < 1e4; } void VSpanData::initTexture(const VBitmap *bitmap, int alpha, VBitmapData::Type type, const VRect &sourceRect) @@ -730,7 +849,11 @@ void VSpanData::updateSpanFunc() } case VSpanData::Type::Texture: { //@TODO update proper image function. - mUnclippedBlendFunc = &blend_untransformed_argb; + if (transformType <= VMatrix::MatrixType::Translate){ + mUnclippedBlendFunc = &blend_untransformed_argb; + } else { + mUnclippedBlendFunc = &blend_transformed_argb; + } break; } } diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index 52852bf795..a02f9473fb 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -176,6 +176,8 @@ struct VSpanData { VBitmapData mBitmap; }; float m11, m12, m13, m21, m22, m23, m33, dx, dy; // inverse xform matrix + bool fast_matrix{true}; + VMatrix::MatrixType transformType{VMatrix::MatrixType::None}; }; void vInitDrawhelperFunctions(); From 704547bf327d7d1036948314b3f7384c5fa36db2 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 15 Jan 2019 16:06:52 +0900 Subject: [PATCH 400/672] lottie/render: Support rendering lottie image object. Change-Id: I1b15263cd27248ccef57eff1d771b627cf0f59d8 --- src/lottie/lottieitem.cpp | 65 +++++++++++++++++++++++++++++++++++++++ src/lottie/lottieitem.h | 13 ++++++++ 2 files changed, 78 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index b57833a7a6..aa88896968 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -23,6 +23,7 @@ #include "vdasher.h" #include "vpainter.h" #include "vraster.h" +#include "vimageloader.h" /* Lottie Layer Rules * 1. time stretch is pre calculated and applied to all the properties of the @@ -60,6 +61,10 @@ LOTCompItem::createLayerItem(LOTLayerData *layerData) return std::make_unique(layerData); break; } + case LayerType::Image: { + return std::make_unique(layerData); + break; + } default: return nullptr; break; @@ -684,6 +689,66 @@ void LOTSolidLayerItem::renderList(std::vector &list) list.push_back(mRenderNode.get()); } +LOTImageLayerItem::LOTImageLayerItem(LOTLayerData *layerData) + : LOTLayerItem(layerData) +{ +} + +void LOTImageLayerItem::updateContent() +{ + if (!mRenderNode) { + mRenderNode = std::make_unique(); + mRenderNode->mType = VDrawable::Type::Fill; + mRenderNode->mFlag |= VDrawable::DirtyState::All; + // load image + //@TODO find a better way to load + // so that can be shared by multiple layers + if (!mLayerData->mAsset->mImagePath.empty()) { + VBitmap img = VImageLoader::instance().load(mLayerData->mAsset->mImagePath.c_str()); + VBrush brush(img); + mRenderNode->setBrush(brush); + } + } + + if (flag() & DirtyFlagBit::Matrix) { + VPath path; + path.addRect( + VRectF(0, 0, mLayerData->mAsset->mWidth, mLayerData->mAsset->mHeight)); + path.transform(combinedMatrix()); + mRenderNode->mFlag |= VDrawable::DirtyState::Path; + mRenderNode->mPath = path; + mRenderNode->mBrush.setMatrix(combinedMatrix()); + } + + if (flag() & DirtyFlagBit::Alpha) { + //@TODO handle alpha with the image. + } +} + +void LOTImageLayerItem::renderList(std::vector &list) +{ + if (!visible()) return; + + list.push_back(mRenderNode.get()); +} + +void LOTImageLayerItem::buildLayerNode() +{ + LOTLayerItem::buildLayerNode(); + + mDrawableList.clear(); + renderList(mDrawableList); + + mCNodeList.clear(); + for (auto &i : mDrawableList) { + LOTDrawable *lotDrawable = static_cast(i); + lotDrawable->sync(); + mCNodeList.push_back(lotDrawable->mCNode.get()); + } + layerNode()->mNodeList.ptr = mCNodeList.data(); + layerNode()->mNodeList.size = mCNodeList.size(); +} + LOTNullLayerItem::LOTNullLayerItem(LOTLayerData *layerData) : LOTLayerItem(layerData) { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 339473e51e..d225699383 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -182,6 +182,19 @@ protected: void updateContent() final; }; +class LOTImageLayerItem: public LOTLayerItem +{ +public: + LOTImageLayerItem(LOTLayerData *layerData); + void buildLayerNode() final; +protected: + void updateContent() final; + void renderList(std::vector &list) final; +private: + std::vector mCNodeList; + std::unique_ptr mRenderNode; +}; + class LOTMaskItem { public: From b39738d852f8d1b77c5e73e66529f0d0f99691e5 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 15 Jan 2019 17:12:40 +0900 Subject: [PATCH 401/672] lottie/example: Added image_test.json(resource with image resource ) Change-Id: If79f5892347be0dcc850380f1520dfd0f2c70724 --- example/demo.cpp | 14 ++++---------- example/resource/image_test.json | 1 + example/resource/images/img_0.png | Bin 0 -> 101560 bytes 3 files changed, 5 insertions(+), 10 deletions(-) create mode 100755 example/resource/image_test.json create mode 100755 example/resource/images/img_0.png diff --git a/example/demo.cpp b/example/demo.cpp index 78f3fdd195..9b14d5502e 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -45,21 +45,15 @@ main(void) app->setup(); std::string filePath = DEMO_DIR; - filePath +="mask.json"; - - std::ifstream f; - f.open(filePath); - std::stringstream buf; - buf << f.rdbuf(); - f.close(); + filePath +="image_test.json"; LottieView *view = new LottieView(app->evas()); - view->loadFromData(buf.str().data(), "test_key"); + view->setFilePath(filePath.c_str()); view->setPos(0, 0); view->setSize(800, 800); view->show(); - view->setMinProgress(0.5); - view->setMaxProgress(0.0); +// view->setMinProgress(0.5); +// view->setMaxProgress(0.0); view->play(); view->loop(true); view->setRepeatMode(LottieView::RepeatMode::Reverse); diff --git a/example/resource/image_test.json b/example/resource/image_test.json new file mode 100755 index 0000000000..e60c95531d --- /dev/null +++ b/example/resource/image_test.json @@ -0,0 +1 @@ +{"v":"5.4.3","fr":60,"ip":0,"op":60,"w":800,"h":800,"nm":"test","ddd":0,"assets":[{"id":"image_0","w":200,"h":300,"u":"images/","p":"img_0.png","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[56]},{"t":50}],"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[100,150,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[99,99,100],"e":[152,152,100]},{"t":50}],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/example/resource/images/img_0.png b/example/resource/images/img_0.png new file mode 100755 index 0000000000000000000000000000000000000000..35ee257cac898531f90d61ec37ca816373649c2f GIT binary patch literal 101560 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 literal 0 HcmV?d00001 From b55ec0f29726082dfa31cc2c6754df5cba0a6894 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 16 Jan 2019 12:20:30 +0900 Subject: [PATCH 402/672] lottie: Fix incorrect return value of totalFrame() api. Change-Id: I930e5b9624b87b512394951d616e73531b2d5b9d --- src/lottie/lottieanimation.cpp | 2 +- src/lottie/lottiemodel.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index c49db2d395..c0cce77066 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -43,7 +43,7 @@ public: VSize size() const {return mCompItem->size();} double duration() const {return mModel->duration();} double frameRate() const {return mModel->frameRate();} - size_t totalFrame() const {return mModel->frameDuration();} + size_t totalFrame() const {return mModel->totalFrame();} size_t frameAtPos(double pos) const {return mModel->frameAtPos(pos);} Surface render(size_t frameNo, const Surface &surface); std::future renderAsync(size_t frameNo, Surface &&surface); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 08f254e512..1f2277b57e 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -422,6 +422,7 @@ public: long frameAtTime(double timeInSec) const { return isStatic() ? startFrame() : frameAtPos(timeInSec / duration()); } + size_t totalFrame() const {return mEndFrame - mStartFrame;} long frameDuration() const {return mEndFrame - mStartFrame -1;} float frameRate() const {return mFrameRate;} long startFrame() const {return mStartFrame;} @@ -797,6 +798,7 @@ class LOTModel public: bool isStatic() const {return mRoot->isStatic();} double duration() const {return mRoot->duration();} + size_t totalFrame() const {return mRoot->totalFrame();} size_t frameDuration() const {return mRoot->frameDuration();} size_t frameRate() const {return mRoot->frameRate();} size_t startFrame() const {return mRoot->startFrame();} From aebcc6ab49c660396f649535b1dec03c3178b03a Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Fri, 18 Jan 2019 19:31:54 +0900 Subject: [PATCH 403/672] lottie: rename public headers to rlottie namesapce. Change-Id: Ib8d3df2600eef84927c95eb6794de9f9074d6253 --- CMakeLists.txt | 9 +- example/lottieview.h | 4 +- inc/lottieanimation.h | 277 +------------------------ inc/lottieanimation_capi.h | 218 +------------------ inc/lottiecommon.h | 224 +------------------- inc/meson.build | 9 +- inc/rlottie.h | 276 ++++++++++++++++++++++++ inc/rlottie_capi.h | 217 +++++++++++++++++++ inc/rlottiecommon.h | 223 ++++++++++++++++++++ src/binding/c/lottieanimation_capi.cpp | 2 +- src/lottie/lottieanimation.cpp | 2 +- src/lottie/lottieitem.h | 4 +- test/test_lottieanimation.cpp | 2 +- 13 files changed, 741 insertions(+), 726 deletions(-) create mode 100644 inc/rlottie.h create mode 100644 inc/rlottie_capi.h create mode 100644 inc/rlottiecommon.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 34e994ca0c..38a8a7a497 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,14 @@ CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) #install header -install(FILES inc/lottieanimation.h inc/lottieanimation_capi.h inc/lottiecommon.h DESTINATION include) +install(FILES + inc/rlottie.h + inc/rlottie_capi.h + inc/rlottiecommon.h + inc/lottieanimation.h + inc/lottieanimation_capi.h + inc/lottiecommon.h + DESTINATION include) #install lib install( TARGETS lottie-player EXPORT lottie-player-targets diff --git a/example/lottieview.h b/example/lottieview.h index 8dc839223c..aab0336fcc 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -32,8 +32,8 @@ #include #include #include -#include "lottieanimation.h" -#include "lottieanimation_capi.h" +#include "rlottie.h" +#include "rlottie_capi.h" #include #include class LottieView diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h index 1d3efce171..1508b2ffff 100644 --- a/inc/lottieanimation.h +++ b/inc/lottieanimation.h @@ -1,276 +1 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef _LOTTIE_ANIMATION_H_ -#define _LOTTIE_ANIMATION_H_ - -#include -#include -#include - -#ifdef _WIN32 -#ifdef LOT_BUILD -#ifdef DLL_EXPORT -#define LOT_EXPORT __declspec(dllexport) -#else -#define LOT_EXPORT -#endif -#else -#define LOT_EXPORT __declspec(dllimport) -#endif -#else -#ifdef __GNUC__ -#if __GNUC__ >= 4 -#define LOT_EXPORT __attribute__((visibility("default"))) -#else -#define LOT_EXPORT -#endif -#else -#define LOT_EXPORT -#endif -#endif - -class AnimationImpl; -struct LOTNode; -struct LOTLayerNode; - -namespace lottie { - -class LOT_EXPORT Surface { -public: - /** - * @brief Surface object constructor. - * - * @param[in] buffer surface buffer. - * @param[in] width surface width. - * @param[in] height surface height. - * @param[in] bytesPerLine number of bytes in a surface scanline. - * - * @note Default surface format is ARGB32_Premultiplied. - * - * @internal - */ - Surface(uint32_t *buffer, size_t width, size_t height, size_t bytesPerLine); - - /** - * @brief Returns width of the surface. - * - * @return surface width - * - * @internal - * - */ - size_t width() const {return mWidth;} - - /** - * @brief Returns height of the surface. - * - * @return surface height - * - * @internal - */ - size_t height() const {return mHeight;} - - /** - * @brief Returns number of bytes in the surface scanline. - * - * @return number of bytes in scanline. - * - * @internal - */ - size_t bytesPerLine() const {return mBytesPerLine;} - - /** - * @brief Returns buffer attached tp the surface. - * - * @return buffer attaced to the Surface. - * - * @internal - */ - uint32_t *buffer() const {return mBuffer;} - - /** - * @brief Default constructor. - */ - Surface() = default; -private: - uint32_t *mBuffer{nullptr}; - size_t mWidth{0}; - size_t mHeight{0}; - size_t mBytesPerLine{0}; -}; - -class LOT_EXPORT Animation { -public: - - /** - * @brief Constructs an animation object from file path. - * - * @param[in] path Lottie resource file path - * - * @return Animation object that can render the contents of the - * Lottie resource represented by file path. - * - * @internal - */ - static std::unique_ptr - loadFromFile(const std::string &path); - - /** - * @brief Constructs an animation object from JSON string data. - * - * @param[in] jsonData The JSON string data. - * @param[in] key the string that will be used to cache the JSON string data. - * - * @return Animation object that can render the contents of the - * Lottie resource represented by JSON string data. - * - * @internal - */ - static std::unique_ptr - loadFromData(std::string jsonData, const std::string &key); - - /** - * @brief Returns default framerate of the Lottie resource. - * - * @return framerate of the Lottie resource - * - * @internal - * - */ - double frameRate() const; - - /** - * @brief Returns total number of frames present in the Lottie resource. - * - * @return frame count of the Lottie resource. - * - * @note frame number starts with 0. - * - * @internal - */ - size_t totalFrame() const; - - /** - * @brief Returns default viewport size of the Lottie resource. - * - * @param[out] width default width of the viewport. - * @param[out] height default height of the viewport. - * - * @internal - * - */ - void size(size_t &width, size_t &height) const; - - /** - * @brief Returns total animation duration of Lottie resource in second. - * it uses totalFrame() and frameRate() to calculate the duration. - * duration = totalFrame() / frameRate(). - * - * @return total animation duration in second. - * @retval 0 if the Lottie resource has no animation. - * - * @see totalFrame() - * @see frameRate() - * - * @internal - */ - double duration() const; - - /** - * @brief Returns frame number for a given position. - * this function helps to map the position value retuned - * by the animator to a frame number in side the Lottie resource. - * frame_number = lerp(start_frame, endframe, pos); - * - * @param[in] pos normalized position value [0 ... 1] - * - * @return frame numer maps to the position value [startFrame .... endFrame] - * - * @internal - */ - size_t frameAtPos(double pos); - - /** - * @brief Renders the content to surface Asynchronously. - * it gives a future in return to get the result of the - * rendering at a future point. - * To get best performance user has to start rendering as soon as - * it finds that content at {frameNo} has to be rendered and get the - * result from the future at the last moment when the surface is needed - * to draw into the screen. - * - * - * @param[in] frameNo Content corresponds to the @p frameNo needs to be drawn - * @param[in] surface Surface in which content will be drawn - * - * @return future that will hold the result when rendering finished. - * - * for Synchronus rendering @see renderSync - * - * @see Surface - * @internal - */ - std::future render(size_t frameNo, Surface surface); - - /** - * @brief Renders the content to surface synchronously. - * for performance use the async rendering @see render - * - * @param[in] frameNo Content corresponds to the @p frameNo needs to be drawn - * @param[in] surface Surface in which content will be drawn - * - * @internal - */ - void renderSync(size_t frameNo, Surface surface); - - /** - * @brief Returns root layer of the composition updated with - * content of the Lottie resource at frame number @p frameNo. - * - * @param[in] frameNo Content corresponds to the @p frameNo needs to be extracted. - * @param[in] width content viewbox width - * @param[in] height content viewbox height - * - * @return Root layer node. - * - * @internal - */ - const LOTLayerNode * renderTree(size_t frameNo, size_t width, size_t height) const; - - /** - * @brief default destructor - * - * @internal - */ - ~Animation(); - -private: - /** - * @brief default constructor - * - * @internal - */ - Animation(); - - std::unique_ptr d; -}; - -} // namespace lotplayer - -#endif // _LOTTIE_ANIMATION_H_ +#include "rlottie.h" \ No newline at end of file diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h index ded215b1ec..4b74147783 100644 --- a/inc/lottieanimation_capi.h +++ b/inc/lottieanimation_capi.h @@ -1,217 +1 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef _LOTTIE_ANIMATION_CAPI_H_ -#define _LOTTIE_ANIMATION_CAPI_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct Lottie_Animation_S Lottie_Animation; - -/** - * @brief Constructs an animation object from file path. - * - * @param[in] path Lottie resource file path - * - * @return Animation object that can build the contents of the - * Lottie resource represented by file path. - * - * @see lottie_animation_destroy() - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *path); - -/** - * @brief Constructs an animation object from JSON string data. - * - * @param[in] data The JSON string data. - * @param[in] key the string that will be used to cache the JSON string data. - * - * @return Animation object that can build the contents of the - * Lottie resource represented by JSON string data. - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT Lottie_Animation *lottie_animation_from_data(const char *data, const char *key); - -/** - * @brief Free given Animation object resource. - * - * @param[in] animation Animation object to free. - * - * @see lottie_animation_from_file() - * @see lottie_animation_from_data() - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT void lottie_animation_destroy(Lottie_Animation *animation); - -/** - * @brief Returns default viewport size of the Lottie resource. - * - * @param[in] animation Animation object. - * @param[out] w default width of the viewport. - * @param[out] h default height of the viewport. - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation *animation, size_t *width, size_t *height); - -/** - * @brief Returns total animation duration of Lottie resource in second. - * it uses totalFrame() and frameRate() to calculate the duration. - * duration = totalFrame() / frameRate(). - * - * @param[in] animation Animation object. - * - * @return total animation duration in second. - * @c 0 if the Lottie resource has no animation. - * - * @see lottie_animation_get_totalframe() - * @see lottie_animation_get_framerate() - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation *animation); - -/** - * @brief Returns total number of frames present in the Lottie resource. - * - * @param[in] animation Animation object. - * - * @return frame count of the Lottie resource.* - * - * @note frame number starts with 0. - * - * @see lottie_animation_get_duration() - * @see lottie_animation_get_framerate() - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT size_t lottie_animation_get_totalframe(const Lottie_Animation *animation); - -/** - * @brief Returns default framerate of the Lottie resource. - * - * @param[in] animation Animation object. - * - * @return framerate of the Lottie resource - * - * @ingroup Lottie_Animation - * @internal - * - */ -LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation *animation); - -/** - * @brief Get the render tree which contains the snapshot of the animation object - * at frame = @c frame_num, the content of the animation in that frame number. - * - * @param[in] animation Animation object. - * @param[in] width requested snapshot viewport width. - * @param[in] height requested snapshot viewport height. - * - * @return Animation snapshot tree. - * - * @note: User has to traverse the tree for rendering. - * - * @see LOTLayerNode - * @see LOTNode - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation *animation, - size_t frame_num, - size_t width, size_t height); - -/** - * @brief Maps position to frame number and returns it. - * - * @param[in] animation Animation object. - * @param[in] pos position in the range [ 0.0 .. 1.0 ]. - * - * @return mapped frame numbe in the range [ start_frame .. end_frame ]. - * @c 0 if the Lottie resource has no animation. - * - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT size_t lottie_animation_get_frame_at_pos(const Lottie_Animation *animation, float pos); - -/** - * @brief Request to render the content of the frame @p frame_num to buffer @p buffer asynchronously. - * - * @param[in] animation Animation object. - * @param[in] frame_num the frame number needs to be rendered. - * @param[in] buffer surface buffer use for rendering. - * @param[in] width width of the surface - * @param[in] height height of the surface - * @param[in] bytes_per_line stride of the surface in bytes. - * - * @note user must call lottie_animation_render_flush() to make sure render is finished. - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT void -lottie_animation_render_async(Lottie_Animation *animation, - size_t frame_num, - uint32_t *buffer, - size_t width, - size_t height, - size_t bytes_per_line); - -/** - * @brief Request to finish the current async renderer job for this animation object. - * If render is finished then this call returns immidiately. - * If not, it waits till render job finish and then return. - * - * @param[in] animation Animation object. - * - * @warning User must call lottie_animation_render_async() and lottie_animation_render_flush() - * in pair to get the benefit of async rendering. - * - * @return the pixel buffer it finished rendering. - * - * @ingroup Lottie_Animation - * @internal - */ -LOT_EXPORT uint32_t * -lottie_animation_render_flush(Lottie_Animation *animation); - -#ifdef __cplusplus -} -#endif - -#endif //_LOTTIE_ANIMATION_CAPI_H_ - +#include "rlottie_capi.h" \ No newline at end of file diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h index d35fcdf881..86267e5ef5 100644 --- a/inc/lottiecommon.h +++ b/inc/lottiecommon.h @@ -1,223 +1 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef _LOTTIE_COMMON_H_ -#define _LOTTIE_COMMON_H_ - -#ifdef _WIN32 -#ifdef LOT_BUILD -#ifdef DLL_EXPORT -#define LOT_EXPORT __declspec(dllexport) -#else -#define LOT_EXPORT -#endif -#else -#define LOT_EXPORT __declspec(dllimport) -#endif -#else -#ifdef __GNUC__ -#if __GNUC__ >= 4 -#define LOT_EXPORT __attribute__((visibility("default"))) -#else -#define LOT_EXPORT -#endif -#else -#define LOT_EXPORT -#endif -#endif - - -/** - * @defgroup Lottie_Animation Lottie_Animation - * - * Lottie Animation is a modern style vector based animation design. Its animation - * resource(within json format) could be generated by Adobe After Effect using - * bodymovin plugin. You can find a good examples in Lottie Community which - * shares many free resources(see: www.lottiefiles.com). - * - * This Lottie_Animation is a common engine to manipulate, control Lottie - * Animation from the Lottie resource - json file. It provides a scene-graph - * node tree per frames by user demand as well as rasterized frame images. - * - */ - -/** - * @ingroup Lottie_Animation - */ - - -/** - * @brief Enumeration for Lottie Player error code. - */ -typedef enum -{ - //TODO: Coding convention?? - LOT_ANIMATION_ERROR_NONE = 0, - LOT_ANIMATION_ERROR_NOT_PERMITTED, - LOT_ANIMATION_ERROR_OUT_OF_MEMORY, - LOT_ANIMATION_ERROR_INVALID_PARAMETER, - LOT_ANIMATION_ERROR_RESULT_OUT_OF_RANGE, - LOT_ANIMATION_ERROR_ALREADY_IN_PROGRESS, - LOT_ANIMATION_ERROR_UNKNOWN -} LOTErrorType; - -typedef enum -{ - BrushSolid = 0, - BrushGradient -} LOTBrushType; - -typedef enum -{ - FillEvenOdd = 0, - FillWinding -} LOTFillRule; - -typedef enum -{ - JoinMiter = 0, - JoinBevel, - JoinRound -} LOTJoinStyle; - -typedef enum -{ - CapFlat = 0, - CapSquare, - CapRound -} LOTCapStyle; - -typedef enum -{ - GradientLinear = 0, - GradientRadial -} LOTGradientType; - -typedef struct LOTGradientStop -{ - float pos; - unsigned char r, g, b, a; -} LOTGradientStop; - -typedef enum -{ - MaskModeAdd = 0, - MaskModeSubstract, - MaskModeIntersect, - MaskModeDifference -} LOTMaskMode; - -typedef struct LOTMask { - struct { - const float *ptPtr; - int ptCount; - const char* elmPtr; - int elmCount; - } mPath; - LOTMaskMode mMode; -}LOTMask; - -typedef enum -{ - MatteNone = 0, - MatteAlpha, - MatteAlphaInv, - MatteLuma, - MatteLumaInv -} LOTMatteType; - -typedef struct LOTNode { - -#define ChangeFlagNone 0x0000 -#define ChangeFlagPath 0x0001 -#define ChangeFlagPaint 0x0010 -#define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) - - struct { - const float *ptPtr; - int ptCount; - const char* elmPtr; - int elmCount; - } mPath; - - struct { - unsigned char r, g, b, a; - } mColor; - - struct { - unsigned char enable; - int width; - LOTCapStyle cap; - LOTJoinStyle join; - int meterLimit; - float* dashArray; - int dashArraySize; - } mStroke; - - struct { - LOTGradientType type; - LOTGradientStop *stopPtr; - unsigned int stopCount; - struct { - float x, y; - } start, end, center, focal; - float cradius; - float fradius; - } mGradient; - - int mFlag; - LOTBrushType mBrushType; - LOTFillRule mFillRule; -} LOTNode; - - - -typedef struct LOTLayerNode { - - struct { - LOTMask *ptr; - unsigned int size; - } mMaskList; - - struct { - const float *ptPtr; - int ptCount; - const char* elmPtr; - int elmCount; - } mClipPath; - - struct { - struct LOTLayerNode **ptr; - unsigned int size; - } mLayerList; - - struct { - LOTNode **ptr; - unsigned int size; - } mNodeList; - - LOTMatteType mMatte; - int mVisible; - -} LOTLayerNode; - -/** - * @} - */ - -#endif // _LOTTIE_COMMON_H_ +#include "rlottiecommon.h" \ No newline at end of file diff --git a/inc/meson.build b/inc/meson.build index c2d6e4e1fd..fca654bf8e 100644 --- a/inc/meson.build +++ b/inc/meson.build @@ -1,3 +1,8 @@ -install_headers(['lottieanimation.h', +install_headers([ + 'rlottie.h', + 'rlottie_capi.h', + 'rlottiecommon.h', + 'lottieanimation.h', 'lottiecommon.h', - 'lottieanimation_capi.h']) + 'lottieanimation_capi.h' + ]) diff --git a/inc/rlottie.h b/inc/rlottie.h new file mode 100644 index 0000000000..47aa4e254e --- /dev/null +++ b/inc/rlottie.h @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _RLOTTIE_H_ +#define _RLOTTIE_H_ + +#include +#include +#include + +#ifdef _WIN32 +#ifdef LOT_BUILD +#ifdef DLL_EXPORT +#define LOT_EXPORT __declspec(dllexport) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT __declspec(dllimport) +#endif +#else +#ifdef __GNUC__ +#if __GNUC__ >= 4 +#define LOT_EXPORT __attribute__((visibility("default"))) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT +#endif +#endif + +class AnimationImpl; +struct LOTNode; +struct LOTLayerNode; + +namespace lottie { + +class LOT_EXPORT Surface { +public: + /** + * @brief Surface object constructor. + * + * @param[in] buffer surface buffer. + * @param[in] width surface width. + * @param[in] height surface height. + * @param[in] bytesPerLine number of bytes in a surface scanline. + * + * @note Default surface format is ARGB32_Premultiplied. + * + * @internal + */ + Surface(uint32_t *buffer, size_t width, size_t height, size_t bytesPerLine); + + /** + * @brief Returns width of the surface. + * + * @return surface width + * + * @internal + * + */ + size_t width() const {return mWidth;} + + /** + * @brief Returns height of the surface. + * + * @return surface height + * + * @internal + */ + size_t height() const {return mHeight;} + + /** + * @brief Returns number of bytes in the surface scanline. + * + * @return number of bytes in scanline. + * + * @internal + */ + size_t bytesPerLine() const {return mBytesPerLine;} + + /** + * @brief Returns buffer attached tp the surface. + * + * @return buffer attaced to the Surface. + * + * @internal + */ + uint32_t *buffer() const {return mBuffer;} + + /** + * @brief Default constructor. + */ + Surface() = default; +private: + uint32_t *mBuffer{nullptr}; + size_t mWidth{0}; + size_t mHeight{0}; + size_t mBytesPerLine{0}; +}; + +class LOT_EXPORT Animation { +public: + + /** + * @brief Constructs an animation object from file path. + * + * @param[in] path Lottie resource file path + * + * @return Animation object that can render the contents of the + * Lottie resource represented by file path. + * + * @internal + */ + static std::unique_ptr + loadFromFile(const std::string &path); + + /** + * @brief Constructs an animation object from JSON string data. + * + * @param[in] jsonData The JSON string data. + * @param[in] key the string that will be used to cache the JSON string data. + * + * @return Animation object that can render the contents of the + * Lottie resource represented by JSON string data. + * + * @internal + */ + static std::unique_ptr + loadFromData(std::string jsonData, const std::string &key); + + /** + * @brief Returns default framerate of the Lottie resource. + * + * @return framerate of the Lottie resource + * + * @internal + * + */ + double frameRate() const; + + /** + * @brief Returns total number of frames present in the Lottie resource. + * + * @return frame count of the Lottie resource. + * + * @note frame number starts with 0. + * + * @internal + */ + size_t totalFrame() const; + + /** + * @brief Returns default viewport size of the Lottie resource. + * + * @param[out] width default width of the viewport. + * @param[out] height default height of the viewport. + * + * @internal + * + */ + void size(size_t &width, size_t &height) const; + + /** + * @brief Returns total animation duration of Lottie resource in second. + * it uses totalFrame() and frameRate() to calculate the duration. + * duration = totalFrame() / frameRate(). + * + * @return total animation duration in second. + * @retval 0 if the Lottie resource has no animation. + * + * @see totalFrame() + * @see frameRate() + * + * @internal + */ + double duration() const; + + /** + * @brief Returns frame number for a given position. + * this function helps to map the position value retuned + * by the animator to a frame number in side the Lottie resource. + * frame_number = lerp(start_frame, endframe, pos); + * + * @param[in] pos normalized position value [0 ... 1] + * + * @return frame numer maps to the position value [startFrame .... endFrame] + * + * @internal + */ + size_t frameAtPos(double pos); + + /** + * @brief Renders the content to surface Asynchronously. + * it gives a future in return to get the result of the + * rendering at a future point. + * To get best performance user has to start rendering as soon as + * it finds that content at {frameNo} has to be rendered and get the + * result from the future at the last moment when the surface is needed + * to draw into the screen. + * + * + * @param[in] frameNo Content corresponds to the @p frameNo needs to be drawn + * @param[in] surface Surface in which content will be drawn + * + * @return future that will hold the result when rendering finished. + * + * for Synchronus rendering @see renderSync + * + * @see Surface + * @internal + */ + std::future render(size_t frameNo, Surface surface); + + /** + * @brief Renders the content to surface synchronously. + * for performance use the async rendering @see render + * + * @param[in] frameNo Content corresponds to the @p frameNo needs to be drawn + * @param[in] surface Surface in which content will be drawn + * + * @internal + */ + void renderSync(size_t frameNo, Surface surface); + + /** + * @brief Returns root layer of the composition updated with + * content of the Lottie resource at frame number @p frameNo. + * + * @param[in] frameNo Content corresponds to the @p frameNo needs to be extracted. + * @param[in] width content viewbox width + * @param[in] height content viewbox height + * + * @return Root layer node. + * + * @internal + */ + const LOTLayerNode * renderTree(size_t frameNo, size_t width, size_t height) const; + + /** + * @brief default destructor + * + * @internal + */ + ~Animation(); + +private: + /** + * @brief default constructor + * + * @internal + */ + Animation(); + + std::unique_ptr d; +}; + +} // namespace lotplayer + +#endif // _RLOTTIE_H_ diff --git a/inc/rlottie_capi.h b/inc/rlottie_capi.h new file mode 100644 index 0000000000..8cc84c57d9 --- /dev/null +++ b/inc/rlottie_capi.h @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _RLOTTIE_CAPI_H_ +#define _RLOTTIE_CAPI_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct Lottie_Animation_S Lottie_Animation; + +/** + * @brief Constructs an animation object from file path. + * + * @param[in] path Lottie resource file path + * + * @return Animation object that can build the contents of the + * Lottie resource represented by file path. + * + * @see lottie_animation_destroy() + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *path); + +/** + * @brief Constructs an animation object from JSON string data. + * + * @param[in] data The JSON string data. + * @param[in] key the string that will be used to cache the JSON string data. + * + * @return Animation object that can build the contents of the + * Lottie resource represented by JSON string data. + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT Lottie_Animation *lottie_animation_from_data(const char *data, const char *key); + +/** + * @brief Free given Animation object resource. + * + * @param[in] animation Animation object to free. + * + * @see lottie_animation_from_file() + * @see lottie_animation_from_data() + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT void lottie_animation_destroy(Lottie_Animation *animation); + +/** + * @brief Returns default viewport size of the Lottie resource. + * + * @param[in] animation Animation object. + * @param[out] w default width of the viewport. + * @param[out] h default height of the viewport. + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT void lottie_animation_get_size(const Lottie_Animation *animation, size_t *width, size_t *height); + +/** + * @brief Returns total animation duration of Lottie resource in second. + * it uses totalFrame() and frameRate() to calculate the duration. + * duration = totalFrame() / frameRate(). + * + * @param[in] animation Animation object. + * + * @return total animation duration in second. + * @c 0 if the Lottie resource has no animation. + * + * @see lottie_animation_get_totalframe() + * @see lottie_animation_get_framerate() + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT double lottie_animation_get_duration(const Lottie_Animation *animation); + +/** + * @brief Returns total number of frames present in the Lottie resource. + * + * @param[in] animation Animation object. + * + * @return frame count of the Lottie resource.* + * + * @note frame number starts with 0. + * + * @see lottie_animation_get_duration() + * @see lottie_animation_get_framerate() + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT size_t lottie_animation_get_totalframe(const Lottie_Animation *animation); + +/** + * @brief Returns default framerate of the Lottie resource. + * + * @param[in] animation Animation object. + * + * @return framerate of the Lottie resource + * + * @ingroup Lottie_Animation + * @internal + * + */ +LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation *animation); + +/** + * @brief Get the render tree which contains the snapshot of the animation object + * at frame = @c frame_num, the content of the animation in that frame number. + * + * @param[in] animation Animation object. + * @param[in] width requested snapshot viewport width. + * @param[in] height requested snapshot viewport height. + * + * @return Animation snapshot tree. + * + * @note: User has to traverse the tree for rendering. + * + * @see LOTLayerNode + * @see LOTNode + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation *animation, + size_t frame_num, + size_t width, size_t height); + +/** + * @brief Maps position to frame number and returns it. + * + * @param[in] animation Animation object. + * @param[in] pos position in the range [ 0.0 .. 1.0 ]. + * + * @return mapped frame numbe in the range [ start_frame .. end_frame ]. + * @c 0 if the Lottie resource has no animation. + * + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT size_t lottie_animation_get_frame_at_pos(const Lottie_Animation *animation, float pos); + +/** + * @brief Request to render the content of the frame @p frame_num to buffer @p buffer asynchronously. + * + * @param[in] animation Animation object. + * @param[in] frame_num the frame number needs to be rendered. + * @param[in] buffer surface buffer use for rendering. + * @param[in] width width of the surface + * @param[in] height height of the surface + * @param[in] bytes_per_line stride of the surface in bytes. + * + * @note user must call lottie_animation_render_flush() to make sure render is finished. + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT void +lottie_animation_render_async(Lottie_Animation *animation, + size_t frame_num, + uint32_t *buffer, + size_t width, + size_t height, + size_t bytes_per_line); + +/** + * @brief Request to finish the current async renderer job for this animation object. + * If render is finished then this call returns immidiately. + * If not, it waits till render job finish and then return. + * + * @param[in] animation Animation object. + * + * @warning User must call lottie_animation_render_async() and lottie_animation_render_flush() + * in pair to get the benefit of async rendering. + * + * @return the pixel buffer it finished rendering. + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT uint32_t * +lottie_animation_render_flush(Lottie_Animation *animation); + +#ifdef __cplusplus +} +#endif + +#endif //_RLOTTIE_CAPI_H_ + diff --git a/inc/rlottiecommon.h b/inc/rlottiecommon.h new file mode 100644 index 0000000000..edc6299be8 --- /dev/null +++ b/inc/rlottiecommon.h @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _RLOTTIE_COMMON_H_ +#define _RLOTTIE_COMMON_H_ + +#ifdef _WIN32 +#ifdef LOT_BUILD +#ifdef DLL_EXPORT +#define LOT_EXPORT __declspec(dllexport) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT __declspec(dllimport) +#endif +#else +#ifdef __GNUC__ +#if __GNUC__ >= 4 +#define LOT_EXPORT __attribute__((visibility("default"))) +#else +#define LOT_EXPORT +#endif +#else +#define LOT_EXPORT +#endif +#endif + + +/** + * @defgroup Lottie_Animation Lottie_Animation + * + * Lottie Animation is a modern style vector based animation design. Its animation + * resource(within json format) could be generated by Adobe After Effect using + * bodymovin plugin. You can find a good examples in Lottie Community which + * shares many free resources(see: www.lottiefiles.com). + * + * This Lottie_Animation is a common engine to manipulate, control Lottie + * Animation from the Lottie resource - json file. It provides a scene-graph + * node tree per frames by user demand as well as rasterized frame images. + * + */ + +/** + * @ingroup Lottie_Animation + */ + + +/** + * @brief Enumeration for Lottie Player error code. + */ +typedef enum +{ + //TODO: Coding convention?? + LOT_ANIMATION_ERROR_NONE = 0, + LOT_ANIMATION_ERROR_NOT_PERMITTED, + LOT_ANIMATION_ERROR_OUT_OF_MEMORY, + LOT_ANIMATION_ERROR_INVALID_PARAMETER, + LOT_ANIMATION_ERROR_RESULT_OUT_OF_RANGE, + LOT_ANIMATION_ERROR_ALREADY_IN_PROGRESS, + LOT_ANIMATION_ERROR_UNKNOWN +} LOTErrorType; + +typedef enum +{ + BrushSolid = 0, + BrushGradient +} LOTBrushType; + +typedef enum +{ + FillEvenOdd = 0, + FillWinding +} LOTFillRule; + +typedef enum +{ + JoinMiter = 0, + JoinBevel, + JoinRound +} LOTJoinStyle; + +typedef enum +{ + CapFlat = 0, + CapSquare, + CapRound +} LOTCapStyle; + +typedef enum +{ + GradientLinear = 0, + GradientRadial +} LOTGradientType; + +typedef struct LOTGradientStop +{ + float pos; + unsigned char r, g, b, a; +} LOTGradientStop; + +typedef enum +{ + MaskModeAdd = 0, + MaskModeSubstract, + MaskModeIntersect, + MaskModeDifference +} LOTMaskMode; + +typedef struct LOTMask { + struct { + const float *ptPtr; + int ptCount; + const char* elmPtr; + int elmCount; + } mPath; + LOTMaskMode mMode; +}LOTMask; + +typedef enum +{ + MatteNone = 0, + MatteAlpha, + MatteAlphaInv, + MatteLuma, + MatteLumaInv +} LOTMatteType; + +typedef struct LOTNode { + +#define ChangeFlagNone 0x0000 +#define ChangeFlagPath 0x0001 +#define ChangeFlagPaint 0x0010 +#define ChangeFlagAll (ChangeFlagPath & ChangeFlagPaint) + + struct { + const float *ptPtr; + int ptCount; + const char* elmPtr; + int elmCount; + } mPath; + + struct { + unsigned char r, g, b, a; + } mColor; + + struct { + unsigned char enable; + int width; + LOTCapStyle cap; + LOTJoinStyle join; + int meterLimit; + float* dashArray; + int dashArraySize; + } mStroke; + + struct { + LOTGradientType type; + LOTGradientStop *stopPtr; + unsigned int stopCount; + struct { + float x, y; + } start, end, center, focal; + float cradius; + float fradius; + } mGradient; + + int mFlag; + LOTBrushType mBrushType; + LOTFillRule mFillRule; +} LOTNode; + + + +typedef struct LOTLayerNode { + + struct { + LOTMask *ptr; + unsigned int size; + } mMaskList; + + struct { + const float *ptPtr; + int ptCount; + const char* elmPtr; + int elmCount; + } mClipPath; + + struct { + struct LOTLayerNode **ptr; + unsigned int size; + } mLayerList; + + struct { + LOTNode **ptr; + unsigned int size; + } mNodeList; + + LOTMatteType mMatte; + int mVisible; + +} LOTLayerNode; + +/** + * @} + */ + +#endif // _RLOTTIE_COMMON_H_ diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 084b994f28..6748f205a6 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "lottieanimation.h" +#include "rlottie.h" #include "vdebug.h" using namespace lottie; diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index c0cce77066..1f041f8f93 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "lottieanimation.h" +#include "rlottie.h" #include "lottieitem.h" #include "lottieloader.h" #include "lottiemodel.h" diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index d225699383..b38a37958a 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -27,8 +27,8 @@ #include"vpath.h" #include"vpoint.h" #include"vpathmesure.h" -#include"lottiecommon.h" -#include"lottieanimation.h" +#include"rlottiecommon.h" +#include"rlottie.h" #include"vpainter.h" #include"vdrawable.h" diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index ee4d8a18cf..7b08b4f54a 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -1,5 +1,5 @@ #include -#include "lottieanimation.h" +#include "rlottie.h" class AnimationTest : public ::testing::Test { public: From 04a4bec5bbbf395f3c7f5e31aa35092a2dcf0d2a Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sat, 19 Jan 2019 09:22:16 +0900 Subject: [PATCH 404/672] lottie: rename lottie-player to rlottie in meson build Change-Id: Ie19ea2d849af95b348417e826dcc2fb7e6ded86b --- example/meson.build | 10 +++++----- meson.build | 12 ++++++------ src/meson.build | 12 ++++++------ src/vector/stb/meson.build | 9 +++++---- src/vector/vimageloader.cpp | 10 +++++----- test/meson.build | 2 +- 6 files changed, 28 insertions(+), 27 deletions(-) diff --git a/example/meson.build b/example/meson.build index 9a89b6009d..41c9c966be 100644 --- a/example/meson.build +++ b/example/meson.build @@ -16,7 +16,7 @@ if (demo_dep.found()) executable('demo', demo_sources, include_directories : inc, - link_with : lottie_player_lib, + link_with : rlottie_lib, dependencies : demo_dep) lottieview_test_src = files('lottieviewtest.cpp') @@ -25,7 +25,7 @@ if (demo_dep.found()) executable('lottieviewTest', lottieview_test_src, include_directories : inc, - link_with : lottie_player_lib, + link_with : rlottie_lib, dependencies : demo_dep) uxsample_test_src = files('uxsampletest.cpp') @@ -34,7 +34,7 @@ if (demo_dep.found()) executable('uxsampleTest', uxsample_test_src, include_directories : inc, - link_with : lottie_player_lib, + link_with : rlottie_lib, dependencies : demo_dep) lottieviewer_sources = files('lottieviewer.cpp') @@ -43,14 +43,14 @@ if (demo_dep.found()) executable('lottieviewer', lottieviewer_sources, include_directories : inc, - link_with : lottie_player_lib, + link_with : rlottie_lib, dependencies : demo_dep) if (meson.get_compiler('cpp').has_header('elementary-1/elm_animation_view.h')) executable('efl_animview', 'efl_animview.cpp', include_directories : inc, - link_with : lottie_player_lib, + link_with : rlottie_lib, dependencies : demo_dep) endif diff --git a/meson.build b/meson.build index a3315b59e1..85c04b2896 100644 --- a/meson.build +++ b/meson.build @@ -1,8 +1,8 @@ -project('lottie-player library', +project('rlottie library', 'cpp', license : 'Apache') -lottie_player_lib_version = '0.0.1' +rlottie_lib_version = '0.0.1' add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_source_dir()), language : 'cpp') @@ -46,9 +46,9 @@ endif pkg_mod = import('pkgconfig') -pkg_mod.generate( libraries : lottie_player_lib, - version : lottie_player_lib_version, - name : 'liblottie-player', - filebase : 'lottie-player', +pkg_mod.generate( libraries : rlottie_lib, + version : rlottie_lib_version, + name : 'librlottie', + filebase : 'rlottie', description : 'A Library for rendering lottie files.' ) diff --git a/src/meson.build b/src/meson.build index dc6a83723a..148edd82d4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -6,9 +6,9 @@ library_deps = vector_dep library_deps += lottie_dep library_deps += binding_dep -lottie_player_lib = shared_library( 'lottie-player', - include_directories : inc, - version : lottie_player_lib_version, - dependencies : library_deps, - install : true - ) +rlottie_lib = shared_library('rlottie', + include_directories : inc, + version : rlottie_lib_version, + dependencies : library_deps, + install : true + ) diff --git a/src/vector/stb/meson.build b/src/vector/stb/meson.build index a7a59c0060..79f19625f5 100644 --- a/src/vector/stb/meson.build +++ b/src/vector/stb/meson.build @@ -1,7 +1,8 @@ -lottie_image_loader_sources = ['stb_image.cpp'] +rlottie_image_loader_sources = ['stb_image.cpp'] -lottie_image_loader_lib = shared_library( 'lottie-image-loader', - lottie_image_loader_sources, - install : true) +rlottie_image_loader_lib = shared_library('rlottie-image-loader', + rlottie_image_loader_sources, + install : true + ) diff --git a/src/vector/vimageloader.cpp b/src/vector/vimageloader.cpp index 28a774ab35..c7e73b7f9f 100644 --- a/src/vector/vimageloader.cpp +++ b/src/vector/vimageloader.cpp @@ -15,18 +15,18 @@ struct VImageLoader::Impl Impl() { #ifdef __APPLE__ - dl_handle = dlopen("liblottie-image-loader.dylib", RTLD_LAZY); + dl_handle = dlopen("librlottie-image-loader.dylib", RTLD_LAZY); #else - dl_handle = dlopen("liblottie-image-loader.so", RTLD_LAZY); + dl_handle = dlopen("librlottie-image-loader.so", RTLD_LAZY); #endif if (!dl_handle) - vWarning<<"Failed to dlopen liblottie-image-loader library"; + vWarning<<"Failed to dlopen librlottie-image-loader library"; lottie_image_load = (lottie_image_load_f) dlsym(dl_handle, "lottie_image_load"); if (!lottie_image_load) - vWarning<<"Failed to find symbol lottie_image_load in liblottie-image-loader library"; + vWarning<<"Failed to find symbol lottie_image_load in librlottie-image-loader library"; lottie_image_free = (lottie_image_free_f) dlsym(dl_handle, "lottie_image_free"); if (!lottie_image_free) - vWarning<<"Failed to find symbol lottie_image_free in liblottie-image-loader library"; + vWarning<<"Failed to find symbol lottie_image_free in librlottie-image-loader library"; } ~Impl() { diff --git a/test/meson.build b/test/meson.build index 8a83c861e2..312e53e1d0 100644 --- a/test/meson.build +++ b/test/meson.build @@ -19,7 +19,7 @@ animation_test_sources += files('test_lottieanimation_capi.cpp') animation_testsuite = executable('animationTestSuite', animation_test_sources, include_directories : inc, - link_with : lottie_player_lib, + link_with : rlottie_lib, dependencies : gtest_dep) test('Animation Testsuite', animation_testsuite) From 569f16a7e999ad697008900948192b13c0e27f4f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 22 Jan 2019 13:45:07 +0900 Subject: [PATCH 405/672] lottie: rename lottie-player to rlottie for cmake and gbs build, update namespace to rlottie. Change-Id: I51f85201c06be4cb42c2036a0162b9124149e781 --- CMakeLists.txt | 56 +++++++++---------- COPYING | 2 +- README.txt | 2 +- cmake/lottie-playerConfig.cmake.in | 16 ------ cmake/rlottieConfig.cmake.in | 16 ++++++ example/lottieview.cpp | 6 +- example/lottieview.h | 4 +- inc/CMakeLists.txt | 2 +- inc/rlottie.h | 2 +- lottie-player.pc.in | 12 ---- packaging/lottie-player.manifest | 5 -- .../rlottie.manifest | 0 .../{lottie-player.spec => rlottie.spec} | 18 +++--- rlottie.pc.in | 12 ++++ src/binding/c/CMakeLists.txt | 4 +- src/binding/c/lottieanimation_capi.cpp | 4 +- src/lottie/CMakeLists.txt | 4 +- src/lottie/lottieanimation.cpp | 2 +- src/lottie/lottieitem.cpp | 2 +- src/lottie/lottieitem.h | 2 +- src/vector/CMakeLists.txt | 4 +- src/vector/freetype/CMakeLists.txt | 4 +- src/vector/pixman/CMakeLists.txt | 6 +- test/test_lottieanimation.cpp | 8 +-- 24 files changed, 94 insertions(+), 99 deletions(-) delete mode 100644 cmake/lottie-playerConfig.cmake.in create mode 100644 cmake/rlottieConfig.cmake.in delete mode 100644 lottie-player.pc.in delete mode 100644 packaging/lottie-player.manifest rename lottie-player.manifest => packaging/rlottie.manifest (100%) rename packaging/{lottie-player.spec => rlottie.spec} (76%) create mode 100644 rlottie.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 38a8a7a497..facf8e7c65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,26 +1,26 @@ cmake_minimum_required( VERSION 3.2 ) #declare project -project( lottie-player VERSION 0.0.1 LANGUAGES C CXX ASM) +project( rlottie VERSION 0.0.1 LANGUAGES C CXX ASM) #declare target -add_library( lottie-player SHARED "" ) +add_library( rlottie SHARED "" ) #declare version of the target -set(player_version_major 0) -set(player_version_minor 0) -set(player_version_patch 1) -set(player_version ${player_version_major}.${player_version_minor}.${player_version_patch} ) -set_target_properties(lottie-player PROPERTIES - VERSION ${player_version} - SOVERSION ${player_version_major} +set(rlottie_version_major 0) +set(rlottie_version_minor 0) +set(rlottie_version_patch 1) +set(rlottie_version ${rlottie_version_major}.${rlottie_version_minor}.${rlottie_version_patch} ) +set_target_properties(rlottie PROPERTIES + VERSION ${rlottie_version} + SOVERSION ${rlottie_version_major} ) #declare alias so that library can be used inside the build tree, e.g. when testing -add_library(lottie-player::lottie-player ALIAS lottie-player) +add_library(rlottie::rlottie ALIAS rlottie) #declare target compilation options -target_compile_options(lottie-player +target_compile_options(rlottie PUBLIC -std=c++14 PRIVATE @@ -30,17 +30,17 @@ target_compile_options(lottie-player set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) find_package( Threads ) -target_link_libraries(lottie-player +target_link_libraries(rlottie PUBLIC "${CMAKE_THREAD_LIBS_INIT}" ) # for dlopen, dlsym and dlclose dependancy -target_link_libraries(lottie-player +target_link_libraries(rlottie PRIVATE ${CMAKE_DL_LIBS}) -target_link_libraries(lottie-player +target_link_libraries(rlottie PUBLIC "-Wl,--no-undefined" ) @@ -67,7 +67,7 @@ install(FILES DESTINATION include) #install lib -install( TARGETS lottie-player EXPORT lottie-player-targets +install( TARGETS rlottie EXPORT rlottie-targets LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} INCLUDES DESTINATION include @@ -75,36 +75,36 @@ install( TARGETS lottie-player EXPORT lottie-player-targets #install config file. -install( EXPORT lottie-player-targets - FILE lottie-playerTargets.cmake - NAMESPACE lottie-player:: - DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player +install( EXPORT rlottie-targets + FILE rlottieTargets.cmake + NAMESPACE rlottie:: + DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie ) #Create a ConfigVersion.cmake file include(CMakePackageConfigHelpers) write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) -configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/lottie-playerConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake - INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player +configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/rlottieConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfig.cmake + INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie ) #Install the config, configversion and custom find modules install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake - DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfigVersion.cmake + DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie ) -export(EXPORT lottie-player-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerTargets.cmake NAMESPACE lottie-player::) +export(EXPORT rlottie-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/rlottieTargets.cmake NAMESPACE rlottie::) #Register package in user's package registry -export(PACKAGE lottie-player) +export(PACKAGE rlottie) diff --git a/COPYING b/COPYING index 550e1e9b7b..293d8daedb 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ Licensing -lottie-player basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) +rlottie basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) but some parts of shared code are covered by different licenses. Listed below are the folder names and the license file covering it. Note that this license would cover all of the source invovled in each folders, unless diff --git a/README.txt b/README.txt index e028653b4f..dce83ba78d 100644 --- a/README.txt +++ b/README.txt @@ -21,7 +21,7 @@ RUN TESTS BUILD WITH CMAKE ================ -liblottie-player can also be built using the cmake build system. +librlottie can also be built using the cmake build system. 1. install cmake. (Follow instructions at https://cmake.org/download/) 2. create a new build/ directory diff --git a/cmake/lottie-playerConfig.cmake.in b/cmake/lottie-playerConfig.cmake.in deleted file mode 100644 index 8367242b03..0000000000 --- a/cmake/lottie-playerConfig.cmake.in +++ /dev/null @@ -1,16 +0,0 @@ -get_filename_component(lottie-player_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -include(CMakeFindDependencyMacro) - -list(APPEND CMAKE_MODULE_PATH ${lottie-player_CMAKE_DIR}) - -# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 - -#find_dependency(RapidJSON 1.0 REQUIRED MODULE) -#find_package(Boost 1.55 REQUIRED COMPONENTS regex) -list(REMOVE_AT CMAKE_MODULE_PATH -1) - -if(NOT TARGET lottie-player::lottie-player) - include("${lottie-player_CMAKE_DIR}/lottie-playerTargets.cmake") -endif() - -set(lottie-player_LIBRARIES lottie-player::lottie-player) diff --git a/cmake/rlottieConfig.cmake.in b/cmake/rlottieConfig.cmake.in new file mode 100644 index 0000000000..730672a1d2 --- /dev/null +++ b/cmake/rlottieConfig.cmake.in @@ -0,0 +1,16 @@ +get_filename_component(rlottie_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +include(CMakeFindDependencyMacro) + +list(APPEND CMAKE_MODULE_PATH ${rlottie_CMAKE_DIR}) + +# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 + +#find_dependency(RapidJSON 1.0 REQUIRED MODULE) +#find_package(Boost 1.55 REQUIRED COMPONENTS regex) +list(REMOVE_AT CMAKE_MODULE_PATH -1) + +if(NOT TARGET rlottie::rlottie) + include("${rlottie_CMAKE_DIR}/rlottieTargets.cmake") +endif() + +set(rlottie_LIBRARIES rlottie::rlottie) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index a09417ac7d..7671735e62 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -18,7 +18,7 @@ #include"lottieview.h" -using namespace lottie; +using namespace rlottie; static Eina_Bool animator(void *data , double pos) @@ -321,14 +321,14 @@ void LottieView::seek(float pos) mDirty = true; auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); size_t bytesperline = evas_object_image_stride_get(mImage); - lottie::Surface surface(buffer, width, height, bytesperline); + rlottie::Surface surface(buffer, width, height, bytesperline); mRenderTask = mPlayer->render(mCurFrame, surface); // to force a redraw evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } else { auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); size_t bytesperline = evas_object_image_stride_get(mImage); - lottie::Surface surface(buffer, width, height, bytesperline); + rlottie::Surface surface(buffer, width, height, bytesperline); mPlayer->renderSync(mCurFrame, surface); evas_object_image_data_set(mImage, surface.buffer()); evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); diff --git a/example/lottieview.h b/example/lottieview.h index aab0336fcc..1ff8266c5c 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -108,7 +108,7 @@ public: Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - std::unique_ptr mPlayer; + std::unique_ptr mPlayer; size_t mCurFrame{UINT_MAX}; Ecore_Animator *mAnimator{nullptr}; bool mLoop; @@ -123,7 +123,7 @@ public: float mPos; float mFrameRate; long mTotalFrame; - std::future mRenderTask; + std::future mRenderTask; //keep a segment of the animation default is [0, 1] float mMinProgress{0}; diff --git a/inc/CMakeLists.txt b/inc/CMakeLists.txt index adc3dc01d7..0e31a6653f 100644 --- a/inc/CMakeLists.txt +++ b/inc/CMakeLists.txt @@ -1,4 +1,4 @@ -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) \ No newline at end of file diff --git a/inc/rlottie.h b/inc/rlottie.h index 47aa4e254e..7821641188 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -49,7 +49,7 @@ class AnimationImpl; struct LOTNode; struct LOTLayerNode; -namespace lottie { +namespace rlottie { class LOT_EXPORT Surface { public: diff --git a/lottie-player.pc.in b/lottie-player.pc.in deleted file mode 100644 index f7ea6f012d..0000000000 --- a/lottie-player.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -prefix=@PREFIX@ -exec_prefix=@EXEC_DIR@ -apiversion=@player_version@ -libdir=@LIBDIR@ -includedir=@INCDIR@ - -Name: lottie-player -Description: A lottie-player library -Version: @player_version@ -Requires: -Libs: -L${libdir} -llottie-player -Cflags: -I${includedir} -std=c++14 diff --git a/packaging/lottie-player.manifest b/packaging/lottie-player.manifest deleted file mode 100644 index 017d22d3af..0000000000 --- a/packaging/lottie-player.manifest +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/lottie-player.manifest b/packaging/rlottie.manifest similarity index 100% rename from lottie-player.manifest rename to packaging/rlottie.manifest diff --git a/packaging/lottie-player.spec b/packaging/rlottie.spec similarity index 76% rename from packaging/lottie-player.spec rename to packaging/rlottie.spec index f2bf9e4679..2e3954257f 100644 --- a/packaging/lottie-player.spec +++ b/packaging/rlottie.spec @@ -1,5 +1,5 @@ -Name: lottie-player -Summary: lottie player library +Name: rlottie +Summary: lottie rendering library Version: 0.0.1 Release: 1 Group: UI Framework/Services @@ -15,13 +15,13 @@ lottie player library %package devel -Summary: lottie player library (devel) +Summary: lottie rendering library (devel) Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel -lottie player library (devel) +lottie rendering library (devel) %prep @@ -54,13 +54,13 @@ make %{?jobs:-j%jobs} %files %defattr(-,root,root,-) -%{_libdir}/liblottie-player.so.* -%manifest %{name}.manifest +%{_libdir}/librlottie.so.* +%manifest packaging/%{name}.manifest %license COPYING licenses/COPYING* %files devel %defattr(-,root,root,-) %{_includedir}/*.h -%{_libdir}/liblottie-player.so -%{_libdir}/cmake/lottie-player/*.cmake -%{_libdir}/pkgconfig/lottie-player.pc +%{_libdir}/librlottie.so +%{_libdir}/cmake/rlottie/*.cmake +%{_libdir}/pkgconfig/rlottie.pc diff --git a/rlottie.pc.in b/rlottie.pc.in new file mode 100644 index 0000000000..bf279e29bd --- /dev/null +++ b/rlottie.pc.in @@ -0,0 +1,12 @@ +prefix=@PREFIX@ +exec_prefix=@EXEC_DIR@ +apiversion=@rlottie_version@ +libdir=@LIBDIR@ +includedir=@INCDIR@ + +Name: rlottie +Description: A rlottie library +Version: @rlottie_version@ +Requires: +Libs: -L${libdir} -lrlottie +Cflags: -I${includedir} -std=c++14 diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt index 7737952a86..30a049ad29 100644 --- a/src/binding/c/CMakeLists.txt +++ b/src/binding/c/CMakeLists.txt @@ -1,9 +1,9 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lottieanimation_capi.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 6748f205a6..dd7f5e13fe 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -19,7 +19,7 @@ #include "rlottie.h" #include "vdebug.h" -using namespace lottie; +using namespace rlottie; extern "C" { @@ -117,7 +117,7 @@ lottie_animation_render_async(Lottie_Animation_S *animation, { if (!animation) return; - lottie::Surface surface(buffer, width, height, bytes_per_line); + rlottie::Surface surface(buffer, width, height, bytes_per_line); animation->mRenderTask = animation->mAnimation->render(frame_number, surface); animation->mBufferRef = buffer; } diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt index 4fb944a45b..7261d43762 100644 --- a/src/lottie/CMakeLists.txt +++ b/src/lottie/CMakeLists.txt @@ -1,5 +1,5 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lottieitem.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieloader.cpp" @@ -8,7 +8,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/lottieanimation.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 1f041f8f93..1084a23d26 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -23,7 +23,7 @@ #include -using namespace lottie; +using namespace rlottie; struct RenderTask { RenderTask() { receiver = sender.get_future(); } diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index aa88896968..3cd78fd4e5 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -121,7 +121,7 @@ const LOTLayerNode * LOTCompItem::renderTree() const return mRootLayer->layerNode(); } -bool LOTCompItem::render(const lottie::Surface &surface) +bool LOTCompItem::render(const rlottie::Surface &surface) { VBitmap bitmap(reinterpret_cast(surface.buffer()), surface.width(), surface.height(), diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index b38a37958a..9eda6d13c0 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -56,7 +56,7 @@ public: VSize size() const; void buildRenderTree(); const LOTLayerNode * renderTree()const; - bool render(const lottie::Surface &surface); + bool render(const rlottie::Surface &surface); private: VMatrix mScaleMatrix; VSize mViewSize; diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index cbf9c9869e..30f9d29cae 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -2,7 +2,7 @@ add_subdirectory(freetype) add_subdirectory(pixman) -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/vrect.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdasher.cpp" @@ -26,7 +26,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vimageloader.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/vector/freetype/CMakeLists.txt b/src/vector/freetype/CMakeLists.txt index 0ce7e69da1..31a9f084a8 100644 --- a/src/vector/freetype/CMakeLists.txt +++ b/src/vector/freetype/CMakeLists.txt @@ -1,11 +1,11 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/v_ft_math.cpp" "${CMAKE_CURRENT_LIST_DIR}/v_ft_raster.cpp" "${CMAKE_CURRENT_LIST_DIR}/v_ft_stroker.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) \ No newline at end of file diff --git a/src/vector/pixman/CMakeLists.txt b/src/vector/pixman/CMakeLists.txt index d38a0947dd..c08593fd3d 100644 --- a/src/vector/pixman/CMakeLists.txt +++ b/src/vector/pixman/CMakeLists.txt @@ -1,17 +1,17 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" ) IF("${ARCH}" STREQUAL "arm") SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" ) ENDIF("${ARCH}" STREQUAL "arm") -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index 7b08b4f54a..d704fb4bfd 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -5,10 +5,10 @@ class AnimationTest : public ::testing::Test { public: void SetUp() { - animationInvalid = lottie::Animation::loadFromFile("wrong_file.json"); + animationInvalid = rlottie::Animation::loadFromFile("wrong_file.json"); std::string filePath = DEMO_DIR; filePath +="mask.json"; - animation = lottie::Animation::loadFromFile(filePath); + animation = rlottie::Animation::loadFromFile(filePath); } void TearDown() @@ -16,8 +16,8 @@ public: } public: - std::unique_ptr animationInvalid; - std::unique_ptr animation; + std::unique_ptr animationInvalid; + std::unique_ptr animation; }; TEST_F(AnimationTest, loadFromFile_N) { From 6e8aec45533a001275a12c879a3cd668988541c4 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 23 Jan 2019 14:46:34 +0900 Subject: [PATCH 406/672] Revert "lottie: rename lottie-player to rlottie for cmake and gbs build, update namespace to rlottie." This reverts commit 569f16a7e999ad697008900948192b13c0e27f4f. --- CMakeLists.txt | 56 +++++++++---------- COPYING | 2 +- README.txt | 2 +- cmake/lottie-playerConfig.cmake.in | 16 ++++++ cmake/rlottieConfig.cmake.in | 16 ------ example/lottieview.cpp | 6 +- example/lottieview.h | 4 +- inc/CMakeLists.txt | 2 +- inc/rlottie.h | 2 +- ...rlottie.manifest => lottie-player.manifest | 0 lottie-player.pc.in | 12 ++++ packaging/lottie-player.manifest | 5 ++ .../{rlottie.spec => lottie-player.spec} | 18 +++--- rlottie.pc.in | 12 ---- src/binding/c/CMakeLists.txt | 4 +- src/binding/c/lottieanimation_capi.cpp | 4 +- src/lottie/CMakeLists.txt | 4 +- src/lottie/lottieanimation.cpp | 2 +- src/lottie/lottieitem.cpp | 2 +- src/lottie/lottieitem.h | 2 +- src/vector/CMakeLists.txt | 4 +- src/vector/freetype/CMakeLists.txt | 4 +- src/vector/pixman/CMakeLists.txt | 6 +- test/test_lottieanimation.cpp | 8 +-- 24 files changed, 99 insertions(+), 94 deletions(-) create mode 100644 cmake/lottie-playerConfig.cmake.in delete mode 100644 cmake/rlottieConfig.cmake.in rename packaging/rlottie.manifest => lottie-player.manifest (100%) create mode 100644 lottie-player.pc.in create mode 100644 packaging/lottie-player.manifest rename packaging/{rlottie.spec => lottie-player.spec} (76%) delete mode 100644 rlottie.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index facf8e7c65..38a8a7a497 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,26 +1,26 @@ cmake_minimum_required( VERSION 3.2 ) #declare project -project( rlottie VERSION 0.0.1 LANGUAGES C CXX ASM) +project( lottie-player VERSION 0.0.1 LANGUAGES C CXX ASM) #declare target -add_library( rlottie SHARED "" ) +add_library( lottie-player SHARED "" ) #declare version of the target -set(rlottie_version_major 0) -set(rlottie_version_minor 0) -set(rlottie_version_patch 1) -set(rlottie_version ${rlottie_version_major}.${rlottie_version_minor}.${rlottie_version_patch} ) -set_target_properties(rlottie PROPERTIES - VERSION ${rlottie_version} - SOVERSION ${rlottie_version_major} +set(player_version_major 0) +set(player_version_minor 0) +set(player_version_patch 1) +set(player_version ${player_version_major}.${player_version_minor}.${player_version_patch} ) +set_target_properties(lottie-player PROPERTIES + VERSION ${player_version} + SOVERSION ${player_version_major} ) #declare alias so that library can be used inside the build tree, e.g. when testing -add_library(rlottie::rlottie ALIAS rlottie) +add_library(lottie-player::lottie-player ALIAS lottie-player) #declare target compilation options -target_compile_options(rlottie +target_compile_options(lottie-player PUBLIC -std=c++14 PRIVATE @@ -30,17 +30,17 @@ target_compile_options(rlottie set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) find_package( Threads ) -target_link_libraries(rlottie +target_link_libraries(lottie-player PUBLIC "${CMAKE_THREAD_LIBS_INIT}" ) # for dlopen, dlsym and dlclose dependancy -target_link_libraries(rlottie +target_link_libraries(lottie-player PRIVATE ${CMAKE_DL_LIBS}) -target_link_libraries(rlottie +target_link_libraries(lottie-player PUBLIC "-Wl,--no-undefined" ) @@ -67,7 +67,7 @@ install(FILES DESTINATION include) #install lib -install( TARGETS rlottie EXPORT rlottie-targets +install( TARGETS lottie-player EXPORT lottie-player-targets LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} INCLUDES DESTINATION include @@ -75,36 +75,36 @@ install( TARGETS rlottie EXPORT rlottie-targets #install config file. -install( EXPORT rlottie-targets - FILE rlottieTargets.cmake - NAMESPACE rlottie:: - DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie +install( EXPORT lottie-player-targets + FILE lottie-playerTargets.cmake + NAMESPACE lottie-player:: + DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player ) #Create a ConfigVersion.cmake file include(CMakePackageConfigHelpers) write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfigVersion.cmake + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) -configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/rlottieConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfig.cmake - INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie +configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/lottie-playerConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake + INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player ) #Install the config, configversion and custom find modules install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfigVersion.cmake - DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake + DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player ) -export(EXPORT rlottie-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/rlottieTargets.cmake NAMESPACE rlottie::) +export(EXPORT lottie-player-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerTargets.cmake NAMESPACE lottie-player::) #Register package in user's package registry -export(PACKAGE rlottie) +export(PACKAGE lottie-player) diff --git a/COPYING b/COPYING index 293d8daedb..550e1e9b7b 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ Licensing -rlottie basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) +lottie-player basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) but some parts of shared code are covered by different licenses. Listed below are the folder names and the license file covering it. Note that this license would cover all of the source invovled in each folders, unless diff --git a/README.txt b/README.txt index dce83ba78d..e028653b4f 100644 --- a/README.txt +++ b/README.txt @@ -21,7 +21,7 @@ RUN TESTS BUILD WITH CMAKE ================ -librlottie can also be built using the cmake build system. +liblottie-player can also be built using the cmake build system. 1. install cmake. (Follow instructions at https://cmake.org/download/) 2. create a new build/ directory diff --git a/cmake/lottie-playerConfig.cmake.in b/cmake/lottie-playerConfig.cmake.in new file mode 100644 index 0000000000..8367242b03 --- /dev/null +++ b/cmake/lottie-playerConfig.cmake.in @@ -0,0 +1,16 @@ +get_filename_component(lottie-player_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +include(CMakeFindDependencyMacro) + +list(APPEND CMAKE_MODULE_PATH ${lottie-player_CMAKE_DIR}) + +# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 + +#find_dependency(RapidJSON 1.0 REQUIRED MODULE) +#find_package(Boost 1.55 REQUIRED COMPONENTS regex) +list(REMOVE_AT CMAKE_MODULE_PATH -1) + +if(NOT TARGET lottie-player::lottie-player) + include("${lottie-player_CMAKE_DIR}/lottie-playerTargets.cmake") +endif() + +set(lottie-player_LIBRARIES lottie-player::lottie-player) diff --git a/cmake/rlottieConfig.cmake.in b/cmake/rlottieConfig.cmake.in deleted file mode 100644 index 730672a1d2..0000000000 --- a/cmake/rlottieConfig.cmake.in +++ /dev/null @@ -1,16 +0,0 @@ -get_filename_component(rlottie_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -include(CMakeFindDependencyMacro) - -list(APPEND CMAKE_MODULE_PATH ${rlottie_CMAKE_DIR}) - -# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 - -#find_dependency(RapidJSON 1.0 REQUIRED MODULE) -#find_package(Boost 1.55 REQUIRED COMPONENTS regex) -list(REMOVE_AT CMAKE_MODULE_PATH -1) - -if(NOT TARGET rlottie::rlottie) - include("${rlottie_CMAKE_DIR}/rlottieTargets.cmake") -endif() - -set(rlottie_LIBRARIES rlottie::rlottie) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 7671735e62..a09417ac7d 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -18,7 +18,7 @@ #include"lottieview.h" -using namespace rlottie; +using namespace lottie; static Eina_Bool animator(void *data , double pos) @@ -321,14 +321,14 @@ void LottieView::seek(float pos) mDirty = true; auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); size_t bytesperline = evas_object_image_stride_get(mImage); - rlottie::Surface surface(buffer, width, height, bytesperline); + lottie::Surface surface(buffer, width, height, bytesperline); mRenderTask = mPlayer->render(mCurFrame, surface); // to force a redraw evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } else { auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); size_t bytesperline = evas_object_image_stride_get(mImage); - rlottie::Surface surface(buffer, width, height, bytesperline); + lottie::Surface surface(buffer, width, height, bytesperline); mPlayer->renderSync(mCurFrame, surface); evas_object_image_data_set(mImage, surface.buffer()); evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); diff --git a/example/lottieview.h b/example/lottieview.h index 1ff8266c5c..aab0336fcc 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -108,7 +108,7 @@ public: Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - std::unique_ptr mPlayer; + std::unique_ptr mPlayer; size_t mCurFrame{UINT_MAX}; Ecore_Animator *mAnimator{nullptr}; bool mLoop; @@ -123,7 +123,7 @@ public: float mPos; float mFrameRate; long mTotalFrame; - std::future mRenderTask; + std::future mRenderTask; //keep a segment of the animation default is [0, 1] float mMinProgress{0}; diff --git a/inc/CMakeLists.txt b/inc/CMakeLists.txt index 0e31a6653f..adc3dc01d7 100644 --- a/inc/CMakeLists.txt +++ b/inc/CMakeLists.txt @@ -1,4 +1,4 @@ -target_include_directories(rlottie +target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) \ No newline at end of file diff --git a/inc/rlottie.h b/inc/rlottie.h index 7821641188..47aa4e254e 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -49,7 +49,7 @@ class AnimationImpl; struct LOTNode; struct LOTLayerNode; -namespace rlottie { +namespace lottie { class LOT_EXPORT Surface { public: diff --git a/packaging/rlottie.manifest b/lottie-player.manifest similarity index 100% rename from packaging/rlottie.manifest rename to lottie-player.manifest diff --git a/lottie-player.pc.in b/lottie-player.pc.in new file mode 100644 index 0000000000..f7ea6f012d --- /dev/null +++ b/lottie-player.pc.in @@ -0,0 +1,12 @@ +prefix=@PREFIX@ +exec_prefix=@EXEC_DIR@ +apiversion=@player_version@ +libdir=@LIBDIR@ +includedir=@INCDIR@ + +Name: lottie-player +Description: A lottie-player library +Version: @player_version@ +Requires: +Libs: -L${libdir} -llottie-player +Cflags: -I${includedir} -std=c++14 diff --git a/packaging/lottie-player.manifest b/packaging/lottie-player.manifest new file mode 100644 index 0000000000..017d22d3af --- /dev/null +++ b/packaging/lottie-player.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/rlottie.spec b/packaging/lottie-player.spec similarity index 76% rename from packaging/rlottie.spec rename to packaging/lottie-player.spec index 2e3954257f..f2bf9e4679 100644 --- a/packaging/rlottie.spec +++ b/packaging/lottie-player.spec @@ -1,5 +1,5 @@ -Name: rlottie -Summary: lottie rendering library +Name: lottie-player +Summary: lottie player library Version: 0.0.1 Release: 1 Group: UI Framework/Services @@ -15,13 +15,13 @@ lottie player library %package devel -Summary: lottie rendering library (devel) +Summary: lottie player library (devel) Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel -lottie rendering library (devel) +lottie player library (devel) %prep @@ -54,13 +54,13 @@ make %{?jobs:-j%jobs} %files %defattr(-,root,root,-) -%{_libdir}/librlottie.so.* -%manifest packaging/%{name}.manifest +%{_libdir}/liblottie-player.so.* +%manifest %{name}.manifest %license COPYING licenses/COPYING* %files devel %defattr(-,root,root,-) %{_includedir}/*.h -%{_libdir}/librlottie.so -%{_libdir}/cmake/rlottie/*.cmake -%{_libdir}/pkgconfig/rlottie.pc +%{_libdir}/liblottie-player.so +%{_libdir}/cmake/lottie-player/*.cmake +%{_libdir}/pkgconfig/lottie-player.pc diff --git a/rlottie.pc.in b/rlottie.pc.in deleted file mode 100644 index bf279e29bd..0000000000 --- a/rlottie.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -prefix=@PREFIX@ -exec_prefix=@EXEC_DIR@ -apiversion=@rlottie_version@ -libdir=@LIBDIR@ -includedir=@INCDIR@ - -Name: rlottie -Description: A rlottie library -Version: @rlottie_version@ -Requires: -Libs: -L${libdir} -lrlottie -Cflags: -I${includedir} -std=c++14 diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt index 30a049ad29..7737952a86 100644 --- a/src/binding/c/CMakeLists.txt +++ b/src/binding/c/CMakeLists.txt @@ -1,9 +1,9 @@ -target_sources(rlottie +target_sources(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lottieanimation_capi.cpp" ) -target_include_directories(rlottie +target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index dd7f5e13fe..6748f205a6 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -19,7 +19,7 @@ #include "rlottie.h" #include "vdebug.h" -using namespace rlottie; +using namespace lottie; extern "C" { @@ -117,7 +117,7 @@ lottie_animation_render_async(Lottie_Animation_S *animation, { if (!animation) return; - rlottie::Surface surface(buffer, width, height, bytes_per_line); + lottie::Surface surface(buffer, width, height, bytes_per_line); animation->mRenderTask = animation->mAnimation->render(frame_number, surface); animation->mBufferRef = buffer; } diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt index 7261d43762..4fb944a45b 100644 --- a/src/lottie/CMakeLists.txt +++ b/src/lottie/CMakeLists.txt @@ -1,5 +1,5 @@ -target_sources(rlottie +target_sources(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lottieitem.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieloader.cpp" @@ -8,7 +8,7 @@ target_sources(rlottie "${CMAKE_CURRENT_LIST_DIR}/lottieanimation.cpp" ) -target_include_directories(rlottie +target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 1084a23d26..1f041f8f93 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -23,7 +23,7 @@ #include -using namespace rlottie; +using namespace lottie; struct RenderTask { RenderTask() { receiver = sender.get_future(); } diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 3cd78fd4e5..aa88896968 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -121,7 +121,7 @@ const LOTLayerNode * LOTCompItem::renderTree() const return mRootLayer->layerNode(); } -bool LOTCompItem::render(const rlottie::Surface &surface) +bool LOTCompItem::render(const lottie::Surface &surface) { VBitmap bitmap(reinterpret_cast(surface.buffer()), surface.width(), surface.height(), diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 9eda6d13c0..b38a37958a 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -56,7 +56,7 @@ public: VSize size() const; void buildRenderTree(); const LOTLayerNode * renderTree()const; - bool render(const rlottie::Surface &surface); + bool render(const lottie::Surface &surface); private: VMatrix mScaleMatrix; VSize mViewSize; diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 30f9d29cae..cbf9c9869e 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -2,7 +2,7 @@ add_subdirectory(freetype) add_subdirectory(pixman) -target_sources(rlottie +target_sources(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}/vrect.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdasher.cpp" @@ -26,7 +26,7 @@ target_sources(rlottie "${CMAKE_CURRENT_LIST_DIR}/vimageloader.cpp" ) -target_include_directories(rlottie +target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/vector/freetype/CMakeLists.txt b/src/vector/freetype/CMakeLists.txt index 31a9f084a8..0ce7e69da1 100644 --- a/src/vector/freetype/CMakeLists.txt +++ b/src/vector/freetype/CMakeLists.txt @@ -1,11 +1,11 @@ -target_sources(rlottie +target_sources(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}/v_ft_math.cpp" "${CMAKE_CURRENT_LIST_DIR}/v_ft_raster.cpp" "${CMAKE_CURRENT_LIST_DIR}/v_ft_stroker.cpp" ) -target_include_directories(rlottie +target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) \ No newline at end of file diff --git a/src/vector/pixman/CMakeLists.txt b/src/vector/pixman/CMakeLists.txt index c08593fd3d..d38a0947dd 100644 --- a/src/vector/pixman/CMakeLists.txt +++ b/src/vector/pixman/CMakeLists.txt @@ -1,17 +1,17 @@ -target_sources(rlottie +target_sources(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" ) IF("${ARCH}" STREQUAL "arm") SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") -target_sources(rlottie +target_sources(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" ) ENDIF("${ARCH}" STREQUAL "arm") -target_include_directories(rlottie +target_include_directories(lottie-player PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index d704fb4bfd..7b08b4f54a 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -5,10 +5,10 @@ class AnimationTest : public ::testing::Test { public: void SetUp() { - animationInvalid = rlottie::Animation::loadFromFile("wrong_file.json"); + animationInvalid = lottie::Animation::loadFromFile("wrong_file.json"); std::string filePath = DEMO_DIR; filePath +="mask.json"; - animation = rlottie::Animation::loadFromFile(filePath); + animation = lottie::Animation::loadFromFile(filePath); } void TearDown() @@ -16,8 +16,8 @@ public: } public: - std::unique_ptr animationInvalid; - std::unique_ptr animation; + std::unique_ptr animationInvalid; + std::unique_ptr animation; }; TEST_F(AnimationTest, loadFromFile_N) { From 8056153937df517427a98d21c3c0ca03c15a4244 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 23 Jan 2019 17:15:20 +0900 Subject: [PATCH 407/672] lottie-player: remove old capi headers. efl now looks at rlottie headers. Change-Id: I6b2acfa5423c5ddceafdc85b64d551d2417ad565 --- CMakeLists.txt | 2 -- inc/lottieanimation_capi.h | 1 - inc/lottiecommon.h | 1 - inc/meson.build | 2 -- 4 files changed, 6 deletions(-) delete mode 100644 inc/lottieanimation_capi.h delete mode 100644 inc/lottiecommon.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 38a8a7a497..ff14a0c8bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,8 +62,6 @@ install(FILES inc/rlottie_capi.h inc/rlottiecommon.h inc/lottieanimation.h - inc/lottieanimation_capi.h - inc/lottiecommon.h DESTINATION include) #install lib diff --git a/inc/lottieanimation_capi.h b/inc/lottieanimation_capi.h deleted file mode 100644 index 4b74147783..0000000000 --- a/inc/lottieanimation_capi.h +++ /dev/null @@ -1 +0,0 @@ -#include "rlottie_capi.h" \ No newline at end of file diff --git a/inc/lottiecommon.h b/inc/lottiecommon.h deleted file mode 100644 index 86267e5ef5..0000000000 --- a/inc/lottiecommon.h +++ /dev/null @@ -1 +0,0 @@ -#include "rlottiecommon.h" \ No newline at end of file diff --git a/inc/meson.build b/inc/meson.build index fca654bf8e..7853c2e517 100644 --- a/inc/meson.build +++ b/inc/meson.build @@ -3,6 +3,4 @@ install_headers([ 'rlottie_capi.h', 'rlottiecommon.h', 'lottieanimation.h', - 'lottiecommon.h', - 'lottieanimation_capi.h' ]) From 660ef0dbd35a5b52af3837728efdd17ec761f052 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 23 Jan 2019 17:17:58 +0900 Subject: [PATCH 408/672] example: update new header name of efl animation_view. Change-Id: I6f2b73fc13808027e42122bed58052f99dc67a7c --- example/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/meson.build b/example/meson.build index 41c9c966be..ae4d15f0fc 100644 --- a/example/meson.build +++ b/example/meson.build @@ -46,7 +46,7 @@ if (demo_dep.found()) link_with : rlottie_lib, dependencies : demo_dep) -if (meson.get_compiler('cpp').has_header('elementary-1/elm_animation_view.h')) +if (meson.get_compiler('cpp').has_header('elementary-1/efl_ui_animation_view_legacy.h')) executable('efl_animview', 'efl_animview.cpp', include_directories : inc, From 9cbbf28d25cb5ef1ca38cf6a19d295859fa414d7 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 23 Jan 2019 20:04:40 +0900 Subject: [PATCH 409/672] packaging: rename lottie-player to rlottie. This is a trial-error test that could be accepted by server test. Change-Id: Ib7ccc4f5d5282df9d119b1efb1de51ffb3cbb0b9 --- CMakeLists.txt | 51 ++++++++++--------- COPYING | 2 +- README.txt | 2 +- cmake/lottie-playerConfig.cmake.in | 16 ------ cmake/rlottieConfig.cmake.in | 16 ++++++ inc/CMakeLists.txt | 4 +- .../rlottie.manifest | 0 .../{lottie-player.spec => rlottie.spec} | 12 +++-- ...lottie-player.manifest => rlottie.manifest | 0 lottie-player.pc.in => rlottie.pc.in | 6 +-- src/binding/c/CMakeLists.txt | 4 +- src/lottie/CMakeLists.txt | 4 +- src/vector/CMakeLists.txt | 4 +- src/vector/freetype/CMakeLists.txt | 6 +-- src/vector/pixman/CMakeLists.txt | 6 +-- 15 files changed, 70 insertions(+), 63 deletions(-) delete mode 100644 cmake/lottie-playerConfig.cmake.in create mode 100644 cmake/rlottieConfig.cmake.in rename lottie-player.manifest => packaging/rlottie.manifest (100%) rename packaging/{lottie-player.spec => rlottie.spec} (86%) rename packaging/lottie-player.manifest => rlottie.manifest (100%) rename lottie-player.pc.in => rlottie.pc.in (65%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff14a0c8bf..4249b0f384 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,26 +1,26 @@ cmake_minimum_required( VERSION 3.2 ) #declare project -project( lottie-player VERSION 0.0.1 LANGUAGES C CXX ASM) +project( rlottie VERSION 0.0.1 LANGUAGES C CXX ASM) #declare target -add_library( lottie-player SHARED "" ) +add_library( rlottie SHARED "" ) #declare version of the target set(player_version_major 0) set(player_version_minor 0) set(player_version_patch 1) set(player_version ${player_version_major}.${player_version_minor}.${player_version_patch} ) -set_target_properties(lottie-player PROPERTIES +set_target_properties(rlottie PROPERTIES VERSION ${player_version} SOVERSION ${player_version_major} ) #declare alias so that library can be used inside the build tree, e.g. when testing -add_library(lottie-player::lottie-player ALIAS lottie-player) +add_library(rlottie::rlottie ALIAS rlottie) #declare target compilation options -target_compile_options(lottie-player +target_compile_options(rlottie PUBLIC -std=c++14 PRIVATE @@ -30,17 +30,17 @@ target_compile_options(lottie-player set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) find_package( Threads ) -target_link_libraries(lottie-player +target_link_libraries(rlottie PUBLIC "${CMAKE_THREAD_LIBS_INIT}" ) # for dlopen, dlsym and dlclose dependancy -target_link_libraries(lottie-player +target_link_libraries(rlottie PRIVATE ${CMAKE_DL_LIBS}) -target_link_libraries(lottie-player +target_link_libraries(rlottie PUBLIC "-Wl,--no-undefined" ) @@ -53,9 +53,14 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_DIR ${PREFIX}) SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCDIR ${PREFIX}/include) -CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) +#temporary for lottie-player dependency. +CONFIGURE_FILE(${PROJECT_NAME}.pc.in lottie-player.pc) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/lottie-player.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) + + #install header install(FILES inc/rlottie.h @@ -65,7 +70,7 @@ install(FILES DESTINATION include) #install lib -install( TARGETS lottie-player EXPORT lottie-player-targets +install( TARGETS rlottie EXPORT rlottie-targets LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} INCLUDES DESTINATION include @@ -73,36 +78,36 @@ install( TARGETS lottie-player EXPORT lottie-player-targets #install config file. -install( EXPORT lottie-player-targets - FILE lottie-playerTargets.cmake - NAMESPACE lottie-player:: - DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player +install( EXPORT rlottie-targets + FILE rlottieTargets.cmake + NAMESPACE rlottie:: + DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie ) #Create a ConfigVersion.cmake file include(CMakePackageConfigHelpers) write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) -configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/lottie-playerConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake - INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player +configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/rlottieConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfig.cmake + INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie ) #Install the config, configversion and custom find modules install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerConfigVersion.cmake - DESTINATION ${LIB_INSTALL_DIR}/cmake/lottie-player + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/rlottieConfigVersion.cmake + DESTINATION ${LIB_INSTALL_DIR}/cmake/rlottie ) -export(EXPORT lottie-player-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/lottie-playerTargets.cmake NAMESPACE lottie-player::) +export(EXPORT rlottie-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/rlottieTargets.cmake NAMESPACE rlottie::) #Register package in user's package registry -export(PACKAGE lottie-player) +export(PACKAGE rlottie) diff --git a/COPYING b/COPYING index 550e1e9b7b..293d8daedb 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ Licensing -lottie-player basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) +rlottie basically comes with LGPL-v2.1 license(licenses/COPYING.LGPL) but some parts of shared code are covered by different licenses. Listed below are the folder names and the license file covering it. Note that this license would cover all of the source invovled in each folders, unless diff --git a/README.txt b/README.txt index e028653b4f..dce83ba78d 100644 --- a/README.txt +++ b/README.txt @@ -21,7 +21,7 @@ RUN TESTS BUILD WITH CMAKE ================ -liblottie-player can also be built using the cmake build system. +librlottie can also be built using the cmake build system. 1. install cmake. (Follow instructions at https://cmake.org/download/) 2. create a new build/ directory diff --git a/cmake/lottie-playerConfig.cmake.in b/cmake/lottie-playerConfig.cmake.in deleted file mode 100644 index 8367242b03..0000000000 --- a/cmake/lottie-playerConfig.cmake.in +++ /dev/null @@ -1,16 +0,0 @@ -get_filename_component(lottie-player_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -include(CMakeFindDependencyMacro) - -list(APPEND CMAKE_MODULE_PATH ${lottie-player_CMAKE_DIR}) - -# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 - -#find_dependency(RapidJSON 1.0 REQUIRED MODULE) -#find_package(Boost 1.55 REQUIRED COMPONENTS regex) -list(REMOVE_AT CMAKE_MODULE_PATH -1) - -if(NOT TARGET lottie-player::lottie-player) - include("${lottie-player_CMAKE_DIR}/lottie-playerTargets.cmake") -endif() - -set(lottie-player_LIBRARIES lottie-player::lottie-player) diff --git a/cmake/rlottieConfig.cmake.in b/cmake/rlottieConfig.cmake.in new file mode 100644 index 0000000000..730672a1d2 --- /dev/null +++ b/cmake/rlottieConfig.cmake.in @@ -0,0 +1,16 @@ +get_filename_component(rlottie_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +include(CMakeFindDependencyMacro) + +list(APPEND CMAKE_MODULE_PATH ${rlottie_CMAKE_DIR}) + +# NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0 + +#find_dependency(RapidJSON 1.0 REQUIRED MODULE) +#find_package(Boost 1.55 REQUIRED COMPONENTS regex) +list(REMOVE_AT CMAKE_MODULE_PATH -1) + +if(NOT TARGET rlottie::rlottie) + include("${rlottie_CMAKE_DIR}/rlottieTargets.cmake") +endif() + +set(rlottie_LIBRARIES rlottie::rlottie) diff --git a/inc/CMakeLists.txt b/inc/CMakeLists.txt index adc3dc01d7..9611443056 100644 --- a/inc/CMakeLists.txt +++ b/inc/CMakeLists.txt @@ -1,4 +1,4 @@ -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" - ) \ No newline at end of file + ) diff --git a/lottie-player.manifest b/packaging/rlottie.manifest similarity index 100% rename from lottie-player.manifest rename to packaging/rlottie.manifest diff --git a/packaging/lottie-player.spec b/packaging/rlottie.spec similarity index 86% rename from packaging/lottie-player.spec rename to packaging/rlottie.spec index f2bf9e4679..d7a30f602a 100644 --- a/packaging/lottie-player.spec +++ b/packaging/rlottie.spec @@ -1,5 +1,5 @@ -Name: lottie-player -Summary: lottie player library +Name: rlottie +Summary: rlottie ibrary Version: 0.0.1 Release: 1 Group: UI Framework/Services @@ -54,13 +54,15 @@ make %{?jobs:-j%jobs} %files %defattr(-,root,root,-) -%{_libdir}/liblottie-player.so.* +%{_libdir}/librlottie.so.* %manifest %{name}.manifest %license COPYING licenses/COPYING* %files devel %defattr(-,root,root,-) %{_includedir}/*.h -%{_libdir}/liblottie-player.so -%{_libdir}/cmake/lottie-player/*.cmake +%{_libdir}/librlottie.so + +%{_libdir}/cmake/rlottie/*.cmake %{_libdir}/pkgconfig/lottie-player.pc +%{_libdir}/pkgconfig/rlottie.pc diff --git a/packaging/lottie-player.manifest b/rlottie.manifest similarity index 100% rename from packaging/lottie-player.manifest rename to rlottie.manifest diff --git a/lottie-player.pc.in b/rlottie.pc.in similarity index 65% rename from lottie-player.pc.in rename to rlottie.pc.in index f7ea6f012d..0e5a6b334d 100644 --- a/lottie-player.pc.in +++ b/rlottie.pc.in @@ -4,9 +4,9 @@ apiversion=@player_version@ libdir=@LIBDIR@ includedir=@INCDIR@ -Name: lottie-player -Description: A lottie-player library +Name: rlottie +Description: A rlottie library Version: @player_version@ Requires: -Libs: -L${libdir} -llottie-player +Libs: -L${libdir} -lrlottie Cflags: -I${includedir} -std=c++14 diff --git a/src/binding/c/CMakeLists.txt b/src/binding/c/CMakeLists.txt index 7737952a86..30a049ad29 100644 --- a/src/binding/c/CMakeLists.txt +++ b/src/binding/c/CMakeLists.txt @@ -1,9 +1,9 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lottieanimation_capi.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt index 4fb944a45b..7261d43762 100644 --- a/src/lottie/CMakeLists.txt +++ b/src/lottie/CMakeLists.txt @@ -1,5 +1,5 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/lottieitem.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieloader.cpp" @@ -8,7 +8,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/lottieanimation.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index cbf9c9869e..30f9d29cae 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -2,7 +2,7 @@ add_subdirectory(freetype) add_subdirectory(pixman) -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/vrect.cpp" "${CMAKE_CURRENT_LIST_DIR}/vdasher.cpp" @@ -26,7 +26,7 @@ target_sources(lottie-player "${CMAKE_CURRENT_LIST_DIR}/vimageloader.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) diff --git a/src/vector/freetype/CMakeLists.txt b/src/vector/freetype/CMakeLists.txt index 0ce7e69da1..add0d42235 100644 --- a/src/vector/freetype/CMakeLists.txt +++ b/src/vector/freetype/CMakeLists.txt @@ -1,11 +1,11 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/v_ft_math.cpp" "${CMAKE_CURRENT_LIST_DIR}/v_ft_raster.cpp" "${CMAKE_CURRENT_LIST_DIR}/v_ft_stroker.cpp" ) -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" - ) \ No newline at end of file + ) diff --git a/src/vector/pixman/CMakeLists.txt b/src/vector/pixman/CMakeLists.txt index d38a0947dd..c08593fd3d 100644 --- a/src/vector/pixman/CMakeLists.txt +++ b/src/vector/pixman/CMakeLists.txt @@ -1,17 +1,17 @@ -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/vregion.cpp" ) IF("${ARCH}" STREQUAL "arm") SET(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp") -target_sources(lottie-player +target_sources(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}/pixman-arm-neon-asm.S" ) ENDIF("${ARCH}" STREQUAL "arm") -target_include_directories(lottie-player +target_include_directories(rlottie PRIVATE "${CMAKE_CURRENT_LIST_DIR}" ) From 90a4ed2dc46892b518f2ea9ba384c2babb076a0b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 23 Jan 2019 20:07:45 +0900 Subject: [PATCH 410/672] remove lottie player naming usage. Change-Id: Id2549402e8aa6d8db328e14908f1d4f62ca05603 --- packaging/rlottie.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/rlottie.spec b/packaging/rlottie.spec index d7a30f602a..122ce8bf4d 100644 --- a/packaging/rlottie.spec +++ b/packaging/rlottie.spec @@ -11,17 +11,17 @@ Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig %description -lottie player library +rlottie library %package devel -Summary: lottie player library (devel) +Summary: rlottie library (devel) Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel -lottie player library (devel) +rlottie library (devel) %prep From a2614da5c660ae2580ecd09198f36079719b2c6d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 24 Jan 2019 11:28:50 +0900 Subject: [PATCH 411/672] lottie: final changes to rename from lottie-player to rlottie Change-Id: Ie2ed4d7c3fb08abd3f8fe484021d478e90bc9d91 --- CMakeLists.txt | 5 ----- example/lottieview.cpp | 6 +++--- example/lottieview.h | 4 ++-- inc/lottieanimation.h | 1 - inc/meson.build | 1 - inc/rlottie.h | 2 +- packaging/rlottie.spec | 5 ++--- rlottie.manifest | 5 ----- src/binding/c/lottieanimation_capi.cpp | 4 ++-- src/lottie/lottieanimation.cpp | 2 +- src/lottie/lottieitem.cpp | 2 +- src/lottie/lottieitem.h | 2 +- test/test_lottieanimation.cpp | 8 ++++---- 13 files changed, 17 insertions(+), 30 deletions(-) delete mode 100644 inc/lottieanimation.h delete mode 100644 rlottie.manifest diff --git a/CMakeLists.txt b/CMakeLists.txt index 4249b0f384..0e164d5ced 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,17 +56,12 @@ SET(INCDIR ${PREFIX}/include) CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) -#temporary for lottie-player dependency. -CONFIGURE_FILE(${PROJECT_NAME}.pc.in lottie-player.pc) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/lottie-player.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) - #install header install(FILES inc/rlottie.h inc/rlottie_capi.h inc/rlottiecommon.h - inc/lottieanimation.h DESTINATION include) #install lib diff --git a/example/lottieview.cpp b/example/lottieview.cpp index a09417ac7d..7671735e62 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -18,7 +18,7 @@ #include"lottieview.h" -using namespace lottie; +using namespace rlottie; static Eina_Bool animator(void *data , double pos) @@ -321,14 +321,14 @@ void LottieView::seek(float pos) mDirty = true; auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); size_t bytesperline = evas_object_image_stride_get(mImage); - lottie::Surface surface(buffer, width, height, bytesperline); + rlottie::Surface surface(buffer, width, height, bytesperline); mRenderTask = mPlayer->render(mCurFrame, surface); // to force a redraw evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); } else { auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); size_t bytesperline = evas_object_image_stride_get(mImage); - lottie::Surface surface(buffer, width, height, bytesperline); + rlottie::Surface surface(buffer, width, height, bytesperline); mPlayer->renderSync(mCurFrame, surface); evas_object_image_data_set(mImage, surface.buffer()); evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); diff --git a/example/lottieview.h b/example/lottieview.h index aab0336fcc..1ff8266c5c 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -108,7 +108,7 @@ public: Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - std::unique_ptr mPlayer; + std::unique_ptr mPlayer; size_t mCurFrame{UINT_MAX}; Ecore_Animator *mAnimator{nullptr}; bool mLoop; @@ -123,7 +123,7 @@ public: float mPos; float mFrameRate; long mTotalFrame; - std::future mRenderTask; + std::future mRenderTask; //keep a segment of the animation default is [0, 1] float mMinProgress{0}; diff --git a/inc/lottieanimation.h b/inc/lottieanimation.h deleted file mode 100644 index 1508b2ffff..0000000000 --- a/inc/lottieanimation.h +++ /dev/null @@ -1 +0,0 @@ -#include "rlottie.h" \ No newline at end of file diff --git a/inc/meson.build b/inc/meson.build index 7853c2e517..0349fac2f2 100644 --- a/inc/meson.build +++ b/inc/meson.build @@ -2,5 +2,4 @@ install_headers([ 'rlottie.h', 'rlottie_capi.h', 'rlottiecommon.h', - 'lottieanimation.h', ]) diff --git a/inc/rlottie.h b/inc/rlottie.h index 47aa4e254e..7821641188 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -49,7 +49,7 @@ class AnimationImpl; struct LOTNode; struct LOTLayerNode; -namespace lottie { +namespace rlottie { class LOT_EXPORT Surface { public: diff --git a/packaging/rlottie.spec b/packaging/rlottie.spec index 122ce8bf4d..1a343dbba1 100644 --- a/packaging/rlottie.spec +++ b/packaging/rlottie.spec @@ -1,4 +1,4 @@ -Name: rlottie +Name: lotti-player Summary: rlottie ibrary Version: 0.0.1 Release: 1 @@ -55,7 +55,7 @@ make %{?jobs:-j%jobs} %files %defattr(-,root,root,-) %{_libdir}/librlottie.so.* -%manifest %{name}.manifest +%manifest packaging/rlottie.manifest %license COPYING licenses/COPYING* %files devel @@ -64,5 +64,4 @@ make %{?jobs:-j%jobs} %{_libdir}/librlottie.so %{_libdir}/cmake/rlottie/*.cmake -%{_libdir}/pkgconfig/lottie-player.pc %{_libdir}/pkgconfig/rlottie.pc diff --git a/rlottie.manifest b/rlottie.manifest deleted file mode 100644 index 017d22d3af..0000000000 --- a/rlottie.manifest +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index 6748f205a6..dd7f5e13fe 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -19,7 +19,7 @@ #include "rlottie.h" #include "vdebug.h" -using namespace lottie; +using namespace rlottie; extern "C" { @@ -117,7 +117,7 @@ lottie_animation_render_async(Lottie_Animation_S *animation, { if (!animation) return; - lottie::Surface surface(buffer, width, height, bytes_per_line); + rlottie::Surface surface(buffer, width, height, bytes_per_line); animation->mRenderTask = animation->mAnimation->render(frame_number, surface); animation->mBufferRef = buffer; } diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 1f041f8f93..1084a23d26 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -23,7 +23,7 @@ #include -using namespace lottie; +using namespace rlottie; struct RenderTask { RenderTask() { receiver = sender.get_future(); } diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index aa88896968..3cd78fd4e5 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -121,7 +121,7 @@ const LOTLayerNode * LOTCompItem::renderTree() const return mRootLayer->layerNode(); } -bool LOTCompItem::render(const lottie::Surface &surface) +bool LOTCompItem::render(const rlottie::Surface &surface) { VBitmap bitmap(reinterpret_cast(surface.buffer()), surface.width(), surface.height(), diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index b38a37958a..9eda6d13c0 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -56,7 +56,7 @@ public: VSize size() const; void buildRenderTree(); const LOTLayerNode * renderTree()const; - bool render(const lottie::Surface &surface); + bool render(const rlottie::Surface &surface); private: VMatrix mScaleMatrix; VSize mViewSize; diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index 7b08b4f54a..d704fb4bfd 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -5,10 +5,10 @@ class AnimationTest : public ::testing::Test { public: void SetUp() { - animationInvalid = lottie::Animation::loadFromFile("wrong_file.json"); + animationInvalid = rlottie::Animation::loadFromFile("wrong_file.json"); std::string filePath = DEMO_DIR; filePath +="mask.json"; - animation = lottie::Animation::loadFromFile(filePath); + animation = rlottie::Animation::loadFromFile(filePath); } void TearDown() @@ -16,8 +16,8 @@ public: } public: - std::unique_ptr animationInvalid; - std::unique_ptr animation; + std::unique_ptr animationInvalid; + std::unique_ptr animation; }; TEST_F(AnimationTest, loadFromFile_N) { From ecb0b9748c83337c138190cf5a73b5f130dac81b Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 24 Jan 2019 17:05:38 +0900 Subject: [PATCH 412/672] Spec: fix pc file Change-Id: I98532f5ddd26d9792a4ba3401b577284f5c61a82 --- rlottie.pc.in | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/rlottie.pc.in b/rlottie.pc.in index 0e5a6b334d..fad2947f7f 100644 --- a/rlottie.pc.in +++ b/rlottie.pc.in @@ -1,12 +1,6 @@ -prefix=@PREFIX@ -exec_prefix=@EXEC_DIR@ -apiversion=@player_version@ -libdir=@LIBDIR@ -includedir=@INCDIR@ - Name: rlottie Description: A rlottie library Version: @player_version@ Requires: -Libs: -L${libdir} -lrlottie -Cflags: -I${includedir} -std=c++14 +Libs: -L@LIBDIR@ -lrlottie +Cflags: -I@INCDIR@ -std=c++14 From 3db9cd3b15bd8ada2a1c49bc9cb8ac05929871f4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 23 Jan 2019 17:20:17 +0900 Subject: [PATCH 413/672] lottie: Added support for rendering embedded image resource Change-Id: I330ee46e7bccabbebe2b15b54d21582212c1f020 --- example/resource/image_embedded.json | 1 + src/lottie/lottieitem.cpp | 8 +--- src/lottie/lottiemodel.cpp | 13 ++++++ src/lottie/lottiemodel.h | 5 ++- src/lottie/lottieparser.cpp | 62 +++++++++++++++++++++++++++- src/vector/stb/stb_image.cpp | 7 ++++ src/vector/vimageloader.cpp | 54 ++++++++++++++++++------ src/vector/vimageloader.h | 1 + 8 files changed, 129 insertions(+), 22 deletions(-) create mode 100755 example/resource/image_embedded.json diff --git a/example/resource/image_embedded.json b/example/resource/image_embedded.json new file mode 100755 index 0000000000..c3d48387f1 --- /dev/null +++ b/example/resource/image_embedded.json @@ -0,0 +1 @@ +{"v":"5.4.3","fr":60,"ip":0,"op":60,"w":800,"h":800,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":200,"h":300,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[81]},{"t":59}],"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[100,150,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":60,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 3cd78fd4e5..6e78206717 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -23,7 +23,6 @@ #include "vdasher.h" #include "vpainter.h" #include "vraster.h" -#include "vimageloader.h" /* Lottie Layer Rules * 1. time stretch is pre calculated and applied to all the properties of the @@ -703,11 +702,8 @@ void LOTImageLayerItem::updateContent() // load image //@TODO find a better way to load // so that can be shared by multiple layers - if (!mLayerData->mAsset->mImagePath.empty()) { - VBitmap img = VImageLoader::instance().load(mLayerData->mAsset->mImagePath.c_str()); - VBrush brush(img); - mRenderNode->setBrush(brush); - } + VBrush brush(mLayerData->mAsset->bitmap()); + mRenderNode->setBrush(brush); } if (flag() & DirtyFlagBit::Matrix) { diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 4139dfe9c9..1891633225 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -18,6 +18,7 @@ #include "lottiemodel.h" #include "vline.h" +#include "vimageloader.h" #include #include @@ -317,3 +318,15 @@ void LOTGradient::update(std::unique_ptr &grad, int frameNo) grad->radial.fradius = 0; } } + +VBitmap +LOTAsset::bitmap() const +{ + if (!mImageData.empty()) { + return VImageLoader::instance().load(mImageData.c_str(), mImageData.length()); + } else if (!mImagePath.empty()) { + return VImageLoader::instance().load(mImagePath.c_str()); + } else { + return VBitmap(); + } +} diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 1f2277b57e..5a12f80d96 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -339,12 +339,12 @@ public: class LOTLayerData; struct LOTAsset { - enum class Type { + enum class Type : unsigned char{ Precomp, Image, Char }; - + VBitmap bitmap() const; Type mAssetType{Type::Precomp}; std::string mRefId; // ref id std::vector> mLayers; @@ -352,6 +352,7 @@ struct LOTAsset int mWidth{0}; int mHeight{0}; std::string mImagePath; + std::string mImageData; }; class LOTLayerData : public LOTGroupData diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 643c3cba45..d821c32e3a 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -626,6 +626,56 @@ void LottieParserImpl::parseAssets(LOTCompositionData *composition) // update the precomp layers with the actual layer object } +static constexpr const unsigned char B64index[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 62, 62, 63, 52, 53, 54, 55, +56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, +7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, +0, 0, 0, 63, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, +41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 }; + +std::string b64decode(const void* data, const size_t len) +{ + unsigned char* p = (unsigned char*)data; + int pad = len > 0 && (len % 4 || p[len - 1] == '='); + const size_t L = ((len + 3) / 4 - pad) * 4; + std::string str(L / 4 * 3 + pad, '\0'); + + for (size_t i = 0, j = 0; i < L; i += 4) + { + int n = B64index[p[i]] << 18 | B64index[p[i + 1]] << 12 | B64index[p[i + 2]] << 6 | B64index[p[i + 3]]; + str[j++] = n >> 16; + str[j++] = n >> 8 & 0xFF; + str[j++] = n & 0xFF; + } + if (pad) + { + int n = B64index[p[L]] << 18 | B64index[p[L + 1]] << 12; + str[str.size() - 1] = n >> 16; + + if (len > L + 2 && p[L + 2] != '=') + { + n |= B64index[p[L + 2]] << 6; + str.push_back(n >> 8 & 0xFF); + } + } + return str; +} + +static std::string +convertFromBase64(const std::string &str) +{ + // usual header look like "data:image/png;base64," + // so need to skip till ','. + int startIndex = str.find(",", 0); + startIndex += 1; // skip "," + int length = str.length() - startIndex; + + const char *b64Data = str.c_str() + startIndex; + + return b64decode(b64Data, length); +} + /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/layers/shape.json * @@ -637,6 +687,7 @@ std::shared_ptr LottieParserImpl::parseAsset() LOTAsset * asset = sharedAsset.get(); std::string filename; std::string relativePath; + bool embededResource = false; EnterObject(); while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "w")) { @@ -652,6 +703,8 @@ std::shared_ptr LottieParserImpl::parseAsset() } else if (0 == strcmp(key, "u")) { /* relative image path */ RAPIDJSON_ASSERT(PeekType() == kStringType); relativePath = std::string(GetString()); + } else if (0 == strcmp(key, "e")) { /* relative image path */ + embededResource = GetInt(); } else if (0 == strcmp(key, "id")) { /* reference id*/ if (PeekType() == kStringType) { asset->mRefId = std::string(GetString()); @@ -674,8 +727,13 @@ std::shared_ptr LottieParserImpl::parseAsset() Skip(key); } } - // its an image asset - if (!filename.empty()) { + + if (embededResource) { + // embeder resource should start with "data:" + if (filename.find("data:", 0) == 0) { + asset->mImageData = convertFromBase64(filename); + } + } else { asset->mImagePath = mDirPath + relativePath + filename; } return sharedAsset; diff --git a/src/vector/stb/stb_image.cpp b/src/vector/stb/stb_image.cpp index d5bf5c4e2d..320a726425 100644 --- a/src/vector/stb/stb_image.cpp +++ b/src/vector/stb/stb_image.cpp @@ -49,6 +49,13 @@ lottie_image_load(char const *filename, int *x, int *y, int *comp, int req_comp) return stbi_load(filename, x, y, comp, req_comp); } +LOT_EXPORT unsigned char * +lottie_image_load_from_data(const char *imageData, int len, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data = (unsigned char *)imageData; + return stbi_load_from_memory(data, len, x, y, comp, req_comp); +} + LOT_EXPORT void lottie_image_free(unsigned char *data) { diff --git a/src/vector/vimageloader.cpp b/src/vector/vimageloader.cpp index c7e73b7f9f..3b683f7cb1 100644 --- a/src/vector/vimageloader.cpp +++ b/src/vector/vimageloader.cpp @@ -3,7 +3,8 @@ #include #include -using lottie_image_load_f = unsigned char* (*)(char const *filename, int *x, int *y, int *comp, int req_comp); +using lottie_image_load_f = unsigned char* (*)(const char *filename, int *x, int *y, int *comp, int req_comp); +using lottie_image_load_data_f = unsigned char* (*)(const char *data, int len, int *x, int *y, int *comp, int req_comp); using lottie_image_free_f = void (*)(unsigned char *); struct VImageLoader::Impl @@ -11,6 +12,7 @@ struct VImageLoader::Impl void *dl_handle{nullptr}; lottie_image_load_f lottie_image_load{nullptr}; lottie_image_free_f lottie_image_free{nullptr}; + lottie_image_load_data_f lottie_image_load_data{nullptr}; Impl() { @@ -27,24 +29,19 @@ struct VImageLoader::Impl lottie_image_free = (lottie_image_free_f) dlsym(dl_handle, "lottie_image_free"); if (!lottie_image_free) vWarning<<"Failed to find symbol lottie_image_free in librlottie-image-loader library"; + lottie_image_load_data = (lottie_image_load_data_f) dlsym(dl_handle, "lottie_image_load_from_data"); + if (!lottie_image_load_data) + vWarning<<"Failed to find symbol lottie_image_load_data in librlottie-image-loader library"; } ~Impl() { if (dl_handle) dlclose(dl_handle); } - VBitmap load(const char *fileName) + + VBitmap createBitmap(unsigned char *data, int width, int height, int channel) { - if (!lottie_image_load) return VBitmap(); - - int width, height, n; - unsigned char *data = lottie_image_load(fileName, &width, &height, &n, 4); - - if (!data) { - return VBitmap(); - } - // premultiply alpha - if (n == 4) + if (channel == 4) convertToBGRAPremul(data, width, height); else convertToBGRA(data, width, height); @@ -60,6 +57,34 @@ struct VImageLoader::Impl return result; } + + VBitmap load(const char *fileName) + { + if (!lottie_image_load) return VBitmap(); + + int width, height, n; + unsigned char *data = lottie_image_load(fileName, &width, &height, &n, 4); + + if (!data) { + return VBitmap(); + } + + return createBitmap(data, width, height, n); + } + + VBitmap load(const char *imageData, int len) + { + if (!lottie_image_load_data) return VBitmap(); + + int width, height, n; + unsigned char *data = lottie_image_load_data(imageData, len, &width, &height, &n, 4); + + if (!data) { + return VBitmap(); + } + + return createBitmap(data, width, height, n); + } /* * convert from RGBA to BGRA and premultiply */ @@ -114,3 +139,8 @@ VBitmap VImageLoader::load(const char *fileName) return mImpl->load(fileName); } +VBitmap VImageLoader::load(const char *data, int len) +{ + return mImpl->load(data, len); +} + diff --git a/src/vector/vimageloader.h b/src/vector/vimageloader.h index 64bd8654ad..2ca4cec39a 100644 --- a/src/vector/vimageloader.h +++ b/src/vector/vimageloader.h @@ -15,6 +15,7 @@ public: } VBitmap load(const char *fileName); + VBitmap load(const char *data, int len); ~VImageLoader(); private: VImageLoader(); From 5a61739fe5bdae1c6d7611ea59e0e8d05d251a2b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 24 Jan 2019 18:02:00 +0900 Subject: [PATCH 414/672] lottie: Add image_loader plugin for cmake build. Change-Id: I21217f6c1b8f45d4183bf58f9c86c0de62bd7a44 --- packaging/rlottie.spec | 2 ++ src/vector/CMakeLists.txt | 3 ++- src/vector/stb/CMakeLists.txt | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packaging/rlottie.spec b/packaging/rlottie.spec index 1a343dbba1..072dcf58e0 100644 --- a/packaging/rlottie.spec +++ b/packaging/rlottie.spec @@ -55,6 +55,7 @@ make %{?jobs:-j%jobs} %files %defattr(-,root,root,-) %{_libdir}/librlottie.so.* +%{_libdir}/librlottie-image-loader.so* %manifest packaging/rlottie.manifest %license COPYING licenses/COPYING* @@ -62,6 +63,7 @@ make %{?jobs:-j%jobs} %defattr(-,root,root,-) %{_includedir}/*.h %{_libdir}/librlottie.so +%{_libdir}/librlottie-image-loader.so %{_libdir}/cmake/rlottie/*.cmake %{_libdir}/pkgconfig/rlottie.pc diff --git a/src/vector/CMakeLists.txt b/src/vector/CMakeLists.txt index 30f9d29cae..ae4a860d44 100644 --- a/src/vector/CMakeLists.txt +++ b/src/vector/CMakeLists.txt @@ -1,6 +1,7 @@ - add_subdirectory(freetype) add_subdirectory(pixman) +add_subdirectory(stb) + target_sources(rlottie PRIVATE diff --git a/src/vector/stb/CMakeLists.txt b/src/vector/stb/CMakeLists.txt index e69de29bb2..e67ab25a36 100644 --- a/src/vector/stb/CMakeLists.txt +++ b/src/vector/stb/CMakeLists.txt @@ -0,0 +1,6 @@ +add_library(rlottie-image-loader SHARED + stb_image.cpp + ) +install(TARGETS rlottie-image-loader + LIBRARY DESTINATION ${LIB_INSTALL_DIR} + ) From 6cb446bc240d306af49c3a25505da0b359db4fcd Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 25 Jan 2019 14:31:30 +0900 Subject: [PATCH 415/672] lottie/parser: only keep the 1st interpolatr string from the array and discard rest. Fixed issue with resource peli-canon.json Change-Id: If0ab2a6b6227b25ae193749a9618b81a08361bbd --- src/lottie/lottieparser.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index d821c32e3a..fd3bb2ffe4 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1888,7 +1888,12 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) EnterArray(); while (NextArrayValue()) { RAPIDJSON_ASSERT(PeekType() == kStringType); - interpolatorKey = GetString(); + if (!interpolatorKey) { + interpolatorKey = GetString(); + } else { + //skip rest of the string + GetString(); + } } } continue; From 1b8ce64af0ec311b013ae94f6ba342c77935b4de Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 8 Feb 2019 11:08:08 +0900 Subject: [PATCH 416/672] fix typo. Package name must be lottie-player, Also, we could have an internal name rlottie. Change-Id: Id8670e85d1905062133b12c871bee37d10e496ec --- packaging/rlottie.spec | 4 ++-- src/lottie/lottieanimation.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/rlottie.spec b/packaging/rlottie.spec index 072dcf58e0..b9e3cc0dc0 100644 --- a/packaging/rlottie.spec +++ b/packaging/rlottie.spec @@ -1,5 +1,5 @@ -Name: lotti-player -Summary: rlottie ibrary +Name: lottie-player +Summary: rlottie Library Version: 0.0.1 Release: 1 Group: UI Framework/Services diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 1084a23d26..2fcfceb547 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -296,7 +296,7 @@ void initLogging() #if defined(__ARM_NEON__) set_log_level(LogLevel::OFF); #else - initialize(GuaranteedLogger(), "/tmp/", "lotti-player", 1); + initialize(GuaranteedLogger(), "/tmp/", "rlottie", 1); set_log_level(LogLevel::INFO); #endif } From 576198f5db84e9ffebcd3fcef1cbba827af01039 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 8 Feb 2019 14:51:11 +0900 Subject: [PATCH 417/672] lottieitem: Add alpha property in LOTMask Change-Id: I929839c5a0a1677a530b5197e45ec230ea145dd1 --- inc/rlottiecommon.h | 2 ++ src/lottie/lottieitem.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/inc/rlottiecommon.h b/inc/rlottiecommon.h index edc6299be8..cc198a4baf 100644 --- a/inc/rlottiecommon.h +++ b/inc/rlottiecommon.h @@ -130,6 +130,8 @@ typedef struct LOTMask { int elmCount; } mPath; LOTMaskMode mMode; + + int mAlpha; }LOTMask; typedef enum diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 6e78206717..21a2e135be 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -230,6 +230,7 @@ void LOTLayerItem::buildLayerNode() cNode.mPath.ptCount = pts.size(); cNode.mPath.elmPtr = elmPtr; cNode.mPath.elmCount = elm.size(); + cNode.mAlpha = mask.mCombinedAlpha * 255; switch (mask.maskMode()) { case LOTMaskData::Mode::Add: cNode.mMode = MaskModeAdd; From 583354b1b18b365508887a575ecaeac1e94d8995 Mon Sep 17 00:00:00 2001 From: somang-park Date: Mon, 11 Feb 2019 18:12:16 +0900 Subject: [PATCH 418/672] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..56f2d7c346 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# rlottie +A platform independent standalone library that plays Lottie Animation. From 985e64ad080b34d2413401ce81f037296f1680ab Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 11 Feb 2019 21:17:27 +0900 Subject: [PATCH 419/672] updated READE file. --- README.md | 36 +++++++++++++++++++++++++++++++++++- README.txt | 34 ---------------------------------- 2 files changed, 35 insertions(+), 35 deletions(-) delete mode 100644 README.txt diff --git a/README.md b/README.md index 56f2d7c346..832e8fe88e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ # rlottie -A platform independent standalone library that plays Lottie Animation. +A platform independent standalone library that plays Lottie Animation. + +## BUILD INSTRUCTIONS + +1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) +2. install ninja build tool (https://ninja-build.org/) +3. invoke meson build/ or meson -Dexample=true build/ +4. invoke ninja inside the build folder. + +NOTE: run meson configure to see all the build options + +## BUILD EXAMPLES + +1. meson configure -Dexample=true +2. ninja +3. to run examples invoke ./build/example/demo, etc. + +## RUN TESTS + +1. meson configure -Dtest=true +2. ninja +3. invoke testsuites as ./build/test/animationTestSuite and ./build/test/vectorTestSuite + +## BUILD WITH CMAKE + +librlottie can also be built using the cmake build system. + +1. install cmake. (Follow instructions at https://cmake.org/download/) +2. create a new build/ directory +3. invoke cmake from inside build/ as cmake -DLIB_INSTALL_DIR=lib .. +4. invoke make +5. invoke sudo make install to install, if desired. + +To install to a different prefix, specify it when running cmake, e.g.: + cmake -DCMAKE_INSTALL_PREFIX:PATH=~/Build -DLIB_INSTALL_DIR=~/Build/lib .. diff --git a/README.txt b/README.txt deleted file mode 100644 index dce83ba78d..0000000000 --- a/README.txt +++ /dev/null @@ -1,34 +0,0 @@ -BUILD INSTRUCTIONS -================== -1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) -2. install ninja build tool (https://ninja-build.org/) -3. invoke meson build/ or meson -Dexample=true build/ -4. invoke ninja inside the build folder. - -NOTE: run meson configure to see all the build options - -BUILD EXAMPLES -============== -1. meson configure -Dexample=true -2. ninja -3. to run examples invoke ./build/example/demo, etc. - -RUN TESTS -========= -1. meson configure -Dtest=true -2. ninja -3. invoke testsuites as ./build/test/animationTestSuite and ./build/test/vectorTestSuite - -BUILD WITH CMAKE -================ -librlottie can also be built using the cmake build system. - -1. install cmake. (Follow instructions at https://cmake.org/download/) -2. create a new build/ directory -3. invoke cmake from inside build/ as cmake -DLIB_INSTALL_DIR=lib .. -4. invoke make -5. invoke sudo make install to install, if desired. - -To install to a different prefix, specify it when running cmake, e.g.: - cmake -DCMAKE_INSTALL_PREFIX:PATH=~/Build -DLIB_INSTALL_DIR=~/Build/lib .. - From fd110c3419d1c06baa32c721d4e3a749a2c2aee8 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 21 Feb 2019 10:58:44 +0900 Subject: [PATCH 420/672] vector stb: check oom for safety. --- src/vector/stb/stb_image.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vector/stb/stb_image.h b/src/vector/stb/stb_image.h index d284fd090d..b52db63f28 100644 --- a/src/vector/stb/stb_image.h +++ b/src/vector/stb/stb_image.h @@ -3771,6 +3771,10 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) { int result; stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) { + stbi__errpuc("outofmem", "Out of memory"); + return 0; + } j->s = s; result = stbi__jpeg_info_raw(j, x, y, comp); STBI_FREE(j); From febe35c421d7fc75c8da5a746716a18f0b06ccfe Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 27 Feb 2019 15:56:37 +0900 Subject: [PATCH 421/672] example : Change keyframe_set/get to progress_set/get APIs efl_animation_view_keyframe_set/get are deprecated. --- example/efl_animview.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/efl_animview.cpp b/example/efl_animview.cpp index a1f0acaf46..b548025ca7 100644 --- a/example/efl_animview.cpp +++ b/example/efl_animview.cpp @@ -103,7 +103,7 @@ static void _play_updated(void *data, Eo *obj, void *ev) { Eo *slider = (Eo *) data; - elm_slider_value_set(slider, elm_animation_view_keyframe_get(obj)); + elm_slider_value_set(slider, elm_animation_view_progress_get(obj)); } static void @@ -123,7 +123,7 @@ static void _slider_drag_cb(void *data, Eo *obj, void *ev) { Eo *anim_view = (Eo *) data; - elm_animation_view_keyframe_set(anim_view, elm_slider_value_get(obj)); + elm_animation_view_progress_set(anim_view, elm_slider_value_get(obj)); } static void From 8047001e1fc052c526d947811a8f180bc3821a8f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 4 Mar 2019 17:05:01 +0900 Subject: [PATCH 422/672] rlottie: remove dependancy of -stdc++14 flag to link against rlottie library. --- CMakeLists.txt | 3 +-- rlottie.pc.in | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e164d5ced..7e9abe71a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,9 +22,8 @@ add_library(rlottie::rlottie ALIAS rlottie) #declare target compilation options target_compile_options(rlottie PUBLIC - -std=c++14 PRIVATE - -Wall -fvisibility=hidden -O2) + -Wall -fvisibility=hidden -O2 -std=c++14) #declare dependancy set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) diff --git a/rlottie.pc.in b/rlottie.pc.in index fad2947f7f..3cee683ac7 100644 --- a/rlottie.pc.in +++ b/rlottie.pc.in @@ -3,4 +3,4 @@ Description: A rlottie library Version: @player_version@ Requires: Libs: -L@LIBDIR@ -lrlottie -Cflags: -I@INCDIR@ -std=c++14 +Cflags: -I@INCDIR@ From b7d488671a4600cfbaae58a4ffe62831bb2445f0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 4 Mar 2019 13:19:47 +0900 Subject: [PATCH 423/672] rlottie: now loadFromData() api takes resourcePath for loading external resource --- example/lottieview.cpp | 4 ++-- example/lottieview.h | 2 +- inc/rlottie.h | 2 +- inc/rlottie_capi.h | 3 ++- src/binding/c/lottieanimation_capi.cpp | 4 ++-- src/lottie/lottieanimation.cpp | 5 +++-- src/lottie/lottieloader.cpp | 4 ++-- src/lottie/lottieloader.h | 2 +- src/lottie/lottieparser.h | 2 +- 9 files changed, 15 insertions(+), 13 deletions(-) diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 7671735e62..383aa6dd98 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -369,9 +369,9 @@ void LottieView::setFilePath(const char *filePath) } } -void LottieView::loadFromData(const std::string &jsonData, const std::string &key) +void LottieView::loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) { - if (mPlayer = Animation::loadFromData(jsonData, key)) { + if (mPlayer = Animation::loadFromData(jsonData, key, resourcePath)) { mFrameRate = mPlayer->frameRate(); mTotalFrame = mPlayer->totalFrame(); } else { diff --git a/example/lottieview.h b/example/lottieview.h index 1ff8266c5c..f979c56a9c 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -49,7 +49,7 @@ public: void setSize(int w, int h); void setPos(int x, int y); void setFilePath(const char *filePath); - void loadFromData(const std::string &jsonData, const std::string &key); + void loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath=""); void show(); void hide(); void loop(bool loop); diff --git a/inc/rlottie.h b/inc/rlottie.h index 7821641188..135ab53d90 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -143,7 +143,7 @@ public: * @internal */ static std::unique_ptr - loadFromData(std::string jsonData, const std::string &key); + loadFromData(std::string jsonData, const std::string &key, const std::string &resourcePath=""); /** * @brief Returns default framerate of the Lottie resource. diff --git a/inc/rlottie_capi.h b/inc/rlottie_capi.h index 8cc84c57d9..2c8a199fc7 100644 --- a/inc/rlottie_capi.h +++ b/inc/rlottie_capi.h @@ -49,6 +49,7 @@ LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *path); * * @param[in] data The JSON string data. * @param[in] key the string that will be used to cache the JSON string data. + * @param[in] resource_path the path that will be used to load external resource needed by the JSON data. * * @return Animation object that can build the contents of the * Lottie resource represented by JSON string data. @@ -56,7 +57,7 @@ LOT_EXPORT Lottie_Animation *lottie_animation_from_file(const char *path); * @ingroup Lottie_Animation * @internal */ -LOT_EXPORT Lottie_Animation *lottie_animation_from_data(const char *data, const char *key); +LOT_EXPORT Lottie_Animation *lottie_animation_from_data(const char *data, const char *key, const char *resource_path); /** * @brief Free given Animation object resource. diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index dd7f5e13fe..cd85bd3789 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -41,9 +41,9 @@ LOT_EXPORT Lottie_Animation_S *lottie_animation_from_file(const char *path) } } -LOT_EXPORT Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key) +LOT_EXPORT Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key, const char *resourcePath) { - if (auto animation = Animation::loadFromData(data, key) ) { + if (auto animation = Animation::loadFromData(data, key, resourcePath) ) { Lottie_Animation_S *handle = new Lottie_Animation_S(); handle->mAnimation = std::move(animation); return handle; diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 2fcfceb547..bc86d4be57 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -198,7 +198,7 @@ std::future AnimationImpl::renderAsync(size_t frameNo, Surface &&surfac * @param path add the details */ std::unique_ptr -Animation::loadFromData(std::string jsonData, const std::string &key) +Animation::loadFromData(std::string jsonData, const std::string &key, const std::string &resourcePath) { if (jsonData.empty()) { vWarning << "jason data is empty"; @@ -206,7 +206,8 @@ Animation::loadFromData(std::string jsonData, const std::string &key) } LottieLoader loader; - if (loader.loadFromData(std::move(jsonData), key)) { + if (loader.loadFromData(std::move(jsonData), key, + (resourcePath.empty() ? " " : resourcePath))) { auto animation = std::unique_ptr(new Animation); animation->d->init(loader.model()); return animation; diff --git a/src/lottie/lottieloader.cpp b/src/lottie/lottieloader.cpp index 6b540f8102..7aab52585f 100644 --- a/src/lottie/lottieloader.cpp +++ b/src/lottie/lottieloader.cpp @@ -90,14 +90,14 @@ bool LottieLoader::load(const std::string &path) return true; } -bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key) +bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key, const std::string &resourcePath) { LottieFileCache &fileCache = LottieFileCache::get(); mModel = fileCache.find(key); if (mModel) return true; - LottieParser parser(const_cast(jsonData.c_str())); + LottieParser parser(const_cast(jsonData.c_str()), resourcePath.c_str()); mModel = parser.model(); fileCache.add(key, mModel); diff --git a/src/lottie/lottieloader.h b/src/lottie/lottieloader.h index 1f6f3d5258..d7228bbce1 100644 --- a/src/lottie/lottieloader.h +++ b/src/lottie/lottieloader.h @@ -27,7 +27,7 @@ class LottieLoader { public: bool load(const std::string &filePath); - bool loadFromData(std::string &&jsonData, const std::string &key); + bool loadFromData(std::string &&jsonData, const std::string &key, const std::string &resourcePath); std::shared_ptr model(); private: std::shared_ptr mModel; diff --git a/src/lottie/lottieparser.h b/src/lottie/lottieparser.h index d892c24507..21e5ae8a43 100644 --- a/src/lottie/lottieparser.h +++ b/src/lottie/lottieparser.h @@ -25,7 +25,7 @@ class LottieParserImpl; class LottieParser { public: ~LottieParser(); - LottieParser(char* str, const char *dir_path=""); + LottieParser(char* str, const char *dir_path); std::shared_ptr model(); private: LottieParserImpl *d; From 7f5d496a965234cbe143b235dc7720a0a929c3b3 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 6 Mar 2019 15:46:09 +0900 Subject: [PATCH 424/672] [rlottie] Added setDrawRegion api to Surface for supporting subsurface rendering. --- inc/rlottie.h | 70 ++++++++++++++++++++++++++++++++++ src/lottie/lottieanimation.cpp | 17 ++++++++- 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/inc/rlottie.h b/inc/rlottie.h index 135ab53d90..af26d8750b 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -67,6 +67,24 @@ public: */ Surface(uint32_t *buffer, size_t width, size_t height, size_t bytesPerLine); + /** + * @brief Sets the Draw Area available on the Surface. + * + * Lottie will use the draw region size to generate frame image + * and will update only the draw rgion of the surface. + * + * @param[in] x region area x position. + * @param[in] y region area y position. + * @param[in] width region area width. + * @param[in] height region area height. + * + * @note Default surface format is ARGB32_Premultiplied. + * @note Default draw region area is [ 0 , 0, surface width , surface height] + * + * @internal + */ + void setDrawRegion(size_t x, size_t y, size_t width, size_t height); + /** * @brief Returns width of the surface. * @@ -104,6 +122,51 @@ public: */ uint32_t *buffer() const {return mBuffer;} + /** + * @brief Returns drawable area width of the surface. + * + * @return drawable area width + * + * @note Default value is width() of the surface + * + * @internal + * + */ + size_t drawRegionWidth() const {return mDrawArea.w;} + + /** + * @brief Returns drawable area height of the surface. + * + * @return drawable area height + * + * @note Default value is height() of the surface + * + * @internal + */ + size_t drawRegionHeight() const {return mDrawArea.h;} + + /** + * @brief Returns drawable area's x position of the surface. + * + * @return drawable area's x potition. + * + * @note Default value is 0 + * + * @internal + */ + size_t drawRegionPosX() const {return mDrawArea.x;} + + /** + * @brief Returns drawable area's y position of the surface. + * + * @return drawable area's y potition. + * + * @note Default value is 0 + * + * @internal + */ + size_t drawRegionPosY() const {return mDrawArea.x;} + /** * @brief Default constructor. */ @@ -113,6 +176,12 @@ private: size_t mWidth{0}; size_t mHeight{0}; size_t mBytesPerLine{0}; + struct { + size_t x{0}; + size_t y{0}; + size_t w{0}; + size_t h{0}; + }mDrawArea; }; class LOT_EXPORT Animation { @@ -136,6 +205,7 @@ public: * * @param[in] jsonData The JSON string data. * @param[in] key the string that will be used to cache the JSON string data. + * @param[in] resourcePath the path will be used to search for external resource. * * @return Animation object that can render the contents of the * Lottie resource represented by JSON string data. diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index bc86d4be57..6c8bef6bf1 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -89,7 +89,7 @@ Surface AnimationImpl::render(size_t frameNo, const Surface &surface) } mRenderInProgress.store(true); - update(frameNo, VSize(surface.width(), surface.height())); + update(frameNo, VSize(surface.drawRegionWidth(), surface.drawRegionHeight())); mCompItem->render(surface); mRenderInProgress.store(false); @@ -289,9 +289,22 @@ Surface::Surface(uint32_t *buffer, :mBuffer(buffer), mWidth(width), mHeight(height), - mBytesPerLine(bytesPerLine) {} + mBytesPerLine(bytesPerLine) +{ + mDrawArea.w = mWidth; + mDrawArea.h = mHeight; +} +void Surface::setDrawRegion(size_t x, size_t y, size_t width, size_t height) +{ + if ((x + width > mWidth) || + (y + height > mHeight)) return; + mDrawArea.x = x; + mDrawArea.y = y; + mDrawArea.w = width; + mDrawArea.h = height; +} void initLogging() { #if defined(__ARM_NEON__) From 75affa0da7f0451f66b4d45d1417bf88bc9c4bb8 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 12 Mar 2019 13:50:23 +0900 Subject: [PATCH 425/672] capi: update doc. add missing parameter description. --- inc/rlottie_capi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/rlottie_capi.h b/inc/rlottie_capi.h index 2c8a199fc7..d038782872 100644 --- a/inc/rlottie_capi.h +++ b/inc/rlottie_capi.h @@ -137,6 +137,7 @@ LOT_EXPORT double lottie_animation_get_framerate(const Lottie_Animation *animati * at frame = @c frame_num, the content of the animation in that frame number. * * @param[in] animation Animation object. + * @param[in] frame_num Content corresponds to the @p frame_num needs to be drawn * @param[in] width requested snapshot viewport width. * @param[in] height requested snapshot viewport height. * From 445cc344cbb5051202de190a2972f21c45a557f1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 13 Mar 2019 15:57:03 +0900 Subject: [PATCH 426/672] [rlottie]: clear any existing brush data before drawing bitmap. --- src/vector/vpainter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 39b19f64b4..f4fea33f53 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -168,6 +168,9 @@ void VPainter::drawBitmap(const VRect &target, const VBitmap &bitmap, const VRe { if (!bitmap.valid()) return; + // clear any existing brush data. + setBrush(VBrush()); + if (target.size() == source.size()) { mImpl->drawBitmapUntransform(target, bitmap, source); } else { From 416e26cc07efa3ec365a5c8276e6bee913cfb647 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 13 Mar 2019 19:13:15 +0900 Subject: [PATCH 427/672] rlottie/example: sort the resource list before displaying. --- example/evasapp.cpp | 4 ++++ example/lottieviewer.cpp | 25 +++++++------------------ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/example/evasapp.cpp b/example/evasapp.cpp index c9170b8deb..943fbbae4e 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -18,6 +18,7 @@ #include "evasapp.h" #include +#include static void _on_resize(Ecore_Evas *ee) @@ -132,6 +133,9 @@ EvasApp::jsonFiles(const std::string &dirName, bool recurse) } closedir(d); } + + std::sort(result.begin(), result.end(), [](auto & a, auto &b){return a < b;}); + return result; } diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 92f90bb418..2d6bd4086a 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -18,6 +18,7 @@ #include #include "lottieview.h" +#include "evasapp.h" #include #include #include @@ -147,10 +148,7 @@ create_layout(Evas_Object *parent, const char *file) //LOTTIEVIEW LottieView *view = new LottieView(evas_object_evas_get(layout), renderMode); - std::string filePath = DEMO_DIR; - filePath +=file; - - view->setFilePath(filePath.c_str()); + view->setFilePath(file); view->setSize(500, 500); //IMAGE from LOTTIEVIEW @@ -205,7 +203,9 @@ static char * _gl_text_get(void *data, Evas_Object *obj, const char *part) { ItemData *id = (ItemData *) data; - return strdup(jsonFiles[id->index].c_str()); + const char *ptr = strrchr(jsonFiles[id->index].c_str(), '/'); + int len = int(ptr + 1 - jsonFiles[id->index].c_str()); // +1 to include '/' + return strdup(jsonFiles[id->index].substr(len).c_str()); } static void @@ -219,8 +219,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) Evas_Object *win, *nf, *genlist; Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); ItemData *itemData; - DIR *dir; - struct dirent *ent; + if (argc > 1) { if (!strcmp(argv[1], "--disable-render")) @@ -249,17 +248,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) itc->func.text_get = _gl_text_get; itc->func.del = _gl_del; - std::string rscPath = DEMO_DIR; - - dir = opendir(rscPath.c_str()); - while ((ent = readdir(dir)) != NULL) { - if (!strncmp(ent->d_name + (strlen(ent->d_name) - 4), "json", 4)) { - jsonFiles.push_back(ent->d_name); - } - } - closedir(dir); - - std::sort(jsonFiles.begin(), jsonFiles.end(), [](auto & a, auto &b){return a < b;}); + jsonFiles = EvasApp::jsonFiles(DEMO_DIR); for (uint i = 0; i < jsonFiles.size(); i++) { itemData = (ItemData *)calloc(sizeof(ItemData), 1); From 56dc3247d274a3899928a8d6645d4d434a343070 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 14 Mar 2019 17:34:03 +0900 Subject: [PATCH 428/672] rlottie: Use opacity value when rendering gradient. --- src/lottie/lottieitem.cpp | 6 ++++-- src/lottie/lottieitem.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 21a2e135be..49e029bb60 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1172,6 +1172,7 @@ LOTGFillItem::LOTGFillItem(LOTGFillData *data) void LOTGFillItem::updateContent(int frameNo) { + mAlpha = mData->opacity(frameNo); mData->update(mGradient, frameNo); mGradient->mMatrix = static_cast(parent())->matrix(); mFillRule = mData->fillRule(); @@ -1179,7 +1180,7 @@ void LOTGFillItem::updateContent(int frameNo) void LOTGFillItem::updateRenderNode() { - mGradient->setAlpha(parentAlpha()); + mGradient->setAlpha(mAlpha * parentAlpha()); mDrawable->setBrush(VBrush(mGradient.get())); mDrawable->setFillRule(mFillRule); } @@ -1245,6 +1246,7 @@ LOTGStrokeItem::LOTGStrokeItem(LOTGStrokeData *data) void LOTGStrokeItem::updateContent(int frameNo) { + mAlpha = mData->opacity(frameNo); mData->update(mGradient, frameNo); mGradient->mMatrix = static_cast(parent())->matrix(); mCap = mData->capStyle(); @@ -1259,7 +1261,7 @@ void LOTGStrokeItem::updateContent(int frameNo) void LOTGStrokeItem::updateRenderNode() { float scale = getScale(mGradient->mMatrix); - mGradient->setAlpha(parentAlpha()); + mGradient->setAlpha(mAlpha * parentAlpha()); mDrawable->setBrush(VBrush(mGradient.get())); mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, mWidth * scale); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 9eda6d13c0..bdf13626b1 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -413,6 +413,7 @@ protected: private: LOTGFillData *mData; std::unique_ptr mGradient; + float mAlpha{1.0}; FillRule mFillRule{FillRule::Winding}; }; @@ -448,6 +449,7 @@ private: JoinStyle mJoin{JoinStyle::Miter}; float mMiterLimit{0}; VColor mColor; + float mAlpha{1.0}; float mWidth{0}; float mDashArray[6]; int mDashArraySize{0}; From 9bd4062efbd8a9e435038bff7236d31a7ca1ddaa Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 18 Mar 2019 16:34:33 +0900 Subject: [PATCH 429/672] cmake: fix cmake error for install command on windows For DLL platforms (all Windows-based systems including Cygwin), the DLL import library is treated as an ARCHIVE target. https://github.com/Samsung/rlottie/issues/14#issue-421341587 --- src/vector/stb/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vector/stb/CMakeLists.txt b/src/vector/stb/CMakeLists.txt index e67ab25a36..9c9a530477 100644 --- a/src/vector/stb/CMakeLists.txt +++ b/src/vector/stb/CMakeLists.txt @@ -3,4 +3,5 @@ add_library(rlottie-image-loader SHARED ) install(TARGETS rlottie-image-loader LIBRARY DESTINATION ${LIB_INSTALL_DIR} + ARCHIVE DESTINATION ${LIB_INSTALL_DIR} ) From 2b9991540cb4f9596378ca34086dc946e48108b4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 15 Mar 2019 17:01:12 +0900 Subject: [PATCH 430/672] [rlottie]: Added layers() api to return the layer info list of the composition. --- inc/rlottie.h | 13 +++++++++++++ src/lottie/lottieanimation.cpp | 7 +++++++ src/lottie/lottiemodel.h | 6 ++++++ src/lottie/lottieparser.cpp | 17 ++++++++++++++--- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/inc/rlottie.h b/inc/rlottie.h index af26d8750b..aef520035c 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -184,6 +184,8 @@ private: }mDrawArea; }; +using LayerInfoList = std::vector>; + class LOT_EXPORT Animation { public: @@ -323,6 +325,17 @@ public: */ const LOTLayerNode * renderTree(size_t frameNo, size_t width, size_t height) const; + /** + * @brief Returns Layer information{name, inFrame, outFrame} of all the child layers of the composition. + * + * + * @return List of Layer Information of the Composition. + * + * @see LayerInfoList + * @internal + */ + const LayerInfoList& layers() const; + /** * @brief default destructor * diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 6c8bef6bf1..16fa9cdc2e 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -49,6 +49,8 @@ public: std::future renderAsync(size_t frameNo, Surface &&surface); const LOTLayerNode * renderTree(size_t frameNo, const VSize &size); + + const LayerInfoList& layerInfoList() const { return mModel->layerInfoList();} private: std::string mFilePath; std::shared_ptr mModel; @@ -276,6 +278,11 @@ void Animation::renderSync(size_t frameNo, Surface surface) d->render(frameNo, surface); } +const LayerInfoList& Animation::layers() const +{ + return d->layerInfoList(); +} + Animation::Animation(): d(std::make_unique()) {} /* diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 5a12f80d96..a00a3b141b 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -407,10 +407,13 @@ public: std::shared_ptr mAsset; }; +using LayerInfo = std::tuple; + class LOTCompositionData : public LOTData { public: LOTCompositionData():LOTData(LOTData::Type::Composition){} + const std::vector &layerInfoList() const { return mLayerInfoList;} double duration() const { return isStatic() ? startFrame() : frameDuration() / frameRate(); // in second @@ -443,6 +446,8 @@ public: std::unordered_map> mAssets; + std::vector mLayerInfoList; + }; /** @@ -805,6 +810,7 @@ public: size_t startFrame() const {return mRoot->startFrame();} size_t endFrame() const {return mRoot->endFrame();} size_t frameAtPos(double pos) const {return mRoot->frameAtPos(pos);} + const std::vector &layerInfoList() const { return mRoot->layerInfoList();} public: std::shared_ptr mRoot; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index fd3bb2ffe4..f55fba8237 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -215,7 +215,7 @@ public: void parseAssets(LOTCompositionData *comp); std::shared_ptr parseAsset(); void parseLayers(LOTCompositionData *comp); - std::shared_ptr parseLayer(); + std::shared_ptr parseLayer(bool record = false); void parseMaskProperty(LOTLayerData *layer); void parseShapesAttr(LOTLayerData *layer); void parseObject(LOTGroupData *parent); @@ -273,6 +273,7 @@ protected: LOTLayerData * curLayerRef{nullptr}; std::vector> mLayersToUpdate; std::string mDirPath; + std::vector mLayerInfoList; void SkipOut(int depth); }; @@ -612,6 +613,8 @@ void LottieParserImpl::parseComposition() comp->mRootLayer->mInFrame = comp->mStartFrame; comp->mRootLayer->mOutFrame = comp->mEndFrame; + comp->mLayerInfoList = std::move(mLayerInfoList); + mComposition = sharedComposition; } @@ -749,7 +752,7 @@ void LottieParserImpl::parseLayers(LOTCompositionData *comp) RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { - std::shared_ptr layer = parseLayer(); + std::shared_ptr layer = parseLayer(true); staticFlag &= layer->isStatic(); comp->mRootLayer->mChildren.push_back(layer); } @@ -838,7 +841,7 @@ LayerType LottieParserImpl::getLayerType() * https://github.com/airbnb/lottie-web/blob/master/docs/json/layers/shape.json * */ -std::shared_ptr LottieParserImpl::parseLayer() +std::shared_ptr LottieParserImpl::parseLayer(bool record) { RAPIDJSON_ASSERT(PeekType() == kObjectType); std::shared_ptr sharedLayer = @@ -847,10 +850,14 @@ std::shared_ptr LottieParserImpl::parseLayer() curLayerRef = layer; bool hasLayerRef = false; bool ddd = true; + std::string layerName; EnterObject(); while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "ty")) { /* Type of layer*/ layer->mLayerType = getLayerType(); + } else if (0 == strcmp(key, "nm")) { /*Layer name*/ + RAPIDJSON_ASSERT(PeekType() == kStringType); + layerName = GetString(); } else if (0 == strcmp(key, "ind")) { /*Layer index in AE. Used for parenting and expressions.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); @@ -930,6 +937,10 @@ std::shared_ptr LottieParserImpl::parseLayer() layer->setStatic(staticFlag && layer->mTransform->isStatic() && !hasLayerRef); layer->mCompRef = compRef; + + if (record) { + mLayerInfoList.push_back(LayerInfo(layerName, layer->mInFrame, layer->mOutFrame)); + } return sharedLayer; } From a708ff3721e85264407262a46055d5bdbdd50ed9 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 21 Mar 2019 15:32:15 +0900 Subject: [PATCH 431/672] rlottie: fix typo. --- inc/rlottie.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/rlottie.h b/inc/rlottie.h index aef520035c..3d6c967a63 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -165,7 +165,7 @@ public: * * @internal */ - size_t drawRegionPosY() const {return mDrawArea.x;} + size_t drawRegionPosY() const {return mDrawArea.y;} /** * @brief Default constructor. From 94fd87b3d952968c732570ac4e5371aa71f6daed Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 21 Mar 2019 15:35:58 +0900 Subject: [PATCH 432/672] rlottie/vector: support subsurface rendering with arbitrary offset. --- src/lottie/lottieitem.cpp | 6 +++++- src/vector/vdrawhelper.cpp | 2 +- src/vector/vdrawhelper.h | 16 +++++++++++----- src/vector/vpainter.cpp | 16 ++++++++++------ src/vector/vpainter.h | 1 + 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 49e029bb60..9e4a831f4a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -126,16 +126,20 @@ bool LOTCompItem::render(const rlottie::Surface &surface) surface.width(), surface.height(), surface.bytesPerLine(), VBitmap::Format::ARGB32_Premultiplied); + /* schedule all preprocess task for this frame at once. */ mDrawableList.clear(); mRootLayer->renderList(mDrawableList); - VRect clip(0, 0, surface.width(), surface.height()); + VRect clip(0, 0, surface.drawRegionWidth(), surface.drawRegionHeight()); for (auto &e : mDrawableList) { e->preprocess(clip); } VPainter painter(&bitmap); + // set sub surface area for drawing. + painter.setDrawRegion(VRect(surface.drawRegionPosX(), surface.drawRegionPosY(), + surface.drawRegionWidth(), surface.drawRegionHeight())); mRootLayer->render(&painter, {}, {}); return true; diff --git a/src/vector/vdrawhelper.cpp b/src/vector/vdrawhelper.cpp index 3a254836f0..9c793726bd 100644 --- a/src/vector/vdrawhelper.cpp +++ b/src/vector/vdrawhelper.cpp @@ -207,7 +207,7 @@ VBitmap::Format VRasterBuffer::prepare(VBitmap *image) void VSpanData::init(VRasterBuffer *image) { mRasterBuffer = image; - mSystemClip = VRect(0, 0, image->width(), image->height()); + setDrawRegion(VRect(0, 0, image->width(), image->height())); mType = VSpanData::Type::None; mBlendFunc = nullptr; mUnclippedBlendFunc = nullptr; diff --git a/src/vector/vdrawhelper.h b/src/vector/vdrawhelper.h index a02f9473fb..9672613dc6 100644 --- a/src/vector/vdrawhelper.h +++ b/src/vector/vdrawhelper.h @@ -150,15 +150,21 @@ struct VSpanData { VPainter::CompositionMode mode = VPainter::CompModeSrcOver, int alpha = 255); void setupMatrix(const VMatrix &matrix); - void setPos(const VPoint &pos) { mPos = pos; } + VRect clipRect() const { - return mSystemClip.translated(-mPos.x(), -mPos.y()); + return VRect(0, 0, mDrawableSize.width(), mDrawableSize.height()); + } + + void setDrawRegion(const VRect ®ion) + { + mOffset = VPoint(region.left(), region.top()); + mDrawableSize = VSize(region.width(), region.height()); } uint *buffer(int x, int y) const { - return (uint *)(mRasterBuffer->scanLine(y + mPos.y())) + x + mPos.x(); + return (uint *)(mRasterBuffer->scanLine(y + mOffset.y())) + x + mOffset.x(); } void initTexture(const VBitmap *image, int alpha, VBitmapData::Type type, const VRect &sourceRect); @@ -166,10 +172,10 @@ struct VSpanData { VRasterBuffer * mRasterBuffer; ProcessRleSpan mBlendFunc; ProcessRleSpan mUnclippedBlendFunc; - VRect mSystemClip; VSpanData::Type mType; std::shared_ptr mCachedGradient; - VPoint mPos; + VPoint mOffset; // offset to the subsurface + VSize mDrawableSize;// suburface size union { uint32_t mSolid; VGradientData mGradient; diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index f4fea33f53..7b6d36188a 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -32,15 +32,13 @@ public: VSpanData mSpanData; }; -void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle) +void VPainterImpl::drawRle(const VPoint &, const VRle &rle) { if (rle.empty()) return; // mSpanData.updateSpanFunc(); if (!mSpanData.mUnclippedBlendFunc) return; - mSpanData.setPos(pos); - // do draw after applying clip. rle.intersect(mSpanData.clipRect(), mSpanData.mUnclippedBlendFunc, &mSpanData); @@ -61,9 +59,9 @@ static void fillRect(const VRect &r, VSpanData *data) int x1, x2, y1, y2; x1 = std::max(r.x(), 0); - x2 = std::min(r.x() + r.width(), data->mRasterBuffer->width()); + x2 = std::min(r.x() + r.width(), data->mDrawableSize.width()); y1 = std::max(r.y(), 0); - y2 = std::min(r.y() + r.height(), data->mRasterBuffer->height()); + y2 = std::min(r.y() + r.height(), data->mDrawableSize.height()); if (x2 <= x1 || y2 <= y1) return; @@ -130,6 +128,12 @@ bool VPainter::begin(VBitmap *buffer) } void VPainter::end() {} +void VPainter::setDrawRegion(const VRect ®ion) +{ + mImpl->mSpanData.setDrawRegion(region); +} + + void VPainter::setBrush(const VBrush &brush) { mImpl->mSpanData.setup(brush); @@ -153,7 +157,7 @@ void VPainter::drawRle(const VRle &rle, const VRle &clip) VRect VPainter::clipBoundingRect() const { - return mImpl->mSpanData.mSystemClip; + return mImpl->mSpanData.clipRect(); } void VPainter::drawBitmap(const VPoint &point, const VBitmap &bitmap, const VRect &source) diff --git a/src/vector/vpainter.h b/src/vector/vpainter.h index 389c94d7e5..9a2d60a049 100644 --- a/src/vector/vpainter.h +++ b/src/vector/vpainter.h @@ -40,6 +40,7 @@ public: VPainter(VBitmap *buffer); bool begin(VBitmap *buffer); void end(); + void setDrawRegion(const VRect ®ion); // sub surface rendering area. void setBrush(const VBrush &brush); void setCompositionMode(CompositionMode mode); void drawRle(const VPoint &pos, const VRle &rle); From 5056b34db8cdece2e558c82832cbcf57c5b4d146 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 22 Mar 2019 13:23:17 +0900 Subject: [PATCH 433/672] rlotti/model: Fix issue with trim offset calculation. --- src/lottie/lottiemodel.h | 72 ++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index a00a3b141b..bf7311232a 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -749,35 +749,63 @@ public: Individually }; LOTTrimData():LOTData(LOTData::Type::Trim){} + /* + * if start > end vector trims the path as a loop ( 2 segment) + * if start < end vector trims the path without loop ( 1 segment). + * if no offset then there is no loop. + */ Segment segment(int frameNo) const { float start = mStart.value(frameNo)/100.0f; float end = mEnd.value(frameNo)/100.0f; float offset = fmod(mOffset.value(frameNo), 360.0f)/ 360.0f; - start += offset; - end += offset; - // normalize start, end value to 0 - 1 - if (fabs(start) > 1) start = fmod(start, 1); - if (fabs(end) > 1) end = fmod(end, 1); - Segment s; - if (start >= 0 && end >= 0) { - s.start = std::min(start, end); - s.end = std::max(start, end); - } else if (start < 0 && end < 0) { - start += 1; - end +=1; - s.start = std::min(start, end); - s.end = std::max(start, end); - } else { - // one of them is -ve so it a loop - if (start < 0) start +=1; - if (end < 0) end +=1; - s.start = std::max(start, end); - s.end = std::min(start, end); - } - return s; + float diff = fabs(start - end); + if (vCompare(diff, 0)) return {0, 0}; + if (vCompare(diff, 1)) return {0, 1}; + + // no offset case + if (vCompare(fabs(offset), 0.0)) { + return noloop(start, end); + } else { + if (offset > 0) { + start += offset; + end += offset; + if (start <= 1 && end <=1) { + return noloop(start, end); + } else if (start > 1 && end > 1) { + return noloop(start - 1, end - 1); + } else { + if (start > 1) return loop(start - 1 , end); + else return loop(start , end - 1); + } + } else { + start += offset; + end += offset; + if (start >= 0 && end >= 0) { + return noloop(start, end); + } else if (start < 0 && end < 0) { + return noloop(-start, -end); + } else { + if (start < 0) return loop(-start, end); + else return loop(start , -end); + } + } + } } LOTTrimData::TrimType type() const {return mTrimType;} +private: + Segment noloop(float start, float end) const{ + Segment s; + s.start = std::min(start, end); + s.end = std::max(start, end); + return s; + } + Segment loop(float start, float end) const{ + Segment s; + s.start = std::max(start, end); + s.end = std::min(start, end); + return s; + } public: LOTAnimatable mStart{0}; LOTAnimatable mEnd{0}; From 4af06dc09c13a48c49e75447c9f62f91a0d8a7a1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 25 Mar 2019 16:09:36 +0900 Subject: [PATCH 434/672] rlottie: fix the issue with trim(start,end) update when offset is -ve. --- src/lottie/lottiemodel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index bf7311232a..86e4194a25 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -786,8 +786,8 @@ public: } else if (start < 0 && end < 0) { return noloop(-start, -end); } else { - if (start < 0) return loop(-start, end); - else return loop(start , -end); + if (start < 0) return loop(1 + start, end); + else return loop(start , 1 + end); } } } From 797be5cdba2a1c36170cbd3de73072c288afefff Mon Sep 17 00:00:00 2001 From: yuangu Date: Fri, 22 Mar 2019 18:53:50 +0800 Subject: [PATCH 435/672] Win support --- src/lottie/lottieitem.cpp | 1 + src/lottie/lottiemodel.cpp | 1 + src/lottie/lottiemodel.h | 18 +++++++++++--- src/vector/freetype/v_ft_math.cpp | 33 +++++++++++++++++++++++++- src/vector/vglobal.h | 17 ++++++++++++-- src/vector/vimageloader.cpp | 39 +++++++++++++++++++++++++++---- src/vector/vpainter.cpp | 1 + src/vector/vpath.cpp | 1 + src/vector/vrect.cpp | 1 + 9 files changed, 102 insertions(+), 10 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 9e4a831f4a..dc99df6397 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -19,6 +19,7 @@ #include "lottieitem.h" #include #include +#include #include "vbitmap.h" #include "vdasher.h" #include "vpainter.h" diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 1891633225..7ebed12e7b 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -21,6 +21,7 @@ #include "vimageloader.h" #include #include +#include /* * We process the iterator objects in the children list diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 86e4194a25..c63b4085c7 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -22,6 +22,7 @@ #include #include #include +#include #include"vpoint.h" #include"vrect.h" #include"vinterpolator.h" @@ -760,11 +761,22 @@ public: float offset = fmod(mOffset.value(frameNo), 360.0f)/ 360.0f; float diff = fabs(start - end); - if (vCompare(diff, 0)) return {0, 0}; - if (vCompare(diff, 1)) return {0, 1}; + if (vCompare(diff, 0.0f)) { + Segment tmp; + tmp.start = 0; + tmp.end = 0; + return tmp; + } + + if (vCompare(diff, 1.0f)) { + Segment tmp; + tmp.start = 0; + tmp.end = 1; + return tmp; + } // no offset case - if (vCompare(fabs(offset), 0.0)) { + if (vCompare(fabs(offset), 0.0f)) { return noloop(start, end); } else { if (offset > 0) { diff --git a/src/vector/freetype/v_ft_math.cpp b/src/vector/freetype/v_ft_math.cpp index 381ab6c889..5a71e70e31 100644 --- a/src/vector/freetype/v_ft_math.cpp +++ b/src/vector/freetype/v_ft_math.cpp @@ -18,7 +18,38 @@ #include "v_ft_math.h" #include -#define SW_FT_MSB(x) (31 - __builtin_clz(x)) +//form https://github.com/chromium/chromium/blob/59afd8336009c9d97c22854c52e0382b62b3aa5e/third_party/abseil-cpp/absl/base/internal/bits.h + +#if defined(_MSC_VER) +#include +static unsigned int __inline clz(unsigned int x) { + unsigned long r = 0; + if (x != 0) + { + _BitScanReverse(&r, x); + } + return r; +} +#define SW_FT_MSB(x) (clz(x)) +#elif defined(__GNUC__) +#define SW_FT_MSB(x) (31 - __builtin_clz(x)) +#else +static unsigned int __inline clz(unsigned int x) { + int c = 31; + x &= ~x + 1; + if (n & 0x0000FFFF) c -= 16; + if (n & 0x00FF00FF) c -= 8; + if (n & 0x0F0F0F0F) c -= 4; + if (n & 0x33333333) c -= 2; + if (n & 0x55555555) c -= 1; + return c; +} +#define SW_FT_MSB(x) (clz(x)) +#endif + + + + #define SW_FT_PAD_FLOOR(x, n) ((x) & ~((n)-1)) #define SW_FT_PAD_ROUND(x, n) SW_FT_PAD_FLOOR((x) + ((n) / 2), n) diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 3ff804d995..2eb5bcd621 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -43,8 +43,21 @@ typedef uint8_t uchar; #endif -#define V_UNUSED __attribute__((__unused__)) -#define V_REQUIRED_RESULT __attribute__((__warn_unused_result__)) +#ifndef __has_attribute +# define __has_attribute(x) 0 +#endif /* !__has_attribute */ + +#if __has_attribute(unused) +# define V_UNUSED __attribute__((__unused__)) +#else +# define V_UNUSED +#endif /* V_UNUSED */ + +#if __has_attribute(warn_unused_result) +# define V_REQUIRED_RESULT __attribute__((__warn_unused_result__)) +#else +# define V_REQUIRED_RESULT +#endif /* V_REQUIRED_RESULT */ #define V_CONSTEXPR constexpr #define V_NOTHROW noexcept diff --git a/src/vector/vimageloader.cpp b/src/vector/vimageloader.cpp index 3b683f7cb1..ab51b99ce0 100644 --- a/src/vector/vimageloader.cpp +++ b/src/vector/vimageloader.cpp @@ -1,6 +1,10 @@ #include "vimageloader.h" #include "vdebug.h" +#ifndef WIN32 #include +#else +#include +#endif #include using lottie_image_load_f = unsigned char* (*)(const char *filename, int *x, int *y, int *comp, int req_comp); @@ -9,7 +13,11 @@ using lottie_image_free_f = void (*)(unsigned char *); struct VImageLoader::Impl { +#ifdef WIN32 + HMODULE dl_handle{ nullptr }; +#else void *dl_handle{nullptr}; +#endif lottie_image_load_f lottie_image_load{nullptr}; lottie_image_free_f lottie_image_free{nullptr}; lottie_image_load_data_f lottie_image_load_data{nullptr}; @@ -18,24 +26,47 @@ struct VImageLoader::Impl { #ifdef __APPLE__ dl_handle = dlopen("librlottie-image-loader.dylib", RTLD_LAZY); - #else + #elif WIN32 + dl_handle = LoadLibraryA("librlottie-image-loader.dll"); + #else dl_handle = dlopen("librlottie-image-loader.so", RTLD_LAZY); #endif if (!dl_handle) vWarning<<"Failed to dlopen librlottie-image-loader library"; - lottie_image_load = (lottie_image_load_f) dlsym(dl_handle, "lottie_image_load"); + +#ifdef WIN32 + lottie_image_load = (lottie_image_load_f)GetProcAddress(dl_handle, "lottie_image_load"); +#else + lottie_image_load = (lottie_image_load_f) dlsym(dl_handle, "lottie_image_load"); +#endif + if (!lottie_image_load) vWarning<<"Failed to find symbol lottie_image_load in librlottie-image-loader library"; +#ifdef WIN32 + lottie_image_free = (lottie_image_free_f)GetProcAddress(dl_handle, "lottie_image_free"); +#else lottie_image_free = (lottie_image_free_f) dlsym(dl_handle, "lottie_image_free"); +#endif if (!lottie_image_free) vWarning<<"Failed to find symbol lottie_image_free in librlottie-image-loader library"; +#ifdef WIN32 + lottie_image_load_data = (lottie_image_load_data_f)GetProcAddress(dl_handle, "lottie_image_load_from_data"); +#else lottie_image_load_data = (lottie_image_load_data_f) dlsym(dl_handle, "lottie_image_load_from_data"); +#endif if (!lottie_image_load_data) vWarning<<"Failed to find symbol lottie_image_load_data in librlottie-image-loader library"; } ~Impl() - { - if (dl_handle) dlclose(dl_handle); + { + if (dl_handle) + { +#ifdef WIN32 + FreeLibrary(dl_handle); +#else + dlclose(dl_handle); +#endif + } } VBitmap createBitmap(unsigned char *data, int width, int height, int channel) diff --git a/src/vector/vpainter.cpp b/src/vector/vpainter.cpp index 7b6d36188a..71a57bb581 100644 --- a/src/vector/vpainter.cpp +++ b/src/vector/vpainter.cpp @@ -18,6 +18,7 @@ #include "vpainter.h" #include "vdrawhelper.h" +#include V_BEGIN_NAMESPACE diff --git a/src/vector/vpath.cpp b/src/vector/vpath.cpp index 300420616a..225e57b059 100644 --- a/src/vector/vpath.cpp +++ b/src/vector/vpath.cpp @@ -19,6 +19,7 @@ #include "vpath.h" #include #include +#include #include "vbezier.h" #include "vdebug.h" #include "vrect.h" diff --git a/src/vector/vrect.cpp b/src/vector/vrect.cpp index 60d21162d8..2180009de3 100644 --- a/src/vector/vrect.cpp +++ b/src/vector/vrect.cpp @@ -17,6 +17,7 @@ */ #include "vrect.h" +#include VRect VRect::operator&(const VRect &r) const { From 65ab13984898d99787fcef742fa89be204278935 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 25 Mar 2019 16:40:29 +0900 Subject: [PATCH 436/672] rlottie/vector: remove unused version of vCompare to avoid warning. --- src/lottie/lottiemodel.h | 15 ++------------- src/vector/vglobal.h | 5 ----- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index c63b4085c7..376b873d5e 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -761,19 +761,8 @@ public: float offset = fmod(mOffset.value(frameNo), 360.0f)/ 360.0f; float diff = fabs(start - end); - if (vCompare(diff, 0.0f)) { - Segment tmp; - tmp.start = 0; - tmp.end = 0; - return tmp; - } - - if (vCompare(diff, 1.0f)) { - Segment tmp; - tmp.start = 0; - tmp.end = 1; - return tmp; - } + if (vCompare(diff, 0.0f)) return {0, 0}; + if (vCompare(diff, 1.0f)) return {0, 1}; // no offset case if (vCompare(fabs(offset), 0.0f)) { diff --git a/src/vector/vglobal.h b/src/vector/vglobal.h index 2eb5bcd621..98837fd235 100644 --- a/src/vector/vglobal.h +++ b/src/vector/vglobal.h @@ -125,11 +125,6 @@ V_CONSTEXPR inline const T &vMax(const T &a, const T &b) static const double EPSILON_DOUBLE = 0.000000000001f; static const float EPSILON_FLOAT = 0.000001f; -static inline bool vCompare(double p1, double p2) -{ - return (std::abs(p1 - p2) < EPSILON_DOUBLE); -} - static inline bool vCompare(float p1, float p2) { return (std::abs(p1 - p2) < EPSILON_FLOAT); From 74762d697d0c7549c49c3613eeae21c6032ccb83 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 27 Mar 2019 11:08:29 +0900 Subject: [PATCH 437/672] rlottie: added travis build badge to the rlottie main page. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 832e8fe88e..5f69b65aa2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/Samsung/rlottie.svg?branch=master)](https://travis-ci.org/Samsung/rlottie) + # rlottie A platform independent standalone library that plays Lottie Animation. From 97cf5023d8b5947fdc24edb3c3ee7bbeca8f3b3b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 27 Mar 2019 10:21:53 +0900 Subject: [PATCH 438/672] rlottie: added travis ci support. --- .travis.yml | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..91921b2e46 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,42 @@ +dist: trusty + +sudo: false + +language: cpp + +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-5 + +matrix: + include: + - os: linux + compiler: clang + env: + build_type=debug + options="" + + - os: linux + compiler: clang + env: + build_type=release + options="" + + - os: linux + compiler: gcc + env: + build_type=debug + options="" + + - os: linux + compiler: gcc + env: + build_type=release + options="" + +script: + - CXX=/usr/bin/g++-5 CC=/usr/bin/gcc-5 cmake -DLIB_INSTALL_DIR=/usr/lib . + - cmake --build . -- -j2 From 5e2192c0f3399721abe17e5158acbb2f19f86aa5 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 27 Mar 2019 15:17:01 +0900 Subject: [PATCH 439/672] capi: code rectoring keep code consistency of mask with matte. --- inc/rlottiecommon.h | 15 +++++++-------- src/lottie/lottieitem.cpp | 10 +++++----- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/inc/rlottiecommon.h b/inc/rlottiecommon.h index cc198a4baf..0d8bce553e 100644 --- a/inc/rlottiecommon.h +++ b/inc/rlottiecommon.h @@ -116,11 +116,11 @@ typedef struct LOTGradientStop typedef enum { - MaskModeAdd = 0, - MaskModeSubstract, - MaskModeIntersect, - MaskModeDifference -} LOTMaskMode; + MaskAdd = 0, + MaskSubstract, + MaskIntersect, + MaskDifference +} LOTMaskType; typedef struct LOTMask { struct { @@ -129,8 +129,7 @@ typedef struct LOTMask { const char* elmPtr; int elmCount; } mPath; - LOTMaskMode mMode; - + LOTMaskType mMode; int mAlpha; }LOTMask; @@ -209,7 +208,7 @@ typedef struct LOTLayerNode { } mLayerList; struct { - LOTNode **ptr; + LOTNode **ptr; unsigned int size; } mNodeList; diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index dc99df6397..9b259a8bd2 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -238,19 +238,19 @@ void LOTLayerItem::buildLayerNode() cNode.mAlpha = mask.mCombinedAlpha * 255; switch (mask.maskMode()) { case LOTMaskData::Mode::Add: - cNode.mMode = MaskModeAdd; + cNode.mMode = MaskAdd; break; case LOTMaskData::Mode::Substarct: - cNode.mMode = MaskModeSubstract; + cNode.mMode = MaskSubstract; break; case LOTMaskData::Mode::Intersect: - cNode.mMode = MaskModeIntersect; + cNode.mMode = MaskIntersect; break; case LOTMaskData::Mode::Difference: - cNode.mMode = MaskModeDifference; + cNode.mMode = MaskDifference; break; default: - cNode.mMode = MaskModeAdd; + cNode.mMode = MaskAdd; break; } mMasksCNode.push_back(std::move(cNode)); From bb64c5e7c8798257fb031aee6255eec8e9d1e03e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 27 Mar 2019 15:35:37 +0900 Subject: [PATCH 440/672] lottie: a small optimization. reserve mask size as possible in advance, reduce data copies. --- src/lottie/lottieitem.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 9b259a8bd2..3f23241e0d 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -225,35 +225,36 @@ void LOTLayerItem::buildLayerNode() } if (mLayerMask) { mMasksCNode.clear(); + mMasksCNode.resize(mLayerMask->mMasks.size()); + size_t i = 0; for (const auto &mask : mLayerMask->mMasks) { - LOTMask cNode; + LOTMask *cNode = &mMasksCNode[i++]; const std::vector &elm = mask.mFinalPath.elements(); const std::vector & pts = mask.mFinalPath.points(); const float *ptPtr = reinterpret_cast(pts.data()); const char * elmPtr = reinterpret_cast(elm.data()); - cNode.mPath.ptPtr = ptPtr; - cNode.mPath.ptCount = pts.size(); - cNode.mPath.elmPtr = elmPtr; - cNode.mPath.elmCount = elm.size(); - cNode.mAlpha = mask.mCombinedAlpha * 255; + cNode->mPath.ptPtr = ptPtr; + cNode->mPath.ptCount = pts.size(); + cNode->mPath.elmPtr = elmPtr; + cNode->mPath.elmCount = elm.size(); + cNode->mAlpha = mask.mCombinedAlpha * 255; switch (mask.maskMode()) { case LOTMaskData::Mode::Add: - cNode.mMode = MaskAdd; + cNode->mMode = MaskAdd; break; case LOTMaskData::Mode::Substarct: - cNode.mMode = MaskSubstract; + cNode->mMode = MaskSubstract; break; case LOTMaskData::Mode::Intersect: - cNode.mMode = MaskIntersect; + cNode->mMode = MaskIntersect; break; case LOTMaskData::Mode::Difference: - cNode.mMode = MaskDifference; + cNode->mMode = MaskDifference; break; default: - cNode.mMode = MaskAdd; + cNode->mMode = MaskAdd; break; } - mMasksCNode.push_back(std::move(cNode)); } mLayerCNode->mMaskList.ptr = mMasksCNode.data(); mLayerCNode->mMaskList.size = mMasksCNode.size(); From 6dbb4afec9b5530f1f07ce6ceaba563860a7fcf1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 29 Mar 2019 15:44:21 +0900 Subject: [PATCH 441/672] rlottie: refactor thread support to make it configurable at compile time. --- src/lottie/lottieanimation.cpp | 31 +++++++++++-- src/vector/config.h | 7 +++ src/vector/vraster.cpp | 84 ++++++++++++++++++++++------------ 3 files changed, 89 insertions(+), 33 deletions(-) create mode 100644 src/vector/config.h diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 16fa9cdc2e..55b8b51dc3 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -15,7 +15,7 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include "config.h" #include "rlottie.h" #include "lottieitem.h" #include "lottieloader.h" @@ -105,6 +105,11 @@ void AnimationImpl::init(const std::shared_ptr &model) mRenderInProgress = false; } +#ifdef LOTTIE_THREAD_SUPPORT + +#include "vtaskqueue.h" +#include + /* * Implement a task stealing schduler to perform render task * As each player draws into its own buffer we can delegate this @@ -116,8 +121,6 @@ void AnimationImpl::init(const std::shared_ptr &model) * one it steals the task from it and executes. if it couldn't find one then it * just waits for new task on its own queue. */ - -#include class RenderTaskScheduler { const unsigned _count{std::thread::hardware_concurrency()}; std::vector _threads; @@ -163,7 +166,7 @@ public: for (auto &e : _threads) e.join(); } - std::future async(SharedRenderTask task) + std::future process(SharedRenderTask task) { auto receiver = std::move(task->receiver); auto i = _index++; @@ -178,6 +181,24 @@ public: } }; +#else +class RenderTaskScheduler { +public: + static RenderTaskScheduler& instance() + { + static RenderTaskScheduler singleton; + return singleton; + } + + std::future process(SharedRenderTask task) + { + auto result = task->playerImpl->render(task->frameNo, task->surface); + task->sender.set_value(result); + return std::move(task->receiver); + } +}; +#endif + std::future AnimationImpl::renderAsync(size_t frameNo, Surface &&surface) { @@ -191,7 +212,7 @@ std::future AnimationImpl::renderAsync(size_t frameNo, Surface &&surfac mTask->frameNo = frameNo; mTask->surface = std::move(surface); - return RenderTaskScheduler::instance().async(mTask); + return RenderTaskScheduler::instance().process(mTask); } /** diff --git a/src/vector/config.h b/src/vector/config.h new file mode 100644 index 0000000000..bcf557337f --- /dev/null +++ b/src/vector/config.h @@ -0,0 +1,7 @@ +#ifndef CONFIG_H +#define CONFIG_H + +// enable threading +#define LOTTIE_THREAD_SUPPORT + +#endif // CONFIG_H diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 2f98798f7a..95c2626874 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -18,14 +18,13 @@ #include "vraster.h" #include -#include #include "v_ft_raster.h" #include "v_ft_stroker.h" #include "vdebug.h" #include "vmatrix.h" #include "vpath.h" -#include "vtaskqueue.h" #include "vrle.h" +#include "config.h" V_BEGIN_NAMESPACE @@ -274,6 +273,30 @@ struct RleTask { bool stroke; VRle operator()(FTOutline &outRef, SW_FT_Stroker &stroker); void render(FTOutline &outRef); + RleTask() {} + RleTask(RleShare &apromise, VPath &&apath, VRle &&arle, FillRule afillRule, const VRect &aclip) + { + path = std::move(apath); + rle = std::move(arle); + fillRule = afillRule; + clip = aclip; + stroke = false; + mRlePromise = apromise; + } + RleTask(RleShare &apromise, VPath &&apath, VRle &&arle, CapStyle acap, JoinStyle ajoin, + float awidth, float ameterLimit, const VRect &aclip) + { + stroke = true; + path = std::move(apath); + rle = std::move(arle); + cap = acap; + join = ajoin; + width = awidth; + meterLimit = ameterLimit; + clip = aclip; + mRlePromise = apromise; + } + }; void RleTask::render(FTOutline &outRef) @@ -337,6 +360,11 @@ VRle RleTask::operator()(FTOutline &outRef, SW_FT_Stroker &stroker) return std::move(rle); } +#ifdef LOTTIE_THREAD_SUPPORT + +#include "vtaskqueue.h" +#include + class RleTaskScheduler { const unsigned _count{std::thread::hardware_concurrency()}; std::vector _threads; @@ -393,7 +421,7 @@ public: for (auto &e : _threads) e.join(); } - void async(RleTask &&task) + void process(RleTask &&task) { auto i = _index++; @@ -403,37 +431,37 @@ public: _q[i % _count].push(std::move(task)); } +}; - void strokeRle(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, JoinStyle join, - float width, float meterLimit, const VRect &clip) +#else + +class RleTaskScheduler { +public: + FTOutline outlineRef; + SW_FT_Stroker stroker; +public: + static RleTaskScheduler& instance() { - RleTask task; - task.stroke = true; - task.path = std::move(path); - task.rle = std::move(rle); - task.cap = cap; - task.join = join; - task.width = width; - task.meterLimit = meterLimit; - task.clip = clip; - task.mRlePromise = promise; - - async(std::move(task)); + static RleTaskScheduler singleton; + return singleton; } - void fillRle(RleShare &promise, VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) + RleTaskScheduler() { - RleTask task; - task.path = std::move(path); - task.rle = std::move(rle); - task.fillRule = fillRule; - task.clip = clip; - task.stroke = false; - task.mRlePromise = promise; + SW_FT_Stroker_New(&stroker); + } - async(std::move(task)); + ~RleTaskScheduler() + { + SW_FT_Stroker_Done(stroker); + } + + void process(RleTask &&task) + { + task.mRlePromise->set_value((task)(outlineRef, stroker)); } }; +#endif void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, FillRule fillRule, const VRect &clip) @@ -442,7 +470,7 @@ void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, promise->set_value(VRle()); return; } - return RleTaskScheduler::instance().fillRle(promise, std::move(path), std::move(rle), fillRule, clip); + return RleTaskScheduler::instance().process(RleTask(promise, std::move(path), std::move(rle), fillRule, clip)); } void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, @@ -453,7 +481,7 @@ void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, Ca promise->set_value(VRle()); return; } - return RleTaskScheduler::instance().strokeRle(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip); + return RleTaskScheduler::instance().process(RleTask(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip)); } V_END_NAMESPACE From f672dead5755471b18f9ffb6e6913f45d8b42523 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Fri, 29 Mar 2019 20:19:40 +0900 Subject: [PATCH 442/672] rlottie: enable conditional compilation of logging support. --- src/lottie/lottieanimation.cpp | 4 ++++ src/vector/config.h | 3 +++ src/vector/vdebug.cpp | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 55b8b51dc3..98dd3dd7ec 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -333,6 +333,9 @@ void Surface::setDrawRegion(size_t x, size_t y, size_t width, size_t height) mDrawArea.w = width; mDrawArea.h = height; } + + +#ifdef LOTTIE_LOGGING_SUPPORT void initLogging() { #if defined(__ARM_NEON__) @@ -344,3 +347,4 @@ void initLogging() } V_CONSTRUCTOR_FUNCTION(initLogging) +#endif diff --git a/src/vector/config.h b/src/vector/config.h index bcf557337f..c23cdb91fc 100644 --- a/src/vector/config.h +++ b/src/vector/config.h @@ -4,4 +4,7 @@ // enable threading #define LOTTIE_THREAD_SUPPORT +//enable logging +#define LOTTIE_LOGGING_SUPPORT + #endif // CONFIG_H diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index bd7a3210ba..7002bd0412 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -17,6 +17,7 @@ */ #include "vdebug.h" +#include "config.h" #include #include #include @@ -737,8 +738,19 @@ void set_log_level(LogLevel level) loglevel.store(static_cast(level), std::memory_order_release); } +#ifdef LOTTIE_LOGGING_SUPPORT + bool is_logged(LogLevel level) { return static_cast(level) >= loglevel.load(std::memory_order_relaxed); } + +#else + +bool is_logged(LogLevel) +{ + return false; +} + +#endif From 5e3221de1850ce067cbb18222497cafded242159 Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Mon, 1 Apr 2019 23:08:35 +0900 Subject: [PATCH 443/672] rlottie: added compilation switch to build imageloader as part of rlottie library. --- src/vector/config.h | 3 + src/vector/vimageloader.cpp | 124 +++++++++++++++++++++++------------- 2 files changed, 83 insertions(+), 44 deletions(-) diff --git a/src/vector/config.h b/src/vector/config.h index c23cdb91fc..2c2722ac11 100644 --- a/src/vector/config.h +++ b/src/vector/config.h @@ -7,4 +7,7 @@ //enable logging #define LOTTIE_LOGGING_SUPPORT +//enable static building of image loader +//#define LOTTIE_STATIC_IMAGE_LOADER + #endif // CONFIG_H diff --git a/src/vector/vimageloader.cpp b/src/vector/vimageloader.cpp index ab51b99ce0..9592d073b8 100644 --- a/src/vector/vimageloader.cpp +++ b/src/vector/vimageloader.cpp @@ -1,5 +1,6 @@ #include "vimageloader.h" #include "vdebug.h" +#include "config.h" #ifndef WIN32 #include #else @@ -11,62 +12,97 @@ using lottie_image_load_f = unsigned char* (*)(const char *filename, int *x, int using lottie_image_load_data_f = unsigned char* (*)(const char *data, int len, int *x, int *y, int *comp, int req_comp); using lottie_image_free_f = void (*)(unsigned char *); +#ifdef __cplusplus +extern "C" { +#endif + +extern unsigned char * lottie_image_load(char const *filename, int *x, int *y, int *comp, int req_comp); +extern unsigned char * lottie_image_load_from_data(const char *imageData, int len, int *x, int *y, int *comp, int req_comp); +extern void lottie_image_free(unsigned char *data); + +#ifdef __cplusplus +} +#endif + + struct VImageLoader::Impl { + lottie_image_load_f imageLoad{nullptr}; + lottie_image_free_f imageFree{nullptr}; + lottie_image_load_data_f imageFromData{nullptr}; + +#ifndef LOTTIE_STATIC_IMAGE_LOADER #ifdef WIN32 - HMODULE dl_handle{ nullptr }; + HMODULE dl_handle{ nullptr }; + bool moduleLoad() { + dl_handle = LoadLibraryA("librlottie-image-loader.dll"); + return (dl_handle == nullptr); + } + void moduleFree() { + if (dl_handle) FreeLibrary(dl_handle); + } + void init() { + imageLoad = (lottie_image_load_f)GetProcAddress(dl_handle, "lottie_image_load"); + imageFree = (lottie_image_free_f)GetProcAddress(dl_handle, "lottie_image_free"); + imageFromData = (lottie_image_load_data_f)GetProcAddress(dl_handle, "lottie_image_load_from_data"); + } #else void *dl_handle{nullptr}; + void init() { + imageLoad = (lottie_image_load_f) dlsym(dl_handle, "lottie_image_load"); + imageFree = (lottie_image_free_f) dlsym(dl_handle, "lottie_image_free"); + imageFromData = (lottie_image_load_data_f) dlsym(dl_handle, "lottie_image_load_from_data"); + } + + void moduleFree() { + if (dl_handle) dlclose(dl_handle); + } +#ifdef __APPLE__ + bool moduleLoad() { + dl_handle = dlopen("librlottie-image-loader.dylib", RTLD_LAZY); + return (dl_handle == nullptr); + } +#else + bool moduleLoad() { + dl_handle = dlopen("librlottie-image-loader.so", RTLD_LAZY); + return (dl_handle == nullptr); + } +#endif #endif - lottie_image_load_f lottie_image_load{nullptr}; - lottie_image_free_f lottie_image_free{nullptr}; - lottie_image_load_data_f lottie_image_load_data{nullptr}; +#else + void *dl_handle{nullptr}; + void init() { + imageLoad = lottie_image_load; + imageFree = lottie_image_free; + imageFromData = lottie_image_load_from_data; + } + void moduleFree() {} + bool moduleLoad() {return false;} +#endif + Impl() { - #ifdef __APPLE__ - dl_handle = dlopen("librlottie-image-loader.dylib", RTLD_LAZY); - #elif WIN32 - dl_handle = LoadLibraryA("librlottie-image-loader.dll"); - #else - dl_handle = dlopen("librlottie-image-loader.so", RTLD_LAZY); - #endif - if (!dl_handle) + if (moduleLoad()) { vWarning<<"Failed to dlopen librlottie-image-loader library"; - -#ifdef WIN32 - lottie_image_load = (lottie_image_load_f)GetProcAddress(dl_handle, "lottie_image_load"); -#else - lottie_image_load = (lottie_image_load_f) dlsym(dl_handle, "lottie_image_load"); -#endif + return; + } + + init(); - if (!lottie_image_load) + if (!imageLoad) vWarning<<"Failed to find symbol lottie_image_load in librlottie-image-loader library"; -#ifdef WIN32 - lottie_image_free = (lottie_image_free_f)GetProcAddress(dl_handle, "lottie_image_free"); -#else - lottie_image_free = (lottie_image_free_f) dlsym(dl_handle, "lottie_image_free"); -#endif - if (!lottie_image_free) + + if (!imageFree) vWarning<<"Failed to find symbol lottie_image_free in librlottie-image-loader library"; -#ifdef WIN32 - lottie_image_load_data = (lottie_image_load_data_f)GetProcAddress(dl_handle, "lottie_image_load_from_data"); -#else - lottie_image_load_data = (lottie_image_load_data_f) dlsym(dl_handle, "lottie_image_load_from_data"); -#endif - if (!lottie_image_load_data) + + if (!imageFromData) vWarning<<"Failed to find symbol lottie_image_load_data in librlottie-image-loader library"; } + ~Impl() { - if (dl_handle) - { -#ifdef WIN32 - FreeLibrary(dl_handle); -#else - dlclose(dl_handle); -#endif - } + moduleFree(); } VBitmap createBitmap(unsigned char *data, int width, int height, int channel) @@ -84,17 +120,17 @@ struct VImageLoader::Impl memcpy(result.data(), data, width * height * 4); // free the image data - lottie_image_free(data); + imageFree(data); return result; } VBitmap load(const char *fileName) { - if (!lottie_image_load) return VBitmap(); + if (!imageLoad) return VBitmap(); int width, height, n; - unsigned char *data = lottie_image_load(fileName, &width, &height, &n, 4); + unsigned char *data = imageLoad(fileName, &width, &height, &n, 4); if (!data) { return VBitmap(); @@ -105,10 +141,10 @@ struct VImageLoader::Impl VBitmap load(const char *imageData, int len) { - if (!lottie_image_load_data) return VBitmap(); + if (!imageFromData) return VBitmap(); int width, height, n; - unsigned char *data = lottie_image_load_data(imageData, len, &width, &height, &n, 4); + unsigned char *data = imageFromData(imageData, len, &width, &height, &n, 4); if (!data) { return VBitmap(); From ea8ca121b20e26526e4e80ccbc17d5f5f2277029 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 2 Apr 2019 10:31:45 +0900 Subject: [PATCH 444/672] rlottie: Fix issue with intersect mask When do an Intersect mask, it need to initialize rle like a Subtract. --- src/lottie/lottieitem.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 3f23241e0d..22466311d7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -343,6 +343,8 @@ VRle LOTLayerMaskItem::maskRle(const VRect &clipRect) break; } case LOTMaskData::Mode::Intersect: { + if (rle.empty() && !clipRect.empty()) + rle = VRle::toRle(clipRect); rle = rle & i.rle(); break; } From f31cb8c968bca114a09eed6202d697a30c995240 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 15 Apr 2019 14:14:27 +0900 Subject: [PATCH 445/672] lottieanimation: + exceptional handling. prevent just in case of dividing by zero. --- src/lottie/lottieanimation.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 98dd3dd7ec..b8e067468f 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -175,7 +175,9 @@ public: if (_q[(i + n) % _count].try_push(std::move(task))) return receiver; } - _q[i % _count].push(std::move(task)); + if (_count > 0) { + _q[i % _count].push(std::move(task)); + } return receiver; } From e0d60eb058c70aa005b3e86ef874751ae6b27b54 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 15 Apr 2019 14:18:51 +0900 Subject: [PATCH 446/672] vector: + exception handling prevent a case of dividing by zero. --- src/vector/vraster.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 95c2626874..1ad9a8bf49 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -429,7 +429,9 @@ public: if (_q[(i + n) % _count].try_push(std::move(task))) return; } - _q[i % _count].push(std::move(task)); + if (_count > 0) { + _q[i % _count].push(std::move(task)); + } } }; From 6efe7e23f5ee59e82ae1162d0e37de49dc3b6945 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 17 Apr 2019 16:47:11 +0900 Subject: [PATCH 447/672] example: refactor lottieview to test both c and cpp api --- example/demo.cpp | 2 +- example/lottieview.cpp | 347 ++++----------------------- example/lottieview.h | 463 +++++++++++++++++++++++++++++++++++-- example/lottieviewer.cpp | 2 +- example/lottieviewtest.cpp | 34 ++- example/uxsampletest.cpp | 2 +- 6 files changed, 506 insertions(+), 344 deletions(-) diff --git a/example/demo.cpp b/example/demo.cpp index 9b14d5502e..368e29f773 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -45,7 +45,7 @@ main(void) app->setup(); std::string filePath = DEMO_DIR; - filePath +="image_test.json"; + filePath +="3d.json"; LottieView *view = new LottieView(app->evas()); view->setFilePath(filePath.c_str()); diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 383aa6dd98..755b2e0d8b 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -34,222 +34,7 @@ animator(void *data , double pos) return EINA_TRUE; } -void LottieView::createVgNode(LOTNode *node, Efl_VG *root) -{ - Efl_VG *shape = evas_vg_shape_add(root); - - //0: Path - const float *data = node->mPath.ptPtr; - if (!data) return; - - for (int i = 0; i < node->mPath.elmCount; i++) { - switch (node->mPath.elmPtr[i]) { - case 0: - evas_vg_shape_append_move_to(shape, data[0], data[1]); - data += 2; - break; - case 1: - evas_vg_shape_append_line_to(shape, data[0], data[1]); - data += 2; - break; - case 2: - evas_vg_shape_append_cubic_to(shape, data[0], data[1], data[2], data[3], data[4], data[5]); - data += 6; - break; - case 3: - evas_vg_shape_append_close(shape); - break; - default: - break; - } - } - - //1: Stroke - if (node->mStroke.enable) { - //Stroke Width - evas_vg_shape_stroke_width_set(shape, node->mStroke.width); - - //Stroke Cap - Efl_Gfx_Cap cap; - switch (node->mStroke.cap) { - case CapFlat: cap = EFL_GFX_CAP_BUTT; break; - case CapSquare: cap = EFL_GFX_CAP_SQUARE; break; - case CapRound: cap = EFL_GFX_CAP_ROUND; break; - default: cap = EFL_GFX_CAP_BUTT; break; - } - evas_vg_shape_stroke_cap_set(shape, cap); - - //Stroke Join - Efl_Gfx_Join join; - switch (node->mStroke.join) { - case JoinMiter: join = EFL_GFX_JOIN_MITER; break; - case JoinBevel: join = EFL_GFX_JOIN_BEVEL; break; - case JoinRound: join = EFL_GFX_JOIN_ROUND; break; - default: join = EFL_GFX_JOIN_MITER; break; - } - evas_vg_shape_stroke_join_set(shape, join); - - //Stroke Dash - if (node->mStroke.dashArraySize > 0) { - int size = (node->mStroke.dashArraySize / 2); - Efl_Gfx_Dash *dash = static_cast(malloc(sizeof(Efl_Gfx_Dash) * size)); - if (dash) { - for (int i = 0; i <= size; i+=2) { - dash[i].length = node->mStroke.dashArray[i]; - dash[i].gap = node->mStroke.dashArray[i + 1]; - } - evas_vg_shape_stroke_dash_set(shape, dash, size); - free(dash); - } - } - } - - //2: Fill Method - switch (node->mBrushType) { - case BrushSolid: { - float pa = ((float)node->mColor.a) / 255; - int r = (int)(((float) node->mColor.r) * pa); - int g = (int)(((float) node->mColor.g) * pa); - int b = (int)(((float) node->mColor.b) * pa); - int a = node->mColor.a; - if (node->mStroke.enable) - evas_vg_shape_stroke_color_set(shape, r, g, b, a); - else - evas_vg_node_color_set(shape, r, g, b, a); - break; - } - case BrushGradient: { - Efl_VG* grad = NULL; - if (node->mGradient.type == GradientLinear) { - grad = evas_vg_gradient_linear_add(root); - evas_vg_gradient_linear_start_set(grad, node->mGradient.start.x, node->mGradient.start.y); - evas_vg_gradient_linear_end_set(grad, node->mGradient.end.x, node->mGradient.end.y); - - } - else if (node->mGradient.type == GradientRadial) { - grad = evas_vg_gradient_radial_add(root); - evas_vg_gradient_radial_center_set(grad, node->mGradient.center.x, node->mGradient.center.y); - evas_vg_gradient_radial_focal_set(grad, node->mGradient.focal.x, node->mGradient.focal.y); - evas_vg_gradient_radial_radius_set(grad, node->mGradient.cradius); - } - - if (grad) { - //Gradient Stop - Efl_Gfx_Gradient_Stop* stops = static_cast(malloc(sizeof(Efl_Gfx_Gradient_Stop) * node->mGradient.stopCount)); - if (stops) { - for (unsigned int i = 0; i < node->mGradient.stopCount; i++) { - stops[i].offset = node->mGradient.stopPtr[i].pos; - float pa = ((float)node->mGradient.stopPtr[i].a) / 255; - stops[i].r = (int)(((float)node->mGradient.stopPtr[i].r) * pa); - stops[i].g = (int)(((float)node->mGradient.stopPtr[i].g) * pa); - stops[i].b = (int)(((float)node->mGradient.stopPtr[i].b) * pa); - stops[i].a = node->mGradient.stopPtr[i].a; - } - evas_vg_gradient_stop_set(grad, stops, node->mGradient.stopCount); - free(stops); - } - if (node->mStroke.enable) - evas_vg_shape_stroke_fill_set(shape, grad); - else - evas_vg_shape_fill_set(shape, grad); - } - break; - } - default: - break; - } - - //3: Fill Rule - if (node->mFillRule == FillEvenOdd) - efl_gfx_shape_fill_rule_set(shape, EFL_GFX_FILL_RULE_ODD_EVEN); - else if (node->mFillRule == FillWinding) - efl_gfx_shape_fill_rule_set(shape, EFL_GFX_FILL_RULE_WINDING); -} - -void LottieView::update(const std::vector &renderList) -{ - Efl_VG *root = evas_vg_container_add(mVg); - for(auto i : renderList) { - createVgNode(i, root); - } - evas_object_vg_root_node_set(mVg, root); -} - -void LottieView::updateTree(const LOTLayerNode * node) -{ - Efl_VG *root = evas_vg_container_add(mVg); - update(node, root); - evas_object_vg_root_node_set(mVg, root); -} - -void LottieView::update(const LOTLayerNode * node, Efl_VG *parent) -{ - // if the layer is invisible return - if (!node->mVisible) return; - - // check if this layer is a container layer - bool hasMatte = false; - if (node->mLayerList.size) { - for (unsigned int i = 0; i < node->mLayerList.size; i++) { - if (hasMatte) { - hasMatte = false; - continue; - } - // if the layer has matte then - // the next layer has to be rendered using this layer - // as matte source - if (node->mLayerList.ptr[i]->mMatte != MatteNone) { - hasMatte = true; - printf("Matte is not supported Yet\n"); - continue; - } - update(node->mLayerList.ptr[i], parent); - } - } - - // check if this layer has drawable - if (node->mNodeList.size) { - for (unsigned int i = 0; i < node->mNodeList.size; i++) { - createVgNode(node->mNodeList.ptr[i], parent); - } - } -} - -static void mImageDelCb(void *data, Evas *evas, Evas_Object *obj, void *) -{ - LottieView *lottie = (LottieView *)data; - - if (lottie->mImage != obj) return; - - lottie->mImage = NULL; - lottie->stop(); -} - -static void mVgDelCb(void *data, Evas *evas, Evas_Object *obj, void *) -{ - LottieView *lottie = (LottieView *)data; - if (lottie->mVg != obj) return; - - lottie->mVg = NULL; - lottie->stop(); -} - -void LottieView::initializeBufferObject(Evas *evas) -{ - if (mRenderMode) { - mImage = evas_object_image_filled_add(evas); - evas_object_image_colorspace_set(mImage, EVAS_COLORSPACE_ARGB8888); - evas_object_image_alpha_set(mImage, EINA_TRUE); - evas_object_event_callback_add(mImage, EVAS_CALLBACK_DEL, mImageDelCb, this); - } else { - mVg = evas_object_vg_add(evas); - evas_object_event_callback_add(mVg, EVAS_CALLBACK_DEL, mVgDelCb, this); - } -} - -LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr) -{ - mPlayer = nullptr; +LottieView::LottieView(Evas *evas, Strategy s) { mPalying = false; mReverse = false; mRepeatCount = 0; @@ -257,86 +42,66 @@ LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullpt mLoop = false; mSpeed = 1; - mEvas = evas; - mRenderMode = renderMode; - mAsyncRender = asyncRender; - - initializeBufferObject(evas); + switch (s) { + case Strategy::renderCpp: { + mRenderDelegate = std::make_unique(evas); + break; + } + case Strategy::renderCppAsync: { + mRenderDelegate = std::make_unique(evas); + break; + } + case Strategy::renderC: { + mRenderDelegate = std::make_unique(evas); + break; + } + case Strategy::renderCAsync: { + mRenderDelegate = std::make_unique(evas); + break; + } + case Strategy::eflVg: { + mRenderDelegate = std::make_unique(evas); + break; + } + default: + mRenderDelegate = std::make_unique(evas); + break; + } } LottieView::~LottieView() { - if (mRenderTask.valid()) - mRenderTask.get(); - if (mAnimator) ecore_animator_del(mAnimator); - if (mVg) evas_object_del(mVg); - if (mImage) evas_object_del(mImage); } Evas_Object *LottieView::getImage() { - if (mRenderMode) { - return mImage; - } else { - return mVg; - } + return mRenderDelegate->renderObject(); } void LottieView::show() { - if (mRenderMode) { - evas_object_show(mImage); - } else { - evas_object_show(mVg); - } + mRenderDelegate->show(); seek(0); } void LottieView::hide() { - if (mRenderMode) { - evas_object_hide(mImage); - } else { - evas_object_hide(mVg); - } + mRenderDelegate->hide(); } void LottieView::seek(float pos) { - if (!mPlayer) return; + if (!mRenderDelegate) return; mPos = mapProgress(pos); // check if the pos maps to the current frame - if (mCurFrame == mPlayer->frameAtPos(mPos)) return; + if (mCurFrame == mRenderDelegate->frameAtPos(mPos)) return; - mCurFrame = mPlayer->frameAtPos(mPos); + mCurFrame = mRenderDelegate->frameAtPos(mPos); - if (mRenderMode) { - int width , height; - evas_object_image_size_get(mImage, &width, &height); - if (mAsyncRender) { - if (mRenderTask.valid()) return; - mDirty = true; - auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); - size_t bytesperline = evas_object_image_stride_get(mImage); - rlottie::Surface surface(buffer, width, height, bytesperline); - mRenderTask = mPlayer->render(mCurFrame, surface); - // to force a redraw - evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); - } else { - auto buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE); - size_t bytesperline = evas_object_image_stride_get(mImage); - rlottie::Surface surface(buffer, width, height, bytesperline); - mPlayer->renderSync(mCurFrame, surface); - evas_object_image_data_set(mImage, surface.buffer()); - evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); - } - } else { - const LOTLayerNode *root = mPlayer->renderTree(mCurFrame, mw, mh); - updateTree(root); - } + mRenderDelegate->renderRequest(mCurFrame); } float LottieView::getPos() @@ -346,57 +111,27 @@ float LottieView::getPos() void LottieView::render() { - if (!mPlayer) return; - - if (!mDirty) return; - mDirty = false; - - if (mRenderMode) { - if (!mRenderTask.valid()) return; - auto surface = mRenderTask.get(); - evas_object_image_data_set(mImage, surface.buffer()); - evas_object_image_data_update_add(mImage, 0 , 0, surface.width(), surface.height()); - } + mRenderDelegate->renderFlush(); } void LottieView::setFilePath(const char *filePath) { - if (mPlayer = Animation::loadFromFile(filePath)) { - mFrameRate = mPlayer->frameRate(); - mTotalFrame = mPlayer->totalFrame(); - } else { - printf("load failed file %s\n", filePath); - } + mRenderDelegate->loadFromFile(filePath); } void LottieView::loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) { - if (mPlayer = Animation::loadFromData(jsonData, key, resourcePath)) { - mFrameRate = mPlayer->frameRate(); - mTotalFrame = mPlayer->totalFrame(); - } else { - printf("load failed from data key : %s\n", key.c_str()); - } + mRenderDelegate->loadFromData(jsonData, key, resourcePath); } void LottieView::setSize(int w, int h) { - mw = w; mh = h; - - if (mRenderMode) { - evas_object_resize(mImage, w, h); - evas_object_image_size_set(mImage, w, h); - } else { - evas_object_resize(mVg, w, h); - } + mRenderDelegate->resize(w, h); } + void LottieView::setPos(int x, int y) { - if (mRenderMode) { - evas_object_move(mImage, x, y); - } else { - evas_object_move(mVg, x, y); - } + mRenderDelegate->setPos(x, y); } void LottieView::finished() @@ -421,8 +156,6 @@ void LottieView::setRepeatMode(LottieView::RepeatMode mode) void LottieView::play() { - if (!mPlayer) return; - if (mAnimator) ecore_animator_del(mAnimator); mAnimator = ecore_animator_timeline_add(duration()/mSpeed, animator, this); mReverse = false; @@ -446,8 +179,6 @@ void LottieView::stop() void LottieView::restart() { - if (!mPlayer) return; - mCurCount--; if (mLoop || mRepeatCount) { if (mRepeatMode == LottieView::RepeatMode::Reverse) diff --git a/example/lottieview.h b/example/lottieview.h index f979c56a9c..a0425236a2 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -36,6 +36,244 @@ #include "rlottie_capi.h" #include #include + +class RenderStrategy { +public: + virtual ~RenderStrategy() { + evas_object_del(renderObject()); + } + RenderStrategy(Evas_Object *obj):_renderObject(obj){} + virtual void loadFromFile(const char *filePath) = 0; + virtual void loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) = 0; + virtual size_t totalFrame() = 0; + virtual double frameRate() = 0; + virtual size_t frameAtPos(double pos) = 0; + virtual double duration() = 0; + virtual void renderRequest(int frame) = 0; + virtual void renderFlush() {} + virtual void resize(int width, int height) = 0; + virtual void setPos(int x, int y) {evas_object_move(renderObject(), x, y);} + void show() {evas_object_show(_renderObject);} + void hide() {evas_object_hide(_renderObject);} + Evas_Object* renderObject() const {return _renderObject;} +private: + Evas_Object *_renderObject; +}; + +class CppApiBase : public RenderStrategy { +public: + CppApiBase(Evas_Object *renderObject): RenderStrategy(renderObject) {} + + void loadFromFile(const char *filePath) + { + mPlayer = rlottie::Animation::loadFromFile(filePath); + + if (!mPlayer) { + printf("load failed file %s\n", filePath); + } + } + + void loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) + { + mPlayer = rlottie::Animation::loadFromData(jsonData, key, resourcePath); + if (!mPlayer) { + printf("load failed from data\n"); + } + } + + size_t totalFrame() { + return mPlayer->totalFrame(); + + } + double duration() { + return mPlayer->duration(); + } + + double frameRate() { + return mPlayer->frameRate(); + } + + size_t frameAtPos(double pos) { + return mPlayer->frameAtPos(pos); + } +protected: + std::unique_ptr mPlayer; +}; + +class RlottieRenderStrategyCBase : public RenderStrategy { +public: + RlottieRenderStrategyCBase(Evas *evas):RenderStrategy(evas_object_image_filled_add(evas)) { + evas_object_image_colorspace_set(renderObject(), EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(renderObject(), EINA_TRUE); + } + void resize(int width, int height) { + evas_object_resize(renderObject(), width, height); + evas_object_image_size_set(renderObject(), width, height); + } +}; + +class RlottieRenderStrategy : public CppApiBase { +public: + RlottieRenderStrategy(Evas *evas):CppApiBase(evas_object_image_filled_add(evas)) { + evas_object_image_colorspace_set(renderObject(), EVAS_COLORSPACE_ARGB8888); + evas_object_image_alpha_set(renderObject(), EINA_TRUE); + } + void resize(int width, int height) { + evas_object_resize(renderObject(), width, height); + evas_object_image_size_set(renderObject(), width, height); + } +}; + +class RlottieRenderStrategy_CPP : public RlottieRenderStrategy { +public: + RlottieRenderStrategy_CPP(Evas *evas):RlottieRenderStrategy(evas) {} + + void renderRequest(int frame) { + int width , height; + Evas_Object *image = renderObject(); + evas_object_image_size_get(image, &width, &height); + auto buffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE); + size_t bytesperline = evas_object_image_stride_get(image); + rlottie::Surface surface(buffer, width, height, bytesperline); + mPlayer->renderSync(frame, surface); + evas_object_image_data_set(image, surface.buffer()); + evas_object_image_data_update_add(image, 0 , 0, surface.width(), surface.height()); + } +}; + +class RlottieRenderStrategy_CPP_ASYNC : public RlottieRenderStrategy_CPP { +public: + RlottieRenderStrategy_CPP_ASYNC(Evas *evas):RlottieRenderStrategy_CPP(evas) {} + ~RlottieRenderStrategy_CPP_ASYNC() { + if (mRenderTask.valid()) + mRenderTask.get(); + } + void renderRequest(int frame) { + if (mRenderTask.valid()) return; + mDirty = true; + int width , height; + Evas_Object *image = renderObject(); + evas_object_image_size_get(image, &width, &height); + auto buffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE); + size_t bytesperline = evas_object_image_stride_get(image); + rlottie::Surface surface(buffer, width, height, bytesperline); + mRenderTask = mPlayer->render(frame, surface); + // to force a redraw + evas_object_image_data_update_add(renderObject(), 0 , 0, surface.width(), surface.height()); + } + + void renderFlush() { + if (!mDirty) return; + + if (!mRenderTask.valid()) return; + + auto surface = mRenderTask.get(); + evas_object_image_data_set(renderObject(), surface.buffer()); + evas_object_image_data_update_add(renderObject(), 0 , 0, surface.width(), surface.height()); + mDirty = false; + } +private: + std::future mRenderTask; + bool mDirty{true}; +}; + + +class RlottieRenderStrategy_C : public RlottieRenderStrategyCBase { +public: + RlottieRenderStrategy_C(Evas *evas):RlottieRenderStrategyCBase(evas) {} + ~RlottieRenderStrategy_C() { + if (mPlayer) lottie_animation_destroy(mPlayer); + } + void loadFromFile(const char *filePath) + { + mPlayer = lottie_animation_from_file(filePath); + + if (!mPlayer) { + printf("load failed file %s\n", filePath); + } + } + + void loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) + { + mPlayer = lottie_animation_from_data(jsonData.c_str(), key.c_str(), resourcePath.c_str()); + if (!mPlayer) { + printf("load failed from data\n"); + } + } + + size_t totalFrame() { + return lottie_animation_get_totalframe(mPlayer); + + } + + double frameRate() { + return lottie_animation_get_framerate(mPlayer); + } + + size_t frameAtPos(double pos) { + return lottie_animation_get_frame_at_pos(mPlayer, pos); + } + + double duration() { + return lottie_animation_get_duration(mPlayer); + } + + void renderRequest(int frame) { + int width , height; + Evas_Object *image = renderObject(); + evas_object_image_size_get(image, &width, &height); + auto buffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE); + size_t bytesperline = evas_object_image_stride_get(image); + lottie_animation_render_async(mPlayer, frame, buffer, width, height, bytesperline); + lottie_animation_render_flush(mPlayer); + evas_object_image_data_set(image, buffer); + evas_object_image_data_update_add(image, 0 , 0, width, height); + } + +protected: + Lottie_Animation *mPlayer; +}; + +class RlottieRenderStrategy_C_ASYNC : public RlottieRenderStrategy_C { +public: + RlottieRenderStrategy_C_ASYNC(Evas *evas):RlottieRenderStrategy_C(evas) {} + ~RlottieRenderStrategy_C_ASYNC() { + if (mDirty) lottie_animation_render_flush(mPlayer); + } + void renderRequest(int frame) { + if (mDirty) return; + mDirty = true; + Evas_Object *image = renderObject(); + evas_object_image_size_get(image, &mWidth, &mHeight); + mBuffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE); + size_t bytesperline = evas_object_image_stride_get(image); + lottie_animation_render_async(mPlayer, frame, mBuffer, mWidth, mHeight, bytesperline); + // to force a redraw + evas_object_image_data_update_add(renderObject(), 0 , 0, mWidth, mWidth); + } + + void renderFlush() { + if (!mDirty) return; + lottie_animation_render_flush(mPlayer); + evas_object_image_data_set(renderObject(), mBuffer); + evas_object_image_data_update_add(renderObject(), 0 , 0, mWidth, mHeight); + mDirty = false; + } +private: + uint32_t * mBuffer; + int mWidth; + int mHeight; + bool mDirty{false}; +}; + +enum class Strategy { + renderCpp = 0, + renderCppAsync, + renderC, + renderCAsync, + eflVg +}; + class LottieView { public: @@ -43,7 +281,7 @@ public: Restart, Reverse }; - LottieView(Evas *evas, bool renderMode = true, bool asyncRender = true); + LottieView(Evas *evas, Strategy s = Strategy::renderCppAsync); ~LottieView(); Evas_Object *getImage(); void setSize(int w, int h); @@ -56,8 +294,8 @@ public: void setSpeed(float speed) { mSpeed = speed;} void setRepeatCount(int count); void setRepeatMode(LottieView::RepeatMode mode); - float getFrameRate() const { return mFrameRate; } - long getTotalFrame() const { return mTotalFrame; } + float getFrameRate() const { return mRenderDelegate->frameRate(); } + long getTotalFrame() const { return mRenderDelegate->totalFrame(); } public: void seek(float pos); float getPos(); @@ -93,7 +331,7 @@ private: float duration() const { // usually we run the animation for mPlayer->duration() // but now run animation for segmented duration. - return mPlayer->duration() * fabs(mMaxprogress - mMinProgress); + return mRenderDelegate->duration() * fabs(mMaxprogress - mMinProgress); } void createVgNode(LOTNode *node, Efl_VG *root); void update(const std::vector &); @@ -101,41 +339,220 @@ private: void update(const LOTLayerNode *, Efl_VG *parent); void restart(); public: - int mw; - int mh; - Evas *mEvas; - Efl_VG *mRoot; - Evas_Object *mVg; int mRepeatCount; LottieView::RepeatMode mRepeatMode; - std::unique_ptr mPlayer; size_t mCurFrame{UINT_MAX}; Ecore_Animator *mAnimator{nullptr}; bool mLoop; int mCurCount; bool mReverse; bool mPalying; - Evas_Object *mImage; float mSpeed; - bool mRenderMode; - bool mAsyncRender; - bool mDirty; float mPos; - float mFrameRate; - long mTotalFrame; - std::future mRenderTask; - //keep a segment of the animation default is [0, 1] float mMinProgress{0}; float mMaxprogress{1}; + std::unique_ptr mRenderDelegate; }; -class LottieViewCApi -{ + +class EflVgRenderStrategy : public CppApiBase { + int mW; + int mH; public: -private: - Evas *mEvas; - Lottie_Animation *mAnimation; + EflVgRenderStrategy(Evas *evas):CppApiBase(evas_object_vg_add(evas)) {} + + void resize(int width, int height) { + mW = width; + mH = height; + evas_object_resize(renderObject(), width, height); + } + + void renderRequest(int frame) { + const LOTLayerNode *root = mPlayer->renderTree(frame, mW, mH); + updateTree(root); + } + + void updateTree(const LOTLayerNode * node) + { + Efl_VG *root = evas_vg_container_add(renderObject()); + update(node, root); + evas_object_vg_root_node_set(renderObject(), root); + } + + void createVgNode(LOTNode *node, Efl_VG *root) + { + Efl_VG *shape = evas_vg_shape_add(root); + + //0: Path + const float *data = node->mPath.ptPtr; + if (!data) return; + + for (int i = 0; i < node->mPath.elmCount; i++) { + switch (node->mPath.elmPtr[i]) { + case 0: + evas_vg_shape_append_move_to(shape, data[0], data[1]); + data += 2; + break; + case 1: + evas_vg_shape_append_line_to(shape, data[0], data[1]); + data += 2; + break; + case 2: + evas_vg_shape_append_cubic_to(shape, data[0], data[1], data[2], data[3], data[4], data[5]); + data += 6; + break; + case 3: + evas_vg_shape_append_close(shape); + break; + default: + break; + } + } + + //1: Stroke + if (node->mStroke.enable) { + //Stroke Width + evas_vg_shape_stroke_width_set(shape, node->mStroke.width); + + //Stroke Cap + Efl_Gfx_Cap cap; + switch (node->mStroke.cap) { + case CapFlat: cap = EFL_GFX_CAP_BUTT; break; + case CapSquare: cap = EFL_GFX_CAP_SQUARE; break; + case CapRound: cap = EFL_GFX_CAP_ROUND; break; + default: cap = EFL_GFX_CAP_BUTT; break; + } + evas_vg_shape_stroke_cap_set(shape, cap); + + //Stroke Join + Efl_Gfx_Join join; + switch (node->mStroke.join) { + case JoinMiter: join = EFL_GFX_JOIN_MITER; break; + case JoinBevel: join = EFL_GFX_JOIN_BEVEL; break; + case JoinRound: join = EFL_GFX_JOIN_ROUND; break; + default: join = EFL_GFX_JOIN_MITER; break; + } + evas_vg_shape_stroke_join_set(shape, join); + + //Stroke Dash + if (node->mStroke.dashArraySize > 0) { + int size = (node->mStroke.dashArraySize / 2); + Efl_Gfx_Dash *dash = static_cast(malloc(sizeof(Efl_Gfx_Dash) * size)); + if (dash) { + for (int i = 0; i <= size; i+=2) { + dash[i].length = node->mStroke.dashArray[i]; + dash[i].gap = node->mStroke.dashArray[i + 1]; + } + evas_vg_shape_stroke_dash_set(shape, dash, size); + free(dash); + } + } + } + + //2: Fill Method + switch (node->mBrushType) { + case BrushSolid: { + float pa = ((float)node->mColor.a) / 255; + int r = (int)(((float) node->mColor.r) * pa); + int g = (int)(((float) node->mColor.g) * pa); + int b = (int)(((float) node->mColor.b) * pa); + int a = node->mColor.a; + if (node->mStroke.enable) + evas_vg_shape_stroke_color_set(shape, r, g, b, a); + else + evas_vg_node_color_set(shape, r, g, b, a); + break; + } + case BrushGradient: { + Efl_VG* grad = NULL; + if (node->mGradient.type == GradientLinear) { + grad = evas_vg_gradient_linear_add(root); + evas_vg_gradient_linear_start_set(grad, node->mGradient.start.x, node->mGradient.start.y); + evas_vg_gradient_linear_end_set(grad, node->mGradient.end.x, node->mGradient.end.y); + + } + else if (node->mGradient.type == GradientRadial) { + grad = evas_vg_gradient_radial_add(root); + evas_vg_gradient_radial_center_set(grad, node->mGradient.center.x, node->mGradient.center.y); + evas_vg_gradient_radial_focal_set(grad, node->mGradient.focal.x, node->mGradient.focal.y); + evas_vg_gradient_radial_radius_set(grad, node->mGradient.cradius); + } + + if (grad) { + //Gradient Stop + Efl_Gfx_Gradient_Stop* stops = static_cast(malloc(sizeof(Efl_Gfx_Gradient_Stop) * node->mGradient.stopCount)); + if (stops) { + for (unsigned int i = 0; i < node->mGradient.stopCount; i++) { + stops[i].offset = node->mGradient.stopPtr[i].pos; + float pa = ((float)node->mGradient.stopPtr[i].a) / 255; + stops[i].r = (int)(((float)node->mGradient.stopPtr[i].r) * pa); + stops[i].g = (int)(((float)node->mGradient.stopPtr[i].g) * pa); + stops[i].b = (int)(((float)node->mGradient.stopPtr[i].b) * pa); + stops[i].a = node->mGradient.stopPtr[i].a; + } + evas_vg_gradient_stop_set(grad, stops, node->mGradient.stopCount); + free(stops); + } + if (node->mStroke.enable) + evas_vg_shape_stroke_fill_set(shape, grad); + else + evas_vg_shape_fill_set(shape, grad); + } + break; + } + default: + break; + } + + //3: Fill Rule +// if (node->mFillRule == FillEvenOdd) +// efl_gfx_shape_fill_rule_set(shape, EFL_GFX_FILL_RULE_ODD_EVEN); +// else if (node->mFillRule == FillWinding) +// efl_gfx_shape_fill_rule_set(shape, EFL_GFX_FILL_RULE_WINDING); + } + + void update(const std::vector &renderList) + { + Efl_VG *root = evas_vg_container_add(renderObject()); + for(auto i : renderList) { + createVgNode(i, root); + } + evas_object_vg_root_node_set(renderObject(), root); + } + + void update(const LOTLayerNode * node, Efl_VG *parent) + { + // if the layer is invisible return + if (!node->mVisible) return; + + // check if this layer is a container layer + bool hasMatte = false; + if (node->mLayerList.size) { + for (unsigned int i = 0; i < node->mLayerList.size; i++) { + if (hasMatte) { + hasMatte = false; + continue; + } + // if the layer has matte then + // the next layer has to be rendered using this layer + // as matte source + if (node->mLayerList.ptr[i]->mMatte != MatteNone) { + hasMatte = true; + printf("Matte is not supported Yet\n"); + continue; + } + update(node->mLayerList.ptr[i], parent); + } + } + + // check if this layer has drawable + if (node->mNodeList.size) { + for (unsigned int i = 0; i < node->mNodeList.size; i++) { + createVgNode(node->mNodeList.ptr[i], parent); + } + } + } }; #endif //LOTTIEVIEW_H diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 2d6bd4086a..858bc760cf 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -147,7 +147,7 @@ create_layout(Evas_Object *parent, const char *file) elm_layout_file_set(layout, edjPath.c_str(), "layout"); //LOTTIEVIEW - LottieView *view = new LottieView(evas_object_evas_get(layout), renderMode); + LottieView *view = new LottieView(evas_object_evas_get(layout), Strategy::renderCppAsync); view->setFilePath(file); view->setSize(500, 500); diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 8eb4dbb057..843c6f7f1d 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -35,10 +35,9 @@ using namespace std; class LottieViewTest { public: - LottieViewTest(EvasApp *app, bool renderMode) { + LottieViewTest(EvasApp *app, Strategy st) { + mStrategy = st; mApp = app; - mRenderMode = renderMode; - ecore_animator_frametime_set(1.0/120.0); } void show(int numberOfImage) { @@ -56,7 +55,7 @@ public: int resourceSize = resource.size(); for (int i = 0 ; i < numberOfImage; i++) { int index = i % resourceSize; - std::unique_ptr view(new LottieView(mApp->evas(), mRenderMode)); + std::unique_ptr view(new LottieView(mApp->evas(), mStrategy)); view->setFilePath(resource[index].c_str()); view->setPos(posx, posy); view->setSize(vw, vh); @@ -85,7 +84,7 @@ public: public: EvasApp *mApp; - bool mRenderMode = false; + Strategy mStrategy; std::vector> mViews; }; @@ -106,16 +105,31 @@ onRenderPreCb(void *data, void *extra) int main(int argc, char **argv) { + if (argc > 1) { + if (!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h")) { + printf("Usage ./lottieviewTest 1 \n"); + printf("\t 0 - Test Lottie SYNC Renderer with CPP API\n"); + printf("\t 1 - Test Lottie ASYNC Renderer with CPP API\n"); + printf("\t 2 - Test Lottie SYNC Renderer with C API\n"); + printf("\t 3 - Test Lottie ASYNC Renderer with C API\n"); + printf("\t 4 - Test Lottie Tree Api using Efl VG Render\n"); + printf("\t Default is ./lottieviewTest 1 \n"); + return 0; + } + } else { + printf("Run ./lottieviewTest -h for more option\n"); + } + EvasApp *app = new EvasApp(800, 800); app->setup(); - bool renderMode = true; + Strategy st = Strategy::renderCppAsync; if (argc > 1) { - if (!strcmp(argv[1],"--disable-render")) - renderMode = false; + int option = atoi(argv[1]); + st = static_cast(option); } - LottieViewTest *view = new LottieViewTest(app, renderMode); - view->show(250); + LottieViewTest *view = new LottieViewTest(app, st); + view->show(150); app->addExitCb(onExitCb, view); app->addRenderPreCb(onRenderPreCb, view); diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index 73d8ce8653..aaba0ac416 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -57,7 +57,7 @@ public: private: void show() { - mView = std::make_unique(mApp->evas(), mRenderMode); + mView = std::make_unique(mApp->evas(), Strategy::renderCAsync); mView->setFilePath(mResourceList[mCurIndex].c_str()); mView->setPos(0, 0); mView->setSize(mApp->width(), mApp->height()); From 7e8884fc0010599ccefa662de4b438da1d83ce7d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 18 Apr 2019 16:03:21 +0900 Subject: [PATCH 448/672] rlottie: Fix issue with repeater object. Below issues are fixed 1. when repeater has 0 copies. 2. when "copies" property has animation. 3. Wrong matrix computation when repeater transformation has anchor value. Fixed abstract_circle.json resource. --- src/lottie/lottieitem.cpp | 40 +++++++++++++++++++++++++++---------- src/lottie/lottieitem.h | 5 ++++- src/lottie/lottiemodel.cpp | 5 +++-- src/lottie/lottiemodel.h | 2 ++ src/lottie/lottieparser.cpp | 14 ++++++++++++- 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 22466311d7..e3ac115d2a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1383,7 +1383,9 @@ LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) LOTGroupData *root = reinterpret_cast(mData->mChildren[0].get()); assert(root); - for (int i= 0; i < mData->copies(0); i++) { + mCopies = mData->maxCopies(); + + for (int i= 0; i < mCopies; i++) { auto content = std::make_unique(static_cast(root)); content->setParent(this); mContents.push_back(std::move(content)); @@ -1395,27 +1397,43 @@ void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, float par DirtyFlag newFlag = flag; + float copies = mData->copies(frameNo); + int visibleCopies = int(copies); + + if (visibleCopies == 0) { + mHidden = true; + return; + } else { + mHidden = false; + } + if (mData->hasMtrixChange(frameNo)) { newFlag |= DirtyFlagBit::Matrix; } - float multiplier = mData->offset(frameNo); + float offset = mData->offset(frameNo); float startOpacity = mData->mTransform->startOpacity(frameNo); float endOpacity = mData->mTransform->endOpacity(frameNo); - float index = 0; - float copies = mData->copies(frameNo); - if (!vCompare(copies, 1)) copies -=1; newFlag |= DirtyFlagBit::Alpha; - for (const auto &content : mContents) { - float newAlpha = parentAlpha * lerp(startOpacity, endOpacity, index / copies); - VMatrix result = mData->mTransform->matrixForRepeater(frameNo, multiplier) * parentMatrix; - content->update(frameNo, result, newAlpha, newFlag); - multiplier += 1; - index +=1; + + for (int i = 0; i < mCopies; ++i) { + float newAlpha = parentAlpha * lerp(startOpacity, endOpacity, i / copies); + + // hide rest of the copies , @TODO find a better solution. + if ( i >= visibleCopies) newAlpha = 0; + + VMatrix result = mData->mTransform->matrixForRepeater(frameNo, i + offset) * parentMatrix; + mContents[i]->update(frameNo, result, newAlpha, newFlag); } } +void LOTRepeaterItem::renderList(std::vector &list) +{ + if (mHidden) return; + return LOTContentGroupItem::renderList(list); +} + static void updateGStops(LOTNode *n, const VGradient *grad) { if (grad->mStops.size() != n->mGradient.stopCount) { diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index bdf13626b1..88bab8da91 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -268,7 +268,7 @@ public: void applyTrim(); void processTrimItems(std::vector &list); void processPaintItems(std::vector &list); - void renderList(std::vector &list) final; + void renderList(std::vector &list); const VMatrix & matrix() const { return mMatrix;} protected: LOTGroupData *mData{nullptr}; @@ -488,8 +488,11 @@ class LOTRepeaterItem : public LOTContentGroupItem public: LOTRepeaterItem(LOTRepeaterData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + void renderList(std::vector &list) final; private: LOTRepeaterData *mData; + bool mHidden{false}; + int mCopies{0}; }; diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index 7ebed12e7b..aee0c4974d 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -94,9 +94,10 @@ VMatrix LOTTransformData::matrixForRepeater(int frameNo, float multiplier) const scale.setY(std::pow(scale.y(), multiplier)); VMatrix m; m.translate(mPosition.value(frameNo) * multiplier) - .rotate(mRotation.value(frameNo) * multiplier) .scale(scale) - .translate(mAnchor.value(frameNo)); + .translate(mAnchor.value(frameNo)) + .rotate(mRotation.value(frameNo) * multiplier) + .translate(-mAnchor.value(frameNo)); return m; } diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 376b873d5e..f9f38ccf58 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -821,11 +821,13 @@ public: bool hasMtrixChange(int /*frameNo*/) const { return !(mTransform->isStatic() && mOffset.isStatic()); } + int maxCopies() const { return int(mMaxCopies);} float copies(int frameNo) const {return mCopies.value(frameNo);} float offset(int frameNo) const {return mOffset.value(frameNo);} public: LOTAnimatable mCopies{0}; LOTAnimatable mOffset{0}; + float mMaxCopies{0.0}; }; class LOTModel diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index f55fba8237..9afdc2d54e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1282,6 +1282,18 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "c")) { parseProperty(obj->mCopies); + float maxCopy= 0.0; + if (!obj->mCopies.isStatic()) { + for(auto &keyFrame : obj->mCopies.mAnimInfo->mKeyFrames) { + if (maxCopy < keyFrame.mValue.mStartValue) + maxCopy = keyFrame.mValue.mStartValue; + if (maxCopy < keyFrame.mValue.mEndValue) + maxCopy = keyFrame.mValue.mEndValue; + } + } else { + maxCopy = obj->mCopies.mValue; + } + obj->mMaxCopies = maxCopy; } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOffset); } else if (0 == strcmp(key, "tr")) { @@ -2109,7 +2121,7 @@ public: case LOTData::Type::Repeater: { auto r = static_cast(obj); vDebug << level << "{ Repeater: a:" << !obj->isStatic() - << ", copies:" << r->copies(0) + << ", copies:" << r->maxCopies() << ", offset:" << r->offset(0); visitChildren(static_cast(obj), level); vDebug << level << "} Repeater"; From fb1b68146af4d9c73b0208906746090fed2a4930 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 19 Apr 2019 09:25:47 +0900 Subject: [PATCH 449/672] lottie: fixed issue with anchor property in repeater transformation --- src/lottie/lottiemodel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index aee0c4974d..f5939e4900 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -94,10 +94,11 @@ VMatrix LOTTransformData::matrixForRepeater(int frameNo, float multiplier) const scale.setY(std::pow(scale.y(), multiplier)); VMatrix m; m.translate(mPosition.value(frameNo) * multiplier) - .scale(scale) .translate(mAnchor.value(frameNo)) + .scale(scale) .rotate(mRotation.value(frameNo) * multiplier) .translate(-mAnchor.value(frameNo)); + return m; } From 055326ee6e5d09c403e2be60d7b88fb879f9b498 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 16 Apr 2019 15:04:53 +0900 Subject: [PATCH 450/672] lottie: Added proxymodel to support dynamic property change. --- src/lottie/CMakeLists.txt | 1 + src/lottie/lottieitem.cpp | 26 +++++++----------- src/lottie/lottieitem.h | 22 +++++++-------- src/lottie/lottiemodel.h | 4 ++- src/lottie/lottieproxymodel.cpp | 0 src/lottie/lottieproxymodel.h | 47 +++++++++++++++++++++++++++++++++ src/lottie/meson.build | 1 + 7 files changed, 71 insertions(+), 30 deletions(-) create mode 100644 src/lottie/lottieproxymodel.cpp create mode 100644 src/lottie/lottieproxymodel.h diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt index 7261d43762..a81356b546 100644 --- a/src/lottie/CMakeLists.txt +++ b/src/lottie/CMakeLists.txt @@ -4,6 +4,7 @@ target_sources(rlottie "${CMAKE_CURRENT_LIST_DIR}/lottieitem.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieloader.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottiemodel.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottieproxymodel.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieparser.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieanimation.cpp" ) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index e3ac115d2a..2da69815b6 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1151,16 +1151,13 @@ void LOTPaintDataItem::addPathItems(std::vector &list, int st LOTFillItem::LOTFillItem(LOTFillData *data) - : LOTPaintDataItem(data->isStatic()), mData(data) + : LOTPaintDataItem(data->isStatic()), mModel(data) { } void LOTFillItem::updateContent(int frameNo) { - LottieColor c = mData->mColor.value(frameNo); - float opacity = mData->opacity(frameNo); - mColor = c.toColor(opacity); - mFillRule = mData->fillRule(); + mColor = mModel.color(frameNo).toColor(mModel.opacity(frameNo)); } void LOTFillItem::updateRenderNode() @@ -1170,7 +1167,7 @@ void LOTFillItem::updateRenderNode() color.setAlpha(color.a * parentAlpha()); VBrush brush(color); mDrawable->setBrush(brush); - mDrawable->setFillRule(mFillRule); + mDrawable->setFillRule(mModel.fillRule()); } LOTGFillItem::LOTGFillItem(LOTGFillData *data) @@ -1194,22 +1191,17 @@ void LOTGFillItem::updateRenderNode() } LOTStrokeItem::LOTStrokeItem(LOTStrokeData *data) - : LOTPaintDataItem(data->isStatic()), mData(data) + : LOTPaintDataItem(data->isStatic()), mModel(data) { mDashArraySize = 0; } void LOTStrokeItem::updateContent(int frameNo) { - LottieColor c = mData->mColor.value(frameNo); - float opacity = mData->opacity(frameNo); - mColor = c.toColor(opacity); - mCap = mData->capStyle(); - mJoin = mData->joinStyle(); - mMiterLimit = mData->meterLimit(); - mWidth = mData->width(frameNo); - if (mData->hasDashInfo()) { - mDashArraySize = mData->getDashInfo(frameNo, mDashArray); + mColor = mModel.color(frameNo).toColor(mModel.opacity(frameNo)); + mWidth = mModel.strokeWidth(frameNo); + if (mModel.hasDashInfo()) { + mDashArraySize = mModel.getDashInfo(frameNo, mDashArray); } } @@ -1233,7 +1225,7 @@ void LOTStrokeItem::updateRenderNode() VBrush brush(color); mDrawable->setBrush(brush); float scale = getScale(static_cast(parent())->matrix()); - mDrawable->setStrokeInfo(mCap, mJoin, mMiterLimit, + mDrawable->setStrokeInfo(mModel.capStyle(), mModel.joinStyle(), mModel.meterLimit(), mWidth * scale); if (mDashArraySize) { for (int i = 0 ; i < mDashArraySize ; i++) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 88bab8da91..365bbd0752 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -19,10 +19,10 @@ #ifndef LOTTIEITEM_H #define LOTTIEITEM_H -#include #include #include +#include"lottieproxymodel.h" #include"vmatrix.h" #include"vpath.h" #include"vpoint.h" @@ -46,6 +46,7 @@ class LOTLayerItem; class LOTMaskItem; class VDrawable; + class LOTCompItem { public: @@ -398,9 +399,8 @@ protected: void updateContent(int frameNo) final; void updateRenderNode() final; private: - LOTFillData *mData; - VColor mColor; - FillRule mFillRule{FillRule::Winding}; + LOTProxyModel mModel; + VColor mColor; }; class LOTGFillItem : public LOTPaintDataItem @@ -425,14 +425,12 @@ protected: void updateContent(int frameNo) final; void updateRenderNode() final; private: - LOTStrokeData *mData; - CapStyle mCap{CapStyle::Flat}; - JoinStyle mJoin{JoinStyle::Miter}; - float mMiterLimit{0}; - VColor mColor; - float mWidth{0}; - float mDashArray[6]; - int mDashArraySize{0}; + LOTProxyModel mModel; + LOTStrokeData *mData; + VColor mColor; + float mWidth{0}; + float mDashArray[6]; + int mDashArraySize{0}; }; class LOTGStrokeItem : public LOTPaintDataItem diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index f9f38ccf58..8f4cd93e26 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -519,6 +519,7 @@ class LOTFillData : public LOTData { public: LOTFillData():LOTData(LOTData::Type::Fill){} + LottieColor color(int frameNo) const {return mColor.value(frameNo);} float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} FillRule fillRule() const {return mFillRule;} public: @@ -539,8 +540,9 @@ class LOTStrokeData : public LOTData { public: LOTStrokeData():LOTData(LOTData::Type::Stroke){} + LottieColor color(int frameNo) const {return mColor.value(frameNo);} float opacity(int frameNo) const {return mOpacity.value(frameNo)/100.0;} - float width(int frameNo) const {return mWidth.value(frameNo);} + float strokeWidth(int frameNo) const {return mWidth.value(frameNo);} CapStyle capStyle() const {return mCapStyle;} JoinStyle joinStyle() const {return mJoinStyle;} float meterLimit() const{return mMeterLimit;} diff --git a/src/lottie/lottieproxymodel.cpp b/src/lottie/lottieproxymodel.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/lottie/lottieproxymodel.h b/src/lottie/lottieproxymodel.h new file mode 100644 index 0000000000..b62292af28 --- /dev/null +++ b/src/lottie/lottieproxymodel.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LOTTIEPROXYMODEL_H +#define LOTTIEPROXYMODEL_H + +#include "lottiemodel.h" + +template +class LOTProxyModel +{ +public: + LOTProxyModel(T *model): _modelData(model) {} + void addValueProvider() {/* Impement*/} + void removeValueProvider() {/* Impement*/} + bool hasValueProvider() {return false;} + LottieColor color(int frame) const { return _modelData->color(frame);} + float opacity(int frame) const { return _modelData->opacity(frame);} + FillRule fillRule() const {return _modelData->fillRule();} + + float strokeWidth(int frame) const {return _modelData->strokeWidth(frame);} + float meterLimit() const {return _modelData->meterLimit();} + CapStyle capStyle() const {return _modelData->capStyle();} + JoinStyle joinStyle() const {return _modelData->joinStyle();} + bool hasDashInfo() const { return _modelData->hasDashInfo();} + int getDashInfo(int frameNo, float *array) const {return _modelData->getDashInfo(frameNo, array);} + +private: + T *_modelData; +}; + +#endif // LOTTIEITEM_H diff --git a/src/lottie/meson.build b/src/lottie/meson.build index 1c7275f7fa..b49bbb2d56 100644 --- a/src/lottie/meson.build +++ b/src/lottie/meson.build @@ -2,6 +2,7 @@ source_file = files('lottieparser.cpp') source_file += files('lottieloader.cpp') source_file += files('lottiemodel.cpp') +source_file += files('lottieproxymodel.cpp') source_file += files('lottieanimation.cpp') source_file += files('lottieitem.cpp') From 6b9fcdf67c6e2520d341935a90c00e23f7d1c1db Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 19 Apr 2019 13:36:59 +0900 Subject: [PATCH 451/672] updated README --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 5f69b65aa2..f27e84f2f1 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,13 @@ # rlottie A platform independent standalone library that plays Lottie Animation. +For any resource test, please visit rlottie online viewer: +https://www.rlottie.com + +Query about rlottie or request troubleshooting online, please visit Gitter: +https://gitter.im/rLottie-dev/community# + + ## BUILD INSTRUCTIONS 1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) From 2433238033c6caab3a934a79cb5ea1933c2f0835 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 19 Apr 2019 13:46:18 +0900 Subject: [PATCH 452/672] update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f27e84f2f1..10fed69e42 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ # rlottie A platform independent standalone library that plays Lottie Animation. -For any resource test, please visit rlottie online viewer: +For resource test, please visit rlottie online viewer: https://www.rlottie.com Query about rlottie or request troubleshooting online, please visit Gitter: From 90affa8bd19edfbfe821cf8df25e10f5ebbf112b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 23 Apr 2019 14:59:50 +0900 Subject: [PATCH 453/672] rlottie: Added dynamic property change feature The keypath can handle globe(**) and wildchar(*) reg ex. Currently only support fillcolor , fill opacity , stroke color , stroke opacity and stroke width property. --- example/demo.cpp | 5 +- example/lottieview.h | 4 +- example/resource/dynamic_property.json | 1 + inc/rlottie.h | 84 +++++++++++++ src/lottie/CMakeLists.txt | 1 + src/lottie/lottieanimation.cpp | 36 ++++++ src/lottie/lottieitem.cpp | 142 +++++++++++++++++++++- src/lottie/lottieitem.h | 25 +++- src/lottie/lottiekeypath.cpp | 81 +++++++++++++ src/lottie/lottiekeypath.h | 45 +++++++ src/lottie/lottiemodel.h | 10 +- src/lottie/lottieparser.cpp | 78 ++++++++----- src/lottie/lottieproxymodel.h | 156 +++++++++++++++++++++++-- src/lottie/meson.build | 1 + 14 files changed, 622 insertions(+), 47 deletions(-) create mode 100755 example/resource/dynamic_property.json create mode 100644 src/lottie/lottiekeypath.cpp create mode 100644 src/lottie/lottiekeypath.h diff --git a/example/demo.cpp b/example/demo.cpp index 368e29f773..48625c602e 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -45,10 +45,13 @@ main(void) app->setup(); std::string filePath = DEMO_DIR; - filePath +="3d.json"; + filePath +="circuit.json"; LottieView *view = new LottieView(app->evas()); view->setFilePath(filePath.c_str()); + if (view->player()) { + view->player()->setValue("**", rlottie::Color(0, 1, 0)); + } view->setPos(0, 0); view->setSize(800, 800); view->show(); diff --git a/example/lottieview.h b/example/lottieview.h index a0425236a2..0874e9717c 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -43,6 +43,7 @@ public: evas_object_del(renderObject()); } RenderStrategy(Evas_Object *obj):_renderObject(obj){} + virtual rlottie::Animation *player() {return nullptr;} virtual void loadFromFile(const char *filePath) = 0; virtual void loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) = 0; virtual size_t totalFrame() = 0; @@ -63,7 +64,7 @@ private: class CppApiBase : public RenderStrategy { public: CppApiBase(Evas_Object *renderObject): RenderStrategy(renderObject) {} - + rlottie::Animation *player() {return mPlayer.get();} void loadFromFile(const char *filePath) { mPlayer = rlottie::Animation::loadFromFile(filePath); @@ -283,6 +284,7 @@ public: }; LottieView(Evas *evas, Strategy s = Strategy::renderCppAsync); ~LottieView(); + rlottie::Animation *player(){return mRenderDelegate->player();} Evas_Object *getImage(); void setSize(int w, int h); void setPos(int x, int y); diff --git a/example/resource/dynamic_property.json b/example/resource/dynamic_property.json new file mode 100755 index 0000000000..ef04bd08c4 --- /dev/null +++ b/example/resource/dynamic_property.json @@ -0,0 +1 @@ +{"v":"5.4.3","fr":60,"ip":0,"op":30,"w":800,"h":800,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ABCDEFG Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[395,397,0],"ix":2},"a":{"a":0,"k":[86,-17,0],"ix":1},"s":{"a":0,"k":[343,343,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.516],[0.334,-0.269],[0.949,-0.047],[0,0],[0,0],[0,0],[0.545,0.475],[0.668,1.594],[0,0],[0,0],[0,0],[0.598,-0.563],[0.996,-0.176],[0,0],[0,0],[0,0],[0.346,0.275],[0,0.363],[-0.399,0.926],[0,0],[0,0]],"o":[[0.469,1.113],[0,0.387],[-0.334,0.27],[0,0],[0,0],[0,0],[-0.973,-0.059],[-0.545,-0.475],[0,0],[0,0],[0,0],[-0.727,1.723],[-0.293,0.281],[0,0],[0,0],[0,0],[-1.149,-0.082],[-0.346,-0.275],[0,-0.457],[0,0],[0,0],[0,0]],"v":[[17.912,-4.553],[18.615,-2.109],[18.114,-1.125],[16.189,-0.65],[16.189,0],[25.594,0],[25.594,-0.65],[23.317,-1.45],[21.498,-4.553],[13.201,-24.381],[12.586,-24.381],[4.201,-4.764],[2.215,-1.336],[0.281,-0.65],[0.281,0],[7.787,0],[7.787,-0.65],[5.546,-1.187],[5.027,-2.145],[5.625,-4.219],[7.242,-7.98],[16.471,-7.98]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[7.787,-9.281],[11.936,-18.914],[15.979,-9.281]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"A","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.727,0.943],[0,1.195],[0.926,1.072],[1.758,0.422],[1.922,0],[0,0],[0,0],[0,0],[-0.457,-0.516],[0,-1.477],[0,0],[0.269,-0.41],[0.996,0],[0,0],[0,0],[0,0],[-1.307,0.498],[-0.75,1.084],[0,1.184],[1.137,1.078],[1.652,0.352]],"o":[[0.726,-0.943],[0,-1.394],[-0.926,-1.072],[-1.16,-0.281],[0,0],[0,0],[0,0],[0.902,0],[0.34,0.387],[0,0],[0,1.336],[-0.434,0.633],[0,0],[0,0],[0,0],[2.683,0],[1.307,-0.498],[0.75,-1.084],[0,-1.558],[-0.82,-0.773],[1.418,-0.457]],"v":[[45.844,-14.265],[46.934,-17.473],[45.545,-21.173],[41.52,-23.414],[36.896,-23.836],[26.596,-23.836],[26.596,-23.186],[27.492,-23.186],[29.531,-22.412],[30.041,-19.617],[30.041,-4.219],[29.637,-1.6],[27.492,-0.65],[26.596,-0.65],[26.596,0],[37.846,0],[43.831,-0.747],[46.916,-3.12],[48.041,-6.521],[46.336,-10.477],[42.627,-12.164]],"c":true},"ix":2},"nm":"B","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-1.172,0],[-1.137,-0.984],[0,-1.394],[0.457,-0.762],[0.861,-0.369],[1.711,0],[0.556,0.041],[0.433,0.082]],"o":[[0.937,-0.258],[2.18,0],[1.137,0.984],[0,0.903],[-0.457,0.762],[-0.861,0.369],[-0.668,0],[-0.557,-0.041],[0,0]],"v":[[33.416,-22.271],[36.58,-22.658],[41.555,-21.182],[43.26,-17.613],[42.574,-15.117],[40.597,-13.421],[36.738,-12.867],[34.901,-12.929],[33.416,-13.113]],"c":true},"ix":2},"nm":"B","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-0.516,0.024],[-0.727,0],[-1.137,-0.492],[-0.504,-0.855],[0,-0.926],[1.113,-0.955],[2.121,0],[1.359,0.316]],"o":[[0.316,-0.059],[0.516,-0.023],[1.676,0],[1.137,0.492],[0.504,0.856],[0,1.406],[-1.113,0.955],[-1.324,0],[0,0]],"v":[[33.416,-11.496],[34.664,-11.619],[36.527,-11.654],[40.746,-10.916],[43.207,-8.895],[43.963,-6.223],[42.293,-2.681],[37.441,-1.248],[33.416,-1.723]],"c":true},"ix":2},"nm":"B","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"B","np":6,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.305,-0.316],[0.316,0],[0.492,0.258],[1.723,0],[1.869,-1.096],[1.066,-1.992],[0,-2.379],[-1.617,-2.18],[-3.949,0],[-1.594,0.984],[-1.195,2.121],[0,0],[1.184,-0.662],[1.547,0],[1.389,0.844],[0.691,1.582],[0,2.156],[-0.733,1.758],[-1.277,0.803],[-1.582,0],[-1.348,-1.066],[-0.727,-2.426],[0,0],[0,0]],"o":[[-0.129,0.563],[-0.235,0.223],[-0.211,0],[-1.676,-0.844],[-2.215,0],[-1.869,1.096],[-1.066,1.992],[0,2.953],[2.168,2.93],[2.191,0],[1.594,-0.984],[0,0],[-1.418,1.969],[-1.184,0.662],[-1.781,0],[-1.389,-0.844],[-0.692,-1.582],[0,-2.613],[0.732,-1.758],[1.277,-0.803],[1.887,0],[1.347,1.066],[0,0],[0,0],[0,0]],"v":[[71.068,-24.381],[70.418,-23.063],[69.592,-22.729],[68.537,-23.115],[63.439,-24.381],[57.313,-22.737],[52.91,-18.105],[51.311,-11.549],[53.736,-3.85],[62.912,0.545],[68.59,-0.932],[72.773,-5.59],[72.229,-5.941],[68.326,-1.995],[64.23,-1.002],[59.476,-2.268],[56.355,-5.906],[55.318,-11.514],[56.417,-18.07],[59.432,-21.911],[63.721,-23.115],[68.572,-21.516],[71.684,-16.277],[72.229,-16.277],[71.684,-24.381]],"c":true},"ix":2},"nm":"C","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"C","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.262,2.485],[0,3.316],[1.131,1.887],[1.857,0.809],[3.562,0],[0,0],[0,0],[0,0],[-0.457,-0.516],[0,-1.488],[0,0],[0.258,-0.387],[1.008,0],[0,0],[0,0]],"o":[[4.629,0],[2.015,-2.226],[0,-2.472],[-1.131,-1.887],[-1.858,-0.809],[0,0],[0,0],[0,0],[0.902,0],[0.328,0.375],[0,0],[0,1.348],[-0.422,0.645],[0,0],[0,0],[0,0]],"v":[[85.289,0],[95.625,-3.727],[98.648,-12.041],[96.952,-18.58],[92.47,-22.623],[84.34,-23.836],[74.637,-23.836],[74.637,-23.186],[75.533,-23.186],[77.572,-22.412],[78.064,-19.617],[78.064,-4.219],[77.678,-1.617],[75.533,-0.65],[74.637,-0.65],[74.637,0]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-1.055,0],[-1.793,-1.898],[0,-3.293],[1.793,-1.91],[2.719,0],[1.488,0.328]],"o":[[1.347,-0.34],[2.813,0],[1.793,1.898],[0,3.27],[-1.793,1.91],[-1.008,0],[0,0]],"v":[[81.439,-21.99],[85.043,-22.5],[91.951,-19.652],[94.641,-11.865],[91.951,-4.096],[85.184,-1.23],[81.439,-1.723]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"D","np":5,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.469,-0.176],[-0.299,-0.469],[-0.246,-1.254],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.422,-0.469],[0,-1.512],[0,0],[0.135,-0.375],[0.375,-0.187],[0.563,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.726,-0.726],[0.609,-0.187],[1.347,0],[0,0],[0.234,0.135],[0.094,0.229],[0,1.055],[0,0],[0,0],[-0.481,-0.234],[-0.211,-0.41],[-0.164,-1.16],[0,0],[0,0],[0,0],[0.609,-0.539],[1.359,0],[0,0],[0,0]],"o":[[1.184,0],[0.586,0.246],[0.299,0.469],[0,0],[0,0],[0,0],[0,0],[0,0],[0.984,0],[0.305,0.352],[0,0],[0,1.16],[-0.135,0.375],[-0.504,0.27],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.762,1.465],[-0.563,0.551],[-0.609,0.188],[0,0],[-0.656,0],[-0.235,-0.135],[-0.094,-0.229],[0,0],[0,0],[0.996,0],[0.48,0.235],[0.164,0.328],[0,0],[0,0],[0,0],[-0.07,1.36],[-0.457,0.41],[0,0],[0,0],[0,0]],"v":[[114.082,-22.535],[116.561,-22.271],[117.888,-21.199],[118.705,-18.615],[119.391,-18.615],[119.127,-23.836],[100.758,-23.836],[100.758,-23.186],[101.602,-23.186],[103.711,-22.482],[104.168,-19.688],[104.168,-4.201],[103.966,-1.898],[103.201,-1.055],[101.602,-0.65],[100.758,-0.65],[100.758,0],[119.127,0],[121.184,-5.977],[120.48,-5.977],[118.248,-2.689],[116.49,-1.582],[113.555,-1.301],[109.512,-1.301],[108.176,-1.503],[107.684,-2.048],[107.543,-3.973],[107.543,-11.83],[112.781,-11.83],[114.996,-11.479],[116.033,-10.512],[116.525,-8.279],[117.176,-8.279],[117.176,-16.576],[116.525,-16.576],[115.506,-13.729],[112.781,-13.113],[107.543,-13.113],[107.543,-22.535]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"E","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.592,-0.234],[-0.404,-0.521],[-0.305,-1.113],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.504,-0.281],[-0.117,-0.293],[0,-1.207],[0,0],[0.281,-0.375],[0.984,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.516,0.281],[0.117,0.293],[0,1.207],[0,0],[0,0],[-0.404,-0.217],[-0.229,-0.433],[-0.012,-0.926],[0,0],[0,0],[0,0],[0.463,-0.439],[0.996,0],[0,0],[0,0]],"o":[[1.242,0],[0.592,0.235],[0.404,0.522],[0,0],[0,0],[0,0],[0,0],[0,0],[0.574,0],[0.363,0.211],[0.152,0.387],[0,0],[0,1.43],[-0.445,0.574],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.563,0],[-0.375,-0.211],[-0.152,-0.387],[0,0],[0,0],[0.797,0],[0.404,0.217],[0.229,0.434],[0,0],[0,0],[0,0],[-0.152,1.301],[-0.463,0.439],[0,0],[0,0],[0,0]],"v":[[134.631,-22.535],[137.382,-22.184],[138.876,-21.05],[139.939,-18.598],[140.555,-18.598],[140.326,-23.836],[122.59,-23.836],[122.59,-23.186],[123.434,-23.186],[125.051,-22.764],[125.771,-22.008],[126,-19.617],[126,-4.219],[125.578,-1.512],[123.434,-0.65],[122.59,-0.65],[122.59,0],[132.82,0],[132.82,-0.65],[131.959,-0.65],[130.342,-1.072],[129.604,-1.828],[129.375,-4.219],[129.375,-11.707],[133.717,-11.707],[135.519,-11.382],[136.468,-10.406],[136.828,-8.367],[137.479,-8.367],[137.479,-16.436],[136.828,-16.436],[135.905,-13.825],[133.717,-13.166],[129.375,-13.166],[129.375,-22.535]],"c":true},"ix":2},"nm":"F","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"F","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.158,-0.205],[0.222,0],[0.656,0.246],[0.709,0.141],[0.867,0],[1.746,-1.02],[1.195,-2.285],[0,-2.098],[-1.793,-2.215],[-4.605,0],[-1.313,0.34],[-1.348,0.727],[0,0],[-0.235,0.434],[-0.914,0],[0,0],[0,0],[0,0],[0,0],[-0.381,-0.193],[-0.182,-0.369],[0,-1.195],[0,0],[0.82,-0.222],[0.879,0],[1.424,0.873],[0.879,1.875],[0,2.274],[-1.324,2.028],[-3.035,0],[-1.418,-1.371],[-0.621,-1.875],[0,0],[0,0]],"o":[[-0.035,0.598],[-0.158,0.205],[-0.223,0],[-1.301,-0.48],[-0.709,-0.141],[-2.379,0],[-2.086,1.23],[-1.008,1.922],[0,2.895],[2.391,2.953],[1.605,0],[1.312,-0.34],[0,0],[0,-1.277],[0.34,-0.609],[0,0],[0,0],[0,0],[0,0],[0.961,0],[0.381,0.193],[0.182,0.369],[0,0],[-0.762,0.434],[-0.82,0.223],[-1.5,0],[-1.424,-0.873],[-0.879,-1.875],[0,-2.801],[1.582,-2.402],[2.226,0],[0.984,0.949],[0,0],[0,0],[0,0]],"v":[[163.477,-24.381],[163.187,-23.177],[162.615,-22.869],[161.297,-23.238],[158.282,-24.17],[155.918,-24.381],[149.73,-22.852],[144.809,-17.578],[143.297,-11.549],[145.986,-3.885],[156.48,0.545],[160.857,0.035],[164.848,-1.564],[164.848,-8.859],[165.199,-11.426],[167.08,-12.34],[167.52,-12.34],[167.52,-13.008],[158.291,-13.008],[158.291,-12.34],[160.304,-12.05],[161.147,-11.206],[161.42,-8.859],[161.42,-1.969],[159.047,-0.984],[156.498,-0.65],[152.112,-1.96],[148.658,-6.082],[147.34,-12.305],[149.326,-19.547],[156.252,-23.15],[161.719,-21.094],[164.127,-16.857],[164.742,-16.857],[164.127,-24.381]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568986481,0.921568986481,0.921568986481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"G","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/inc/rlottie.h b/inc/rlottie.h index 3d6c967a63..11e1e7c2a0 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -51,6 +51,38 @@ struct LOTLayerNode; namespace rlottie { +struct Color { + Color(){} + Color(float r, float g , float b):mr(r), mg(g), mb(b){} +public: + float mr{0}, mg{0}, mb{0}; +}; + +struct Size { + Size(float w, float h):mw(w), mh(h){} +private: + float mw{0} , mh{0}; +}; + +struct Point { + Point(float x, float y):mx(x), my(y){} +private: + float mx{0} , my{0}; +}; + +enum class Property { + FillColor, /*!< Color property of Fill object , value type is rlottie::Color */ + FillOpacity, /*!< Opacity property of Fill object , value type is float [ 0 .. 100] */ + StrokeColor, /*!< Color property of Stroke object , value type is rlottie::Color */ + StrokeOpacity, /*!< Opacity property of Stroke object , value type is float [ 0 .. 100] */ + StrokeWidth, /*!< stroke with property of Stroke object , value type is float */ + TrAnchor, /*!< Transform Anchor property of Layer and Group object , value type is rlottie::Point */ + TrPosition, /*!< Transform Position property of Layer and Group object , value type is rlottie::Point */ + TrScale, /*!< Transform Scale property of Layer and Group object , value type is rlottie::Size. range[0 ..100] */ + TrRotation, /*!< Transform Scale property of Layer and Group object , value type is float. range[0 .. 360] in degrees*/ + TrOpacity /*!< Transform Opacity property of Layer and Group object , value type is float [ 0 .. 100] */ +}; + class LOT_EXPORT Surface { public: /** @@ -336,6 +368,29 @@ public: */ const LayerInfoList& layers() const; + /** + * @brief Sets property value for the specified {@link KeyPath}. This {@link KeyPath} can resolve + * to multiple contents. In that case, the callback's value will apply to all of them. + * + * Keypath should conatin object names separated by (.) and can handle globe(**) or wildchar(*). + * + * @usage + * To change fillcolor property of fill1 object in the layer1->group1->fill1 hirarchy to RED color + * + * player->setValue("layer1.group1.fill1", rlottie::Color(1, 0, 0); + * + * if all the color property inside group1 needs to be changed to GREEN color + * + * player->setValue("**.group1.**", rlottie::Color(0, 1, 0); + * + * @internal + */ + template + void setValue(const std::string &keypath, AnyValue value) + { + setValue(std::integral_constant{}, prop, keypath, value); + } + /** * @brief default destructor * @@ -344,6 +399,34 @@ public: ~Animation(); private: + enum class ValueType {Color,Point,Size,Float}; + static constexpr ValueType mapType(Property prop) { + switch (prop) { + case Property::FillColor: + case Property::StrokeColor: + return ValueType::Color; + case Property::FillOpacity: + case Property::StrokeOpacity: + case Property::StrokeWidth: + case Property::TrOpacity: + case Property::TrRotation: + return ValueType::Float; + case Property::TrAnchor: + case Property::TrPosition: + return ValueType::Point; + case Property::TrScale: + return ValueType::Size; + } + } + + void setValue(std::integral_constant, + Property, const std::string &, Color); + void setValue(std::integral_constant, + Property, const std::string &, float); + void setValue(std::integral_constant, + Property, const std::string &, Size); + void setValue(std::integral_constant, + Property, const std::string &, Point); /** * @brief default constructor * @@ -354,6 +437,7 @@ private: std::unique_ptr d; }; + } // namespace lotplayer #endif // _RLOTTIE_H_ diff --git a/src/lottie/CMakeLists.txt b/src/lottie/CMakeLists.txt index a81356b546..89a2b6836d 100644 --- a/src/lottie/CMakeLists.txt +++ b/src/lottie/CMakeLists.txt @@ -7,6 +7,7 @@ target_sources(rlottie "${CMAKE_CURRENT_LIST_DIR}/lottieproxymodel.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieparser.cpp" "${CMAKE_CURRENT_LIST_DIR}/lottieanimation.cpp" + "${CMAKE_CURRENT_LIST_DIR}/lottiekeypath.cpp" ) target_include_directories(rlottie diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index b8e067468f..d5376eaea1 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -51,6 +51,8 @@ public: renderTree(size_t frameNo, const VSize &size); const LayerInfoList& layerInfoList() const { return mModel->layerInfoList();} + void setValue(const std::string &keypath, LOTVariant &&value); + void removeFilter(const std::string &keypath, Property prop); private: std::string mFilePath; std::shared_ptr mModel; @@ -59,6 +61,12 @@ private: std::atomic mRenderInProgress; }; +void AnimationImpl::setValue(const std::string &keypath, LOTVariant &&value) +{ + if (keypath.empty()) return; + mCompItem->setValue(keypath, value); +} + const LOTLayerNode *AnimationImpl::renderTree(size_t frameNo, const VSize &size) { if (update(frameNo, size)) { @@ -306,6 +314,34 @@ const LayerInfoList& Animation::layers() const return d->layerInfoList(); } +void Animation::setValue(std::integral_constant,Property prop, + const std::string &keypath, + Color value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + +void Animation::setValue(std::integral_constant, Property prop, + const std::string &keypath, + float value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + +void Animation::setValue(std::integral_constant,Property prop, + const std::string &keypath, + Size value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + +void Animation::setValue(std::integral_constant, Property prop, + const std::string &keypath, + Point value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + Animation::Animation(): d(std::make_unique()) {} /* diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 2da69815b6..dd5a113e88 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or @@ -24,6 +24,7 @@ #include "vdasher.h" #include "vpainter.h" #include "vraster.h" +#include "lottiekeypath.h" /* Lottie Layer Rules * 1. time stretch is pre calculated and applied to all the properties of the @@ -32,6 +33,45 @@ * AE. which means (start frame > endFrame) 3. */ +static +bool transformProp(rlottie::Property prop) +{ + switch (prop) { + case rlottie::Property::TrAnchor: + case rlottie::Property::TrScale: + case rlottie::Property::TrOpacity: + case rlottie::Property::TrPosition: + case rlottie::Property::TrRotation: + return true; + default: + return false; + } +} +static +bool fillProp(rlottie::Property prop) +{ + switch (prop) { + case rlottie::Property::FillColor: + case rlottie::Property::FillOpacity: + return true; + default: + return false; + } +} + +static +bool strokeProp(rlottie::Property prop) +{ + switch (prop) { + case rlottie::Property::StrokeColor: + case rlottie::Property::StrokeOpacity: + case rlottie::Property::StrokeWidth: + return true; + default: + return false; + } +} + LOTCompItem::LOTCompItem(LOTModel *model) : mRootModel(model), mUpdateViewBox(false), mCurFrameNo(-1) { @@ -41,6 +81,12 @@ LOTCompItem::LOTCompItem(LOTModel *model) mViewSize = mCompData->size(); } +void LOTCompItem::setValue(const std::string &keypath, LOTVariant &value) +{ + LOTKeyPath key(keypath); + mRootLayer->resolveKeyPath(key, 0, value); +} + std::unique_ptr LOTCompItem::createLayerItem(LOTLayerData *layerData) { @@ -369,6 +415,50 @@ LOTLayerItem::LOTLayerItem(LOTLayerData *layerData): mLayerData(layerData) mLayerMask = std::make_unique(mLayerData); } +bool LOTLayerItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, + LOTVariant &value) +{ + if (!keyPath.matches(name(), depth)) { + return false; + } + + if (!keyPath.skip(name())) { + if (keyPath.fullyResolvesTo(name(), depth) && + transformProp(value.property())) { + //@TODO handle propery update. + } + } + return true; +} + +bool LOTShapeLayerItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, + LOTVariant &value) +{ + if (LOTLayerItem::resolveKeyPath(keyPath, depth, value)){ + if (keyPath.propagate(name(), depth)) { + uint newDepth = keyPath.nextDepth(name(), depth); + mRoot->resolveKeyPath(keyPath, newDepth, value); + } + return true; + } + return false; +} + +bool LOTCompLayerItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, + LOTVariant &value) +{ + if (LOTLayerItem::resolveKeyPath(keyPath, depth, value)) { + if (keyPath.propagate(name(), depth)) { + uint newDepth = keyPath.nextDepth(name(), depth); + for (const auto &layer : mLayers) { + layer->resolveKeyPath( keyPath, newDepth, value); + } + } + return true; + } + return false; +} + void LOTLayerItem::updateStaticProperty() { if (mParentLayer) mParentLayer->updateStaticProperty(); @@ -862,6 +952,56 @@ void LOTShapeLayerItem::renderList(std::vector &list) mRoot->renderList(list); } +bool LOTContentGroupItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) +{ + if (!keyPath.matches(name(), depth)) { + return false; + } + + if (!keyPath.skip(name())) { + if (keyPath.fullyResolvesTo(name(), depth) && + transformProp(value.property())) { + //@TODO handle property update + } + } + + if (keyPath.propagate(name(), depth)) { + uint newDepth = keyPath.nextDepth(name(), depth); + for (auto &child : mContents) { + child->resolveKeyPath( keyPath, newDepth, value); + } + } + return true; +} + +bool LOTFillItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) +{ + if (!keyPath.matches(mModel.name(), depth)) { + return false; + } + + if (keyPath.fullyResolvesTo(mModel.name(), depth) && + fillProp(value.property())) { + mModel.filter().addValue(value); + return true; + } + return false; +} + +bool LOTStrokeItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) +{ + if (!keyPath.matches(mModel.name(), depth)) { + return false; + } + + if (keyPath.fullyResolvesTo(mModel.name(), depth) && + strokeProp(value.property())) { + mModel.filter().addValue(value); + return true; + } + return false; +} + LOTContentGroupItem::LOTContentGroupItem(LOTGroupData *data) : mData(data) { addChildren(mData); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 365bbd0752..49276dec7d 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -31,6 +31,7 @@ #include"rlottie.h" #include"vpainter.h" #include"vdrawable.h" +#include"lottiekeypath.h" V_USE_NAMESPACE @@ -46,7 +47,6 @@ class LOTLayerItem; class LOTMaskItem; class VDrawable; - class LOTCompItem { public: @@ -58,6 +58,7 @@ public: void buildRenderTree(); const LOTLayerNode * renderTree()const; bool render(const rlottie::Surface &surface); + void setValue(const std::string &keypath, LOTVariant &value); private: VMatrix mScaleMatrix; VSize mViewSize; @@ -86,11 +87,12 @@ public: }; typedef vFlag DirtyFlag; + class LOTLayerItem { public: + virtual ~LOTLayerItem() = default; LOTLayerItem(LOTLayerData *layerData); - virtual ~LOTLayerItem()= default; int id() const {return mLayerData->id();} int parentId() const {return mLayerData->parentId();} void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;} @@ -105,6 +107,8 @@ public: bool visible() const; virtual void buildLayerNode(); LOTLayerNode * layerNode() const {return mLayerCNode.get();} + const std::string & name() const {return mLayerData->name();} + virtual bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value); protected: virtual void updateContent() = 0; inline VMatrix combinedMatrix() const {return mCombinedMatrix;} @@ -136,6 +140,7 @@ public: void updateStaticProperty() final; void render(VPainter *painter, const VRle &mask, const VRle &matteRle) final; void buildLayerNode() final; + bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) override; protected: void updateContent() final; private: @@ -169,6 +174,7 @@ public: static std::unique_ptr createContentItem(LOTData *contentData); void renderList(std::vector &list)final; void buildLayerNode() final; + bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) override; protected: void updateContent() final; std::vector mCNodeList; @@ -250,11 +256,12 @@ class LOTTrimItem; class LOTContentItem { public: - virtual ~LOTContentItem()= default; + virtual ~LOTContentItem() = default; virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0; virtual void renderList(std::vector &){} void setParent(LOTContentItem *parent) {mParent = parent;} LOTContentItem *parent() const {return mParent;} + virtual bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) {return false;} private: LOTContentItem *mParent{nullptr}; }; @@ -265,12 +272,18 @@ public: LOTContentGroupItem(){} LOTContentGroupItem(LOTGroupData *data); void addChildren(LOTGroupData *data); - void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) override; void applyTrim(); void processTrimItems(std::vector &list); void processPaintItems(std::vector &list); - void renderList(std::vector &list); + void renderList(std::vector &list) override; const VMatrix & matrix() const { return mMatrix;} + const std::string & name() const + { + static const std::string TAG = "__"; + return mData ? mData->name() : TAG; + } + bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) override; protected: LOTGroupData *mData{nullptr}; std::vector> mContents; @@ -398,6 +411,7 @@ public: protected: void updateContent(int frameNo) final; void updateRenderNode() final; + bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) final; private: LOTProxyModel mModel; VColor mColor; @@ -424,6 +438,7 @@ public: protected: void updateContent(int frameNo) final; void updateRenderNode() final; + bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) final; private: LOTProxyModel mModel; LOTStrokeData *mData; diff --git a/src/lottie/lottiekeypath.cpp b/src/lottie/lottiekeypath.cpp new file mode 100644 index 0000000000..9507660220 --- /dev/null +++ b/src/lottie/lottiekeypath.cpp @@ -0,0 +1,81 @@ +#include "lottiekeypath.h" + +#include + +LOTKeyPath::LOTKeyPath(const std::string &keyPath) +{ + std::stringstream ss (keyPath); + std::string item; + + while (getline (ss, item, '.')) { + mKeys.push_back (item); + } +} + +bool LOTKeyPath::matches(const std::string &key, uint depth) +{ + if (skip(key)) { + // This is an object we programatically create. + return true; + } + if (depth > size()) { + return false; + } + if ((mKeys[depth] == key) || + (mKeys[depth] == "*") || + (mKeys[depth] == "**")) { + return true; + } + return false; +} + +uint LOTKeyPath::nextDepth(const std::string key, uint depth) { + if (skip(key)) { + // If it's a container then we added programatically and it isn't a part of the keypath. + return depth; + } + if ( mKeys[depth] != "**") { + // If it's not a globstar then it is part of the keypath. + return depth + 1; + } + if (depth == size()) { + // The last key is a globstar. + return depth; + } + if (mKeys[depth + 1] == key) { + // We are a globstar and the next key is our current key so consume both. + return depth + 2; + } + return depth; +} + +bool LOTKeyPath::fullyResolvesTo(const std::string key, uint depth) { + if (depth > mKeys.size()) { + return false; + } + + bool isLastDepth = (depth == size()); + + if (!isGlobstar(depth)) { + bool matches = (mKeys[depth] == key) || isGlob(depth); + return (isLastDepth || (depth == size() - 1 && endsWithGlobstar())) && matches; + } + + bool isGlobstarButNextKeyMatches = !isLastDepth && mKeys[depth + 1] == key; + if (isGlobstarButNextKeyMatches) { + return depth == size() - 1 || + (depth == size() - 2 && endsWithGlobstar()); + } + + if (isLastDepth) { + return true; + } + + if (depth + 1 < size()) { + // We are a globstar but there is more than 1 key after the globstar we we can't fully match. + return false; + } + // Return whether the next key (which we now know is the last one) is the same as the current + // key. + return mKeys[depth + 1] == key; + } diff --git a/src/lottie/lottiekeypath.h b/src/lottie/lottiekeypath.h new file mode 100644 index 0000000000..68ddde07d0 --- /dev/null +++ b/src/lottie/lottiekeypath.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LOTTIEKEYPATH_H +#define LOTTIEKEYPATH_H + +#include +#include + +class LOTKeyPath{ +public: + LOTKeyPath(const std::string &keyPath); + bool matches(const std::string &key, uint depth); + uint nextDepth(const std::string key, uint depth); + bool fullyResolvesTo(const std::string key, uint depth); + + bool propagate(const std::string key, uint depth) { + return skip(key) ? true : (depth < size()) || (mKeys[depth] == "**"); + } + bool skip(const std::string &key) const { return key == "__";} +private: + bool isGlobstar(uint depth) const {return mKeys[depth] == "**";} + bool isGlob(uint depth) const {return mKeys[depth] == "*";} + bool endsWithGlobstar() const { return mKeys.back() == "**"; } + uint size() const {return mKeys.size() - 1;} +private: + std::vector mKeys; +}; + +#endif //LOTTIEKEYPATH_H diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 8f4cd93e26..d26aab91f1 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -295,7 +295,7 @@ class LOTDataVisitor; class LOTData { public: - enum class Type { + enum class Type :short { Composition = 1, Layer, ShapeGroup, @@ -316,10 +316,12 @@ public: bool isStatic() const{return mStatic;} void setStatic(bool value) {mStatic = value;} bool hidden() const {return mHidden;} + const std::string& name() const{ return mName;} public: - bool mStatic{true}; - bool mHidden{false}; - LOTData::Type mType; + std::string mName; + bool mStatic{true}; + bool mHidden{false}; + LOTData::Type mType; }; class LOTGroupData: public LOTData diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 9afdc2d54e..10ecd288a4 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -748,6 +748,7 @@ void LottieParserImpl::parseLayers(LOTCompositionData *comp) comp->mRootLayer->mRoot = true; comp->mRootLayer->mLayerType = LayerType::Precomp; comp->mRootLayer->mTransform = std::make_shared(); + comp->mRootLayer->mName = std::string("__"); bool staticFlag = true; RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); @@ -857,7 +858,7 @@ std::shared_ptr LottieParserImpl::parseLayer(bool record) layer->mLayerType = getLayerType(); } else if (0 == strcmp(key, "nm")) { /*Layer name*/ RAPIDJSON_ASSERT(PeekType() == kStringType); - layerName = GetString(); + layer->mName = GetString(); } else if (0 == strcmp(key, "ind")) { /*Layer index in AE. Used for parenting and expressions.*/ RAPIDJSON_ASSERT(PeekType() == kNumberType); @@ -939,7 +940,7 @@ std::shared_ptr LottieParserImpl::parseLayer(bool record) layer->mCompRef = compRef; if (record) { - mLayerInfoList.push_back(LayerInfo(layerName, layer->mInFrame, layer->mOutFrame)); + mLayerInfoList.push_back(LayerInfo(layer->mName, layer->mInFrame, layer->mOutFrame)); } return sharedLayer; } @@ -1070,7 +1071,9 @@ std::shared_ptr LottieParserImpl::parseGroupObject() LOTShapeGroupData *group = sharedGroup.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "it")) { + if (0 == strcmp(key, "nm")) { + group->mName = GetString(); + } else if (0 == strcmp(key, "it")) { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { @@ -1105,7 +1108,9 @@ std::shared_ptr LottieParserImpl::parseRectObject() LOTRectData * obj = sharedRect.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "p")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "p")) { parseProperty(obj->mPos); } else if (0 == strcmp(key, "s")) { parseProperty(obj->mSize); @@ -1134,7 +1139,9 @@ std::shared_ptr LottieParserImpl::parseEllipseObject() LOTEllipseData *obj = sharedEllipse.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "p")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "p")) { parseProperty(obj->mPos); } else if (0 == strcmp(key, "s")) { parseProperty(obj->mSize); @@ -1160,7 +1167,9 @@ std::shared_ptr LottieParserImpl::parseShapeObject() LOTShapeData *obj = sharedShape.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "ks")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "ks")) { parseShapeProperty(obj->mShape); } else if (0 == strcmp(key, "d")) { obj->mDirection = GetInt(); @@ -1188,7 +1197,9 @@ std::shared_ptr LottieParserImpl::parsePolystarObject() LOTPolystarData *obj = sharedPolystar.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "p")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "p")) { parseProperty(obj->mPos); } else if (0 == strcmp(key, "pt")) { parseProperty(obj->mPointCount); @@ -1251,7 +1262,9 @@ std::shared_ptr LottieParserImpl::parseTrimObject() LOTTrimData * obj = sharedTrim.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "s")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "s")) { parseProperty(obj->mStart); } else if (0 == strcmp(key, "e")) { parseProperty(obj->mEnd); @@ -1280,7 +1293,9 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() LOTRepeaterData *obj = sharedRepeater.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "c")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "c")) { parseProperty(obj->mCopies); float maxCopy= 0.0; if (!obj->mCopies.isStatic()) { @@ -1326,7 +1341,9 @@ std::shared_ptr LottieParserImpl::parseTransformObject(bool dd if (ddd) obj->m3D = std::make_unique(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "a")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "a")) { parseProperty(obj->mAnchor); } else if (0 == strcmp(key, "p")) { EnterObject(); @@ -1394,7 +1411,9 @@ std::shared_ptr LottieParserImpl::parseFillObject() LOTFillData * obj = sharedFill.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "c")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "c")) { parseProperty(obj->mColor); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); @@ -1480,7 +1499,9 @@ std::shared_ptr LottieParserImpl::parseStrokeObject() LOTStrokeData *obj = sharedStroke.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "c")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "c")) { parseProperty(obj->mColor); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); @@ -1561,7 +1582,9 @@ std::shared_ptr LottieParserImpl::parseGFillObject() LOTGFillData *obj = sharedGFill.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "r")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "r")) { obj->mFillRule = getFillRule(); } else { parseGradientProperty(obj, key); @@ -1607,7 +1630,9 @@ std::shared_ptr LottieParserImpl::parseGStrokeObject() LOTGStrokeData *obj = sharedGStroke.get(); while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "w")) { + if (0 == strcmp(key, "nm")) { + obj->mName = GetString(); + } else if (0 == strcmp(key, "w")) { parseProperty(obj->mWidth); } else if (0 == strcmp(key, "lc")) { obj->mCapStyle = getLineCap(); @@ -2077,6 +2102,7 @@ public: vDebug << level << "{ " << layerType(obj->mLayerType) + << ", name: "<< obj->name() << ", id:" << obj->mId << " Pid:" << obj->mParentId << ", a:" << !obj->isStatic() << ", "<mMatteType) @@ -2120,7 +2146,7 @@ public: switch (obj->mType) { case LOTData::Type::Repeater: { auto r = static_cast(obj); - vDebug << level << "{ Repeater: a:" << !obj->isStatic() + vDebug << level << "{ Repeater: name: "<name()<<" , a:" << !obj->isStatic() << ", copies:" << r->maxCopies() << ", offset:" << r->offset(0); visitChildren(static_cast(obj), level); @@ -2128,7 +2154,7 @@ public: break; } case LOTData::Type::ShapeGroup: { - vDebug << level << "{ ShapeGroup: a:" << !obj->isStatic(); + vDebug << level << "{ ShapeGroup: name: "<name()<<" , a:" << !obj->isStatic(); visitChildren(static_cast(obj), level); vDebug << level << "} ShapeGroup"; break; @@ -2138,44 +2164,44 @@ public: break; } case LOTData::Type::Trim:{ - vDebug << level << "{ Trim: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Trim: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Rect:{ - vDebug << level << "{ Rect: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Rect: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Ellipse:{ - vDebug << level << "{ Ellipse: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Ellipse: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Shape:{ - vDebug << level << "{ Shape: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Shape: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Polystar:{ - vDebug << level << "{ Polystar: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Polystar: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Transform:{ - vDebug << level << "{ Transform: a: " << !obj->isStatic() << " }"; + vDebug << level << "{ Transform: name: "<name()<<" , a: " << !obj->isStatic() << " }"; break; } case LOTData::Type::Stroke:{ - vDebug << level << "{ Stroke: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Stroke: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::GStroke:{ - vDebug << level << "{ GStroke: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ GStroke: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::Fill:{ - vDebug << level << "{ Fill: a:" << !obj->isStatic() << " }"; + vDebug << level << "{ Fill: name: "<name()<<" , a:" << !obj->isStatic() << " }"; break; } case LOTData::Type::GFill:{ auto f = static_cast(obj); - vDebug << level << "{ GFill: a:" << !f->isStatic() + vDebug << level << "{ GFill: name: "<name()<<" , a:" << !f->isStatic() << ", ty:" << f->mGradientType << ", s:" << f->mStartPoint.value(0) << ", e:" << f->mEndPoint.value(0) << " }"; break; diff --git a/src/lottie/lottieproxymodel.h b/src/lottie/lottieproxymodel.h index b62292af28..54a7d52603 100644 --- a/src/lottie/lottieproxymodel.h +++ b/src/lottie/lottieproxymodel.h @@ -19,21 +19,131 @@ #ifndef LOTTIEPROXYMODEL_H #define LOTTIEPROXYMODEL_H +#include #include "lottiemodel.h" +#include "rlottie.h" + +// Naive way to implement std::variant +// refactor it when we move to c++17 +// users should make sure proper combination +// of id and value are passed while creating the object. +class LOTVariant +{ +public: + enum Type {Color, Point, Size, Float}; + LOTVariant(rlottie::Property prop, float v):property_(prop),valueType_(Type::Float),value_(v){} + LOTVariant(rlottie::Property prop, rlottie::Color col):property_(prop),valueType_(Type::Color),color_(col){} + LOTVariant(rlottie::Property prop, rlottie::Point pt):property_(prop),valueType_(Type::Point),pos_(pt){} + LOTVariant(rlottie::Property prop, rlottie::Size sz):property_(prop),valueType_(Type::Size),size_(sz){} + Type type() const {return valueType_;} + rlottie::Property property() const {return property_;} + float value() const {return value_;} + rlottie::Color color() const {return color_;} + rlottie::Point pos() const {return pos_;} + rlottie::Size size() const {return size_;} +public: + rlottie::Property property_; + Type valueType_; + union { + float value_; + rlottie::Color color_; + rlottie::Point pos_; + rlottie::Size size_; + }; +}; + +class LOTFilter +{ +public: + void addValue(LOTVariant &value) + { + uint index = static_cast(value.property()); + if (mBitset.test(index)) { + for (uint i=0; i < mFilters.size(); i++ ) { + if (mFilters[i].property() == value.property()) { + mFilters[i] = value; + break; + } + } + } else { + mBitset.set(index); + mFilters.push_back(value); + } + } + + void removeValue(LOTVariant &value) + { + uint index = static_cast(value.property()); + if (mBitset.test(index)) { + mBitset.reset(index); + for (uint i=0; i < mFilters.size(); i++ ) { + if (mFilters[i].property() == value.property()) { + mFilters.erase(mFilters.begin() + i); + break; + } + } + } + } + bool hasFilter(rlottie::Property prop) const + { + return mBitset.test(static_cast(prop)); + } + LottieColor color(rlottie::Property prop) const + { + rlottie::Color col = data(prop).color(); + return LottieColor(col.mr, col.mg, col.mb); + } + float opacity(rlottie::Property prop) const + { + float val = data(prop).value(); + return val/100; + } + float value(rlottie::Property prop) const + { + return data(prop).value(); + } +private: + LOTVariant data(rlottie::Property prop) const + { + for (uint i=0; i < mFilters.size(); i++ ) { + if (mFilters[i].property() == prop) { + return mFilters[i]; + } + } + return LOTVariant(prop, 0); + } + std::vector mFilters; + std::bitset<32> mBitset{0}; +}; template class LOTProxyModel { public: LOTProxyModel(T *model): _modelData(model) {} - void addValueProvider() {/* Impement*/} - void removeValueProvider() {/* Impement*/} - bool hasValueProvider() {return false;} - LottieColor color(int frame) const { return _modelData->color(frame);} - float opacity(int frame) const { return _modelData->opacity(frame);} - FillRule fillRule() const {return _modelData->fillRule();} - - float strokeWidth(int frame) const {return _modelData->strokeWidth(frame);} + LOTFilter& filter() {return mFilter;} + const std::string & name() const {return _modelData->name();} + LottieColor color(int frame) const + { + if (mFilter.hasFilter(rlottie::Property::StrokeColor)) { + return mFilter.color(rlottie::Property::StrokeColor); + } + return _modelData->color(frame); + } + float opacity(int frame) const + { + if (mFilter.hasFilter(rlottie::Property::StrokeOpacity)) { + return mFilter.opacity(rlottie::Property::StrokeOpacity); + } + return _modelData->opacity(frame); + } + float strokeWidth(int frame) const + { + if (mFilter.hasFilter(rlottie::Property::StrokeWidth)) { + return mFilter.value(rlottie::Property::StrokeWidth); + } + return _modelData->strokeWidth(frame); + } float meterLimit() const {return _modelData->meterLimit();} CapStyle capStyle() const {return _modelData->capStyle();} JoinStyle joinStyle() const {return _modelData->joinStyle();} @@ -41,7 +151,35 @@ public: int getDashInfo(int frameNo, float *array) const {return _modelData->getDashInfo(frameNo, array);} private: - T *_modelData; + T *_modelData; + LOTFilter mFilter; +}; + +template <> +class LOTProxyModel +{ +public: + LOTProxyModel(LOTFillData *model): _modelData(model) {} + LOTFilter& filter() {return mFilter;} + const std::string & name() const {return _modelData->name();} + LottieColor color(int frame) const + { + if (mFilter.hasFilter(rlottie::Property::FillColor)) { + return mFilter.color(rlottie::Property::FillColor); + } + return _modelData->color(frame); + } + float opacity(int frame) const + { + if (mFilter.hasFilter(rlottie::Property::FillOpacity)) { + return mFilter.opacity(rlottie::Property::FillOpacity); + } + return _modelData->opacity(frame); + } + FillRule fillRule() const {return _modelData->fillRule();} +private: + LOTFillData *_modelData; + LOTFilter mFilter; }; #endif // LOTTIEITEM_H diff --git a/src/lottie/meson.build b/src/lottie/meson.build index b49bbb2d56..a6d1856ba7 100644 --- a/src/lottie/meson.build +++ b/src/lottie/meson.build @@ -5,6 +5,7 @@ source_file += files('lottiemodel.cpp') source_file += files('lottieproxymodel.cpp') source_file += files('lottieanimation.cpp') source_file += files('lottieitem.cpp') +source_file += files('lottiekeypath.cpp') lottie_dep = declare_dependency( From 8bfe01a91ce78a9ece19d298b36ca741aa84ad0d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 24 Apr 2019 16:56:51 +0900 Subject: [PATCH 454/672] rlottie/parser: Fixed issue with latest bodymovin update --- src/lottie/lottieparser.cpp | 62 +++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 10ecd288a4..3d341f240e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1877,28 +1877,14 @@ VPointF LottieParserImpl::parseInperpolatorPoint() } template -bool LottieParserImpl::parseKeyFrameValue(const char * key, - LOTKeyFrameValue &value) -{ - if (0 == strcmp(key, "s")) { - getValue(value.mStartValue); - } else if (0 == strcmp(key, "e")) { - getValue(value.mEndValue); - } else { - return false; - } - return true; -} +bool LottieParserImpl::parseKeyFrameValue(const char *, + LOTKeyFrameValue &){ return false;} template <> -bool LottieParserImpl::parseKeyFrameValue(const char * key, +bool LottieParserImpl::parseKeyFrameValue(const char * key, LOTKeyFrameValue &value) { - if (0 == strcmp(key, "s")) { - getValue(value.mStartValue); - } else if (0 == strcmp(key, "e")) { - getValue(value.mEndValue); - } else if (0 == strcmp(key, "ti")) { + if (0 == strcmp(key, "ti")) { value.mPathKeyFrame = true; getValue(value.mInTangent); } else if (0 == strcmp(key, "to")) { @@ -1916,15 +1902,25 @@ bool LottieParserImpl::parseKeyFrameValue(const char * key, template void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) { +struct ParsedField { + bool interpolator{false}; + bool value{false}; + bool hold{false}; + bool time{false}; + bool lastFrame{false}; + bool hasEndValue{false}; +}; + EnterObject(); + ParsedField parsed; LOTKeyFrame keyframe; VPointF inTangent; VPointF outTangent; const char * interpolatorKey = nullptr; - bool hold = false; - bool lastFrame = true; + while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "i")) { + parsed.interpolator = true; inTangent = parseInperpolatorPoint(); } else if (0 == strcmp(key, "o")) { outTangent = parseInperpolatorPoint(); @@ -1947,11 +1943,19 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) continue; } else if (0 == strcmp(key, "t")) { keyframe.mStartFrame = GetDouble(); + parsed.time = true; + } else if (0 == strcmp(key, "s")) { + parsed.value = true; + getValue(keyframe.mValue.mStartValue); + continue; + } else if (0 == strcmp(key, "e")) { + parsed.hasEndValue = true; + getValue(keyframe.mValue.mEndValue); + continue; } else if (parseKeyFrameValue(key, keyframe.mValue)) { - lastFrame = false; continue; } else if (0 == strcmp(key, "h")) { - hold = GetInt(); + parsed.hold = GetInt(); continue; } else { #ifdef DEBUG_PARSER @@ -1961,12 +1965,22 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) } } + // if both interpolator and hold are not present + // it is the last frame. + if (!parsed.hold && !parsed.interpolator) { + parsed.lastFrame = true; + } + if (!obj.mKeyFrames.empty()) { // update the endFrame value of current keyframe obj.mKeyFrames.back().mEndFrame = keyframe.mStartFrame; + // if no end value provided copy it to previous frame + if (!parsed.hold && parsed.value && !parsed.hasEndValue) { + obj.mKeyFrames.back().mValue.mEndValue = keyframe.mValue.mStartValue; + } } - if (hold) { + if (parsed.hold) { interpolatorKey = "hold_interpolator"; inTangent = VPointF(); outTangent = VPointF(); @@ -1975,7 +1989,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) } char charArray[20]; - if (!(lastFrame || interpolatorKey)) { + if (!(parsed.lastFrame || interpolatorKey)) { snprintf(charArray, 20, "%.2f_%.2f_%.2f_%.2f", inTangent.x(), inTangent.y(), outTangent.x(), outTangent.y()); interpolatorKey = charArray; From 792e78142390aa87428d069c7ed0c0a1146c218d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 24 Apr 2019 18:00:40 +0900 Subject: [PATCH 455/672] added missing header --- src/lottie/lottiekeypath.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lottie/lottiekeypath.h b/src/lottie/lottiekeypath.h index 68ddde07d0..527788f73c 100644 --- a/src/lottie/lottiekeypath.h +++ b/src/lottie/lottiekeypath.h @@ -19,6 +19,7 @@ #ifndef LOTTIEKEYPATH_H #define LOTTIEKEYPATH_H +#include "vglobal.h" #include #include From 409d775f41aa09dcab03d19d438385e2638d5eea Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 25 Apr 2019 10:16:02 +0900 Subject: [PATCH 456/672] rlottie: added sync version of render function in capi --- inc/rlottie_capi.h | 22 ++++++++++++++++++++++ src/binding/c/lottieanimation_capi.cpp | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/inc/rlottie_capi.h b/inc/rlottie_capi.h index d038782872..a5cb70ad50 100644 --- a/inc/rlottie_capi.h +++ b/inc/rlottie_capi.h @@ -170,6 +170,28 @@ LOT_EXPORT const LOTLayerNode * lottie_animation_render_tree(Lottie_Animation *a */ LOT_EXPORT size_t lottie_animation_get_frame_at_pos(const Lottie_Animation *animation, float pos); +/** + * @brief Request to render the content of the frame @p frame_num to buffer @p buffer. + * + * @param[in] animation Animation object. + * @param[in] frame_num the frame number needs to be rendered. + * @param[in] buffer surface buffer use for rendering. + * @param[in] width width of the surface + * @param[in] height height of the surface + * @param[in] bytes_per_line stride of the surface in bytes. + * + * + * @ingroup Lottie_Animation + * @internal + */ +LOT_EXPORT void +lottie_animation_render(Lottie_Animation *animation, + size_t frame_num, + uint32_t *buffer, + size_t width, + size_t height, + size_t bytes_per_line); + /** * @brief Request to render the content of the frame @p frame_num to buffer @p buffer asynchronously. * diff --git a/src/binding/c/lottieanimation_capi.cpp b/src/binding/c/lottieanimation_capi.cpp index cd85bd3789..d40df28b1a 100644 --- a/src/binding/c/lottieanimation_capi.cpp +++ b/src/binding/c/lottieanimation_capi.cpp @@ -107,6 +107,20 @@ lottie_animation_get_frame_at_pos(const Lottie_Animation_S *animation, float pos return animation->mAnimation->frameAtPos(pos); } +LOT_EXPORT void +lottie_animation_render(Lottie_Animation_S *animation, + size_t frame_number, + uint32_t *buffer, + size_t width, + size_t height, + size_t bytes_per_line) +{ + if (!animation) return; + + rlottie::Surface surface(buffer, width, height, bytes_per_line); + animation->mAnimation->renderSync(frame_number, surface); +} + LOT_EXPORT void lottie_animation_render_async(Lottie_Animation_S *animation, size_t frame_number, From 6e0436f60f2422d94d16eac286e526cfeba8b98d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 25 Apr 2019 13:10:34 +0900 Subject: [PATCH 457/672] rlottie/parser: refactor keyframe parsing --- src/lottie/lottiemodel.h | 4 +- src/lottie/lottieparser.cpp | 101 ++++++++++++++---------------------- 2 files changed, 41 insertions(+), 64 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index d26aab91f1..d71a40df32 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -200,7 +200,7 @@ class LOTKeyFrame { public: float progress(int frameNo) const { - return mInterpolator->value((frameNo - mStartFrame) / (mEndFrame - mStartFrame)); + return mInterpolator ? mInterpolator->value((frameNo - mStartFrame) / (mEndFrame - mStartFrame)) : 0; } T value(int frameNo) const { return mValue.value(progress(frameNo)); @@ -444,8 +444,6 @@ public: float mFrameRate{60}; LottieBlendMode mBlendMode{LottieBlendMode::Normal}; std::shared_ptr mRootLayer; - std::unordered_map> mInterpolatorCache; std::unordered_map> mAssets; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 3d341f240e..042e471ef4 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -19,9 +19,9 @@ #include "lottieparser.h" -//#define DEBUG_PARSER +#define DEBUG_PARSER -#define DEBUG_PRINT_TREE +//#define DEBUG_PRINT_TREE // This parser implements JSON token-by-token parsing with an API that is // more direct; we don't have to create handler object and @@ -263,11 +263,15 @@ public: void parseArrayValue(std::vector &v); void parseDashProperty(LOTDashProperty &dash); + std::shared_ptr interpolator(VPointF inTangent, VPointF outTangent); + LottieColor toColor(const char *str); void resolveLayerRefs(); protected: + std::unordered_map> mInterpolatorCache; std::shared_ptr mComposition; LOTCompositionData * compRef{nullptr}; LOTLayerData * curLayerRef{nullptr}; @@ -1896,27 +1900,43 @@ bool LottieParserImpl::parseKeyFrameValue(const char * key, return true; } +std::shared_ptr +LottieParserImpl::interpolator(VPointF inTangent, VPointF outTangent) +{ + std::array temp; + snprintf(temp.data(), temp.size(), "%.2f_%.2f_%.2f_%.2f", + inTangent.x(), inTangent.y(), outTangent.x(), outTangent.y()); + + std::string key(temp.data()); + + auto search = mInterpolatorCache.find(key); + if (search != mInterpolatorCache.end()) { + return search->second; + } else { + auto obj = std::make_shared(VInterpolator(outTangent, inTangent)); + mInterpolatorCache[key] = obj; + return obj; + } +} + /* * https://github.com/airbnb/lottie-web/blob/master/docs/json/properties/multiDimensionalKeyframed.json */ template void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) { -struct ParsedField { - bool interpolator{false}; - bool value{false}; - bool hold{false}; - bool time{false}; - bool lastFrame{false}; - bool hasEndValue{false}; -}; + struct ParsedField { + bool interpolator{false}; + bool value{false}; + bool hold{false}; + bool noEndValue{true}; + }; EnterObject(); ParsedField parsed; LOTKeyFrame keyframe; VPointF inTangent; VPointF outTangent; - const char * interpolatorKey = nullptr; while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "i")) { @@ -1924,32 +1944,14 @@ struct ParsedField { inTangent = parseInperpolatorPoint(); } else if (0 == strcmp(key, "o")) { outTangent = parseInperpolatorPoint(); - } else if (0 == strcmp(key, "n")) { - if (PeekType() == kStringType) { - interpolatorKey = GetString(); - } else { - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); - while (NextArrayValue()) { - RAPIDJSON_ASSERT(PeekType() == kStringType); - if (!interpolatorKey) { - interpolatorKey = GetString(); - } else { - //skip rest of the string - GetString(); - } - } - } - continue; } else if (0 == strcmp(key, "t")) { keyframe.mStartFrame = GetDouble(); - parsed.time = true; } else if (0 == strcmp(key, "s")) { parsed.value = true; getValue(keyframe.mValue.mStartValue); continue; } else if (0 == strcmp(key, "e")) { - parsed.hasEndValue = true; + parsed.noEndValue = false; getValue(keyframe.mValue.mEndValue); continue; } else if (parseKeyFrameValue(key, keyframe.mValue)) { @@ -1965,48 +1967,25 @@ struct ParsedField { } } - // if both interpolator and hold are not present - // it is the last frame. - if (!parsed.hold && !parsed.interpolator) { - parsed.lastFrame = true; - } - if (!obj.mKeyFrames.empty()) { // update the endFrame value of current keyframe obj.mKeyFrames.back().mEndFrame = keyframe.mStartFrame; - // if no end value provided copy it to previous frame - if (!parsed.hold && parsed.value && !parsed.hasEndValue) { + // if no end value provided, copy start value to previous frame + if (parsed.value && + parsed.noEndValue) { obj.mKeyFrames.back().mValue.mEndValue = keyframe.mValue.mStartValue; } } if (parsed.hold) { - interpolatorKey = "hold_interpolator"; - inTangent = VPointF(); - outTangent = VPointF(); keyframe.mValue.mEndValue = keyframe.mValue.mStartValue; keyframe.mEndFrame = keyframe.mStartFrame; - } - - char charArray[20]; - if (!(parsed.lastFrame || interpolatorKey)) { - snprintf(charArray, 20, "%.2f_%.2f_%.2f_%.2f", - inTangent.x(), inTangent.y(), outTangent.x(), outTangent.y()); - interpolatorKey = charArray; - } - - // Try to find the interpolator from cache - if (interpolatorKey) { - auto search = compRef->mInterpolatorCache.find(interpolatorKey); - if (search != compRef->mInterpolatorCache.end()) { - keyframe.mInterpolator = search->second; - } else { - keyframe.mInterpolator = std::make_shared( - VInterpolator(outTangent, inTangent)); - compRef->mInterpolatorCache[interpolatorKey] = - keyframe.mInterpolator; - } obj.mKeyFrames.push_back(keyframe); + } else if (parsed.interpolator) { + keyframe.mInterpolator = interpolator(inTangent, outTangent); + obj.mKeyFrames.push_back(keyframe); + } else { + //its the last frame discard. } } From a4eb94adf94e1fc10e144a7a3b95fcc041860ed2 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 25 Apr 2019 13:54:43 +0900 Subject: [PATCH 458/672] rlottie/parser: refactor to optimize code size --- src/lottie/lottieparser.cpp | 111 ++++++++---------------------------- 1 file changed, 25 insertions(+), 86 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 042e471ef4..8971323fb2 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -19,7 +19,7 @@ #include "lottieparser.h" -#define DEBUG_PARSER +//#define DEBUG_PARSER //#define DEBUG_PRINT_TREE @@ -238,17 +238,15 @@ public: void parseGradientProperty(LOTGradient *gradient, const char *key); VPointF parseInperpolatorPoint(); - void parseArrayValue(VPointF &pt); - void parseArrayValue(LottieColor &pt); - void parseArrayValue(float &val); - void parseArrayValue(int &val); - void parseArrayValue(LottieGradient &gradient); - void getValue(VPointF &val); - void getValue(float &val); - void getValue(LottieColor &val); - void getValue(int &val); - void getValue(LottieShapeData &shape); - void getValue(LottieGradient &gradient); + + void getValue(VPointF &val); + void getValue(float &val); + void getValue(LottieColor &val); + void getValue(int &val); + void getValue(LottieShapeData &shape); + void getValue(LottieGradient &gradient); + void getValue(std::vector &v); + template bool parseKeyFrameValue(const char *key, LOTKeyFrameValue &value); template @@ -260,7 +258,6 @@ public: void parseShapeKeyFrame(LOTAnimInfo &obj); void parseShapeProperty(LOTAnimatable &obj); - void parseArrayValue(std::vector &v); void parseDashProperty(LOTDashProperty &dash); std::shared_ptr interpolator(VPointF inTangent, VPointF outTangent); @@ -1657,43 +1654,7 @@ std::shared_ptr LottieParserImpl::parseGStrokeObject() return sharedGStroke; } -void LottieParserImpl::parseArrayValue(LottieColor &color) -{ - float val[4]; - int i = 0; - while (NextArrayValue()) { - val[i++] = GetDouble(); - } - - color.r = val[0]; - color.g = val[1]; - color.b = val[2]; -} - -void LottieParserImpl::parseArrayValue(VPointF &pt) -{ - float val[4]; - int i = 0; - while (NextArrayValue()) { - val[i++] = GetDouble(); - } - pt.setX(val[0]); - pt.setY(val[1]); -} - -void LottieParserImpl::parseArrayValue(float &val) -{ - RAPIDJSON_ASSERT(0); - val = GetDouble(); -} - -void LottieParserImpl::parseArrayValue(int &val) -{ - RAPIDJSON_ASSERT(0); - val = GetInt(); -} - -void LottieParserImpl::parseArrayValue(std::vector &v) +void LottieParserImpl::getValue(std::vector &v) { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); @@ -1701,7 +1662,7 @@ void LottieParserImpl::parseArrayValue(std::vector &v) RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); VPointF pt; - parseArrayValue(pt); + getValue(pt); v.push_back(pt); } } @@ -1710,8 +1671,9 @@ void LottieParserImpl::getValue(VPointF &pt) { float val[4]; int i = 0; - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); + + if (PeekType() == kArrayType) EnterArray(); + while (NextArrayValue()) { val[i++] = GetDouble(); } @@ -1737,8 +1699,8 @@ void LottieParserImpl::getValue(LottieColor &color) { float val[4]; int i = 0; - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); + if (PeekType() == kArrayType) EnterArray(); + while (NextArrayValue()) { val[i++] = GetDouble(); } @@ -1747,17 +1709,10 @@ void LottieParserImpl::getValue(LottieColor &color) color.b = val[2]; } -void LottieParserImpl::parseArrayValue(LottieGradient &grad) -{ - while (NextArrayValue()) { - grad.mGradient.push_back(GetDouble()); - } -} - void LottieParserImpl::getValue(LottieGradient &grad) { - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); + if (PeekType() == kArrayType) EnterArray(); + while (NextArrayValue()) { grad.mGradient.push_back(GetDouble()); } @@ -1796,11 +1751,11 @@ void LottieParserImpl::getValue(LottieShapeData &obj) EnterObject(); while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "i")) { - parseArrayValue(inPoint); + getValue(inPoint); } else if (0 == strcmp(key, "o")) { - parseArrayValue(outPoint); + getValue(outPoint); } else if (0 == strcmp(key, "v")) { - parseArrayValue(vertices); + getValue(vertices); } else if (0 == strcmp(key, "c")) { closed = GetBool(); } else { @@ -1855,26 +1810,10 @@ VPointF LottieParserImpl::parseInperpolatorPoint() EnterObject(); while (const char *key = NextObjectKey()) { if (0 == strcmp(key, "x")) { - if (PeekType() == kNumberType) { - cp.setX(GetDouble()); - } else { - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); - while (NextArrayValue()) { - cp.setX(GetDouble()); - } - } + getValue(cp.rx()); } if (0 == strcmp(key, "y")) { - if (PeekType() == kNumberType) { - cp.setY(GetDouble()); - } else { - RAPIDJSON_ASSERT(PeekType() == kArrayType); - EnterArray(); - while (NextArrayValue()) { - cp.setY(GetDouble()); - } - } + getValue(cp.ry()); } } return cp; @@ -2046,7 +1985,7 @@ void LottieParserImpl::parsePropertyHelper(LOTAnimatable &obj) */ RAPIDJSON_ASSERT(PeekType() == kNumberType); /*multi value property with no animation*/ - parseArrayValue(obj.mValue); + getValue(obj.mValue); /*break here as we already reached end of array*/ break; } From ccf62bd79f314377337e6810787adf2dbd36afad Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 26 Apr 2019 14:38:12 +0900 Subject: [PATCH 459/672] Organized Readme Page of lottie --- README.md | 209 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 182 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 10fed69e42..b36eaf1acb 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,200 @@ -[![Build Status](https://travis-ci.org/Samsung/rlottie.svg?branch=master)](https://travis-ci.org/Samsung/rlottie) -# rlottie -A platform independent standalone library that plays Lottie Animation. +# rlottie [![Build Status](https://travis-ci.org/Samsung/rlottie.svg?branch=master)](https://travis-ci.org/Samsung/rlottie) + +rlottie is a platform independent standalone c++ library for rendering vector based animations and art in realtime. + +Lottie loads and renders animations and vectors exported in the bodymovin JSON format. Bodymovin JSON can be created and exported from After Effects with [bodymovin](https://github.com/bodymovin/bodymovin), Sketch with [Lottie Sketch Export](https://github.com/buba447/Lottie-Sketch-Export), and from [Haiku](https://www.haiku.ai). + +For the first time, designers can create and ship beautiful animations without an engineer painstakingly recreating it by hand. Since the animation is backed by JSON they are extremely small in size but can be large in complexity! + +Here is just a small sampling of the power of Lottie For resource test, please visit rlottie online viewer: -https://www.rlottie.com +http://www.rlottie.com Query about rlottie or request troubleshooting online, please visit Gitter: https://gitter.im/rLottie-dev/community# +## Contents +- [Building Lottie](#building-lottie) + - [Meson Build](#meson-build) + - [Cmake Build](#cmake-build) + - [Test](#test) +- [Demo](#demo) +- [Dynamic Property](#dynamic-property) +- [Quick Start](#quick-start) +- [Supported After Effects Features](#supported-after-effects-features) +- [Issues or Feature Requests?](#issues-or-feature-requests) -## BUILD INSTRUCTIONS +## Building Lottie +rottie supports [meson](https://mesonbuild.com/) and [cmake](https://cmake.org/) build system. rottie is written in ***C++14***. and has a public dependancy of ***C++11*** -1. install meson build system. ( follow instruction in this link http://mesonbuild.com/Getting-meson.html ) -2. install ninja build tool (https://ninja-build.org/) -3. invoke meson build/ or meson -Dexample=true build/ -4. invoke ninja inside the build folder. +### Meson Build +install [meson](http://mesonbuild.com/Getting-meson.html) and [ninja](https://ninja-build.org/) if not already installed. -NOTE: run meson configure to see all the build options +Run meson to configure rlottie +``` +meson build +``` +Run ninja to build rlottie +``` +ninja -C build +``` -## BUILD EXAMPLES +### Cmake Build -1. meson configure -Dexample=true -2. ninja -3. to run examples invoke ./build/example/demo, etc. +Install [cmake](https://cmake.org/download/) if not already installed -## RUN TESTS +Create a build directory for out of source build +``` +mkdir build +``` +Run cmake command inside build directory to configure rlottie. +``` +cd build +cmake -DLIB_INSTALL_DIR=/usr/lib .. -1. meson configure -Dtest=true -2. ninja -3. invoke testsuites as ./build/test/animationTestSuite and ./build/test/vectorTestSuite +# install to a different prefix. eg ~/test/lib -## BUILD WITH CMAKE +cmake -DCMAKE_INSTALL_PREFIX=~/test -DLIB_INSTALL_DIR=lib .. -librlottie can also be built using the cmake build system. +``` +Run make to build rlottie -1. install cmake. (Follow instructions at https://cmake.org/download/) -2. create a new build/ directory -3. invoke cmake from inside build/ as cmake -DLIB_INSTALL_DIR=lib .. -4. invoke make -5. invoke sudo make install to install, if desired. +``` +make -j 2 +``` +To install rlottie library -To install to a different prefix, specify it when running cmake, e.g.: - cmake -DCMAKE_INSTALL_PREFIX:PATH=~/Build -DLIB_INSTALL_DIR=~/Build/lib .. +``` +make install +``` + +### Test + +Configure to build test +``` +meson configure -Dtest=true +``` +Build test suit + +``` +ninja +``` +Run test suit +``` +ninja test +``` +[Back to contents](#contents) + +# +## Demo + +Update me + +# +## Dynamic Property + +Update me. + +# +## Quick Start + +Update me. + +[Back to contents](#contents) + +# +## Supported After Effects Features + +| **Shapes** | **Supported** | +|:--|:-:| +| Shape | 👍 | +| Ellipse | 👍 | +| Rectangle | 👍 | +| Rounded Rectangle | 👍 | +| Polystar | 👍 | +| Group | 👍 | +| Trim Path (individually) | 👍 | +| Trim Path (simultaneously) | 👍 | +| **Renderable** | **Supported** | +| Fill | 👍 | +| Stroke | 👍 | +| Radial Gradient | 👍 | +| Linear Gradient | 👍 | +| Gradient Stroke | 👍 | +| **Transforms** | **Supported** | +| Position | 👍 | +| Position (separated X/Y) | 👍 | +| Scale | 👍 | +| Skew | ⛔️ | +| Rotation | 👍 | +| Anchor Point | 👍 | +| Opacity | 👍 | +| Parenting | 👍 | +| Auto Orient | 👍 | +| **Interpolation** | **Supported** | +| Linear Interpolation | 👍 | +| Bezier Interpolation | 👍 | +| Hold Interpolation | 👍 | +| Spatial Bezier Interpolation | 👍 | +| Rove Across Time | 👍 | +| **Masks** | **Supported** | +| Mask Path | 👍 | +| Mask Opacity | 👍 | +| Add | 👍 | +| Subtract | 👍 | +| Intersect | 👍 | +| Lighten | ⛔️ | +| Darken | ⛔️ | +| Difference | ⛔️ | +| Expansion | ⛔️ | +| Feather | ⛔️ | +| **Mattes** | **Supported** | +| Alpha Matte | 👍 | +| Alpha Inverted Matte | 👍 | +| Luma Matte | 👍 | +| Luma Inverted Matte | 👍 | +| **Merge Paths** | **Supported** | +| Merge | ⛔️ | +| Add | ⛔️ | +| Subtract | ⛔️ | +| Intersect | ⛔️ | +| Exclude Intersection | ⛔️ | +| **Layer Effects** | **Supported** | +| Fill | ⛔️ | +| Stroke | ⛔️ | +| Tint | ⛔️ | +| Tritone | ⛔️ | +| Levels Individual Controls | ⛔️ | +| **Text** | **Supported** | +| Glyphs | ⛔️ | +| Fonts | ⛔️ | +| Transform | ⛔️ | +| Fill | ⛔️ | +| Stroke | ⛔️ | +| Tracking | ⛔️ | +| Anchor point grouping | ⛔️ | +| Text Path | ⛔️ | +| Per-character 3D | ⛔️ | +| Range selector (Units) | ⛔️ | +| Range selector (Based on) | ⛔️ | +| Range selector (Amount) | ⛔️ | +| Range selector (Shape) | ⛔️ | +| Range selector (Ease High) | ⛔️ | +| Range selector (Ease Low) | ⛔️ | +| Range selector (Randomize order) | ⛔️ | +| expression selector | ⛔️ | +| **Other** | **Supported** | +| Expressions | ⛔️ | +| Images | 👍 | +| Precomps | 👍 | +| Time Stretch | 👍 | +| Time remap | 👍 | +| Markers | ⛔️ | + +# +[Back to contents](#contents) + +## Issues or Feature Requests? +File github issues for anything that is broken. Be sure to check the [list of supported features](#supported-after-effects-features) before submitting. If an animation is not working, please attach the After Effects file to your issue. Debugging without the original can be very difficult. For immidiate assistant or support please reach us in [Gitter](https://gitter.im/rLottie-dev/community#) From bd16d106adcefc2eea6b074dcd661584c91912eb Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 26 Apr 2019 15:02:47 +0900 Subject: [PATCH 460/672] update README with showcase gif and online viewer section --- README.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b36eaf1acb..425f509ee1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ -# rlottie [![Build Status](https://travis-ci.org/Samsung/rlottie.svg?branch=master)](https://travis-ci.org/Samsung/rlottie) +# rlottie + +[![Build Status](https://travis-ci.org/Samsung/rlottie.svg?branch=master)](https://travis-ci.org/Samsung/rlottie) rlottie is a platform independent standalone c++ library for rendering vector based animations and art in realtime. @@ -9,17 +11,14 @@ For the first time, designers can create and ship beautiful animations without a Here is just a small sampling of the power of Lottie -For resource test, please visit rlottie online viewer: -http://www.rlottie.com - -Query about rlottie or request troubleshooting online, please visit Gitter: -https://gitter.im/rLottie-dev/community# +![Example1](https://github.com/airbnb/lottie-ios/blob/master/_Gifs/Examples1.gif) ## Contents - [Building Lottie](#building-lottie) - [Meson Build](#meson-build) - [Cmake Build](#cmake-build) - [Test](#test) +- [Previewing Lottie JSON Files](#previewing-lottie-json-files) - [Demo](#demo) - [Dynamic Property](#dynamic-property) - [Quick Start](#quick-start) @@ -87,6 +86,12 @@ ninja test ``` [Back to contents](#contents) +# +## Previewing Lottie JSON Files +Please visit [rlottie online viewer](http://rlottie.com) + +[rlottie online viewer](http://rlottie.com) uses rlottie wasm library to render the resource locally in your browser. To test your JSON resource drag and drop it to the browser window. + # ## Demo From 99066768fbbb211ec268e429f4ed6466e893e626 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 26 Apr 2019 16:39:36 +0900 Subject: [PATCH 461/672] updated quick start guide in readme file --- README.md | 53 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 425f509ee1..26d02333e2 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,9 @@ Here is just a small sampling of the power of Lottie - [Cmake Build](#cmake-build) - [Test](#test) - [Previewing Lottie JSON Files](#previewing-lottie-json-files) +- [Quick Start](#quick-start) - [Demo](#demo) - [Dynamic Property](#dynamic-property) -- [Quick Start](#quick-start) - [Supported After Effects Features](#supported-after-effects-features) - [Issues or Feature Requests?](#issues-or-feature-requests) @@ -92,6 +92,50 @@ Please visit [rlottie online viewer](http://rlottie.com) [rlottie online viewer](http://rlottie.com) uses rlottie wasm library to render the resource locally in your browser. To test your JSON resource drag and drop it to the browser window. +# +## Quick Start + +Lottie loads and renders animations and vectors exported in the bodymovin JSON format. Bodymovin JSON can be created and exported from After Effects with [bodymovin](https://github.com/bodymovin/bodymovin), Sketch with [Lottie Sketch Export](https://github.com/buba447/Lottie-Sketch-Export), and from [Haiku](https://www.haiku.ai). + +You can quickly load a Lottie animation with: +```cpp +std::unique_ptr animation = + rlottie::loadFromFile(std::string("absolute_path/test.json")); +``` +You can load a lottie animation from raw data with: +```cpp +std::unique_ptr animation = rlottie::loadFromData(std::string(rawData), + std::string(cacheKey)); +``` + +Properties like `frameRate` , `totalFrame` , `duration` can be queried with: +```cpp +# get the frame rate of the resource. +double frameRate = animation->frameRate(); + +#get total frame that exists in the resource +size_t totalFrame = animation->totalFrame(); + +#get total animation duration in sec for the resource +double duration = animation->duration(); +``` +Render a particular frame in a surface buffer `immediately` with: +```cpp +rlottie::Surface surface(buffer, width , height , stride); +animation->renderSync(frameNo, surface); +``` +Render a particular frame in a surface buffer `asyncronousely` with: +```cpp +rlottie::Surface surface(buffer, width , height , stride); +# give a render request +std::future handle = animation->render(frameNo, surface); +... +#when the render data is needed +rlottie::Surface surface = handle.get(); +``` + +[Back to contents](#contents) + # ## Demo @@ -102,13 +146,6 @@ Update me Update me. -# -## Quick Start - -Update me. - -[Back to contents](#contents) - # ## Supported After Effects Features From aeba28956468c48e38f5f32b91fc1f1a802b1f8f Mon Sep 17 00:00:00 2001 From: kimcinoo Date: Fri, 26 Apr 2019 16:54:00 +0900 Subject: [PATCH 462/672] Update style of README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 26d02333e2..7ad95dd41e 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Here is just a small sampling of the power of Lottie - [Issues or Feature Requests?](#issues-or-feature-requests) ## Building Lottie -rottie supports [meson](https://mesonbuild.com/) and [cmake](https://cmake.org/) build system. rottie is written in ***C++14***. and has a public dependancy of ***C++11*** +rottie supports [meson](https://mesonbuild.com/) and [cmake](https://cmake.org/) build system. rottie is written in `C++14`. and has a public header dependancy of `C++11` ### Meson Build install [meson](http://mesonbuild.com/Getting-meson.html) and [ninja](https://ninja-build.org/) if not already installed. From 6db72aa2690ddf32e6b1aa370dbe2359a18db737 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 29 Apr 2019 14:39:46 +0900 Subject: [PATCH 463/672] rlottie/example: added rlottie example app to convert json to GIF --- example/gif.h | 835 ++++++++++++++++++++++++++++++++++++++++ example/meson.build | 5 + example/rlottietest.cpp | 139 +++++++ 3 files changed, 979 insertions(+) create mode 100644 example/gif.h create mode 100644 example/rlottietest.cpp diff --git a/example/gif.h b/example/gif.h new file mode 100644 index 0000000000..72cc148c33 --- /dev/null +++ b/example/gif.h @@ -0,0 +1,835 @@ +// +// gif.h +// by Charlie Tangora +// Public domain. +// Email me : ctangora -at- gmail -dot- com +// +// This file offers a simple, very limited way to create animated GIFs directly in code. +// +// Those looking for particular cleverness are likely to be disappointed; it's pretty +// much a straight-ahead implementation of the GIF format with optional Floyd-Steinberg +// dithering. (It does at least use delta encoding - only the changed portions of each +// frame are saved.) +// +// So resulting files are often quite large. The hope is that it will be handy nonetheless +// as a quick and easily-integrated way for programs to spit out animations. +// +// Only RGBA8 is currently supported as an input format. (The alpha is ignored.) +// +// If capturing a buffer with a bottom-left origin (such as OpenGL), define GIF_FLIP_VERT +// to automatically flip the buffer data when writing the image (the buffer itself is +// unchanged. +// +// USAGE: +// Create a GifWriter struct. Pass it to GifBegin() to initialize and write the header. +// Pass subsequent frames to GifWriteFrame(). +// Finally, call GifEnd() to close the file handle and free memory. +// + +#ifndef gif_h +#define gif_h + +#include // for FILE* +#include // for memcpy and bzero +#include // for integer typedefs + +// Define these macros to hook into a custom memory allocator. +// TEMP_MALLOC and TEMP_FREE will only be called in stack fashion - frees in the reverse order of mallocs +// and any temp memory allocated by a function will be freed before it exits. +// MALLOC and FREE are used only by GifBegin and GifEnd respectively (to allocate a buffer the size of the image, which +// is used to find changed pixels for delta-encoding.) + +#ifndef GIF_TEMP_MALLOC +#include +#define GIF_TEMP_MALLOC malloc +#endif + +#ifndef GIF_TEMP_FREE +#include +#define GIF_TEMP_FREE free +#endif + +#ifndef GIF_MALLOC +#include +#define GIF_MALLOC malloc +#endif + +#ifndef GIF_FREE +#include +#define GIF_FREE free +#endif + +const int kGifTransIndex = 0; + +struct GifPalette +{ + int bitDepth; + + uint8_t r[256]; + uint8_t g[256]; + uint8_t b[256]; + + // k-d tree over RGB space, organized in heap fashion + // i.e. left child of node i is node i*2, right child is node i*2+1 + // nodes 256-511 are implicitly the leaves, containing a color + uint8_t treeSplitElt[255]; + uint8_t treeSplit[255]; +}; + +// max, min, and abs functions +int GifIMax(int l, int r) { return l>r?l:r; } +int GifIMin(int l, int r) { return l (1<bitDepth)-1) + { + int ind = treeRoot-(1<bitDepth); + if(ind == kGifTransIndex) return; + + // check whether this color is better than the current winner + int r_err = r - ((int32_t)pPal->r[ind]); + int g_err = g - ((int32_t)pPal->g[ind]); + int b_err = b - ((int32_t)pPal->b[ind]); + int diff = GifIAbs(r_err)+GifIAbs(g_err)+GifIAbs(b_err); + + if(diff < bestDiff) + { + bestInd = ind; + bestDiff = diff; + } + + return; + } + + // take the appropriate color (r, g, or b) for this node of the k-d tree + int comps[3]; comps[0] = r; comps[1] = g; comps[2] = b; + int splitComp = comps[pPal->treeSplitElt[treeRoot]]; + + int splitPos = pPal->treeSplit[treeRoot]; + if(splitPos > splitComp) + { + // check the left subtree + GifGetClosestPaletteColor(pPal, r, g, b, bestInd, bestDiff, treeRoot*2); + if( bestDiff > splitPos - splitComp ) + { + // cannot prove there's not a better value in the right subtree, check that too + GifGetClosestPaletteColor(pPal, r, g, b, bestInd, bestDiff, treeRoot*2+1); + } + } + else + { + GifGetClosestPaletteColor(pPal, r, g, b, bestInd, bestDiff, treeRoot*2+1); + if( bestDiff > splitComp - splitPos ) + { + GifGetClosestPaletteColor(pPal, r, g, b, bestInd, bestDiff, treeRoot*2); + } + } +} + +void GifSwapPixels(uint8_t* image, int pixA, int pixB) +{ + uint8_t rA = image[pixA*4]; + uint8_t gA = image[pixA*4+1]; + uint8_t bA = image[pixA*4+2]; + uint8_t aA = image[pixA*4+3]; + + uint8_t rB = image[pixB*4]; + uint8_t gB = image[pixB*4+1]; + uint8_t bB = image[pixB*4+2]; + uint8_t aB = image[pixA*4+3]; + + image[pixA*4] = rB; + image[pixA*4+1] = gB; + image[pixA*4+2] = bB; + image[pixA*4+3] = aB; + + image[pixB*4] = rA; + image[pixB*4+1] = gA; + image[pixB*4+2] = bA; + image[pixB*4+3] = aA; +} + +// just the partition operation from quicksort +int GifPartition(uint8_t* image, const int left, const int right, const int elt, int pivotIndex) +{ + const int pivotValue = image[(pivotIndex)*4+elt]; + GifSwapPixels(image, pivotIndex, right-1); + int storeIndex = left; + bool split = 0; + for(int ii=left; ii neededCenter) + GifPartitionByMedian(image, left, pivotIndex, com, neededCenter); + + if(pivotIndex < neededCenter) + GifPartitionByMedian(image, pivotIndex+1, right, com, neededCenter); + } +} + +// Builds a palette by creating a balanced k-d tree of all pixels in the image +void GifSplitPalette(uint8_t* image, int numPixels, int firstElt, int lastElt, int splitElt, int splitDist, int treeNode, bool buildForDither, GifPalette* pal) +{ + if(lastElt <= firstElt || numPixels == 0) + return; + + // base case, bottom of the tree + if(lastElt == firstElt+1) + { + if(buildForDither) + { + // Dithering needs at least one color as dark as anything + // in the image and at least one brightest color - + // otherwise it builds up error and produces strange artifacts + if( firstElt == 1 ) + { + // special case: the darkest color in the image + uint32_t r=255, g=255, b=255; + for(int ii=0; iir[firstElt] = (uint8_t)r; + pal->g[firstElt] = (uint8_t)g; + pal->b[firstElt] = (uint8_t)b; + + return; + } + + if( firstElt == (1 << pal->bitDepth)-1 ) + { + // special case: the lightest color in the image + uint32_t r=0, g=0, b=0; + for(int ii=0; iir[firstElt] = (uint8_t)r; + pal->g[firstElt] = (uint8_t)g; + pal->b[firstElt] = (uint8_t)b; + + return; + } + } + + // otherwise, take the average of all colors in this subcube + uint64_t r=0, g=0, b=0; + for(int ii=0; iir[firstElt] = (uint8_t)r; + pal->g[firstElt] = (uint8_t)g; + pal->b[firstElt] = (uint8_t)b; + + return; + } + + // Find the axis with the largest range + int minR = 255, maxR = 0; + int minG = 255, maxG = 0; + int minB = 255, maxB = 0; + for(int ii=0; ii maxR) maxR = r; + if(r < minR) minR = r; + + if(g > maxG) maxG = g; + if(g < minG) minG = g; + + if(b > maxB) maxB = b; + if(b < minB) minB = b; + } + + int rRange = maxR - minR; + int gRange = maxG - minG; + int bRange = maxB - minB; + + // and split along that axis. (incidentally, this means this isn't a "proper" k-d tree but I don't know what else to call it) + int splitCom = 1; + if(bRange > gRange) splitCom = 2; + if(rRange > bRange && rRange > gRange) splitCom = 0; + + int subPixelsA = numPixels * (splitElt - firstElt) / (lastElt - firstElt); + int subPixelsB = numPixels-subPixelsA; + + GifPartitionByMedian(image, 0, numPixels, splitCom, subPixelsA); + + pal->treeSplitElt[treeNode] = (uint8_t)splitCom; + pal->treeSplit[treeNode] = image[subPixelsA*4+splitCom]; + + GifSplitPalette(image, subPixelsA, firstElt, splitElt, splitElt-splitDist, splitDist/2, treeNode*2, buildForDither, pal); + GifSplitPalette(image+subPixelsA*4, subPixelsB, splitElt, lastElt, splitElt+splitDist, splitDist/2, treeNode*2+1, buildForDither, pal); +} + +// Finds all pixels that have changed from the previous image and +// moves them to the fromt of th buffer. +// This allows us to build a palette optimized for the colors of the +// changed pixels only. +int GifPickChangedPixels( const uint8_t* lastFrame, uint8_t* frame, int numPixels ) +{ + int numChanged = 0; + uint8_t* writeIter = frame; + + for (int ii=0; iibitDepth = bitDepth; + + // SplitPalette is destructive (it sorts the pixels by color) so + // we must create a copy of the image for it to destroy + size_t imageSize = (size_t)(width * height * 4 * sizeof(uint8_t)); + uint8_t* destroyableImage = (uint8_t*)GIF_TEMP_MALLOC(imageSize); + memcpy(destroyableImage, nextFrame, imageSize); + + int numPixels = (int)(width * height); + if(lastFrame) + numPixels = GifPickChangedPixels(lastFrame, destroyableImage, numPixels); + + const int lastElt = 1 << bitDepth; + const int splitElt = lastElt/2; + const int splitDist = splitElt/2; + + GifSplitPalette(destroyableImage, numPixels, 1, lastElt, splitElt, splitDist, 1, buildForDither, pPal); + + GIF_TEMP_FREE(destroyableImage); + + // add the bottom node for the transparency index + pPal->treeSplit[1 << (bitDepth-1)] = 0; + pPal->treeSplitElt[1 << (bitDepth-1)] = 0; + + pPal->r[0] = pPal->g[0] = pPal->b[0] = 0; +} + +// Implements Floyd-Steinberg dithering, writes palette value to alpha +void GifDitherImage( const uint8_t* lastFrame, const uint8_t* nextFrame, uint8_t* outFrame, uint32_t width, uint32_t height, GifPalette* pPal ) +{ + int numPixels = (int)(width * height); + + // quantPixels initially holds color*256 for all pixels + // The extra 8 bits of precision allow for sub-single-color error values + // to be propagated + int32_t *quantPixels = (int32_t *)GIF_TEMP_MALLOC(sizeof(int32_t) * (size_t)numPixels * 4); + + for( int ii=0; iir[bestInd]) * 256; + int32_t g_err = nextPix[1] - int32_t(pPal->g[bestInd]) * 256; + int32_t b_err = nextPix[2] - int32_t(pPal->b[bestInd]) * 256; + + nextPix[0] = pPal->r[bestInd]; + nextPix[1] = pPal->g[bestInd]; + nextPix[2] = pPal->b[bestInd]; + nextPix[3] = bestInd; + + // Propagate the error to the four adjacent locations + // that we haven't touched yet + int quantloc_7 = (int)(yy * width + xx + 1); + int quantloc_3 = (int)(yy * width + width + xx - 1); + int quantloc_5 = (int)(yy * width + width + xx); + int quantloc_1 = (int)(yy * width + width + xx + 1); + + if(quantloc_7 < numPixels) + { + int32_t* pix7 = quantPixels+4*quantloc_7; + pix7[0] += GifIMax( -pix7[0], r_err * 7 / 16 ); + pix7[1] += GifIMax( -pix7[1], g_err * 7 / 16 ); + pix7[2] += GifIMax( -pix7[2], b_err * 7 / 16 ); + } + + if(quantloc_3 < numPixels) + { + int32_t* pix3 = quantPixels+4*quantloc_3; + pix3[0] += GifIMax( -pix3[0], r_err * 3 / 16 ); + pix3[1] += GifIMax( -pix3[1], g_err * 3 / 16 ); + pix3[2] += GifIMax( -pix3[2], b_err * 3 / 16 ); + } + + if(quantloc_5 < numPixels) + { + int32_t* pix5 = quantPixels+4*quantloc_5; + pix5[0] += GifIMax( -pix5[0], r_err * 5 / 16 ); + pix5[1] += GifIMax( -pix5[1], g_err * 5 / 16 ); + pix5[2] += GifIMax( -pix5[2], b_err * 5 / 16 ); + } + + if(quantloc_1 < numPixels) + { + int32_t* pix1 = quantPixels+4*quantloc_1; + pix1[0] += GifIMax( -pix1[0], r_err / 16 ); + pix1[1] += GifIMax( -pix1[1], g_err / 16 ); + pix1[2] += GifIMax( -pix1[2], b_err / 16 ); + } + } + } + + // Copy the palettized result to the output buffer + for( int ii=0; iir[bestInd]; + outFrame[1] = pPal->g[bestInd]; + outFrame[2] = pPal->b[bestInd]; + outFrame[3] = (uint8_t)bestInd; + } + + if(lastFrame) lastFrame += 4; + outFrame += 4; + nextFrame += 4; + } +} + +// Simple structure to write out the LZW-compressed portion of the image +// one bit at a time +struct GifBitStatus +{ + uint8_t bitIndex; // how many bits in the partial byte written so far + uint8_t byte; // current partial byte + + uint32_t chunkIndex; + uint8_t chunk[256]; // bytes are written in here until we have 256 of them, then written to the file +}; + +// insert a single bit +void GifWriteBit( GifBitStatus& stat, uint32_t bit ) +{ + bit = bit & 1; + bit = bit << stat.bitIndex; + stat.byte |= bit; + + ++stat.bitIndex; + if( stat.bitIndex > 7 ) + { + // move the newly-finished byte to the chunk buffer + stat.chunk[stat.chunkIndex++] = stat.byte; + // and start a new byte + stat.bitIndex = 0; + stat.byte = 0; + } +} + +// write all bytes so far to the file +void GifWriteChunk( FILE* f, GifBitStatus& stat ) +{ + fputc((int)stat.chunkIndex, f); + fwrite(stat.chunk, 1, stat.chunkIndex, f); + + stat.bitIndex = 0; + stat.byte = 0; + stat.chunkIndex = 0; +} + +void GifWriteCode( FILE* f, GifBitStatus& stat, uint32_t code, uint32_t length ) +{ + for( uint32_t ii=0; ii> 1; + + if( stat.chunkIndex == 255 ) + { + GifWriteChunk(f, stat); + } + } +} + +// The LZW dictionary is a 256-ary tree constructed as the file is encoded, +// this is one node +struct GifLzwNode +{ + uint16_t m_next[256]; +}; + +// write a 256-color (8-bit) image palette to the file +void GifWritePalette( const GifPalette* pPal, FILE* f ) +{ + fputc(0, f); // first color: transparency + fputc(0, f); + fputc(0, f); + + for(int ii=1; ii<(1 << pPal->bitDepth); ++ii) + { + uint32_t r = pPal->r[ii]; + uint32_t g = pPal->g[ii]; + uint32_t b = pPal->b[ii]; + + fputc((int)r, f); + fputc((int)g, f); + fputc((int)b, f); + } +} + +// write the image header, LZW-compress and write out the image +void GifWriteLzwImage(FILE* f, uint8_t* image, uint32_t left, uint32_t top, uint32_t width, uint32_t height, uint32_t delay, GifPalette* pPal) +{ + // graphics control extension + fputc(0x21, f); + fputc(0xf9, f); + fputc(0x04, f); + fputc(0x05, f); // leave prev frame in place, this frame has transparency + fputc(delay & 0xff, f); + fputc((delay >> 8) & 0xff, f); + fputc(kGifTransIndex, f); // transparent color index + fputc(0, f); + + fputc(0x2c, f); // image descriptor block + + fputc(left & 0xff, f); // corner of image in canvas space + fputc((left >> 8) & 0xff, f); + fputc(top & 0xff, f); + fputc((top >> 8) & 0xff, f); + + fputc(width & 0xff, f); // width and height of image + fputc((width >> 8) & 0xff, f); + fputc(height & 0xff, f); + fputc((height >> 8) & 0xff, f); + + //fputc(0, f); // no local color table, no transparency + //fputc(0x80, f); // no local color table, but transparency + + fputc(0x80 + pPal->bitDepth-1, f); // local color table present, 2 ^ bitDepth entries + GifWritePalette(pPal, f); + + const int minCodeSize = pPal->bitDepth; + const uint32_t clearCode = 1 << pPal->bitDepth; + + fputc(minCodeSize, f); // min code size 8 bits + + GifLzwNode* codetree = (GifLzwNode*)GIF_TEMP_MALLOC(sizeof(GifLzwNode)*4096); + + memset(codetree, 0, sizeof(GifLzwNode)*4096); + int32_t curCode = -1; + uint32_t codeSize = (uint32_t)minCodeSize + 1; + uint32_t maxCode = clearCode+1; + + GifBitStatus stat; + stat.byte = 0; + stat.bitIndex = 0; + stat.chunkIndex = 0; + + GifWriteCode(f, stat, clearCode, codeSize); // start with a fresh LZW dictionary + + for(uint32_t yy=0; yy= (1ul << codeSize) ) + { + // dictionary entry count has broken a size barrier, + // we need more bits for codes + codeSize++; + } + if( maxCode == 4095 ) + { + // the dictionary is full, clear it out and begin anew + GifWriteCode(f, stat, clearCode, codeSize); // clear tree + + memset(codetree, 0, sizeof(GifLzwNode)*4096); + codeSize = (uint32_t)(minCodeSize + 1); + maxCode = clearCode+1; + } + + curCode = nextValue; + } + } + } + + // compression footer + GifWriteCode(f, stat, (uint32_t)curCode, codeSize); + GifWriteCode(f, stat, clearCode, codeSize); + GifWriteCode(f, stat, clearCode + 1, (uint32_t)minCodeSize + 1); + + // write out the last partial chunk + while( stat.bitIndex ) GifWriteBit(stat, 0); + if( stat.chunkIndex ) GifWriteChunk(f, stat); + + fputc(0, f); // image block terminator + + GIF_TEMP_FREE(codetree); +} + +struct GifWriter +{ + FILE* f; + uint8_t* oldImage; + bool firstFrame; +}; + +// Creates a gif file. +// The input GIFWriter is assumed to be uninitialized. +// The delay value is the time between frames in hundredths of a second - note that not all viewers pay much attention to this value. +bool GifBegin( GifWriter* writer, const char* filename, uint32_t width, uint32_t height, uint32_t delay, int32_t bitDepth = 8, bool dither = false ) +{ + (void)bitDepth; (void)dither; // Mute "Unused argument" warnings +#if defined(_MSC_VER) && (_MSC_VER >= 1400) + writer->f = 0; + fopen_s(&writer->f, filename, "wb"); +#else + writer->f = fopen(filename, "wb"); +#endif + if(!writer->f) return false; + + writer->firstFrame = true; + + // allocate + writer->oldImage = (uint8_t*)GIF_MALLOC(width*height*4); + + fputs("GIF89a", writer->f); + + // screen descriptor + fputc(width & 0xff, writer->f); + fputc((width >> 8) & 0xff, writer->f); + fputc(height & 0xff, writer->f); + fputc((height >> 8) & 0xff, writer->f); + + fputc(0xf0, writer->f); // there is an unsorted global color table of 2 entries + fputc(0, writer->f); // background color + fputc(0, writer->f); // pixels are square (we need to specify this because it's 1989) + + // now the "global" palette (really just a dummy palette) + // color 0: black + fputc(0, writer->f); + fputc(0, writer->f); + fputc(0, writer->f); + // color 1: also black + fputc(0, writer->f); + fputc(0, writer->f); + fputc(0, writer->f); + + if( delay != 0 ) + { + // animation header + fputc(0x21, writer->f); // extension + fputc(0xff, writer->f); // application specific + fputc(11, writer->f); // length 11 + fputs("NETSCAPE2.0", writer->f); // yes, really + fputc(3, writer->f); // 3 bytes of NETSCAPE2.0 data + + fputc(1, writer->f); // JUST BECAUSE + fputc(0, writer->f); // loop infinitely (byte 0) + fputc(0, writer->f); // loop infinitely (byte 1) + + fputc(0, writer->f); // block terminator + } + + return true; +} + +// Writes out a new frame to a GIF in progress. +// The GIFWriter should have been created by GIFBegin. +// AFAIK, it is legal to use different bit depths for different frames of an image - +// this may be handy to save bits in animations that don't change much. +bool GifWriteFrame( GifWriter* writer, const uint8_t* image, uint32_t width, uint32_t height, uint32_t delay, int bitDepth = 8, bool dither = false ) +{ + if(!writer->f) return false; + + const uint8_t* oldImage = writer->firstFrame? NULL : writer->oldImage; + writer->firstFrame = false; + + GifPalette pal; + GifMakePalette((dither? NULL : oldImage), image, width, height, bitDepth, dither, &pal); + + if(dither) + GifDitherImage(oldImage, image, writer->oldImage, width, height, &pal); + else + GifThresholdImage(oldImage, image, writer->oldImage, width, height, &pal); + + GifWriteLzwImage(writer->f, writer->oldImage, 0, 0, width, height, delay, &pal); + + return true; +} + +// Writes the EOF code, closes the file handle, and frees temp memory used by a GIF. +// Many if not most viewers will still display a GIF properly if the EOF code is missing, +// but it's still a good idea to write it out. +bool GifEnd( GifWriter* writer ) +{ + if(!writer->f) return false; + + fputc(0x3b, writer->f); // end of file + fclose(writer->f); + GIF_FREE(writer->oldImage); + + writer->f = NULL; + writer->oldImage = NULL; + + return true; +} + +#endif diff --git a/example/meson.build b/example/meson.build index ae4d15f0fc..cd2c47ffcd 100644 --- a/example/meson.build +++ b/example/meson.build @@ -5,6 +5,11 @@ common_source += files('lottieview.cpp') demo_sources = files('demo.cpp') demo_sources += common_source +executable('rlottie', + 'rlottietest.cpp', + include_directories : inc, + link_with : rlottie_lib) + executable('vectorTest', 'vectortest.cpp', include_directories : inc, diff --git a/example/rlottietest.cpp b/example/rlottietest.cpp new file mode 100644 index 0000000000..f485c4eb06 --- /dev/null +++ b/example/rlottietest.cpp @@ -0,0 +1,139 @@ +#include "gif.h" +#include "rlottie.h" + +#include +#include +#include +#include + +class GifBuilder { +public: + GifBuilder(const std::string &fileName , const uint32_t width, + const uint32_t height, const uint32_t delay = 2) + { + GifBegin(&handle, fileName.c_str(), width, height, delay); + } + void addFrame(rlottie::Surface &s, uint32_t delay = 2) + { + argbTorgba(s); + GifWriteFrame(&handle, + reinterpret_cast(s.buffer()), + s.width(), + s.height(), + delay); + } + void argbTorgba(rlottie::Surface &s) + { + uint8_t *buffer = reinterpret_cast(s.buffer()); + uint32_t totalBytes = s.height() * s.bytesPerLine(); + + for (uint32_t i = 0; i < totalBytes; i += 4) { + unsigned char a = buffer[i+3]; + // compute only if alpha is non zero + if (a) { + unsigned char r = buffer[i+2]; + unsigned char g = buffer[i+1]; + unsigned char b = buffer[i]; + + if (a != 255) { //un premultiply + r = (r * 255) / a; + g = (g * 255) / a; + b = (b * 255) / a; + + buffer[i] = r; + buffer[i+1] = g; + buffer[i+2] = b; + + } else { + // only swizzle r and b + buffer[i] = r; + buffer[i+2] = b; + } + } else { + buffer[i+2] = 255; + buffer[i+1] = 255; + buffer[i] = 255; + } + } + } + void commit() + { + GifEnd(&handle); + } +private: + GifWriter handle; +}; + +class App { +public: + int render(uint32_t w, uint32_t h) + { + auto player = rlottie::Animation::loadFromFile(fileName); + if (!player) return help(); + + uint32_t* buffer = (uint32_t *) malloc(w * h * 4); + size_t frameCount = player->totalFrame(); + + GifBuilder builder(baseName.data(), w, h); + for (size_t i = 0; i < frameCount ; i++) { + rlottie::Surface surface(buffer, w, h, w * 4); + player->renderSync(i, surface); + builder.addFrame(surface); + } + builder.commit(); + + free(buffer); + return result(); + } + + int setup(int argc, char **argv) + { + if (argc > 1) fileName = argv[1]; + + if (!fileName) return help(); + + fileName = realpath(fileName, absoloutePath.data()); + + if (!fileName || !jsonFile(fileName) ) return help(); + + baseName = absoloutePath; + char *base = basename(baseName.data()); + snprintf(baseName.data(), baseName.size(), "%s.gif",base); + return 0; + } + +private: + + bool jsonFile(const char *filename) { + const char *dot = strrchr(filename, '.'); + if(!dot || dot == filename) return false; + return !strcmp(dot + 1, "json"); + } + + int result() { + std::cout<<"Generated Gif file : "< absoloutePath; + std::array baseName; +}; + +int +main(int argc, char **argv) +{ + App app; + + if (app.setup(argc, argv)) return 1; + + app.render(200, 200); + + return 0; +} From 9e56f12850bcd167754556128cfeca3727a5176c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 30 Apr 2019 16:52:46 +0900 Subject: [PATCH 464/672] rlottie/header: fixed issue with public header dependency of c++14 c++11 only supports static constexpr function with one return statement. so our maptype() function is valid in c++14 but not on c++11. to work around used the explicit class instantiation to map property type to value type. --- inc/rlottie.h | 52 +++++++++++++++------------------- src/lottie/lottieanimation.cpp | 8 +++--- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/inc/rlottie.h b/inc/rlottie.h index 11e1e7c2a0..d3a48a9495 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -83,6 +83,12 @@ enum class Property { TrOpacity /*!< Transform Opacity property of Layer and Group object , value type is float [ 0 .. 100] */ }; +struct Color_Type{}; +struct Point_Type{}; +struct Size_Type{}; +struct Float_Type{}; +template struct MapType; + class LOT_EXPORT Surface { public: /** @@ -388,7 +394,7 @@ public: template void setValue(const std::string &keypath, AnyValue value) { - setValue(std::integral_constant{}, prop, keypath, value); + setValue(MapType>{}, prop, keypath, value); } /** @@ -399,34 +405,10 @@ public: ~Animation(); private: - enum class ValueType {Color,Point,Size,Float}; - static constexpr ValueType mapType(Property prop) { - switch (prop) { - case Property::FillColor: - case Property::StrokeColor: - return ValueType::Color; - case Property::FillOpacity: - case Property::StrokeOpacity: - case Property::StrokeWidth: - case Property::TrOpacity: - case Property::TrRotation: - return ValueType::Float; - case Property::TrAnchor: - case Property::TrPosition: - return ValueType::Point; - case Property::TrScale: - return ValueType::Size; - } - } - - void setValue(std::integral_constant, - Property, const std::string &, Color); - void setValue(std::integral_constant, - Property, const std::string &, float); - void setValue(std::integral_constant, - Property, const std::string &, Size); - void setValue(std::integral_constant, - Property, const std::string &, Point); + void setValue(Color_Type, Property, const std::string &, Color); + void setValue(Float_Type, Property, const std::string &, float); + void setValue(Size_Type, Property, const std::string &, Size); + void setValue(Point_Type, Property, const std::string &, Point); /** * @brief default constructor * @@ -437,6 +419,18 @@ private: std::unique_ptr d; }; +//Map Property to Value type +template<> struct MapType>: Color_Type{}; +template<> struct MapType>: Color_Type{}; +template<> struct MapType>: Float_Type{}; +template<> struct MapType>: Float_Type{}; +template<> struct MapType>: Float_Type{}; +template<> struct MapType>: Float_Type{}; +template<> struct MapType>: Float_Type{}; +template<> struct MapType>: Point_Type{}; +template<> struct MapType>: Point_Type{}; +template<> struct MapType>: Size_Type{}; + } // namespace lotplayer diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index d5376eaea1..08ed5dc48a 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -314,28 +314,28 @@ const LayerInfoList& Animation::layers() const return d->layerInfoList(); } -void Animation::setValue(std::integral_constant,Property prop, +void Animation::setValue(Color_Type,Property prop, const std::string &keypath, Color value) { d->setValue(keypath, LOTVariant(prop, value)); } -void Animation::setValue(std::integral_constant, Property prop, +void Animation::setValue(Float_Type, Property prop, const std::string &keypath, float value) { d->setValue(keypath, LOTVariant(prop, value)); } -void Animation::setValue(std::integral_constant,Property prop, +void Animation::setValue(Size_Type,Property prop, const std::string &keypath, Size value) { d->setValue(keypath, LOTVariant(prop, value)); } -void Animation::setValue(std::integral_constant, Property prop, +void Animation::setValue(Point_Type, Property prop, const std::string &keypath, Point value) { From c2457d853205ff0be4a454fae6112216355efb21 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 7 May 2019 15:20:31 +0900 Subject: [PATCH 465/672] rlottie: mask item shouldn't inherit parent opacity --- src/lottie/lottieitem.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index dd5a113e88..93a1cd9674 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -193,7 +193,7 @@ bool LOTCompItem::render(const rlottie::Surface &surface) } void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, - float parentAlpha, const DirtyFlag &flag) + float /*parentAlpha*/, const DirtyFlag &flag) { if (flag.testFlag(DirtyFlagBit::None) && mData->isStatic()) return; @@ -204,9 +204,8 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, } else { mData->mShape.value(frameNo).toPath(mLocalPath); } - float opacity = mData->opacity(frameNo); - opacity = opacity * parentAlpha; - mCombinedAlpha = opacity; + /* mask item dosen't inherit opacity */ + mCombinedAlpha = mData->opacity(frameNo); mFinalPath.clone(mLocalPath); mFinalPath.transform(parentMatrix); From 6d9c9b249a74f83cec29b094c5a90465b333c7b2 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 8 May 2019 20:04:36 +0900 Subject: [PATCH 466/672] lottie: resolve c++11 compatible problem. no logical changes. --- src/lottie/lottiemodel.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index d71a40df32..2e54834f86 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -746,6 +746,8 @@ public: struct Segment { float start{0}; float end{0}; + Segment() {} + Segment(float s, float e):start(s), end(e) {} }; enum class TrimType { Simultaneously, @@ -763,8 +765,8 @@ public: float offset = fmod(mOffset.value(frameNo), 360.0f)/ 360.0f; float diff = fabs(start - end); - if (vCompare(diff, 0.0f)) return {0, 0}; - if (vCompare(diff, 1.0f)) return {0, 1}; + if (vCompare(diff, 0.0f)) return Segment(0, 0); + if (vCompare(diff, 1.0f)) return Segment(0, 1); // no offset case if (vCompare(fabs(offset), 0.0f)) { From a6b054a15765909c0223a6338e88dbdb74621fab Mon Sep 17 00:00:00 2001 From: Mihai Serban Date: Tue, 7 May 2019 10:12:15 +0300 Subject: [PATCH 467/672] vector: build for ARM NEON --- src/vector/meson.build | 1 + src/vector/pixman/meson.build | 2 +- src/vector/pixman/pixman-arm-neon-asm.S | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vector/meson.build b/src/vector/meson.build index ed8b471eed..543f730566 100644 --- a/src/vector/meson.build +++ b/src/vector/meson.build @@ -13,6 +13,7 @@ source_file += files('vpainter.cpp') source_file += files('vcompositionfunctions.cpp') source_file += files('vdrawhelper.cpp') source_file += files('vdrawhelper_sse2.cpp') +source_file += files('vdrawhelper_neon.cpp') source_file += files('vdrawable.cpp') source_file += files('vrect.cpp') diff --git a/src/vector/pixman/meson.build b/src/vector/pixman/meson.build index c45d81a7c3..f3da1f3528 100644 --- a/src/vector/pixman/meson.build +++ b/src/vector/pixman/meson.build @@ -1,5 +1,5 @@ -source_file = files('vregion.cpp') +source_file = files('vregion.cpp', 'pixman-arm-neon-asm.S') pixman_dep = declare_dependency( include_directories : include_directories('.'), diff --git a/src/vector/pixman/pixman-arm-neon-asm.S b/src/vector/pixman/pixman-arm-neon-asm.S index f2203c21cf..0124d652c1 100644 --- a/src/vector/pixman/pixman-arm-neon-asm.S +++ b/src/vector/pixman/pixman-arm-neon-asm.S @@ -23,6 +23,8 @@ * Author: Siarhei Siamashka (siarhei.siamashka@nokia.com) */ +#if defined(__ARM_NEON__) + /* * This file contains implementations of NEON optimized pixel processing * functions. There is no full and detailed tutorial, but some functions @@ -495,3 +497,4 @@ generate_composite_function \ 0 /* mask_basereg */ /******************************************************************************/ +#endif // defined(__ARM_NEON__) From cb26cf4225af3d5e862880af09d9c49c212d5a41 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 May 2019 09:52:33 +0900 Subject: [PATCH 468/672] rlottie: refactor with standard algorithms --- src/lottie/lottieparser.cpp | 4 ++-- src/lottie/lottieproxymodel.h | 33 ++++++++++++++++----------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 8971323fb2..2e08aa8e49 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -54,10 +54,10 @@ // This parser uses in-situ strings, so the JSON buffer will be altered during // the parse. -#include +#include + #include "lottiemodel.h" #include "rapidjson/document.h" -#include "velapsedtimer.h" RAPIDJSON_DIAG_PUSH #ifdef __GNUC__ diff --git a/src/lottie/lottieproxymodel.h b/src/lottie/lottieproxymodel.h index 54a7d52603..2137d61644 100644 --- a/src/lottie/lottieproxymodel.h +++ b/src/lottie/lottieproxymodel.h @@ -20,6 +20,7 @@ #define LOTTIEPROXYMODEL_H #include +#include #include "lottiemodel.h" #include "rlottie.h" @@ -59,12 +60,10 @@ public: { uint index = static_cast(value.property()); if (mBitset.test(index)) { - for (uint i=0; i < mFilters.size(); i++ ) { - if (mFilters[i].property() == value.property()) { - mFilters[i] = value; - break; - } - } + std::replace_if(mFilters.begin(), + mFilters.end(), + [&value](const LOTVariant &e) {return e.property() == value.property();}, + value); } else { mBitset.set(index); mFilters.push_back(value); @@ -76,12 +75,10 @@ public: uint index = static_cast(value.property()); if (mBitset.test(index)) { mBitset.reset(index); - for (uint i=0; i < mFilters.size(); i++ ) { - if (mFilters[i].property() == value.property()) { - mFilters.erase(mFilters.begin() + i); - break; - } - } + mFilters.erase(std::remove_if(mFilters.begin(), + mFilters.end(), + [&value](const LOTVariant &e) {return e.property() == value.property();}), + mFilters.end()); } } bool hasFilter(rlottie::Property prop) const @@ -105,12 +102,14 @@ public: private: LOTVariant data(rlottie::Property prop) const { - for (uint i=0; i < mFilters.size(); i++ ) { - if (mFilters[i].property() == prop) { - return mFilters[i]; - } + auto result = std::find_if(mFilters.begin(), + mFilters.end(), + [prop](const LOTVariant &e){return e.property() == prop;}); + if (result != mFilters.end()) { + return *result; + } else { + return LOTVariant(prop, 0); } - return LOTVariant(prop, 0); } std::vector mFilters; std::bitset<32> mBitset{0}; From 7d04fa9355c3081da97e25a54b058ad2e06a7a56 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 May 2019 14:36:36 +0900 Subject: [PATCH 469/672] added lottie2gif converter for both cmake and meson build --- CMakeLists.txt | 1 + example/{rlottietest.cpp => lottie2gif.cpp} | 4 ++-- example/meson.build | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) rename example/{rlottietest.cpp => lottie2gif.cpp} (96%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e9abe71a1..b14a4af815 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ target_link_libraries(rlottie #declare source and include files add_subdirectory(inc) add_subdirectory(src) +add_subdirectory(example) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_DIR ${PREFIX}) diff --git a/example/rlottietest.cpp b/example/lottie2gif.cpp similarity index 96% rename from example/rlottietest.cpp rename to example/lottie2gif.cpp index f485c4eb06..0fac9eb053 100644 --- a/example/rlottietest.cpp +++ b/example/lottie2gif.cpp @@ -111,12 +111,12 @@ private: } int result() { - std::cout<<"Generated Gif file : "< Date: Thu, 9 May 2019 15:28:54 +0900 Subject: [PATCH 470/672] added missing cmake file --- example/CMakeLists.txt | 11 +++++++++++ example/lottie2gif.cpp | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 example/CMakeLists.txt diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 0000000000..9c0f4273f4 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,11 @@ +add_executable(lottie-gif "lottie2gif.cpp") + +target_compile_options(lottie-gif + PRIVATE + -std=c++11) + +target_link_libraries(lottie-gif rlottie) + +target_include_directories(lottie-gif + PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/../inc/") diff --git a/example/lottie2gif.cpp b/example/lottie2gif.cpp index 0fac9eb053..3e2e91abe7 100644 --- a/example/lottie2gif.cpp +++ b/example/lottie2gif.cpp @@ -1,5 +1,5 @@ #include "gif.h" -#include "rlottie.h" +#include #include #include From f2e4b016a6703ae1e4df6a6726bb97791711e4e8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 May 2019 15:05:50 +0900 Subject: [PATCH 471/672] rlottie: updated demo section of the README --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7ad95dd41e..1e2d538d27 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ Here is just a small sampling of the power of Lottie - [Meson Build](#meson-build) - [Cmake Build](#cmake-build) - [Test](#test) +- [Demo](#demo) - [Previewing Lottie JSON Files](#previewing-lottie-json-files) - [Quick Start](#quick-start) -- [Demo](#demo) - [Dynamic Property](#dynamic-property) - [Supported After Effects Features](#supported-after-effects-features) - [Issues or Feature Requests?](#issues-or-feature-requests) @@ -86,6 +86,17 @@ ninja test ``` [Back to contents](#contents) +# +## Demo +If you want to see rlottie librray in action without building it please visit [rlottie online viewer](http://rlottie.com) + +While building rlottie library it generates a simple lottie to GIF converter which can be used to convert lottie json file to GIF file. + +Run Demo +``` +lottie2gif [lottie file name] +``` + # ## Previewing Lottie JSON Files Please visit [rlottie online viewer](http://rlottie.com) @@ -136,11 +147,6 @@ rlottie::Surface surface = handle.get(); [Back to contents](#contents) -# -## Demo - -Update me - # ## Dynamic Property From 906d6b68f30047cbfbb7fdd4977c972990c5bd9c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 9 May 2019 16:59:13 +0900 Subject: [PATCH 472/672] updated travis for clang build --- .travis.yml | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 91921b2e46..f3b5975ca5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,30 +13,23 @@ addons: matrix: include: - - os: linux - compiler: clang - env: - build_type=debug - options="" - - os: linux compiler: clang env: build_type=release options="" - - - os: linux - compiler: gcc - env: - build_type=debug - options="" - + - MATRIX_EVAL="CC=clang-5.0 && CXX=clang++" + - os: linux compiler: gcc env: build_type=release options="" + - MATRIX_EVAL="CC=gcc-5 && CXX=g++-5" +before_install: + - eval "${MATRIX_EVAL}" + script: - - CXX=/usr/bin/g++-5 CC=/usr/bin/gcc-5 cmake -DLIB_INSTALL_DIR=/usr/lib . + - cmake -DLIB_INSTALL_DIR=/usr/lib . - cmake --build . -- -j2 From 231e82d0f8fc6beb3585d8ba42165486ef008348 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 13 May 2019 17:07:21 +0900 Subject: [PATCH 473/672] lottie: shutdown a static analizyer tool warning. initialize a member variable properly. --- src/lottie/lottieitem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 49276dec7d..0e6c8dbc8b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -441,7 +441,7 @@ protected: bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) final; private: LOTProxyModel mModel; - LOTStrokeData *mData; + LOTStrokeData *mData{nullptr}; VColor mColor; float mWidth{0}; float mDashArray[6]; From 323b07c37fab0436f6731bd71cc3ad06b7a8c5a7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 13 May 2019 09:30:56 +0900 Subject: [PATCH 474/672] rlottie: added support of lambda expression in setValue. --- example/demo.cpp | 9 +- inc/rlottie.h | 41 ++++-- src/lottie/lottieanimation.cpp | 34 ++++- src/lottie/lottieitem.cpp | 2 +- src/lottie/lottieitem.h | 2 - src/lottie/lottieproxymodel.h | 229 +++++++++++++++++++++++++++------ 6 files changed, 263 insertions(+), 54 deletions(-) diff --git a/example/demo.cpp b/example/demo.cpp index 48625c602e..99703036ce 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -50,7 +50,14 @@ main(void) LottieView *view = new LottieView(app->evas()); view->setFilePath(filePath.c_str()); if (view->player()) { - view->player()->setValue("**", rlottie::Color(0, 1, 0)); + view->player()->setValue("**", + [](const rlottie::FrameInfo& info) { + if (info.curFrame() < 15 ) + return rlottie::Color(0, 1, 0); + else { + return rlottie::Color(1, 0, 0); + } + }); } view->setPos(0, 0); view->setSize(800, 800); diff --git a/inc/rlottie.h b/inc/rlottie.h index d3a48a9495..765698eb56 100644 --- a/inc/rlottie.h +++ b/inc/rlottie.h @@ -52,22 +52,42 @@ struct LOTLayerNode; namespace rlottie { struct Color { - Color(){} - Color(float r, float g , float b):mr(r), mg(g), mb(b){} -public: - float mr{0}, mg{0}, mb{0}; + Color() = default; + Color(float r, float g , float b):_r(r), _g(g), _b(b){} + float r() const {return _r;} + float g() const {return _g;} + float b() const {return _b;} +private: + float _r{0}; + float _g{0}; + float _b{0}; }; struct Size { - Size(float w, float h):mw(w), mh(h){} + Size() = default; + Size(float w, float h):_w(w), _h(h){} + float w() const {return _w;} + float h() const {return _h;} private: - float mw{0} , mh{0}; + float _w{0}; + float _h{0}; }; struct Point { - Point(float x, float y):mx(x), my(y){} + Point() = default; + Point(float x, float y):_x(x), _y(y){} + float x() const {return _x;} + float y() const {return _y;} private: - float mx{0} , my{0}; + float _x{0}; + float _y{0}; +}; + +struct FrameInfo { + FrameInfo(uint32_t frame): _frameNo(frame){} + uint32_t curFrame() const {return _frameNo;} +private: + uint32_t _frameNo; }; enum class Property { @@ -409,6 +429,11 @@ private: void setValue(Float_Type, Property, const std::string &, float); void setValue(Size_Type, Property, const std::string &, Size); void setValue(Point_Type, Property, const std::string &, Point); + + void setValue(Color_Type, Property, const std::string &, std::function &&); + void setValue(Float_Type, Property, const std::string &, std::function &&); + void setValue(Size_Type, Property, const std::string &, std::function &&); + void setValue(Point_Type, Property, const std::string &, std::function &&); /** * @brief default constructor * diff --git a/src/lottie/lottieanimation.cpp b/src/lottie/lottieanimation.cpp index 08ed5dc48a..7547ac8ae7 100644 --- a/src/lottie/lottieanimation.cpp +++ b/src/lottie/lottieanimation.cpp @@ -318,26 +318,54 @@ void Animation::setValue(Color_Type,Property prop, const std::string &keypath, Color value) { - d->setValue(keypath, LOTVariant(prop, value)); + d->setValue(keypath, LOTVariant(prop, [value](const FrameInfo &){ return value;})); } void Animation::setValue(Float_Type, Property prop, const std::string &keypath, float value) { - d->setValue(keypath, LOTVariant(prop, value)); + d->setValue(keypath, LOTVariant(prop, [value](const FrameInfo &){ return value;})); } void Animation::setValue(Size_Type,Property prop, const std::string &keypath, Size value) { - d->setValue(keypath, LOTVariant(prop, value)); + d->setValue(keypath, LOTVariant(prop, [value](const FrameInfo &){ return value;})); } void Animation::setValue(Point_Type, Property prop, const std::string &keypath, Point value) +{ + d->setValue(keypath, LOTVariant(prop, [value](const FrameInfo &){ return value;})); +} + +void Animation::setValue(Color_Type,Property prop, + const std::string &keypath, + std::function && value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + +void Animation::setValue(Float_Type, Property prop, + const std::string &keypath, + std::function && value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + +void Animation::setValue(Size_Type,Property prop, + const std::string &keypath, + std::function && value) +{ + d->setValue(keypath, LOTVariant(prop, value)); +} + +void Animation::setValue(Point_Type, Property prop, + const std::string &keypath, + std::function && value) { d->setValue(keypath, LOTVariant(prop, value)); } diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 93a1cd9674..39d54ca726 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -73,7 +73,7 @@ bool strokeProp(rlottie::Property prop) } LOTCompItem::LOTCompItem(LOTModel *model) - : mRootModel(model), mUpdateViewBox(false), mCurFrameNo(-1) + : mUpdateViewBox(false), mCurFrameNo(-1) { mCompData = model->mRoot.get(); mRootLayer = createLayerItem(mCompData->mRootLayer.get()); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 0e6c8dbc8b..bf59614282 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -62,7 +62,6 @@ public: private: VMatrix mScaleMatrix; VSize mViewSize; - LOTModel *mRootModel; LOTCompositionData *mCompData; std::unique_ptr mRootLayer; bool mUpdateViewBox; @@ -441,7 +440,6 @@ protected: bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) final; private: LOTProxyModel mModel; - LOTStrokeData *mData{nullptr}; VColor mColor; float mWidth{0}; float mDashArray[6]; diff --git a/src/lottie/lottieproxymodel.h b/src/lottie/lottieproxymodel.h index 2137d61644..8b5ad17594 100644 --- a/src/lottie/lottieproxymodel.h +++ b/src/lottie/lottieproxymodel.h @@ -21,6 +21,7 @@ #include #include +#include #include "lottiemodel.h" #include "rlottie.h" @@ -31,26 +32,177 @@ class LOTVariant { public: - enum Type {Color, Point, Size, Float}; - LOTVariant(rlottie::Property prop, float v):property_(prop),valueType_(Type::Float),value_(v){} - LOTVariant(rlottie::Property prop, rlottie::Color col):property_(prop),valueType_(Type::Color),color_(col){} - LOTVariant(rlottie::Property prop, rlottie::Point pt):property_(prop),valueType_(Type::Point),pos_(pt){} - LOTVariant(rlottie::Property prop, rlottie::Size sz):property_(prop),valueType_(Type::Size),size_(sz){} - Type type() const {return valueType_;} - rlottie::Property property() const {return property_;} - float value() const {return value_;} - rlottie::Color color() const {return color_;} - rlottie::Point pos() const {return pos_;} - rlottie::Size size() const {return size_;} -public: - rlottie::Property property_; - Type valueType_; - union { - float value_; - rlottie::Color color_; - rlottie::Point pos_; - rlottie::Size size_; - }; + using ValueFunc = std::function; + using ColorFunc = std::function; + using PointFunc = std::function; + using SizeFunc = std::function; + + LOTVariant(rlottie::Property prop, const ValueFunc &v):mPropery(prop), mTag(Value) + { + construct(impl.valueFunc, v); + } + + LOTVariant(rlottie::Property prop, ValueFunc &&v):mPropery(prop), mTag(Value) + { + moveConstruct(impl.valueFunc, std::move(v)); + } + + LOTVariant(rlottie::Property prop, const ColorFunc &v):mPropery(prop), mTag(Color) + { + construct(impl.colorFunc, v); + } + + LOTVariant(rlottie::Property prop, ColorFunc &&v):mPropery(prop), mTag(Color) + { + moveConstruct(impl.colorFunc, std::move(v)); + } + + LOTVariant(rlottie::Property prop, const PointFunc &v):mPropery(prop), mTag(Point) + { + construct(impl.pointFunc, v); + } + + LOTVariant(rlottie::Property prop, PointFunc &&v):mPropery(prop), mTag(Point) + { + moveConstruct(impl.pointFunc, std::move(v)); + } + + LOTVariant(rlottie::Property prop, const SizeFunc &v):mPropery(prop), mTag(Size) + { + construct(impl.sizeFunc, v); + } + + LOTVariant(rlottie::Property prop, SizeFunc &&v):mPropery(prop), mTag(Size) + { + moveConstruct(impl.sizeFunc, std::move(v)); + } + + rlottie::Property property() const { return mPropery; } + + const ColorFunc& color() const + { + assert(mTag == Color); + return impl.colorFunc; + } + + const ValueFunc& value() const + { + assert(mTag == Value); + return impl.valueFunc; + } + + const PointFunc& point() const + { + assert(mTag == Point); + return impl.pointFunc; + } + + const SizeFunc& size() const + { + assert(mTag == Size); + return impl.sizeFunc; + } + + LOTVariant() = default; + ~LOTVariant() noexcept {Destroy();} + LOTVariant(const LOTVariant& other) { Copy(other);} + LOTVariant(LOTVariant&& other) noexcept { Move(std::move(other));} + LOTVariant& operator=(LOTVariant&& other) { Destroy(); Move(std::move(other)); return *this;} + LOTVariant& operator=(const LOTVariant& other) { Destroy(); Copy(other); return *this;} +private: + template + void construct(T& member, const T& val) + { + new (&member) T(val); + } + + template + void moveConstruct(T& member, T&& val) + { + new (&member) T(std::move(val)); + } + + void Move(LOTVariant&& other) + { + switch (other.mTag) { + case Type::Value: + moveConstruct(impl.valueFunc, std::move(other.impl.valueFunc)); + break; + case Type::Color: + moveConstruct(impl.colorFunc, std::move(other.impl.colorFunc)); + break; + case Type::Point: + moveConstruct(impl.pointFunc, std::move(other.impl.pointFunc)); + break; + case Type::Size: + moveConstruct(impl.sizeFunc, std::move(other.impl.sizeFunc)); + break; + default: + break; + } + mTag = other.mTag; + mPropery = other.mPropery; + other.mTag = MonoState; + } + + void Copy(const LOTVariant& other) + { + switch (other.mTag) { + case Type::Value: + construct(impl.valueFunc, other.impl.valueFunc); + break; + case Type::Color: + construct(impl.colorFunc, other.impl.colorFunc); + break; + case Type::Point: + construct(impl.pointFunc, other.impl.pointFunc); + break; + case Type::Size: + construct(impl.sizeFunc, other.impl.sizeFunc); + break; + default: + break; + } + mTag = other.mTag; + mPropery = other.mPropery; + } + + void Destroy() + { + switch(mTag) { + case MonoState: { + break; + } + case Value: { + impl.valueFunc.~ValueFunc(); + break; + } + case Color: { + impl.colorFunc.~ColorFunc(); + break; + } + case Point: { + impl.pointFunc.~PointFunc(); + break; + } + case Size: { + impl.sizeFunc.~SizeFunc(); + break; + } + } + } + + enum Type {MonoState, Value, Color, Point , Size}; + rlottie::Property mPropery; + Type mTag{MonoState}; + union details{ + ColorFunc colorFunc; + ValueFunc valueFunc; + PointFunc pointFunc; + SizeFunc sizeFunc; + details(){} + ~details(){} + }impl; }; class LOTFilter @@ -85,34 +237,33 @@ public: { return mBitset.test(static_cast(prop)); } - LottieColor color(rlottie::Property prop) const + LottieColor color(rlottie::Property prop, int frame) const { - rlottie::Color col = data(prop).color(); - return LottieColor(col.mr, col.mg, col.mb); + rlottie::FrameInfo info(frame); + rlottie::Color col = data(prop).color()(info); + return LottieColor(col.r(), col.g(), col.b()); } - float opacity(rlottie::Property prop) const + float opacity(rlottie::Property prop, int frame) const { - float val = data(prop).value(); + rlottie::FrameInfo info(frame); + float val = data(prop).value()(info); return val/100; } - float value(rlottie::Property prop) const + float value(rlottie::Property prop, int frame) const { - return data(prop).value(); + rlottie::FrameInfo info(frame); + return data(prop).value()(info); } private: - LOTVariant data(rlottie::Property prop) const + const LOTVariant& data(rlottie::Property prop) const { auto result = std::find_if(mFilters.begin(), mFilters.end(), [prop](const LOTVariant &e){return e.property() == prop;}); - if (result != mFilters.end()) { - return *result; - } else { - return LOTVariant(prop, 0); - } + return *result; } - std::vector mFilters; std::bitset<32> mBitset{0}; + std::vector mFilters; }; template @@ -125,21 +276,21 @@ public: LottieColor color(int frame) const { if (mFilter.hasFilter(rlottie::Property::StrokeColor)) { - return mFilter.color(rlottie::Property::StrokeColor); + return mFilter.color(rlottie::Property::StrokeColor, frame); } return _modelData->color(frame); } float opacity(int frame) const { if (mFilter.hasFilter(rlottie::Property::StrokeOpacity)) { - return mFilter.opacity(rlottie::Property::StrokeOpacity); + return mFilter.opacity(rlottie::Property::StrokeOpacity, frame); } return _modelData->opacity(frame); } float strokeWidth(int frame) const { if (mFilter.hasFilter(rlottie::Property::StrokeWidth)) { - return mFilter.value(rlottie::Property::StrokeWidth); + return mFilter.value(rlottie::Property::StrokeWidth, frame); } return _modelData->strokeWidth(frame); } @@ -164,14 +315,14 @@ public: LottieColor color(int frame) const { if (mFilter.hasFilter(rlottie::Property::FillColor)) { - return mFilter.color(rlottie::Property::FillColor); + return mFilter.color(rlottie::Property::FillColor, frame); } return _modelData->color(frame); } float opacity(int frame) const { if (mFilter.hasFilter(rlottie::Property::FillOpacity)) { - return mFilter.opacity(rlottie::Property::FillOpacity); + return mFilter.opacity(rlottie::Property::FillOpacity, frame); } return _modelData->opacity(frame); } From 780a2603aef21168aecd195bfc99368bc20d71e8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 14 May 2019 09:37:33 +0900 Subject: [PATCH 475/672] lottie/example: remove all warnings in example --- example/CMakeLists.txt | 8 ++++---- example/demo.cpp | 4 ++-- example/evasapp.cpp | 4 ++-- example/lottieviewer.cpp | 8 ++++---- example/lottieviewtest.cpp | 4 ++-- example/uxsampletest.cpp | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 9c0f4273f4..0122f15d40 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,11 +1,11 @@ -add_executable(lottie-gif "lottie2gif.cpp") +add_executable(lottie2gif "lottie2gif.cpp") -target_compile_options(lottie-gif +target_compile_options(lottie2gif PRIVATE -std=c++11) -target_link_libraries(lottie-gif rlottie) +target_link_libraries(lottie2gif rlottie) -target_include_directories(lottie-gif +target_include_directories(lottie2gif PRIVATE "${CMAKE_CURRENT_LIST_DIR}/../inc/") diff --git a/example/demo.cpp b/example/demo.cpp index 99703036ce..a61aef9233 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -25,14 +25,14 @@ using namespace std; static void -onExitCb(void *data, void *extra) +onExitCb(void *data, void */*extra*/) { LottieView *view = (LottieView *)data; delete view; } static void -onRenderPreCb(void *data, void *extra) +onRenderPreCb(void *data, void */*extra*/) { LottieView *view = (LottieView *)data; view->render(); diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 943fbbae4e..1fa3c0e3a0 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -43,7 +43,7 @@ _on_delete(Ecore_Evas *ee) } static Eina_Bool -on_key_down(void *data, int type, void *event) +on_key_down(void *data, int /*type*/, void *event) { Ecore_Event_Key *keyData = (Ecore_Event_Key *)event; @@ -120,7 +120,7 @@ static bool isJsonFile(const char *filename) { } std::vector -EvasApp::jsonFiles(const std::string &dirName, bool recurse) +EvasApp::jsonFiles(const std::string &dirName, bool /*recurse*/) { DIR *d; struct dirent *dir; diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 858bc760cf..bfa30ba238 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -120,7 +120,7 @@ _slider_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) } static void -_button_clicked_cb(void *data, Evas_Object *obj, void *event_info) +_button_clicked_cb(void *data, Evas_Object */*obj*/, void */*event_info*/) { AppInfo *info = (AppInfo *)data; @@ -189,7 +189,7 @@ create_layout(Evas_Object *parent, const char *file) } static void -_gl_selected_cb(void *data, Evas_Object *obj, void *event_info) +_gl_selected_cb(void *data, Evas_Object */*obj*/, void *event_info) { Evas_Object *nf = (Evas_Object *)data; Elm_Object_Item *it = (Elm_Object_Item *)event_info; @@ -200,7 +200,7 @@ _gl_selected_cb(void *data, Evas_Object *obj, void *event_info) } static char * -_gl_text_get(void *data, Evas_Object *obj, const char *part) +_gl_text_get(void *data, Evas_Object */*obj*/, const char */*part*/) { ItemData *id = (ItemData *) data; const char *ptr = strrchr(jsonFiles[id->index].c_str(), '/'); @@ -209,7 +209,7 @@ _gl_text_get(void *data, Evas_Object *obj, const char *part) } static void -_gl_del(void *data, Evas_Object *obj) +_gl_del(void */*data*/, Evas_Object */*obj*/) { } diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 843c6f7f1d..4eded00c5e 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -89,14 +89,14 @@ public: }; static void -onExitCb(void *data, void *extra) +onExitCb(void *data, void */*extra*/) { LottieViewTest *view = (LottieViewTest *)data; delete view; } static void -onRenderPreCb(void *data, void *extra) +onRenderPreCb(void *data, void */*extra*/) { LottieViewTest *view = (LottieViewTest *)data; view->render(); diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index aaba0ac416..48871c5815 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -77,7 +77,7 @@ public: }; static void -onExitCb(void *data, void *extra) +onExitCb(void *data, void */*extra*/) { UxSampleTest *view = (UxSampleTest *)data; delete view; @@ -104,7 +104,7 @@ onKeyCb(void *data, void *extra) } static void -onRenderPreCb(void *data, void *extra) +onRenderPreCb(void *data, void */*extra*/) { UxSampleTest *view = (UxSampleTest *)data; if (view->mView) @@ -112,7 +112,7 @@ onRenderPreCb(void *data, void *extra) } static void -onResizeCb(void *data, void *extra) +onResizeCb(void *data, void */*extra*/) { UxSampleTest *view = (UxSampleTest *)data; view->resize(); From 7986b659b1424cc09452814439e51a9d06e5174d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 14 May 2019 09:43:11 +0900 Subject: [PATCH 476/672] rlottie: remove remaining warnings --- src/lottie/lottieitem.cpp | 2 +- src/lottie/lottieitem.h | 2 +- src/lottie/lottieparser.cpp | 2 +- src/vector/stb/stb_image.h | 2 +- src/vector/vdebug.cpp | 10 ++++++---- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 39d54ca726..8af434b7e1 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1238,7 +1238,7 @@ void LOTPolystarItem::updatePath(VPath& path, int frameNo) LOTPaintDataItem::LOTPaintDataItem(bool staticContent):mDrawable(std::make_unique()), mStaticContent(staticContent){} -void LOTPaintDataItem::update(int frameNo, const VMatrix &parentMatrix, +void LOTPaintDataItem::update(int frameNo, const VMatrix &/*parentMatrix*/, float parentAlpha, const DirtyFlag &flag) { mRenderNodeUpdate = true; diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index bf59614282..eeb87f969b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -260,7 +260,7 @@ public: virtual void renderList(std::vector &){} void setParent(LOTContentItem *parent) {mParent = parent;} LOTContentItem *parent() const {return mParent;} - virtual bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) {return false;} + virtual bool resolveKeyPath(LOTKeyPath &, uint, LOTVariant &) {return false;} private: LOTContentItem *mParent{nullptr}; }; diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 2e08aa8e49..c9249b0169 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -498,7 +498,7 @@ int LottieParserImpl::PeekType() return -1; } -void LottieParserImpl::Skip(const char *key) +void LottieParserImpl::Skip(const char */*key*/) { if (PeekType() == kArrayType) { EnterArray(); diff --git a/src/vector/stb/stb_image.h b/src/vector/stb/stb_image.h index b52db63f28..b8ab055374 100644 --- a/src/vector/stb/stb_image.h +++ b/src/vector/stb/stb_image.h @@ -969,7 +969,7 @@ STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) stbi__vertically_flip_on_load = flag_true_if_should_flip; } -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int /*bpc*/) { memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed diff --git a/src/vector/vdebug.cpp b/src/vector/vdebug.cpp index 7002bd0412..8e9cc52aa5 100644 --- a/src/vector/vdebug.cpp +++ b/src/vector/vdebug.cpp @@ -161,7 +161,7 @@ void VDebug::stringify(std::ostream& os) } template -char* decode(std::ostream& os, char* b, Arg* dummy) +char* decode(std::ostream& os, char* b, Arg* /*dummy*/) { Arg arg = *reinterpret_cast(b); os << arg; @@ -169,7 +169,7 @@ char* decode(std::ostream& os, char* b, Arg* dummy) } template <> -char* decode(std::ostream& os, char* b, VDebug::string_literal_t* dummy) +char* decode(std::ostream& os, char* b, VDebug::string_literal_t* /*dummy*/) { VDebug::string_literal_t s = *reinterpret_cast(b); @@ -178,7 +178,7 @@ char* decode(std::ostream& os, char* b, VDebug::string_literal_t* dummy) } template <> -char* decode(std::ostream& os, char* b, char** dummy) +char* decode(std::ostream& os, char* b, char** /*dummy*/) { while (*b != '\0') { os << *b; @@ -454,7 +454,9 @@ private: size_t const m_size; Item* m_ring; std::atomic m_write_index; +public: char pad[64]; +private: unsigned int m_read_index; }; @@ -654,7 +656,7 @@ public: m_state.store(State::READY, std::memory_order_release); } - NanoLogger(GuaranteedLogger gl, std::string const& log_directory, + NanoLogger(GuaranteedLogger /*gl*/, std::string const& log_directory, std::string const& log_file_name, uint32_t log_file_roll_size_mb) : m_state(State::INIT), m_buffer_base(new QueueBuffer()), From 86fb579e0b32908a8b573688398350606623a3a1 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 14 May 2019 10:00:00 +0900 Subject: [PATCH 477/672] rlottie: updated compiler flags to treat warning as error --- CMakeLists.txt | 2 +- meson.build | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b14a4af815..a1df24a98c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ add_library(rlottie::rlottie ALIAS rlottie) target_compile_options(rlottie PUBLIC PRIVATE - -Wall -fvisibility=hidden -O2 -std=c++14) + -std=c++14 -O2 -Wall -Werror -Wextra -Wnon-virtual-dtor -Woverloaded-virtual -Wno-unused-parameter -fvisibility=hidden) #declare dependancy set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) diff --git a/meson.build b/meson.build index 85c04b2896..85635b43cb 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,8 @@ rlottie_lib_version = '0.0.1' add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_source_dir()), language : 'cpp') -compiler_flags = ['-Wall', '-O2', '-std=c++14', '-fvisibility=hidden'] +compiler_flags = ['-std=c++14', '-O2', '-Wall', '-Werror', '-Wextra', + '-Wnon-virtual-dtor', '-Woverloaded-virtual', '-Wno-unused-parameter', '-fvisibility=hidden'] if get_option('asan') == true compiler_flags += ['-fsanitize=address'] From c88f05058212fa297f9d7f754c56132f3eaa385c Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 17 May 2019 14:09:46 +0900 Subject: [PATCH 478/672] vector: refactor vraster to remove naked new and delete call --- src/vector/vraster.cpp | 74 +++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/src/vector/vraster.cpp b/src/vector/vraster.cpp index 1ad9a8bf49..0e246be4c6 100644 --- a/src/vector/vraster.cpp +++ b/src/vector/vraster.cpp @@ -18,6 +18,7 @@ #include "vraster.h" #include +#include #include "v_ft_raster.h" #include "v_ft_stroker.h" #include "vdebug.h" @@ -28,19 +29,28 @@ V_BEGIN_NAMESPACE +template +class dyn_array +{ +public: + dyn_array(size_t size):mCapacity(size),mData(std::make_unique(mCapacity)){} + void reserve(size_t size) + { + if (mCapacity > size) return; + mCapacity = size; + mData = std::make_unique(mCapacity); + } + T* data() const {return mData.get();} + +private: + size_t mCapacity{0}; + std::unique_ptr mData{nullptr}; +}; + struct FTOutline { public: - ~FTOutline() - { - if (mPointSize) delete[] ft.points; - if (mTagSize) delete[] ft.tags; - if (mSegmentSize) { - delete[] ft.contours; - delete[] ft.contours_flag; - } - } void reset(); - void grow(int, int); + void grow(size_t, size_t); void convert(const VPath &path); void convert(CapStyle, JoinStyle, float, float); void moveTo(const VPointF &pt); @@ -50,14 +60,15 @@ public: void end(); void transform(const VMatrix &m); SW_FT_Outline ft; - int mPointSize{0}; - int mSegmentSize{0}; - int mTagSize{0}; bool closed{false}; SW_FT_Stroker_LineCap ftCap; SW_FT_Stroker_LineJoin ftJoin; SW_FT_Fixed ftWidth; SW_FT_Fixed ftMeterLimit; + dyn_array mPointMemory{100}; + dyn_array mTagMemory{100}; + dyn_array mContourMemory{10}; + dyn_array mContourFlagMemory{10}; }; void FTOutline::reset() @@ -66,35 +77,18 @@ void FTOutline::reset() ft.flags = 0x0; } -void FTOutline::grow(int points, int segments) +void FTOutline::grow(size_t points, size_t segments) { reset(); + mPointMemory.reserve(points + segments); + mTagMemory.reserve(points + segments); + mContourMemory.reserve(segments); + mContourFlagMemory.reserve(segments); - int point_size = (points + segments); - int segment_size = (sizeof(short) * segments); - int tag_size = (sizeof(char) * (points + segments)); - - if (point_size > mPointSize) { - if (mPointSize) delete [] ft.points; - ft.points = new SW_FT_Vector[point_size]; - mPointSize = point_size; - } - - if (segment_size > mSegmentSize) { - if (mSegmentSize) { - delete [] ft.contours; - delete [] ft.contours_flag; - } - ft.contours = new short[segment_size]; - ft.contours_flag = new char[segment_size]; - mSegmentSize = segment_size; - } - - if (tag_size > mTagSize) { - if (mTagSize) delete [] ft.tags; - ft.tags = new char[tag_size]; - mTagSize = tag_size; - } + ft.points = mPointMemory.data(); + ft.tags = mTagMemory.data(); + ft.contours = mContourMemory.data(); + ft.contours_flag = mContourFlagMemory.data(); } void FTOutline::convert(const VPath &path) @@ -104,7 +98,7 @@ void FTOutline::convert(const VPath &path) grow(points.size(), path.segments()); - int index = 0; + size_t index = 0; for (auto element : elements) { switch (element) { case VPath::Element::MoveTo: From 9a670acaf166089721a2b47a7620243ad6f1b0f8 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 10:02:45 +0900 Subject: [PATCH 479/672] rlottie: Fixed wrong calculation of duration. When lottie file is static but has more than 1 frame of static data we should return the duration() value correctly. --- src/lottie/lottiemodel.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 2e54834f86..eb7ec22341 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -418,16 +418,15 @@ public: LOTCompositionData():LOTData(LOTData::Type::Composition){} const std::vector &layerInfoList() const { return mLayerInfoList;} double duration() const { - return isStatic() ? startFrame() : - frameDuration() / frameRate(); // in second + return frameDuration() / frameRate(); // in second } size_t frameAtPos(double pos) const { if (pos < 0) pos = 0; if (pos > 1) pos = 1; - return isStatic() ? 0 : pos * frameDuration(); + return pos * frameDuration(); } long frameAtTime(double timeInSec) const { - return isStatic() ? startFrame() : frameAtPos(timeInSec / duration()); + return frameAtPos(timeInSec / duration()); } size_t totalFrame() const {return mEndFrame - mStartFrame;} long frameDuration() const {return mEndFrame - mStartFrame -1;} From 23115b90920ff24949008ce13bfc58759f14bffe Mon Sep 17 00:00:00 2001 From: "sub.mohanty@samsung.com" Date: Sun, 19 May 2019 13:29:24 +0900 Subject: [PATCH 480/672] rlottie: always propagate update for precomp layer. Precomp layers can be static with more than 1 frame inside it. so always propagate update to all its child layers. --- src/lottie/lottieitem.cpp | 4 +++- src/lottie/lottiemodel.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 8af434b7e1..85b06bcf61 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -495,7 +495,9 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, } // 5. if no parent property change and layer is static then nothing to do. - if (flag().testFlag(DirtyFlagBit::None) && isStatic()) return; + if (!mLayerData->precompLayer() && + flag().testFlag(DirtyFlagBit::None) && + isStatic()) return; // 6. update the content of the layer updateContent(); diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index eb7ec22341..5401bac01d 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -378,6 +378,7 @@ public: bool autoOrient() const noexcept{return mAutoOrient;} int timeRemap(int frameNo) const; VSize layerSize() const {return mLayerSize;} + bool precompLayer() const {return mLayerType == LayerType::Precomp;} public: struct SolidLayer { int mWidth{0}; From 89a72b6e9c8051b0da5cbef51067d23fad99b51d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 13:10:43 +0900 Subject: [PATCH 481/672] example:refactor to remove naked malloc and RAII warning --- example/lottie2gif.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/example/lottie2gif.cpp b/example/lottie2gif.cpp index 3e2e91abe7..ae9c58c2a3 100644 --- a/example/lottie2gif.cpp +++ b/example/lottie2gif.cpp @@ -4,15 +4,19 @@ #include #include #include -#include +#include class GifBuilder { public: - GifBuilder(const std::string &fileName , const uint32_t width, - const uint32_t height, const uint32_t delay = 2) + explicit GifBuilder(const std::string &fileName , const uint32_t width, + const uint32_t height, const uint32_t delay = 2) { GifBegin(&handle, fileName.c_str(), width, height, delay); } + ~GifBuilder() + { + GifEnd(&handle); + } void addFrame(rlottie::Surface &s, uint32_t delay = 2) { argbTorgba(s); @@ -56,10 +60,7 @@ public: } } } - void commit() - { - GifEnd(&handle); - } + private: GifWriter handle; }; @@ -71,18 +72,15 @@ public: auto player = rlottie::Animation::loadFromFile(fileName); if (!player) return help(); - uint32_t* buffer = (uint32_t *) malloc(w * h * 4); + auto buffer = std::make_unique(w * h); size_t frameCount = player->totalFrame(); GifBuilder builder(baseName.data(), w, h); for (size_t i = 0; i < frameCount ; i++) { - rlottie::Surface surface(buffer, w, h, w * 4); + rlottie::Surface surface(buffer.get(), w, h, w * 4); player->renderSync(i, surface); builder.addFrame(surface); } - builder.commit(); - - free(buffer); return result(); } From 8667453efa9cdcf7c3cff069155a14095397df10 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 13:18:12 +0900 Subject: [PATCH 482/672] buildfix: make it build with c++11 --- example/lottie2gif.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/lottie2gif.cpp b/example/lottie2gif.cpp index ae9c58c2a3..38ad9e863e 100644 --- a/example/lottie2gif.cpp +++ b/example/lottie2gif.cpp @@ -72,7 +72,7 @@ public: auto player = rlottie::Animation::loadFromFile(fileName); if (!player) return help(); - auto buffer = std::make_unique(w * h); + auto buffer = std::unique_ptr(new uint32_t[w * h]); size_t frameCount = player->totalFrame(); GifBuilder builder(baseName.data(), w, h); From e1cf42ba8c1628f6c06cbb6acb78b0ac81521c8f Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 20 May 2019 13:24:34 +0900 Subject: [PATCH 483/672] vector: fix a compile error of strict fallthrough case check. --- src/vector/vmatrix.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index f2dc2570b6..eaecabc174 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -98,8 +98,8 @@ VMatrix::MatrixType VMatrix::type() const case MatrixType::Project: if (!vIsZero(m13) || !vIsZero(m23) || !vIsZero(m33 - 1)) { mType = MatrixType::Project; - break; } + break; case MatrixType::Shear: case MatrixType::Rotate: if (!vIsZero(m12) || !vIsZero(m21)) { @@ -108,18 +108,18 @@ VMatrix::MatrixType VMatrix::type() const mType = MatrixType::Rotate; else mType = MatrixType::Shear; - break; } + break; case MatrixType::Scale: if (!vIsZero(m11 - 1) || !vIsZero(m22 - 1)) { mType = MatrixType::Scale; - break; } + break; case MatrixType::Translate: if (!vIsZero(mtx) || !vIsZero(mty)) { mType = MatrixType::Translate; - break; } + break; case MatrixType::None: mType = MatrixType::None; break; From 3ea10ecbc98fb76dda26ea085b633c2b55d0d74b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 14:28:20 +0900 Subject: [PATCH 484/672] lottie/parser: Fixed regression of interpolator string handling. With older bodymovin pluggins the interpolator cache string sometimes dosen't match with the in and out tangent results into wrong animation. So parse the interpolator string whenever available. --- src/lottie/lottieparser.cpp | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index c9249b0169..bd38fbd0c1 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -260,7 +260,7 @@ public: void parseShapeProperty(LOTAnimatable &obj); void parseDashProperty(LOTDashProperty &dash); - std::shared_ptr interpolator(VPointF inTangent, VPointF outTangent); + std::shared_ptr interpolator(VPointF, VPointF, std::string); LottieColor toColor(const char *str); @@ -1840,20 +1840,21 @@ bool LottieParserImpl::parseKeyFrameValue(const char * key, } std::shared_ptr -LottieParserImpl::interpolator(VPointF inTangent, VPointF outTangent) +LottieParserImpl::interpolator(VPointF inTangent, VPointF outTangent, std::string key) { - std::array temp; - snprintf(temp.data(), temp.size(), "%.2f_%.2f_%.2f_%.2f", - inTangent.x(), inTangent.y(), outTangent.x(), outTangent.y()); - - std::string key(temp.data()); + if (key.empty()) { + std::array temp; + snprintf(temp.data(), temp.size(), "%.2f_%.2f_%.2f_%.2f", + inTangent.x(), inTangent.y(), outTangent.x(), outTangent.y()); + key = temp.data(); + } auto search = mInterpolatorCache.find(key); if (search != mInterpolatorCache.end()) { return search->second; } else { auto obj = std::make_shared(VInterpolator(outTangent, inTangent)); - mInterpolatorCache[key] = obj; + mInterpolatorCache[std::move(key)] = obj; return obj; } } @@ -1865,6 +1866,7 @@ template void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) { struct ParsedField { + std::string interpolatorKey; bool interpolator{false}; bool value{false}; bool hold{false}; @@ -1893,6 +1895,23 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) parsed.noEndValue = false; getValue(keyframe.mValue.mEndValue); continue; + } else if (0 == strcmp(key, "n")) { + if (PeekType() == kStringType) { + parsed.interpolatorKey = GetString(); + } else { + RAPIDJSON_ASSERT(PeekType() == kArrayType); + EnterArray(); + while (NextArrayValue()) { + RAPIDJSON_ASSERT(PeekType() == kStringType); + if (parsed.interpolatorKey.empty()) { + parsed.interpolatorKey = GetString(); + } else { + //skip rest of the string + GetString(); + } + } + } + continue; } else if (parseKeyFrameValue(key, keyframe.mValue)) { continue; } else if (0 == strcmp(key, "h")) { @@ -1921,7 +1940,7 @@ void LottieParserImpl::parseKeyFrame(LOTAnimInfo &obj) keyframe.mEndFrame = keyframe.mStartFrame; obj.mKeyFrames.push_back(keyframe); } else if (parsed.interpolator) { - keyframe.mInterpolator = interpolator(inTangent, outTangent); + keyframe.mInterpolator = interpolator(inTangent, outTangent, std::move(parsed.interpolatorKey)); obj.mKeyFrames.push_back(keyframe); } else { //its the last frame discard. From 947cac4ad8ad459540e34503637c53a782808d70 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 14:53:02 +0900 Subject: [PATCH 485/672] Revert "vector: fix a compile error of strict fallthrough case check." This reverts commit e1cf42ba8c1628f6c06cbb6acb78b0ac81521c8f. The fall through code is as per design. --- src/vector/vmatrix.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index eaecabc174..f2dc2570b6 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -98,8 +98,8 @@ VMatrix::MatrixType VMatrix::type() const case MatrixType::Project: if (!vIsZero(m13) || !vIsZero(m23) || !vIsZero(m33 - 1)) { mType = MatrixType::Project; + break; } - break; case MatrixType::Shear: case MatrixType::Rotate: if (!vIsZero(m12) || !vIsZero(m21)) { @@ -108,18 +108,18 @@ VMatrix::MatrixType VMatrix::type() const mType = MatrixType::Rotate; else mType = MatrixType::Shear; + break; } - break; case MatrixType::Scale: if (!vIsZero(m11 - 1) || !vIsZero(m22 - 1)) { mType = MatrixType::Scale; + break; } - break; case MatrixType::Translate: if (!vIsZero(mtx) || !vIsZero(mty)) { mType = MatrixType::Translate; + break; } - break; case MatrixType::None: mType = MatrixType::None; break; From 30e2ab6897ade6c213baa5e054e708f2310ed6f3 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 15:50:59 +0900 Subject: [PATCH 486/672] vector: fixed build error with gcc7 using fallthrough --- src/vector/vmatrix.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vector/vmatrix.cpp b/src/vector/vmatrix.cpp index f2dc2570b6..36498b4838 100644 --- a/src/vector/vmatrix.cpp +++ b/src/vector/vmatrix.cpp @@ -100,6 +100,7 @@ VMatrix::MatrixType VMatrix::type() const mType = MatrixType::Project; break; } + VECTOR_FALLTHROUGH case MatrixType::Shear: case MatrixType::Rotate: if (!vIsZero(m12) || !vIsZero(m21)) { @@ -110,16 +111,19 @@ VMatrix::MatrixType VMatrix::type() const mType = MatrixType::Shear; break; } + VECTOR_FALLTHROUGH case MatrixType::Scale: if (!vIsZero(m11 - 1) || !vIsZero(m22 - 1)) { mType = MatrixType::Scale; break; } + VECTOR_FALLTHROUGH case MatrixType::Translate: if (!vIsZero(mtx) || !vIsZero(mty)) { mType = MatrixType::Translate; break; } + VECTOR_FALLTHROUGH case MatrixType::None: mType = MatrixType::None; break; From 7bcbea3a5038e054a464153c8ebdb2e22336226d Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 20 May 2019 16:20:15 +0900 Subject: [PATCH 487/672] rlottie/meson: Add neon code only if building for arm system --- src/vector/pixman/meson.build | 6 +++++- src/vector/pixman/pixman-arm-neon-asm.S | 3 --- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vector/pixman/meson.build b/src/vector/pixman/meson.build index f3da1f3528..5d3b4e32ef 100644 --- a/src/vector/pixman/meson.build +++ b/src/vector/pixman/meson.build @@ -1,5 +1,9 @@ -source_file = files('vregion.cpp', 'pixman-arm-neon-asm.S') +source_file = files('vregion.cpp') + +if host_machine.cpu_family() == 'arm' or host_machine.cpu_family() == 'aarch64' + source_file += files('pixman-arm-neon-asm.S') +endif pixman_dep = declare_dependency( include_directories : include_directories('.'), diff --git a/src/vector/pixman/pixman-arm-neon-asm.S b/src/vector/pixman/pixman-arm-neon-asm.S index 0124d652c1..f2203c21cf 100644 --- a/src/vector/pixman/pixman-arm-neon-asm.S +++ b/src/vector/pixman/pixman-arm-neon-asm.S @@ -23,8 +23,6 @@ * Author: Siarhei Siamashka (siarhei.siamashka@nokia.com) */ -#if defined(__ARM_NEON__) - /* * This file contains implementations of NEON optimized pixel processing * functions. There is no full and detailed tutorial, but some functions @@ -497,4 +495,3 @@ generate_composite_function \ 0 /* mask_basereg */ /******************************************************************************/ -#endif // defined(__ARM_NEON__) From 57eea32d4d2c1d97fbe300d6a1589c493a0cf91a Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 22 May 2019 09:55:59 +0900 Subject: [PATCH 488/672] rlottie/model: Fix repeater processing when its part of an asset layer. --- src/lottie/lottiemodel.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index f5939e4900..fd5a79bd14 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -41,6 +41,10 @@ public: auto child = (*i).get(); if (child->type() == LOTData::Type::Repeater) { LOTRepeaterData *repeater = static_cast(child); + // check if this repeater is already processed + // can happen if the layer is an asset and referenced by multiple layer. + if (!repeater->mChildren.empty()) continue; + auto sharedShapeGroup = std::make_shared(); LOTShapeGroupData *shapeGroup = sharedShapeGroup.get(); // 1. increment the reverse iterator to point to the From 0fa16936d16f3e57b786adf2fec5df4fb71c46f4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 22 May 2019 12:36:04 +0900 Subject: [PATCH 489/672] rlottie/parser: Fix float data parsing when data in array form. Take only the 1st element and discard the rest. --- src/lottie/lottieparser.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index bd38fbd0c1..1ebf44a416 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1685,8 +1685,10 @@ void LottieParserImpl::getValue(float &val) { if (PeekType() == kArrayType) { EnterArray(); + if (NextArrayValue()) val = GetDouble(); + //discard rest while (NextArrayValue()) { - val = GetDouble(); + GetDouble(); } } else if (PeekType() == kNumberType) { val = GetDouble(); From 281d3f3a00c141bcd69cfac2ad63c110be3731ff Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 May 2019 09:54:16 +0900 Subject: [PATCH 490/672] rlottie/trim: Fix trim segment calculation. In AE start and end value can naver be -ve. but the final start and end value after applting interpolator curve could be -ve. So refactor to always take the -ve value into account. --- src/lottie/lottiemodel.h | 49 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 5401bac01d..72596395c2 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -768,44 +768,43 @@ public: if (vCompare(diff, 0.0f)) return Segment(0, 0); if (vCompare(diff, 1.0f)) return Segment(0, 1); - // no offset case - if (vCompare(fabs(offset), 0.0f)) { - return noloop(start, end); - } else { - if (offset > 0) { - start += offset; - end += offset; - if (start <= 1 && end <=1) { - return noloop(start, end); - } else if (start > 1 && end > 1) { - return noloop(start - 1, end - 1); - } else { - if (start > 1) return loop(start - 1 , end); - else return loop(start , end - 1); - } + if (offset > 0) { + start += offset; + end += offset; + if (start <= 1 && end <=1) { + return noloop(start, end); + } else if (start > 1 && end > 1) { + return noloop(start - 1, end - 1); } else { - start += offset; - end += offset; - if (start >= 0 && end >= 0) { - return noloop(start, end); - } else if (start < 0 && end < 0) { - return noloop(-start, -end); - } else { - if (start < 0) return loop(1 + start, end); - else return loop(start , 1 + end); - } + if (start > 1) return loop(start - 1 , end); + else return loop(start , end - 1); + } + } else { + start += offset; + end += offset; + if (start >= 0 && end >= 0) { + return noloop(start, end); + } else if (start < 0 && end < 0) { + return noloop(1 + start, 1 + end); + } else { + if (start < 0) return loop(1 + start, end); + else return loop(start , 1 + end); } } } LOTTrimData::TrimType type() const {return mTrimType;} private: Segment noloop(float start, float end) const{ + assert(start >= 0); + assert(end >= 0); Segment s; s.start = std::min(start, end); s.end = std::max(start, end); return s; } Segment loop(float start, float end) const{ + assert(start >= 0); + assert(end >= 0); Segment s; s.start = std::max(start, end); s.end = std::min(start, end); From 55eee7113a3a28f3a1c06849cf977dbf75fc6d50 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 May 2019 17:10:55 +0900 Subject: [PATCH 491/672] rlottie/model: refactor repeater object model to optimize size. --- src/lottie/lottieitem.cpp | 16 +++++--------- src/lottie/lottiemodel.cpp | 15 +++++-------- src/lottie/lottiemodel.h | 44 +++++++++++++++++++++++++++---------- src/lottie/lottieparser.cpp | 36 +++++++++++++++++++++++------- 4 files changed, 72 insertions(+), 39 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 85b06bcf61..b68b1caef3 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -1512,14 +1512,12 @@ void LOTTrimItem::addPathItems(std::vector &list, int startOf LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data) : mData(data) { - assert(mData->mChildren.size() == 1); - LOTGroupData *root = reinterpret_cast(mData->mChildren[0].get()); - assert(root); + assert(mData->content()); mCopies = mData->maxCopies(); for (int i= 0; i < mCopies; i++) { - auto content = std::make_unique(static_cast(root)); + auto content = std::make_unique(mData->content()); content->setParent(this); mContents.push_back(std::move(content)); } @@ -1540,13 +1538,11 @@ void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, float par mHidden = false; } - if (mData->hasMtrixChange(frameNo)) { - newFlag |= DirtyFlagBit::Matrix; - } + if (!mData->isStatic()) newFlag |= DirtyFlagBit::Matrix; float offset = mData->offset(frameNo); - float startOpacity = mData->mTransform->startOpacity(frameNo); - float endOpacity = mData->mTransform->endOpacity(frameNo); + float startOpacity = mData->mTransform.startOpacity(frameNo); + float endOpacity = mData->mTransform.endOpacity(frameNo); newFlag |= DirtyFlagBit::Alpha; @@ -1556,7 +1552,7 @@ void LOTRepeaterItem::update(int frameNo, const VMatrix &parentMatrix, float par // hide rest of the copies , @TODO find a better solution. if ( i >= visibleCopies) newAlpha = 0; - VMatrix result = mData->mTransform->matrixForRepeater(frameNo, i + offset) * parentMatrix; + VMatrix result = mData->mTransform.matrix(frameNo, i + offset) * parentMatrix; mContents[i]->update(frameNo, result, newAlpha, newFlag); } } diff --git a/src/lottie/lottiemodel.cpp b/src/lottie/lottiemodel.cpp index fd5a79bd14..84b90f3fa8 100644 --- a/src/lottie/lottiemodel.cpp +++ b/src/lottie/lottiemodel.cpp @@ -43,24 +43,22 @@ public: LOTRepeaterData *repeater = static_cast(child); // check if this repeater is already processed // can happen if the layer is an asset and referenced by multiple layer. - if (!repeater->mChildren.empty()) continue; + if (repeater->content()) continue; - auto sharedShapeGroup = std::make_shared(); - LOTShapeGroupData *shapeGroup = sharedShapeGroup.get(); + repeater->setContent(std::make_shared()); + LOTShapeGroupData *content = repeater->content(); // 1. increment the reverse iterator to point to the // object before the repeater ++i; // 2. move all the children till repater to the group std::move(obj->mChildren.begin(), - i.base(), back_inserter(shapeGroup->mChildren)); + i.base(), back_inserter(content->mChildren)); // 3. erase the objects from the original children list obj->mChildren.erase(obj->mChildren.begin(), i.base()); - // 4. Add the newly created group to the repeater object. - repeater->mChildren.push_back(sharedShapeGroup); // 5. visit newly created group to process remaining repeater object. - visitChildren(shapeGroup); + visitChildren(content); // 6. exit the loop as the current iterators are invalid break; } else { @@ -91,7 +89,7 @@ void LOTCompositionData::processRepeaterObjects() visitor.visit(mRootLayer.get()); } -VMatrix LOTTransformData::matrixForRepeater(int frameNo, float multiplier) const +VMatrix LOTRepeaterTransform::matrix(int frameNo, float multiplier) const { VPointF scale = mScale.value(frameNo) / 100.f; scale.setX(std::pow(scale.x(), multiplier)); @@ -106,7 +104,6 @@ VMatrix LOTTransformData::matrixForRepeater(int frameNo, float multiplier) const return m; } - VMatrix LOTTransformData::matrix(int frameNo, bool autoOrient) const { if (mStaticMatrix) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index 72596395c2..d3c07af335 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -488,10 +488,7 @@ class LOTTransformData : public LOTData public: LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} VMatrix matrix(int frameNo, bool autoOrient = false) const; - VMatrix matrixForRepeater(int frameNo, float multiplier) const; float opacity(int frameNo) const { return mOpacity.value(frameNo)/100;} - float startOpacity(int frameNo) const { return mStartOpacity.value(frameNo)/100;} - float endOpacity(int frameNo) const { return mEndOpacity.value(frameNo)/100;} void cacheMatrix(); bool staticMatrix() const {return mStaticMatrix;} bool ddd() const {return m3D ? true : false;} @@ -508,8 +505,6 @@ public: LOTAnimatable mOpacity{100}; /* "o" */ LOTAnimatable mSkew{0}; /* "sk" */ LOTAnimatable mSkewAxis{0}; /* "sa" */ - LOTAnimatable mStartOpacity{100}; /* "so" */ - LOTAnimatable mEndOpacity{100}; /* "eo" */ bool mStaticMatrix{true}; bool mSeparate{false}; VMatrix mCachedMatrix; @@ -817,20 +812,45 @@ public: LOTTrimData::TrimType mTrimType{TrimType::Simultaneously}; }; -class LOTRepeaterData : public LOTGroupData +class LOTRepeaterTransform { public: - LOTRepeaterData():LOTGroupData(LOTData::Type::Repeater){} - bool hasMtrixChange(int /*frameNo*/) const { - return !(mTransform->isStatic() && mOffset.isStatic()); + VMatrix matrix(int frameNo, float multiplier) const; + float startOpacity(int frameNo) const { return mStartOpacity.value(frameNo)/100;} + float endOpacity(int frameNo) const { return mEndOpacity.value(frameNo)/100;} + bool isStatic() const + { + return mRotation.isStatic() && + mScale.isStatic() && + mPosition.isStatic() && + mAnchor.isStatic() && + mStartOpacity.isStatic() && + mEndOpacity.isStatic(); } +public: + LOTAnimatable mRotation{0}; /* "r" */ + LOTAnimatable mScale{{100, 100}}; /* "s" */ + LOTAnimatable mPosition; /* "p" */ + LOTAnimatable mAnchor; /* "a" */ + LOTAnimatable mStartOpacity{100}; /* "so" */ + LOTAnimatable mEndOpacity{100}; /* "eo" */ +}; + +class LOTRepeaterData : public LOTData +{ +public: + LOTRepeaterData():LOTData(LOTData::Type::Repeater){} + LOTShapeGroupData *content() const { return mContent ? mContent.get() : nullptr; } + void setContent(std::shared_ptr content) {mContent = std::move(content);} int maxCopies() const { return int(mMaxCopies);} float copies(int frameNo) const {return mCopies.value(frameNo);} float offset(int frameNo) const {return mOffset.value(frameNo);} public: - LOTAnimatable mCopies{0}; - LOTAnimatable mOffset{0}; - float mMaxCopies{0.0}; + std::shared_ptr mContent{nullptr}; + LOTRepeaterTransform mTransform; + LOTAnimatable mCopies{0}; + LOTAnimatable mOffset{0}; + float mMaxCopies{0.0}; }; class LOTModel diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 1ebf44a416..645e7eb628 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -246,6 +246,7 @@ public: void getValue(LottieShapeData &shape); void getValue(LottieGradient &gradient); void getValue(std::vector &v); + void getValue(LOTRepeaterTransform &); template bool parseKeyFrameValue(const char *key, LOTKeyFrameValue &value); @@ -1287,6 +1288,30 @@ std::shared_ptr LottieParserImpl::parseTrimObject() return sharedTrim; } +void LottieParserImpl::getValue(LOTRepeaterTransform &obj) +{ + EnterObject(); + + while (const char *key = NextObjectKey()) { + if (0 == strcmp(key, "a")) { + parseProperty(obj.mAnchor); + } else if (0 == strcmp(key, "p")) { + parseProperty(obj.mPosition); + } else if (0 == strcmp(key, "r")) { + parseProperty(obj.mRotation); + } else if (0 == strcmp(key, "s")) { + parseProperty(obj.mScale); + } else if (0 == strcmp(key, "so")) { + parseProperty(obj.mStartOpacity); + } else if (0 == strcmp(key, "eo")) { + parseProperty(obj.mEndOpacity); + } else { + Skip(key); + } + } +} + + std::shared_ptr LottieParserImpl::parseReapeaterObject() { std::shared_ptr sharedRepeater = @@ -1313,8 +1338,7 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOffset); } else if (0 == strcmp(key, "tr")) { - EnterObject(); - obj->mTransform = parseTransformObject(); + getValue(obj->mTransform); } else if (0 == strcmp(key, "hd")) { obj->mHidden = GetBool(); } else { @@ -1325,7 +1349,7 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() } } obj->setStatic(obj->mCopies.isStatic() && obj->mOffset.isStatic() && - obj->mTransform->isStatic()); + obj->mTransform.isStatic()); return sharedRepeater; } @@ -1371,11 +1395,7 @@ std::shared_ptr LottieParserImpl::parseTransformObject(bool dd parseProperty(obj->mSkewAxis); } else if (0 == strcmp(key, "o")) { parseProperty(obj->mOpacity); - } else if (0 == strcmp(key, "so")) { - parseProperty(obj->mStartOpacity); - } else if (0 == strcmp(key, "eo")) { - parseProperty(obj->mEndOpacity); - } else if (0 == strcmp(key, "hd")) { + } else if (0 == strcmp(key, "hd")) { obj->mHidden = GetBool(); } else if (0 == strcmp(key, "rx")) { parseProperty(obj->m3D->mRx); From 9f0bf89fc5ca5a2b1abafdb0f1b78fd3a461c084 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 24 May 2019 12:11:31 +0900 Subject: [PATCH 492/672] license: keep standard lgpl2 license text --- licenses/COPYING.LGPL | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/licenses/COPYING.LGPL b/licenses/COPYING.LGPL index 9a30e8ce81..5ab7695ab8 100644 --- a/licenses/COPYING.LGPL +++ b/licenses/COPYING.LGPL @@ -1,14 +1,4 @@ GNU LESSER GENERAL PUBLIC LICENSE - - The Qt GUI Toolkit is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). - Contact: Nokia Corporation (qt-info@nokia.com) - - You may use, distribute and copy the Qt GUI Toolkit under the terms of - GNU Lesser General Public License version 2.1, which is displayed below. - -------------------------------------------------------------------------- - - GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. From 4f5830c31b7411d67c3e95312393459be1627e3b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Thu, 23 May 2019 14:54:47 +0900 Subject: [PATCH 493/672] lottie/model: refactor LOTAnimatable to optimize size. --- src/lottie/lottiemodel.h | 73 +++++++++++++++++++++++++++++++------ src/lottie/lottieparser.cpp | 19 ++++------ 2 files changed, 68 insertions(+), 24 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index d3c07af335..dfbce06e6c 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -245,7 +245,7 @@ public: return 0; } - bool changed(int prevFrame, int curFrame) { + bool changed(int prevFrame, int curFrame) const { int first = mKeyFrames.front().mStartFrame; int last = mKeyFrames.back().mEndFrame; @@ -265,22 +265,71 @@ template class LOTAnimatable { public: - LOTAnimatable():mValue(),mAnimInfo(nullptr){} - LOTAnimatable(const T &value): mValue(value){} - bool isStatic() const {if (mAnimInfo) return false; else return true;} + LOTAnimatable() { construct(impl.mValue, {}); } + LOTAnimatable(T value) { construct(impl.mValue, std::move(value)); } + + const LOTAnimInfo& animation() const {return *(impl.mAnimInfo.get());} + const T& value() const {return impl.mValue;} + + LOTAnimInfo& animation() + { + if (mStatic) { + destroy(); + construct(impl.mAnimInfo, std::make_unique>()); + mStatic = false; + } + return *(impl.mAnimInfo.get()); + } + + T& value() + { + assert(mStatic); + return impl.mValue; + } + + // delete special member functions + LOTAnimatable(const LOTAnimatable &) = delete; + LOTAnimatable(LOTAnimatable &&) = delete; + LOTAnimatable& operator=(const LOTAnimatable&) = delete; + LOTAnimatable& operator=(LOTAnimatable&&) = delete; + + ~LOTAnimatable() {destroy();} + + bool isStatic() const {return mStatic;} + T value(int frameNo) const { - return isStatic() ? mValue : mAnimInfo->value(frameNo); + return isStatic() ? value() : animation().value(frameNo); } + float angle(int frameNo) const { - return isStatic() ? 0 : mAnimInfo->angle(frameNo); + return isStatic() ? 0 : animation().angle(frameNo); } - bool changed(int prevFrame, int curFrame) { - return isStatic() ? false : mAnimInfo->changed(prevFrame, curFrame); + + bool changed(int prevFrame, int curFrame) const { + return isStatic() ? false : animation().changed(prevFrame, curFrame); } -public: - T mValue; - int mPropertyIndex{0}; /* "ix" */ - std::unique_ptr> mAnimInfo; +private: + template + void construct(Tp& member, Tp&& val) + { + new (&member) Tp(std::move(val)); + } + + void destroy() { + if (mStatic) { + impl.mValue.~T(); + } else { + using std::unique_ptr; + impl.mAnimInfo.~unique_ptr>(); + } + } + union details { + std::unique_ptr> mAnimInfo; + T mValue; + details(){} + ~details(){} + }impl; + bool mStatic{true}; }; enum class LottieBlendMode diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 645e7eb628..c18fd8c108 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -1325,14 +1325,14 @@ std::shared_ptr LottieParserImpl::parseReapeaterObject() parseProperty(obj->mCopies); float maxCopy= 0.0; if (!obj->mCopies.isStatic()) { - for(auto &keyFrame : obj->mCopies.mAnimInfo->mKeyFrames) { + for(auto &keyFrame : obj->mCopies.animation().mKeyFrames) { if (maxCopy < keyFrame.mValue.mStartValue) maxCopy = keyFrame.mValue.mStartValue; if (maxCopy < keyFrame.mValue.mEndValue) maxCopy = keyFrame.mValue.mEndValue; } } else { - maxCopy = obj->mCopies.mValue; + maxCopy = obj->mCopies.value(); } obj->mMaxCopies = maxCopy; } else if (0 == strcmp(key, "o")) { @@ -1985,13 +1985,10 @@ void LottieParserImpl::parseShapeProperty(LOTAnimatable &obj) EnterArray(); while (NextArrayValue()) { RAPIDJSON_ASSERT(PeekType() == kObjectType); - if (!obj.mAnimInfo) - obj.mAnimInfo = - std::make_unique>(); - parseKeyFrame(*obj.mAnimInfo.get()); + parseKeyFrame(obj.animation()); } } else { - getValue(obj.mValue); + getValue(obj.value()); } } else { #ifdef DEBUG_PARSER @@ -2007,16 +2004,14 @@ void LottieParserImpl::parsePropertyHelper(LOTAnimatable &obj) { if (PeekType() == kNumberType) { /*single value property with no animation*/ - getValue(obj.mValue); + getValue(obj.value()); } else { RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); while (NextArrayValue()) { /* property with keyframe info*/ if (PeekType() == kObjectType) { - if (!obj.mAnimInfo) - obj.mAnimInfo = std::make_unique>(); - parseKeyFrame(*obj.mAnimInfo.get()); + parseKeyFrame(obj.animation()); } else { /* Read before modifying. * as there is no way of knowing if the @@ -2026,7 +2021,7 @@ void LottieParserImpl::parsePropertyHelper(LOTAnimatable &obj) */ RAPIDJSON_ASSERT(PeekType() == kNumberType); /*multi value property with no animation*/ - getValue(obj.mValue); + getValue(obj.value()); /*break here as we already reached end of array*/ break; } From e6a7d9fbe7c92822e57c9705a4522a3ce047af33 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 24 May 2019 16:00:15 +0900 Subject: [PATCH 494/672] rlottie/vector: Added unique(), refcount and clone api to VRle class --- src/vector/vrle.cpp | 5 +++++ src/vector/vrle.h | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/vector/vrle.cpp b/src/vector/vrle.cpp index bcf1c4919f..84e2758d0e 100644 --- a/src/vector/vrle.cpp +++ b/src/vector/vrle.cpp @@ -83,6 +83,11 @@ void VRle::VRleData::reset() mBboxDirty = false; } +void VRle::VRleData::clone(const VRle::VRleData &o) +{ + *this = o; +} + void VRle::VRleData::translate(const VPoint &p) { // take care of last offset if applied diff --git a/src/vector/vrle.h b/src/vector/vrle.h index b91e935b7a..4de7f144fc 100644 --- a/src/vector/vrle.h +++ b/src/vector/vrle.h @@ -58,6 +58,10 @@ public: static VRle toRle(const VRect &rect); + bool unique() const {return d.unique();} + int refCount() const { return d.refCount();} + void clone(const VRle &o); + private: struct VRleData { enum class OpCode { @@ -78,6 +82,7 @@ private: void opSubstract(const VRle::VRleData &, const VRle::VRleData &); void opIntersect(const VRle::VRleData &, const VRle::VRleData &); void addRect(const VRect &rect); + void clone(const VRle::VRleData &); std::vector mSpans; VPoint mOffset; mutable VRect mBbox; @@ -167,6 +172,11 @@ inline void VRle::reset() d.write().reset(); } +inline void VRle::clone(const VRle &o) +{ + d.write().clone(o.d.read()); +} + inline void VRle::translate(const VPoint &p) { d.write().translate(p); From cfe844fde927bce125b34af3619d15effebb84c2 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Fri, 24 May 2019 16:15:18 +0900 Subject: [PATCH 495/672] rlottie: make sure rle object shared between 2 threads always keeps refcount 1 to avoid copy --- src/lottie/lottieitem.cpp | 10 +++++++++- src/vector/vdrawable.cpp | 1 + src/vector/vraster.h | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index b68b1caef3..83e2cc8f62 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -214,7 +214,9 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix, if (!mRleFuture) mRleFuture = std::make_shared>(); + if (mRleFuture->valid()) mRle = mRleFuture->get(); mRleFuture->reuse(); + VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle)); mRle = VRle(); } @@ -402,7 +404,11 @@ VRle LOTLayerMaskItem::maskRle(const VRect &clipRect) } } - mRle = rle; + if (!rle.empty() && !rle.unique()) { + mRle.clone(rle); + } else { + mRle = rle; + } mDirty = false; return mRle; } @@ -702,7 +708,9 @@ void LOTClipperItem::update(const VMatrix &matrix) if (!mRleFuture) mRleFuture = std::make_shared>(); + if (mRleFuture->valid()) mRle = mRleFuture->get(); mRleFuture->reuse(); + VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle)); mRle = VRle(); } diff --git a/src/vector/vdrawable.cpp b/src/vector/vdrawable.cpp index d23dabb114..575d6cd1ef 100644 --- a/src/vector/vdrawable.cpp +++ b/src/vector/vdrawable.cpp @@ -26,6 +26,7 @@ void VDrawable::preprocess(const VRect &clip) if (!mRleFuture) mRleFuture = std::make_shared>(); + if (mRleFuture->valid()) mRle = mRleFuture->get(); mRleFuture->reuse(); if (mStroke.enable) { diff --git a/src/vector/vraster.h b/src/vector/vraster.h index f710c19765..a858b63700 100644 --- a/src/vector/vraster.h +++ b/src/vector/vraster.h @@ -56,7 +56,7 @@ private: std::mutex _mutex; std::condition_variable _cv; bool _ready{false}; - bool _valid{true}; + bool _valid{false}; }; using RleShare = std::shared_ptr>; From 7d6264ad7bad707f49624eeee64919dced072ecd Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 27 May 2019 10:05:42 +0900 Subject: [PATCH 496/672] cmake: if LIB_INSTALL_DIR is not set default it to /usr/lib --- CMakeLists.txt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1df24a98c..f751192608 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,16 @@ add_library(rlottie::rlottie ALIAS rlottie) target_compile_options(rlottie PUBLIC PRIVATE - -std=c++14 -O2 -Wall -Werror -Wextra -Wnon-virtual-dtor -Woverloaded-virtual -Wno-unused-parameter -fvisibility=hidden) + -std=c++14 + -O2 + -Wall + -Werror + -Wextra + -Wnon-virtual-dtor + -Woverloaded-virtual + -Wno-unused-parameter + -fvisibility=hidden + ) #declare dependancy set( CMAKE_THREAD_PREFER_PTHREAD TRUE ) @@ -44,6 +53,10 @@ target_link_libraries(rlottie "-Wl,--no-undefined" ) +if (NOT LIB_INSTALL_DIR) + set (LIB_INSTALL_DIR "/usr/lib") +endif (NOT LIB_INSTALL_DIR) + #declare source and include files add_subdirectory(inc) add_subdirectory(src) @@ -53,6 +66,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_DIR ${PREFIX}) SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCDIR ${PREFIX}/include) + CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) From fa9a48c375d3cf1d2d6af434787d60e7c1f5e92f Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 27 May 2019 10:32:27 +0900 Subject: [PATCH 497/672] Fixed regression in VPath::Clone() api and updated test cases --- src/vector/vpath.h | 6 +++--- test/test_lottieanimation.cpp | 2 +- test/test_vpath.cpp | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vector/vpath.h b/src/vector/vpath.h index 598f10ab72..2c044e822d 100644 --- a/src/vector/vpath.h +++ b/src/vector/vpath.h @@ -99,6 +99,7 @@ private: float startAngle, float cx, float cy, VPath::Direction dir = Direction::CW); void addPath(const VPathData &path); + void clone(const VPath::VPathData &o) { *this = o;} const std::vector &elements() const { return m_elements; @@ -262,10 +263,9 @@ inline const std::vector &VPath::points() const return d->points(); } -inline void VPath::clone(const VPath &srcPath) +inline void VPath::clone(const VPath &o) { - reset(); - addPath(srcPath); + d.write().clone(o.d.read()); } V_END_NAMESPACE diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index d704fb4bfd..086981af07 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -25,7 +25,7 @@ TEST_F(AnimationTest, loadFromFile_N) { } TEST_F(AnimationTest, loadFromFile) { - ASSERT_TRUE(animation); + ASSERT_TRUE(animation != nullptr); ASSERT_EQ(animation->totalFrame(), 29); size_t width, height; animation->size(width, height); diff --git a/test/test_vpath.cpp b/test/test_vpath.cpp index 8ae7e96804..01e2d3c106 100644 --- a/test/test_vpath.cpp +++ b/test/test_vpath.cpp @@ -69,6 +69,7 @@ TEST_F(VPathTest, reserve) { TEST_F(VPathTest, clone) { VPath pathClone; pathClone.clone(pathOval); + ASSERT_TRUE(pathClone.unique()); ASSERT_EQ(pathClone.segments(), pathOval.segments()); ASSERT_EQ(pathClone.points().size(), pathOval.points().size()); ASSERT_NE(pathClone.points().data(), pathOval.points().data()); From a74c36600538a1f3d8709f55aeb5ab41159871d0 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Mon, 27 May 2019 13:27:03 +0900 Subject: [PATCH 498/672] rlottie/test: Fix test cases --- test/test_lottieanimation.cpp | 2 +- test/test_lottieanimation_capi.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_lottieanimation.cpp b/test/test_lottieanimation.cpp index 086981af07..6647946a60 100644 --- a/test/test_lottieanimation.cpp +++ b/test/test_lottieanimation.cpp @@ -26,7 +26,7 @@ TEST_F(AnimationTest, loadFromFile_N) { TEST_F(AnimationTest, loadFromFile) { ASSERT_TRUE(animation != nullptr); - ASSERT_EQ(animation->totalFrame(), 29); + ASSERT_EQ(animation->totalFrame(), 30); size_t width, height; animation->size(width, height); ASSERT_EQ(width, 500); diff --git a/test/test_lottieanimation_capi.cpp b/test/test_lottieanimation_capi.cpp index 1889621bc3..ac058e011f 100644 --- a/test/test_lottieanimation_capi.cpp +++ b/test/test_lottieanimation_capi.cpp @@ -26,7 +26,7 @@ TEST_F(AnimationCApiTest, loadFromFile_N) { TEST_F(AnimationCApiTest, loadFromFile) { ASSERT_TRUE(animation); - ASSERT_EQ(lottie_animation_get_totalframe(animation), 29); + ASSERT_EQ(lottie_animation_get_totalframe(animation), 30); size_t width, height; lottie_animation_get_size(animation, &width, &height); ASSERT_EQ(width, 500); From dd79c1f1df7331d8b2b37c2654e91c50744f2e62 Mon Sep 17 00:00:00 2001 From: Subhransu Date: Mon, 27 May 2019 13:36:02 +0900 Subject: [PATCH 499/672] Update README.md Updated cmake build instruction --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1e2d538d27..df97461e4b 100644 --- a/README.md +++ b/README.md @@ -51,11 +51,11 @@ mkdir build Run cmake command inside build directory to configure rlottie. ``` cd build -cmake -DLIB_INSTALL_DIR=/usr/lib .. +cmake .. -# install to a different prefix. eg ~/test/lib +# install in a different path. eg ~/test/usr/lib -cmake -DCMAKE_INSTALL_PREFIX=~/test -DLIB_INSTALL_DIR=lib .. +cmake -DCMAKE_INSTALL_PREFIX=~/test .. ``` Run make to build rlottie From 9bdd1a83dfe0ea5b000ba81b58882a53c61b0645 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 28 May 2019 11:22:35 +0900 Subject: [PATCH 500/672] example: fix lottieviwer to properly resizable. Don't touch object's in evas render stage. This has also tiny edc code refactoring. --- example/lottieviewer.cpp | 25 +++++++++---------------- example/resource/layout.edc | 22 ++++++++++------------ example/resource/layout.edj | Bin 9149 -> 9106 bytes 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index bfa30ba238..88d07ac5f8 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -35,7 +35,7 @@ struct _AppInfo { Evas_Object *layout; Evas_Object *slider; Evas_Object *button; - Ecore_Evas *ee; + Ecore_Animator *animator; Eina_Bool autoPlaying; }; @@ -53,10 +53,7 @@ _layout_del_cb(void *data, Evas *, Evas_Object *, void *) { AppInfo *info = (AppInfo *)data; if (info->view) delete info->view; - info->view = NULL; - - ecore_evas_data_set(info->ee, "AppInfo", NULL); - + ecore_animator_del(info->animator); free(info); } @@ -87,10 +84,10 @@ _toggle_start_button(AppInfo *info) } } -static void -_ee_pre_render_cb(Ecore_Evas *ee) +static Eina_Bool +_animator_cb(void *data) { - AppInfo *info = (AppInfo *)ecore_evas_data_get(ee, "AppInfo"); + AppInfo *info = (AppInfo *)data; if (info && info->autoPlaying && info->view) { @@ -102,6 +99,7 @@ _ee_pre_render_cb(Ecore_Evas *ee) if (pos >= 1.0) _toggle_start_button(info); } + return ECORE_CALLBACK_RENEW; } static void @@ -131,8 +129,7 @@ Evas_Object * create_layout(Evas_Object *parent, const char *file) { Evas_Object *layout, *slider, *image, *button; - Evas *e; - Ecore_Evas *ee; + Ecore_Animator *animator; char buf[64]; AppInfo *info = (AppInfo *)calloc(sizeof(AppInfo), 1); @@ -154,7 +151,6 @@ create_layout(Evas_Object *parent, const char *file) //IMAGE from LOTTIEVIEW image = view->getImage(); evas_object_show(image); - evas_object_size_hint_min_set(image, 500, 500); elm_object_part_content_set(layout, "lottie", image); //SLIDER @@ -167,16 +163,13 @@ create_layout(Evas_Object *parent, const char *file) elm_object_part_content_set(layout, "button", button); evas_object_smart_callback_add(button, "clicked", _button_clicked_cb, (void *)info); - e = evas_object_evas_get(layout); - ee = ecore_evas_ecore_evas_get(e); - ecore_evas_data_set(ee, "AppInfo", info); - ecore_evas_callback_pre_render_set(ee, _ee_pre_render_cb); + animator = ecore_animator_add(_animator_cb, info); info->view = view; info->layout = layout; info->slider = slider; info->button = button; - info->ee = ee; + info->animator = animator; evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, _layout_del_cb, (void *)info); sprintf(buf, "%d / %ld", 0, view->getTotalFrame()); diff --git a/example/resource/layout.edc b/example/resource/layout.edc index 97544161d7..4021200f12 100644 --- a/example/resource/layout.edc +++ b/example/resource/layout.edc @@ -1,13 +1,13 @@ collections { - group { name: "layout"; + group { "layout"; parts { rect { "bg"; - desc { state: "default" 0.0; + desc { "default"; color: 225 225 225 225; } } spacer { "lottie_base"; - desc { state: "default" 0.0; + desc { "default"; rel1.to_y: "text"; rel1.relative: 0.0 1.0; rel2.to_y: "slider"; @@ -15,15 +15,13 @@ collections { } } swallow { "lottie"; - desc { state: "default" 0.0; + desc { "default"; rel1.to: "lottie_base"; - rel1.relative: 0.5 0.5; rel2.to: "lottie_base"; - rel2.relative: 0.5 0.5; } } text { "text"; - desc { state: "default" 0.0; + desc { "default"; rel1.relative: 1.0 0.0; rel2.relative: 1.0 0.0; rel1.offset: -20 20; @@ -39,7 +37,7 @@ collections { } } swallow { "slider"; - desc { state: "default" 0.0; + desc { "default"; min: 0 100; max: -1 100; align: 0.5 1.0; @@ -51,7 +49,7 @@ collections { } } spacer { "left_pad"; - desc { state: "default" 0.0; + desc { "default"; fixed: 1 0; min: 20 0; align: 0.0 0.5; @@ -59,7 +57,7 @@ collections { } } spacer { "right_pad"; - desc { state: "default" 0.0; + desc { "default"; fixed: 1 0; min: 20 0; align: 1.0 0.5; @@ -67,7 +65,7 @@ collections { } } swallow { "button"; - desc { state: "default" 0.0; + desc { "default"; fixed: 1 1; min: 80 55; align: 1.0 0.5; @@ -80,7 +78,7 @@ collections { } } spacer { "button_left_pad"; - desc { state: "default" 0.0; + desc { "default"; fixed: 1 0; min: 20 0; align: 1.0 0.5; diff --git a/example/resource/layout.edj b/example/resource/layout.edj index 8a74b1a345c76154f724cb537a3974272c7a2e73..4efc51396df74fe026e997a4369fba88a0939d3e 100644 GIT binary patch delta 1635 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 From 485ec8a1105e0be97562e221dac36c4e82ed3b05 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 28 May 2019 11:46:56 +0900 Subject: [PATCH 501/672] example: update image object pixels properly. image object requests the updated pixels in its own designed interface. --- example/lottieviewer.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/example/lottieviewer.cpp b/example/lottieviewer.cpp index 88d07ac5f8..1439d4a0f9 100644 --- a/example/lottieviewer.cpp +++ b/example/lottieviewer.cpp @@ -94,8 +94,7 @@ _animator_cb(void *data) float pos = info->view->getPos(); _update_frame_info(info, pos); elm_slider_value_set(info->slider, (double)pos); - info->view->render(); - + evas_object_image_pixels_dirty_set(info->view->getImage(), EINA_TRUE); if (pos >= 1.0) _toggle_start_button(info); } @@ -113,7 +112,7 @@ _slider_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) if (!info->autoPlaying) { info->view->seek(val); - info->view->render(); + evas_object_image_pixels_dirty_set(info->view->getImage(), EINA_TRUE); } } @@ -125,6 +124,13 @@ _button_clicked_cb(void *data, Evas_Object */*obj*/, void */*event_info*/) _toggle_start_button(info); } +static void +_image_update_cb(void *data, Evas_Object *obj EINA_UNUSED) +{ + AppInfo *info = (AppInfo *)data; + info->view->render(); +} + Evas_Object * create_layout(Evas_Object *parent, const char *file) { @@ -151,6 +157,7 @@ create_layout(Evas_Object *parent, const char *file) //IMAGE from LOTTIEVIEW image = view->getImage(); evas_object_show(image); + evas_object_image_pixels_get_callback_set(image, _image_update_cb, info); elm_object_part_content_set(layout, "lottie", image); //SLIDER From a22450c31a86009ced6d2f799227b629c125215b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Tue, 28 May 2019 18:55:59 +0900 Subject: [PATCH 502/672] rlottie/parser: Refactor static property handling of layer object. --- src/lottie/lottieitem.cpp | 21 --------------------- src/lottie/lottieitem.h | 7 +------ src/lottie/lottiemodel.h | 3 +++ src/lottie/lottieparser.cpp | 13 +++++++------ 4 files changed, 11 insertions(+), 33 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 83e2cc8f62..91c33d59d5 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -77,7 +77,6 @@ LOTCompItem::LOTCompItem(LOTModel *model) { mCompData = model->mRoot.get(); mRootLayer = createLayerItem(mCompData->mRootLayer.get()); - mRootLayer->updateStaticProperty(); mViewSize = mCompData->size(); } @@ -464,15 +463,6 @@ bool LOTCompLayerItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, return false; } -void LOTLayerItem::updateStaticProperty() -{ - if (mParentLayer) mParentLayer->updateStaticProperty(); - - mStatic = mLayerData->isStatic(); - mStatic = mParentLayer ? (mStatic & mParentLayer->isStatic()) : mStatic; - mStatic = mPrecompLayer ? (mStatic & mPrecompLayer->isStatic()) : mStatic; -} - void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, float parentAlpha) { @@ -553,8 +543,6 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) [id](const auto& val){ return val->id() == id;}); if (search != mLayers.end()) layer->setParentLayer((*search).get()); } - // update the precomp layer if its not the root layer. - if (!layerModel->root()) layer->setPrecompLayer(this); } // 3. keep the layer in back-to-front order. @@ -567,15 +555,6 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel) } } -void LOTCompLayerItem::updateStaticProperty() -{ - LOTLayerItem::updateStaticProperty(); - - for (const auto &layer : mLayers) { - layer->updateStaticProperty(); - } -} - void LOTCompLayerItem::buildLayerNode() { LOTLayerItem::buildLayerNode(); diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index eeb87f969b..24d451f42b 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -95,11 +95,9 @@ public: int id() const {return mLayerData->id();} int parentId() const {return mLayerData->parentId();} void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;} - void setPrecompLayer(LOTLayerItem *precomp){mPrecompLayer = precomp;} virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha); VMatrix matrix(int frameNo) const; virtual void renderList(std::vector &){} - virtual void updateStaticProperty(); virtual void render(VPainter *painter, const VRle &mask, const VRle &matteRle); bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; } MatteType matteType() const { return mLayerData->mMatteType;} @@ -113,7 +111,7 @@ protected: inline VMatrix combinedMatrix() const {return mCombinedMatrix;} inline int frameNo() const {return mFrameNo;} inline float combinedAlpha() const {return mCombinedAlpha;} - inline bool isStatic() const {return mStatic;} + inline bool isStatic() const {return mLayerData->isStatic();} float opacity(int frameNo) const; inline DirtyFlag flag() const {return mDirtyFlag;} protected: @@ -123,12 +121,10 @@ protected: std::unique_ptr mLayerMask; LOTLayerData *mLayerData{nullptr}; LOTLayerItem *mParentLayer{nullptr}; - LOTLayerItem *mPrecompLayer{nullptr}; VMatrix mCombinedMatrix; float mCombinedAlpha{0.0}; int mFrameNo{-1}; DirtyFlag mDirtyFlag{DirtyFlagBit::All}; - bool mStatic{false}; }; class LOTCompLayerItem: public LOTLayerItem @@ -136,7 +132,6 @@ class LOTCompLayerItem: public LOTLayerItem public: LOTCompLayerItem(LOTLayerData *layerData); void renderList(std::vector &list)final; - void updateStaticProperty() final; void render(VPainter *painter, const VRle &mask, const VRle &matteRle) final; void buildLayerNode() final; bool resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &value) override; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index dfbce06e6c..ba5f489b76 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -396,8 +396,11 @@ struct LOTAsset Image, Char }; + bool isStatic() const {return mStatic;} + void setStatic(bool value) {mStatic = value;} VBitmap bitmap() const; Type mAssetType{Type::Precomp}; + bool mStatic{true}; std::string mRefId; // ref id std::vector> mLayers; // image asset data diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index c18fd8c108..0283a36f7e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -566,7 +566,8 @@ void LottieParserImpl::resolveLayerRefs() if (layer->mLayerType == LayerType::Image) { layer->mAsset = search->second; } else if (layer->mLayerType == LayerType::Precomp) { - layer->mChildren = search->second.get()->mLayers; + layer->mChildren = search->second->mLayers; + layer->setStatic(layer->isStatic() && search->second->isStatic()); } } } @@ -721,10 +722,13 @@ std::shared_ptr LottieParserImpl::parseAsset() asset->mAssetType = LOTAsset::Type::Precomp; RAPIDJSON_ASSERT(PeekType() == kArrayType); EnterArray(); + bool staticFlag = true; while (NextArrayValue()) { std::shared_ptr layer = parseLayer(); + staticFlag = staticFlag && layer->isStatic(); asset->mLayers.push_back(layer); } + asset->setStatic(staticFlag); } else { #ifdef DEBUG_PARSER vWarning << "Asset Attribute Skipped : " << key; @@ -756,7 +760,7 @@ void LottieParserImpl::parseLayers(LOTCompositionData *comp) EnterArray(); while (NextArrayValue()) { std::shared_ptr layer = parseLayer(true); - staticFlag &= layer->isStatic(); + staticFlag = staticFlag && layer->isStatic(); comp->mRootLayer->mChildren.push_back(layer); } comp->mRootLayer->setStatic(staticFlag); @@ -851,7 +855,6 @@ std::shared_ptr LottieParserImpl::parseLayer(bool record) std::make_shared(); LOTLayerData *layer = sharedLayer.get(); curLayerRef = layer; - bool hasLayerRef = false; bool ddd = true; std::string layerName; EnterObject(); @@ -876,7 +879,6 @@ std::shared_ptr LottieParserImpl::parseLayer(bool record) layer->mPreCompRefId = std::string(GetString()); layer->mHasGradient = true; mLayersToUpdate.push_back(sharedLayer); - hasLayerRef = true; } else if (0 == strcmp(key, "sr")) { // "Layer Time Stretching" RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mTimeStreatch = GetDouble(); @@ -937,8 +939,7 @@ std::shared_ptr LottieParserImpl::parseLayer(bool record) staticFlag &= mask->isStatic(); } - layer->setStatic(staticFlag && layer->mTransform->isStatic() && - !hasLayerRef); + layer->setStatic(staticFlag && layer->mTransform->isStatic()); layer->mCompRef = compRef; if (record) { From c8346f4960b4023467bc156cde5e507e0419635b Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 29 May 2019 09:21:43 +0900 Subject: [PATCH 503/672] rlottie/parser: Don't create transform object for root layer --- src/lottie/lottieitem.cpp | 13 ++----- src/lottie/lottieitem.h | 2 +- src/lottie/lottiemodel.h | 78 ++++++++++++++++++++----------------- src/lottie/lottieparser.cpp | 2 - 4 files changed, 46 insertions(+), 49 deletions(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 91c33d59d5..786aec8d7a 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -502,18 +502,11 @@ void LOTLayerItem::update(int frameNumber, const VMatrix &parentMatrix, mDirtyFlag = DirtyFlagBit::None; } -float LOTLayerItem::opacity(int frameNo) const -{ - return mLayerData->mTransform->opacity(frameNo); -} - VMatrix LOTLayerItem::matrix(int frameNo) const { - if (mParentLayer) - return mLayerData->mTransform->matrix(frameNo, mLayerData->autoOrient()) * - mParentLayer->matrix(frameNo); - else - return mLayerData->mTransform->matrix(frameNo, mLayerData->autoOrient()); + return mParentLayer ? + (mLayerData->matrix(frameNo) * mParentLayer->matrix(frameNo)) : + mLayerData->matrix(frameNo); } bool LOTLayerItem::visible() const diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 24d451f42b..e051945655 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -112,7 +112,7 @@ protected: inline int frameNo() const {return mFrameNo;} inline float combinedAlpha() const {return mCombinedAlpha;} inline bool isStatic() const {return mLayerData->isStatic();} - float opacity(int frameNo) const; + float opacity(int frameNo) const {return mLayerData->opacity(frameNo);} inline DirtyFlag flag() const {return mDirtyFlag;} protected: std::vector mMasksCNode; diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index ba5f489b76..b8ff8cb8a8 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -410,6 +410,40 @@ struct LOTAsset std::string mImageData; }; +struct LOT3DData +{ + LOTAnimatable mRx{0}; + LOTAnimatable mRy{0}; + LOTAnimatable mRz{0}; +}; + +class LOTTransformData : public LOTData +{ +public: + LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} + VMatrix matrix(int frameNo, bool autoOrient = false) const; + float opacity(int frameNo) const { return mOpacity.value(frameNo)/100;} + void cacheMatrix(); + bool staticMatrix() const {return mStaticMatrix;} + bool ddd() const {return m3D ? true : false;} +private: + VMatrix computeMatrix(int frameNo, bool autoOrient = false) const; +public: + std::unique_ptr m3D; + LOTAnimatable mRotation{0}; /* "r" */ + LOTAnimatable mScale; /* "s" */ + LOTAnimatable mPosition; /* "p" */ + LOTAnimatable mX{0}; + LOTAnimatable mY{0}; + LOTAnimatable mAnchor; /* "a" */ + LOTAnimatable mOpacity{100}; /* "o" */ + LOTAnimatable mSkew{0}; /* "sk" */ + LOTAnimatable mSkewAxis{0}; /* "sa" */ + bool mStaticMatrix{true}; + bool mSeparate{false}; + VMatrix mCachedMatrix; +}; + class LOTLayerData : public LOTGroupData { public: @@ -418,7 +452,6 @@ public: bool hasGradient() const noexcept {return mHasGradient;} bool hasMask() const noexcept {return mHasMask;} bool hasRepeater() const noexcept {return mHasRepeater;} - bool root() const noexcept {return mRoot;} int id() const noexcept{ return mId;} int parentId() const noexcept{ return mParentId;} int inFrame() const noexcept{return mInFrame;} @@ -431,6 +464,14 @@ public: int timeRemap(int frameNo) const; VSize layerSize() const {return mLayerSize;} bool precompLayer() const {return mLayerType == LayerType::Precomp;} + VMatrix matrix(int frameNo) const + { + return mTransform ? mTransform->matrix(frameNo, autoOrient()) : VMatrix{}; + } + float opacity(int frameNo) const + { + return mTransform ? mTransform->opacity(frameNo) : 1.0f; + } public: struct SolidLayer { int mWidth{0}; @@ -456,7 +497,6 @@ public: bool mHasMask{false}; bool mHasRepeater{false}; bool mHasGradient{false}; - bool mRoot{false}; bool mAutoOrient{false}; std::vector> mMasks; LOTCompositionData *mCompRef{nullptr}; @@ -528,40 +568,6 @@ inline int LOTLayerData::timeRemap(int frameNo) const return frameNo / mTimeStreatch; } -struct LOT3DData -{ - LOTAnimatable mRx{0}; - LOTAnimatable mRy{0}; - LOTAnimatable mRz{0}; -}; - -class LOTTransformData : public LOTData -{ -public: - LOTTransformData():LOTData(LOTData::Type::Transform),mScale({100, 100}){} - VMatrix matrix(int frameNo, bool autoOrient = false) const; - float opacity(int frameNo) const { return mOpacity.value(frameNo)/100;} - void cacheMatrix(); - bool staticMatrix() const {return mStaticMatrix;} - bool ddd() const {return m3D ? true : false;} -private: - VMatrix computeMatrix(int frameNo, bool autoOrient = false) const; -public: - std::unique_ptr m3D; - LOTAnimatable mRotation{0}; /* "r" */ - LOTAnimatable mScale; /* "s" */ - LOTAnimatable mPosition; /* "p" */ - LOTAnimatable mX{0}; - LOTAnimatable mY{0}; - LOTAnimatable mAnchor; /* "a" */ - LOTAnimatable mOpacity{100}; /* "o" */ - LOTAnimatable mSkew{0}; /* "sk" */ - LOTAnimatable mSkewAxis{0}; /* "sa" */ - bool mStaticMatrix{true}; - bool mSeparate{false}; - VMatrix mCachedMatrix; -}; - class LOTFillData : public LOTData { public: diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index 0283a36f7e..b8bb9319ab 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -751,9 +751,7 @@ std::shared_ptr LottieParserImpl::parseAsset() void LottieParserImpl::parseLayers(LOTCompositionData *comp) { comp->mRootLayer = std::make_shared(); - comp->mRootLayer->mRoot = true; comp->mRootLayer->mLayerType = LayerType::Precomp; - comp->mRootLayer->mTransform = std::make_shared(); comp->mRootLayer->mName = std::string("__"); bool staticFlag = true; RAPIDJSON_ASSERT(PeekType() == kArrayType); From f8409d9d5d2b77ec260992928fb57ec07850e41a Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 27 May 2019 15:32:24 +0900 Subject: [PATCH 504/672] lottieitem: Add image property in LOTNode The image properties are image data, size, and matrix information. If the lottie item is an image item, the image property is stored in the Nodelist. --- inc/rlottiecommon.h | 11 +++++++++++ src/lottie/lottieitem.cpp | 17 +++++++++++++++++ src/vector/vmatrix.h | 12 ++++++++++++ 3 files changed, 40 insertions(+) diff --git a/inc/rlottiecommon.h b/inc/rlottiecommon.h index 0d8bce553e..5d81159872 100644 --- a/inc/rlottiecommon.h +++ b/inc/rlottiecommon.h @@ -181,6 +181,17 @@ typedef struct LOTNode { float fradius; } mGradient; + struct { + unsigned char* data; + int width; + int height; + struct { + float m11; float m12; float m13; + float m21; float m22; float m23; + float m31; float m32; float m33; + } mMatrix; + } mImageInfo; + int mFlag; LOTBrushType mBrushType; LOTFillRule mFillRule; diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 786aec8d7a..7227c126e7 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -819,6 +819,23 @@ void LOTImageLayerItem::buildLayerNode() for (auto &i : mDrawableList) { LOTDrawable *lotDrawable = static_cast(i); lotDrawable->sync(); + + lotDrawable->mCNode->mImageInfo.data = mRenderNode->mBrush.mTexture.data(); + lotDrawable->mCNode->mImageInfo.width = mRenderNode->mBrush.mTexture.width(); + lotDrawable->mCNode->mImageInfo.height = mRenderNode->mBrush.mTexture.height(); + + lotDrawable->mCNode->mImageInfo.mMatrix.m11 = combinedMatrix().m_11(); + lotDrawable->mCNode->mImageInfo.mMatrix.m12 = combinedMatrix().m_12(); + lotDrawable->mCNode->mImageInfo.mMatrix.m13 = combinedMatrix().m_13(); + + lotDrawable->mCNode->mImageInfo.mMatrix.m21 = combinedMatrix().m_21(); + lotDrawable->mCNode->mImageInfo.mMatrix.m22 = combinedMatrix().m_22(); + lotDrawable->mCNode->mImageInfo.mMatrix.m23 = combinedMatrix().m_23(); + + lotDrawable->mCNode->mImageInfo.mMatrix.m31 = combinedMatrix().m_tx(); + lotDrawable->mCNode->mImageInfo.mMatrix.m32 = combinedMatrix().m_ty(); + lotDrawable->mCNode->mImageInfo.mMatrix.m33 = combinedMatrix().m_13(); + mCNodeList.push_back(lotDrawable->mCNode.get()); } layerNode()->mNodeList.ptr = mCNodeList.data(); diff --git a/src/vector/vmatrix.h b/src/vector/vmatrix.h index 2d49f494bd..8128a1c5d7 100644 --- a/src/vector/vmatrix.h +++ b/src/vector/vmatrix.h @@ -46,6 +46,18 @@ public: MatrixType type() const; inline float determinant() const; + float m_11() const { return m11;} + float m_12() const { return m12;} + float m_13() const { return m13;} + + float m_21() const { return m21;} + float m_22() const { return m22;} + float m_23() const { return m23;} + + float m_tx() const { return mtx;} + float m_ty() const { return mty;} + float m_33() const { return m33;} + VMatrix &translate(VPointF pos) { return translate(pos.x(), pos.y()); }; VMatrix &translate(float dx, float dy); VMatrix &scale(VPointF s) { return scale(s.x(), s.y()); }; From 4469d85a5b90a8409390f791758584a3a44d3a25 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 24 May 2019 19:12:16 +0900 Subject: [PATCH 505/672] example : Fix resource path in efl_animation --- example/efl_animview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/efl_animview.cpp b/example/efl_animview.cpp index b548025ca7..32aed202f9 100644 --- a/example/efl_animview.cpp +++ b/example/efl_animview.cpp @@ -302,7 +302,7 @@ main(int argc, char **argv) printf("Usage: efl_animview [input_file]\n"); return 0; } - else snprintf(path, sizeof(path), "%s/%s", DEMO_DIR, "heart.json"); + else snprintf(path, sizeof(path), "%s", argv[1]); Eo *content = anim_view_test(win, path); From 0726a2f137efc18a9d90eb715cf42f95f8bb99e7 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 29 May 2019 10:19:59 +0900 Subject: [PATCH 506/672] rlottie/pareser: remove unused property --- src/lottie/lottiemodel.h | 1 - src/lottie/lottieparser.cpp | 27 --------------------------- 2 files changed, 28 deletions(-) diff --git a/src/lottie/lottiemodel.h b/src/lottie/lottiemodel.h index b8ff8cb8a8..8d1fab89ce 100644 --- a/src/lottie/lottiemodel.h +++ b/src/lottie/lottiemodel.h @@ -480,7 +480,6 @@ public: }; MatteType mMatteType{MatteType::None}; - VRect mBound; LayerType mLayerType{LayerType::Null}; //lottie layer type (solid/shape/precomp) int mParentId{-1}; // Lottie the id of the parent in the composition int mId{-1}; // Lottie the group id used for parenting. diff --git a/src/lottie/lottieparser.cpp b/src/lottie/lottieparser.cpp index b8bb9319ab..6588be292e 100644 --- a/src/lottie/lottieparser.cpp +++ b/src/lottie/lottieparser.cpp @@ -198,7 +198,6 @@ public: bool IsValid() { return st_ != kError; } void Skip(const char *key); - VRect getRect(); LottieBlendMode getBlendMode(); CapStyle getLineCap(); JoinStyle getLineJoin(); @@ -532,30 +531,6 @@ LottieBlendMode LottieParserImpl::getBlendMode() } return mode; } -VRect LottieParserImpl::getRect() -{ - VRect r; - RAPIDJSON_ASSERT(PeekType() == kObjectType); - EnterObject(); - while (const char *key = NextObjectKey()) { - if (0 == strcmp(key, "l")) { - RAPIDJSON_ASSERT(PeekType() == kNumberType); - r.setLeft(GetInt()); - } else if (0 == strcmp(key, "r")) { - RAPIDJSON_ASSERT(PeekType() == kNumberType); - r.setRight(GetInt()); - } else if (0 == strcmp(key, "t")) { - RAPIDJSON_ASSERT(PeekType() == kNumberType); - r.setTop(GetInt()); - } else if (0 == strcmp(key, "b")) { - RAPIDJSON_ASSERT(PeekType() == kNumberType); - r.setBottom(GetInt()); - } else { - RAPIDJSON_ASSERT(false); - } - } - return r; -} void LottieParserImpl::resolveLayerRefs() { @@ -891,8 +866,6 @@ std::shared_ptr LottieParserImpl::parseLayer(bool record) } else if (0 == strcmp(key, "st")) { RAPIDJSON_ASSERT(PeekType() == kNumberType); layer->mStartFrame = GetDouble(); - } else if (0 == strcmp(key, "bounds")) { - layer->mBound = getRect(); } else if (0 == strcmp(key, "bm")) { layer->mBlendMode = getBlendMode(); } else if (0 == strcmp(key, "ks")) { From 87bd99cb2d898cad8e225d47e32484202e02f5c4 Mon Sep 17 00:00:00 2001 From: subhransu mohanty Date: Wed, 29 May 2019 10:26:52 +0900 Subject: [PATCH 507/672] rlottie: updated showcase gif file --- .Gifs/1.gif | Bin 0 -> 5884534 bytes .Gifs/2.gif | Bin 0 -> 1078299 bytes README.md | 4 +++- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 .Gifs/1.gif create mode 100755 .Gifs/2.gif diff --git a/.Gifs/1.gif b/.Gifs/1.gif new file mode 100755 index 0000000000000000000000000000000000000000..7f33920b72f019a262e0e117161b72380055f04a GIT binary patch literal 5884534 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%0Dg>>)a@-7b9=0xCNe2D!N>8FNRkr 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�+6h%25IA5yAcF$HS_`Lg5lF`69>pLcrw^ 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
=C)&~Zotg7S&^}_P=GK!wcad2h6eAf%y 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

krITYB4x^zDb<}C##_kxEjIbt@tQR((#A- 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